mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
parent
41075fef39
commit
ba32691556
104 changed files with 2002 additions and 3317 deletions
|
|
@ -1,53 +0,0 @@
|
||||||
package mage.cards.a;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.dynamicvalue.common.ArtifactYouControlCount;
|
|
||||||
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
|
|
||||||
import mage.abilities.keyword.CrewAbility;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.*;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class AetherwingGoldenScaleFlagship extends CardImpl {
|
|
||||||
|
|
||||||
public AetherwingGoldenScaleFlagship(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(0);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Aetherwing, Golden-Scale Flagship's power is equal to the number of artifacts you control.
|
|
||||||
this.addAbility(new SimpleStaticAbility(
|
|
||||||
Zone.ALL,
|
|
||||||
new SetBasePowerSourceEffect(ArtifactYouControlCount.instance)
|
|
||||||
.setText("{this}'s power is equal to the number of artifacts you control")
|
|
||||||
));
|
|
||||||
|
|
||||||
// Crew 1
|
|
||||||
this.addAbility(new CrewAbility(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
private AetherwingGoldenScaleFlagship(final AetherwingGoldenScaleFlagship card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AetherwingGoldenScaleFlagship copy() {
|
|
||||||
return new AetherwingGoldenScaleFlagship(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
package mage.cards.a;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
|
||||||
import mage.abilities.condition.Condition;
|
|
||||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
|
||||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
|
||||||
import mage.abilities.keyword.MenaceAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.WatcherScope;
|
|
||||||
import mage.counters.CounterType;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.game.events.ZoneChangeEvent;
|
|
||||||
import mage.watchers.Watcher;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class AshenReaper extends CardImpl {
|
|
||||||
|
|
||||||
public AshenReaper(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.ZOMBIE);
|
|
||||||
this.subtype.add(SubType.ELEMENTAL);
|
|
||||||
this.power = new MageInt(2);
|
|
||||||
this.toughness = new MageInt(1);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Menace
|
|
||||||
this.addAbility(new MenaceAbility(false));
|
|
||||||
|
|
||||||
// At the beginning of your end step, put a +1/+1 counter on Ashen Reaper if a permanent was put into a graveyard from the battlefield this turn.
|
|
||||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(
|
|
||||||
new ConditionalOneShotEffect(
|
|
||||||
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
|
||||||
AshenReaperCondition.instance, "put a +1/+1 counter on {this} " +
|
|
||||||
"if a permanent was put into a graveyard from the battlefield this turn"
|
|
||||||
)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private AshenReaper(final AshenReaper card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AshenReaper copy() {
|
|
||||||
return new AshenReaper(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AshenReaperWatcher makeWatcher() {
|
|
||||||
return new AshenReaperWatcher();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum AshenReaperCondition implements Condition {
|
|
||||||
instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
return game.getState().getWatcher(AshenReaperWatcher.class).conditionMet();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AshenReaperWatcher extends Watcher {
|
|
||||||
|
|
||||||
AshenReaperWatcher() {
|
|
||||||
super(WatcherScope.GAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void watch(GameEvent event, Game game) {
|
|
||||||
if (event.getType() == GameEvent.EventType.ZONE_CHANGE
|
|
||||||
&& ((ZoneChangeEvent) event).isDiesEvent()) {
|
|
||||||
condition = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
package mage.cards.a;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.effects.common.*;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.counters.CounterType;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.TargetPlayer;
|
|
||||||
import mage.target.common.TargetControlledPermanent;
|
|
||||||
import mage.target.common.TargetCreaturePermanentAmount;
|
|
||||||
import mage.target.common.TargetPermanentAmount;
|
|
||||||
import mage.target.targetpointer.SecondTargetPointer;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class AwakenTheMaelstrom extends CardImpl {
|
|
||||||
|
|
||||||
public AwakenTheMaelstrom(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "");
|
|
||||||
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Awaken the Maelstrom is all colors.
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("{this} is all colors")));
|
|
||||||
|
|
||||||
// Target player draws two cards.
|
|
||||||
this.getSpellAbility().addEffect(new DrawCardTargetEffect(2));
|
|
||||||
this.getSpellAbility().addTarget(new TargetPlayer().withChooseHint("to draw two cards"));
|
|
||||||
|
|
||||||
// You may put an artifact card from your hand onto the battlefield.
|
|
||||||
this.getSpellAbility().addEffect(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_ARTIFACT_AN));
|
|
||||||
|
|
||||||
// Create a token that's a copy of a permanent you control.
|
|
||||||
// Distribute three +1/+1 counters among one, two, or three creatures you control.
|
|
||||||
this.getSpellAbility().addEffect(new AwakenTheMaelstromEffect());
|
|
||||||
|
|
||||||
// Destroy target permanent an opponent controls.
|
|
||||||
this.getSpellAbility().addEffect(new DestroyTargetEffect().setTargetPointer(new SecondTargetPointer()));
|
|
||||||
this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT).withChooseHint("to destroy"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private AwakenTheMaelstrom(final AwakenTheMaelstrom card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AwakenTheMaelstrom copy() {
|
|
||||||
return new AwakenTheMaelstrom(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AwakenTheMaelstromEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
AwakenTheMaelstromEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "Create a token that's a copy of a permanent you control. " +
|
|
||||||
"Distribute three +1/+1 counters among one, two, or three creatures you control.";
|
|
||||||
}
|
|
||||||
|
|
||||||
private AwakenTheMaelstromEffect(final AwakenTheMaelstromEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AwakenTheMaelstromEffect copy() {
|
|
||||||
return new AwakenTheMaelstromEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
|
||||||
if (player == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
makeToken(player, game, source);
|
|
||||||
game.processAction();
|
|
||||||
distributeCounters(player, game, source);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void makeToken(Player player, Game game, Ability source) {
|
|
||||||
TargetPermanent target = new TargetControlledPermanent();
|
|
||||||
target.withNotTarget(true);
|
|
||||||
target.withChooseHint("to copy");
|
|
||||||
if (!target.canChoose(player.getId(), source, game)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
player.choose(outcome, target, source, game);
|
|
||||||
Permanent permanent = game.getPermanent(target.getFirstTarget());
|
|
||||||
if (permanent != null) {
|
|
||||||
new CreateTokenCopyTargetEffect().setSavedPermanent(permanent).apply(game, source);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void distributeCounters(Player player, Game game, Ability source) {
|
|
||||||
if (game.getBattlefield().count(StaticFilters.FILTER_CONTROLLED_CREATURE, player.getId(), source, game) < 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TargetPermanentAmount target = new TargetCreaturePermanentAmount(3, StaticFilters.FILTER_CONTROLLED_CREATURE);
|
|
||||||
target.withNotTarget(true);
|
|
||||||
target.withChooseHint("to distribute counters");
|
|
||||||
target.chooseTarget(outcome, player.getId(), source, game);
|
|
||||||
for (UUID targetId : target.getTargets()) {
|
|
||||||
Permanent permanent = game.getPermanent(targetId);
|
|
||||||
if (permanent != null) {
|
|
||||||
permanent.addCounters(CounterType.P1P1.createInstance(target.getTargetAmount(targetId)), source, game);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
package mage.cards.a;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect;
|
|
||||||
import mage.abilities.keyword.HasteAbility;
|
|
||||||
import mage.abilities.keyword.VigilanceAbility;
|
|
||||||
import mage.abilities.mana.AnyColorManaAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class AwakenedSkyclave extends CardImpl {
|
|
||||||
|
|
||||||
public AwakenedSkyclave(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.ELEMENTAL);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Vigilance
|
|
||||||
this.addAbility(VigilanceAbility.getInstance());
|
|
||||||
|
|
||||||
// Haste
|
|
||||||
this.addAbility(HasteAbility.getInstance());
|
|
||||||
|
|
||||||
// As long as Awakened Skyclave is on the battlefield, it's a land in addition to its other types.
|
|
||||||
this.addAbility(new SimpleStaticAbility(new AddCardTypeSourceEffect(Duration.WhileOnBattlefield, CardType.LAND)
|
|
||||||
.setText("as long as {this} is on the battlefield, it's a land in addition to its other types")));
|
|
||||||
|
|
||||||
// {T}: Add one mana of any color.
|
|
||||||
this.addAbility(new AnyColorManaAbility());
|
|
||||||
}
|
|
||||||
|
|
||||||
private AwakenedSkyclave(final AwakenedSkyclave card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AwakenedSkyclave copy() {
|
|
||||||
return new AwakenedSkyclave(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
package mage.cards.b;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
|
||||||
import mage.abilities.keyword.IndestructibleAbility;
|
|
||||||
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 java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class BelligerentRegisaur extends CardImpl {
|
|
||||||
|
|
||||||
public BelligerentRegisaur(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.DINOSAUR);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Trample
|
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
|
||||||
|
|
||||||
// Whenever you cast a spell, Belligerent Regisaur gains indestructible until end of turn.
|
|
||||||
this.addAbility(new SpellCastControllerTriggeredAbility(new GainAbilitySourceEffect(
|
|
||||||
IndestructibleAbility.getInstance(), Duration.EndOfTurn
|
|
||||||
), false));
|
|
||||||
}
|
|
||||||
|
|
||||||
private BelligerentRegisaur(final BelligerentRegisaur card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BelligerentRegisaur copy() {
|
|
||||||
return new BelligerentRegisaur(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
package mage.cards.b;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
|
||||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
|
||||||
import mage.abilities.keyword.WardAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.counters.CounterType;
|
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class BloomwielderDryads extends CardImpl {
|
|
||||||
|
|
||||||
public BloomwielderDryads(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.DRYAD);
|
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Ward {2}
|
|
||||||
this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}")));
|
|
||||||
|
|
||||||
// At the beginning of your end step, put a +1/+1 counter on target creature you control.
|
|
||||||
Ability ability = new BeginningOfEndStepTriggeredAbility(
|
|
||||||
new AddCountersTargetEffect(CounterType.P1P1.createInstance())
|
|
||||||
);
|
|
||||||
ability.addTarget(new TargetControlledCreaturePermanent());
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private BloomwielderDryads(final BloomwielderDryads card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BloomwielderDryads copy() {
|
|
||||||
return new BloomwielderDryads(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
package mage.cards.c;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.effects.common.UntapTargetEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect;
|
|
||||||
import mage.abilities.keyword.ConvokeAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.filter.common.FilterNonlandCard;
|
|
||||||
import mage.filter.predicate.Predicates;
|
|
||||||
import mage.filter.predicate.mageobject.AbilityPredicate;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class CaetusSeaTyrantOfSegovia extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterNonlandCard filter = new FilterNonlandCard("noncreature spells you cast");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
|
|
||||||
filter.add(Predicates.not(new AbilityPredicate(ConvokeAbility.class))); // So there are not redundant copies being added to each card
|
|
||||||
}
|
|
||||||
|
|
||||||
public CaetusSeaTyrantOfSegovia(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
|
||||||
this.subtype.add(SubType.SERPENT);
|
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Noncreature spells you cast have convoke.
|
|
||||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledSpellsEffect(new ConvokeAbility(), filter)));
|
|
||||||
|
|
||||||
// At the beginning of your end step, untap up to four target creatures.
|
|
||||||
Ability ability = new BeginningOfEndStepTriggeredAbility(
|
|
||||||
new UntapTargetEffect()
|
|
||||||
);
|
|
||||||
ability.addTarget(new TargetCreaturePermanent(0, 4));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private CaetusSeaTyrantOfSegovia(final CaetusSeaTyrantOfSegovia card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CaetusSeaTyrantOfSegovia copy() {
|
|
||||||
return new CaetusSeaTyrantOfSegovia(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -8,6 +8,7 @@ import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.TransformSourceEffect;
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
import mage.abilities.keyword.DefenderAbility;
|
import mage.abilities.keyword.DefenderAbility;
|
||||||
import mage.abilities.keyword.MenaceAbility;
|
import mage.abilities.keyword.MenaceAbility;
|
||||||
|
import mage.cards.Card;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.TransformingDoubleFacedCard;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -15,6 +16,7 @@ import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetCard;
|
import mage.target.TargetCard;
|
||||||
import mage.target.common.TargetOpponent;
|
import mage.target.common.TargetOpponent;
|
||||||
|
|
@ -83,7 +85,7 @@ class RevealingEyeEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(mage.game.Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Player controller = game.getPlayer(source.getControllerId());
|
Player controller = game.getPlayer(source.getControllerId());
|
||||||
Player opponent = game.getPlayer(source.getFirstTarget());
|
Player opponent = game.getPlayer(source.getFirstTarget());
|
||||||
if (controller == null || opponent == null) {
|
if (controller == null || opponent == null) {
|
||||||
|
|
@ -95,7 +97,7 @@ class RevealingEyeEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
TargetCard target = new TargetCard(0, 1, Zone.HAND, StaticFilters.FILTER_CARD_NON_LAND);
|
TargetCard target = new TargetCard(0, 1, Zone.HAND, StaticFilters.FILTER_CARD_NON_LAND);
|
||||||
controller.choose(outcome, opponent.getHand(), target, source, game);
|
controller.choose(outcome, opponent.getHand(), target, source, game);
|
||||||
mage.cards.Card card = game.getCard(target.getFirstTarget());
|
Card card = game.getCard(target.getFirstTarget());
|
||||||
if (card == null) {
|
if (card == null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
package mage.cards.d;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.MageObjectReference;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.abilities.keyword.TrampleAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.target.common.TargetAnyTarget;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class DefiantThundermaw extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterControlledCreaturePermanent filter
|
|
||||||
= new FilterControlledCreaturePermanent(SubType.DRAGON);
|
|
||||||
|
|
||||||
public DefiantThundermaw(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.DRAGON);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Trample
|
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
|
||||||
|
|
||||||
// Whenever a Dragon you control attacks, it deals 2 damage to any target.
|
|
||||||
Ability ability = new AttacksCreatureYouControlTriggeredAbility(
|
|
||||||
new DefiantThundermawEffect(), false, filter
|
|
||||||
);
|
|
||||||
ability.addTarget(new TargetAnyTarget());
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DefiantThundermaw(final DefiantThundermaw card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DefiantThundermaw copy() {
|
|
||||||
return new DefiantThundermaw(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DefiantThundermawEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
DefiantThundermawEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "it deals 2 damage to any target";
|
|
||||||
}
|
|
||||||
|
|
||||||
private DefiantThundermawEffect(final DefiantThundermawEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DefiantThundermawEffect copy() {
|
|
||||||
return new DefiantThundermawEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
MageObjectReference mor = (MageObjectReference) getValue("attackerRef");
|
|
||||||
if (mor == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
game.damagePlayerOrPermanent(
|
|
||||||
getTargetPointer().getFirst(game, source), 2,
|
|
||||||
mor.getSourceId(), source, game, false, true
|
|
||||||
);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
package mage.cards.d;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
|
||||||
import mage.cards.Card;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.token.ZombieToken;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.common.TargetCardInGraveyard;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class DelugeOfTheDead extends CardImpl {
|
|
||||||
|
|
||||||
public DelugeOfTheDead(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
|
|
||||||
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// When Deluge of the Dead enters the battlefield, create two 2/2 black Zombie creature tokens.
|
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 2)));
|
|
||||||
|
|
||||||
// {2}{B}: Exile target card from a graveyard. If it was a creature card, create a 2/2 black Zombie creature token.
|
|
||||||
Ability ability = new SimpleActivatedAbility(new DelugeOfTheDeadEffect(), new ManaCostsImpl<>("{2}{B}"));
|
|
||||||
ability.addTarget(new TargetCardInGraveyard());
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DelugeOfTheDead(final DelugeOfTheDead card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DelugeOfTheDead copy() {
|
|
||||||
return new DelugeOfTheDead(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DelugeOfTheDeadEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
DelugeOfTheDeadEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "exile target card from a graveyard. " +
|
|
||||||
"If it was a creature card, create a 2/2 black Zombie creature token";
|
|
||||||
}
|
|
||||||
|
|
||||||
private DelugeOfTheDeadEffect(final DelugeOfTheDeadEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DelugeOfTheDeadEffect copy() {
|
|
||||||
return new DelugeOfTheDeadEffect(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;
|
|
||||||
}
|
|
||||||
player.moveCards(card, Zone.EXILED, source, game);
|
|
||||||
if (card.isCreature(game)) {
|
|
||||||
new ZombieToken().putOntoBattlefield(1, game, source);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -3,22 +3,28 @@ package mage.cards.d;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.common.SagaAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.common.MyTurnCondition;
|
import mage.abilities.condition.common.MyTurnCondition;
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
|
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
|
||||||
|
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.TransformingDoubleFacedCard;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.permanent.token.WaylayToken;
|
import mage.game.permanent.token.WaylayToken;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -63,25 +69,25 @@ public final class DionBahamutsDominant extends TransformingDoubleFacedCard {
|
||||||
this.getRightHalfCard().setPT(5, 5);
|
this.getRightHalfCard().setPT(5, 5);
|
||||||
|
|
||||||
// (As this Saga enters and after your draw step, add a lore counter.)
|
// (As this Saga enters and after your draw step, add a lore counter.)
|
||||||
mage.abilities.common.SagaAbility sagaAbility = new mage.abilities.common.SagaAbility(this.getRightHalfCard());
|
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
|
||||||
|
|
||||||
// I, II -- Wings of Light -- Put a +1/+1 counter on each other creature you control. Those creatures gain flying until end of turn.
|
// I, II -- Wings of Light -- Put a +1/+1 counter on each other creature you control. Those creatures gain flying until end of turn.
|
||||||
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, ability3 -> {
|
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, ability3 -> {
|
||||||
ability3.addEffect(new mage.abilities.effects.common.counter.AddCountersAllEffect(
|
ability3.addEffect(new AddCountersAllEffect(
|
||||||
CounterType.P1P1.createInstance(), mage.filter.StaticFilters.FILTER_OTHER_CONTROLLED_CREATURE
|
CounterType.P1P1.createInstance(), StaticFilters.FILTER_OTHER_CONTROLLED_CREATURE
|
||||||
));
|
));
|
||||||
ability3.addEffect(new mage.abilities.effects.common.continuous.GainAbilityControlledEffect(
|
ability3.addEffect(new GainAbilityControlledEffect(
|
||||||
FlyingAbility.getInstance(), Duration.EndOfTurn,
|
FlyingAbility.getInstance(), Duration.EndOfTurn,
|
||||||
mage.filter.StaticFilters.FILTER_CONTROLLED_CREATURE
|
StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||||
).setText("Those creatures gain flying until end of turn"));
|
).setText("Those creatures gain flying until end of turn"));
|
||||||
ability3.withFlavorWord("Wings of Light");
|
ability3.withFlavorWord("Wings of Light");
|
||||||
});
|
});
|
||||||
|
|
||||||
// III -- Gigaflare -- Destroy target permanent. Exile Bahamut, then return it to the battlefield.
|
// III -- Gigaflare -- Destroy target permanent. Exile Bahamut, then return it to the battlefield.
|
||||||
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_III, ability4 -> {
|
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_III, ability4 -> {
|
||||||
ability4.addEffect(new mage.abilities.effects.common.DestroyTargetEffect());
|
ability4.addEffect(new DestroyTargetEffect());
|
||||||
ability4.addEffect(new mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect());
|
ability4.addEffect(new ExileSourceAndReturnFaceUpEffect());
|
||||||
ability4.addTarget(new mage.target.TargetPermanent());
|
ability4.addTarget(new TargetPermanent());
|
||||||
ability4.withFlavorWord("Gigaflare");
|
ability4.withFlavorWord("Gigaflare");
|
||||||
});
|
});
|
||||||
this.getRightHalfCard().addAbility(sagaAbility);
|
this.getRightHalfCard().addAbility(sagaAbility);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,13 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||||
|
import mage.abilities.costs.Cost;
|
||||||
import mage.abilities.costs.SacrificeCost;
|
import mage.abilities.costs.SacrificeCost;
|
||||||
import mage.abilities.costs.UseAttachedCost;
|
import mage.abilities.costs.UseAttachedCost;
|
||||||
|
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||||
import mage.abilities.effects.ContinuousEffectImpl;
|
import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
import mage.abilities.effects.common.DamageWithPowerFromSourceToAnotherTargetEffect;
|
import mage.abilities.effects.common.DamageWithPowerFromSourceToAnotherTargetEffect;
|
||||||
import mage.abilities.effects.common.DoWhenCostPaid;
|
import mage.abilities.effects.common.DoWhenCostPaid;
|
||||||
|
|
@ -116,7 +119,7 @@ class DireBlunderbussGainAbilityEffect extends ContinuousEffectImpl {
|
||||||
new DamageWithPowerFromSourceToAnotherTargetEffect("this creature"), false
|
new DamageWithPowerFromSourceToAnotherTargetEffect("this creature"), false
|
||||||
);
|
);
|
||||||
reflexive.addTarget(new TargetCreaturePermanent());
|
reflexive.addTarget(new TargetCreaturePermanent());
|
||||||
Ability grant = new mage.abilities.common.AttacksTriggeredAbility(
|
Ability grant = new AttacksTriggeredAbility(
|
||||||
new DoWhenCostPaid(
|
new DoWhenCostPaid(
|
||||||
reflexive, new DireBlunderbussSacrificeCost(source, game),
|
reflexive, new DireBlunderbussSacrificeCost(source, game),
|
||||||
"Sacrifice an artifact other than the equipment?"
|
"Sacrifice an artifact other than the equipment?"
|
||||||
|
|
@ -129,7 +132,7 @@ class DireBlunderbussGainAbilityEffect extends ContinuousEffectImpl {
|
||||||
|
|
||||||
class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeCost {
|
class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeCost {
|
||||||
|
|
||||||
private final mage.abilities.costs.common.SacrificeTargetCost sacrificeCost;
|
private final SacrificeTargetCost sacrificeCost;
|
||||||
private final mage.MageObjectReference mageObjectReference;
|
private final mage.MageObjectReference mageObjectReference;
|
||||||
|
|
||||||
DireBlunderbussSacrificeCost(Ability source, Game game) {
|
DireBlunderbussSacrificeCost(Ability source, Game game) {
|
||||||
|
|
@ -137,7 +140,7 @@ class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeC
|
||||||
this.mageObjectReference = new mage.MageObjectReference(source.getSourceObject(game), game);
|
this.mageObjectReference = new mage.MageObjectReference(source.getSourceObject(game), game);
|
||||||
FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent();
|
FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent();
|
||||||
filter.add(Predicates.not(new MageObjectReferencePredicate(this.mageObjectReference)));
|
filter.add(Predicates.not(new MageObjectReferencePredicate(this.mageObjectReference)));
|
||||||
this.sacrificeCost = new mage.abilities.costs.common.SacrificeTargetCost(filter);
|
this.sacrificeCost = new SacrificeTargetCost(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private DireBlunderbussSacrificeCost(final DireBlunderbussSacrificeCost cost) {
|
private DireBlunderbussSacrificeCost(final DireBlunderbussSacrificeCost cost) {
|
||||||
|
|
@ -152,7 +155,7 @@ class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeC
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, mage.abilities.costs.Cost costToPay) {
|
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
|
||||||
Permanent equipment = game.getPermanent(source.getSourceId());
|
Permanent equipment = game.getPermanent(source.getSourceId());
|
||||||
if (equipment == null) {
|
if (equipment == null) {
|
||||||
return paid;
|
return paid;
|
||||||
|
|
|
||||||
|
|
@ -1,113 +0,0 @@
|
||||||
package mage.cards.d;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.MageObject;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.effects.ReplacementEffectImpl;
|
|
||||||
import mage.abilities.keyword.ProwessAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.util.CardUtil;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class DisciplesOfTheInferno extends CardImpl {
|
|
||||||
|
|
||||||
public DisciplesOfTheInferno(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.HUMAN);
|
|
||||||
this.subtype.add(SubType.MONK);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Prowess
|
|
||||||
this.addAbility(new ProwessAbility());
|
|
||||||
|
|
||||||
// If a noncreature source you control would deal damage to a creature, battle, or opponent, it deals that much damage plus 2 instead.
|
|
||||||
this.addAbility(new SimpleStaticAbility(new DisciplesOfTheInfernoEffect()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private DisciplesOfTheInferno(final DisciplesOfTheInferno card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DisciplesOfTheInferno copy() {
|
|
||||||
return new DisciplesOfTheInferno(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DisciplesOfTheInfernoEffect extends ReplacementEffectImpl {
|
|
||||||
|
|
||||||
DisciplesOfTheInfernoEffect() {
|
|
||||||
super(Duration.WhileOnBattlefield, Outcome.Damage);
|
|
||||||
this.staticText = "if a noncreature source you control would deal damage " +
|
|
||||||
"to a creature, battle, or opponent, it deals that much damage plus 2 instead";
|
|
||||||
}
|
|
||||||
|
|
||||||
private DisciplesOfTheInfernoEffect(final DisciplesOfTheInfernoEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
|
||||||
event.setAmount(CardUtil.overflowInc(event.getAmount(), 2));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean checksEventType(GameEvent event, Game game) {
|
|
||||||
switch (event.getType()) {
|
|
||||||
case DAMAGE_PERMANENT:
|
|
||||||
case DAMAGE_PLAYER:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
|
||||||
Player controller = game.getPlayer(source.getControllerId());
|
|
||||||
if (controller == null || !controller.hasOpponent(event.getTargetId(), game)
|
|
||||||
&& Optional
|
|
||||||
.of(event.getTargetId())
|
|
||||||
.map(game::getPermanent)
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.map(permanent -> !permanent.isCreature(game) && !permanent.isBattle(game))
|
|
||||||
.orElse(true)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
MageObject sourceObject;
|
|
||||||
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
|
||||||
if (sourcePermanent == null) {
|
|
||||||
sourceObject = game.getObject(event.getSourceId());
|
|
||||||
} else {
|
|
||||||
sourceObject = sourcePermanent;
|
|
||||||
}
|
|
||||||
return sourceObject != null
|
|
||||||
&& !sourceObject.isCreature(game)
|
|
||||||
&& event.getAmount() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DisciplesOfTheInfernoEffect copy() {
|
|
||||||
return new DisciplesOfTheInfernoEffect(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,7 +2,10 @@ package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.AttacksTriggeredAbility;
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
import mage.abilities.effects.common.TapTargetEffect;
|
import mage.abilities.effects.common.TapTargetEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||||
import mage.abilities.keyword.DisturbAbility;
|
import mage.abilities.keyword.DisturbAbility;
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
|
@ -50,7 +53,7 @@ public final class DistractingGeist extends TransformingDoubleFacedCard {
|
||||||
// Enchant creature
|
// Enchant creature
|
||||||
TargetPermanent auraTarget = new TargetCreaturePermanent();
|
TargetPermanent auraTarget = new TargetCreaturePermanent();
|
||||||
this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
|
this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
|
||||||
this.getRightHalfCard().getSpellAbility().addEffect(new mage.abilities.effects.common.AttachEffect(Outcome.BoostCreature));
|
this.getRightHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
|
||||||
this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
|
this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
|
||||||
|
|
||||||
// Disturb {4}{W}
|
// Disturb {4}{W}
|
||||||
|
|
@ -60,7 +63,7 @@ public final class DistractingGeist extends TransformingDoubleFacedCard {
|
||||||
// Enchanted creature has "Whenever this creature attacks, tap target creature defending player controls."
|
// Enchanted creature has "Whenever this creature attacks, tap target creature defending player controls."
|
||||||
Ability ability2 = new AttacksTriggeredAbility(new TapTargetEffect()).setTriggerPhrase("Whenever this creature attacks, ");
|
Ability ability2 = new AttacksTriggeredAbility(new TapTargetEffect()).setTriggerPhrase("Whenever this creature attacks, ");
|
||||||
ability2.addTarget(new TargetPermanent(filter));
|
ability2.addTarget(new TargetPermanent(filter));
|
||||||
this.getRightHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility(new mage.abilities.effects.common.continuous.GainAbilityAttachedEffect(ability2, AttachmentType.AURA)));
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect(ability2, AttachmentType.AURA)));
|
||||||
|
|
||||||
// If Clever Distracting would be put into a graveyard from anywhere, exile it instead.
|
// If Clever Distracting would be put into a graveyard from anywhere, exile it instead.
|
||||||
this.getRightHalfCard().addAbility(DisturbAbility.makeBackAbility());
|
this.getRightHalfCard().addAbility(DisturbAbility.makeBackAbility());
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,13 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||||
import mage.abilities.effects.common.TransformSourceEffect;
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.TransformingDoubleFacedCard;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
|
|
@ -12,6 +15,7 @@ import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
|
@ -46,12 +50,12 @@ public final class DormantGrove extends TransformingDoubleFacedCard {
|
||||||
this.getRightHalfCard().setPT(3, 6);
|
this.getRightHalfCard().setPT(3, 6);
|
||||||
|
|
||||||
// Vigilance
|
// Vigilance
|
||||||
this.getRightHalfCard().addAbility(mage.abilities.keyword.VigilanceAbility.getInstance());
|
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
|
||||||
|
|
||||||
// Other creatures you control have vigilance.
|
// Other creatures you control have vigilance.
|
||||||
this.getRightHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility(new mage.abilities.effects.common.continuous.GainAbilityControlledEffect(
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||||
mage.abilities.keyword.VigilanceAbility.getInstance(), Duration.WhileOnBattlefield,
|
VigilanceAbility.getInstance(), Duration.WhileOnBattlefield,
|
||||||
mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES, true
|
StaticFilters.FILTER_PERMANENT_CREATURES, true
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,15 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.AttacksOrBlocksTriggeredAbility;
|
import mage.abilities.common.AttacksOrBlocksTriggeredAbility;
|
||||||
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
|
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.AttachEffect;
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
||||||
import mage.abilities.effects.common.SacrificeSourceEffect;
|
import mage.abilities.effects.common.SacrificeSourceEffect;
|
||||||
|
import mage.abilities.effects.common.SacrificeTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||||
import mage.abilities.keyword.DisturbAbility;
|
import mage.abilities.keyword.DisturbAbility;
|
||||||
import mage.abilities.keyword.EnchantAbility;
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
|
|
@ -13,8 +17,12 @@ import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.TransformingDoubleFacedCard;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.token.DorotheasRetributionSpiritToken;
|
||||||
|
import mage.game.permanent.token.Token;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
import mage.target.targetpointer.FixedTargets;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -54,7 +62,7 @@ public final class DorotheaVengefulVictim extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
// Enchanted creature has "Whenever this creature attacks, create a 4/4 white Spirit creature token with flying that's tapped and attacking. Sacrifice that token at end of combat."
|
// Enchanted creature has "Whenever this creature attacks, create a 4/4 white Spirit creature token with flying that's tapped and attacking. Sacrifice that token at end of combat."
|
||||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect(
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect(
|
||||||
new mage.abilities.common.AttacksTriggeredAbility(new DorotheasRetributionEffect()).setTriggerPhrase("Whenever this creature attacks, "),
|
new AttacksTriggeredAbility(new DorotheasRetributionEffect()).setTriggerPhrase("Whenever this creature attacks, "),
|
||||||
AttachmentType.AURA
|
AttachmentType.AURA
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
|
@ -72,7 +80,7 @@ public final class DorotheaVengefulVictim extends TransformingDoubleFacedCard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DorotheasRetributionEffect extends mage.abilities.effects.OneShotEffect {
|
class DorotheasRetributionEffect extends OneShotEffect {
|
||||||
|
|
||||||
DorotheasRetributionEffect() {
|
DorotheasRetributionEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
|
|
@ -89,12 +97,12 @@ class DorotheasRetributionEffect extends mage.abilities.effects.OneShotEffect {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(mage.game.Game game, mage.abilities.Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
mage.game.permanent.token.Token token = new mage.game.permanent.token.DorotheasRetributionSpiritToken();
|
Token token = new DorotheasRetributionSpiritToken();
|
||||||
token.putOntoBattlefield(1, game, source, source.getControllerId(), true, true);
|
token.putOntoBattlefield(1, game, source, source.getControllerId(), true, true);
|
||||||
game.addDelayedTriggeredAbility(new AtTheEndOfCombatDelayedTriggeredAbility(
|
game.addDelayedTriggeredAbility(new AtTheEndOfCombatDelayedTriggeredAbility(
|
||||||
new mage.abilities.effects.common.SacrificeTargetEffect()
|
new SacrificeTargetEffect()
|
||||||
.setTargetPointer(new mage.target.targetpointer.FixedTargets(token, game))
|
.setTargetPointer(new FixedTargets(token, game))
|
||||||
.setText("sacrifice that token")
|
.setText("sacrifice that token")
|
||||||
), source);
|
), source);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,15 @@ package mage.cards.d;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
|
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
import mage.abilities.effects.common.CreateTokenTargetEffect;
|
import mage.abilities.effects.common.CreateTokenTargetEffect;
|
||||||
import mage.abilities.effects.common.TransformSourceEffect;
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
||||||
|
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
|
||||||
import mage.abilities.keyword.EquipAbility;
|
import mage.abilities.keyword.EquipAbility;
|
||||||
|
import mage.abilities.mana.SimpleManaAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.TransformingDoubleFacedCard;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -35,17 +40,17 @@ public final class DowsingDagger extends TransformingDoubleFacedCard {
|
||||||
this.getLeftHalfCard().addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
// Equipped creature gets +2/+1.
|
// Equipped creature gets +2/+1.
|
||||||
this.getLeftHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility(new BoostEquippedEffect(2, 1)));
|
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new BoostEquippedEffect(2, 1)));
|
||||||
|
|
||||||
// Whenever equipped creature deals combat damage to a player, you may transform Dowsing Dagger.
|
// Whenever equipped creature deals combat damage to a player, you may transform Dowsing Dagger.
|
||||||
this.getLeftHalfCard().addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new TransformSourceEffect(), "equipped", true));
|
this.getLeftHalfCard().addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new TransformSourceEffect(), "equipped", true));
|
||||||
|
|
||||||
// Equip 2
|
// Equip 2
|
||||||
this.getLeftHalfCard().addAbility(new EquipAbility(Outcome.AddAbility, new mage.abilities.costs.mana.GenericManaCost(2), false));
|
this.getLeftHalfCard().addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2), false));
|
||||||
|
|
||||||
// Lost Vale
|
// Lost Vale
|
||||||
// T: Add three mana of any one color.
|
// T: Add three mana of any one color.
|
||||||
this.getRightHalfCard().addAbility(new mage.abilities.mana.SimpleManaAbility(new mage.abilities.effects.mana.AddManaOfAnyColorEffect(3), new mage.abilities.costs.common.TapSourceCost()));
|
this.getRightHalfCard().addAbility(new SimpleManaAbility(new AddManaOfAnyColorEffect(3), new TapSourceCost()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private DowsingDagger(final DowsingDagger card) {
|
private DowsingDagger(final DowsingDagger card) {
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,21 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||||
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||||
|
import mage.abilities.dynamicvalue.common.ArtifactYouControlCount;
|
||||||
|
import mage.abilities.dynamicvalue.common.StaticValue;
|
||||||
import mage.abilities.effects.common.TransformSourceEffect;
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||||
import mage.abilities.hint.common.ArtifactYouControlHint;
|
import mage.abilities.hint.common.ArtifactYouControlHint;
|
||||||
import mage.abilities.keyword.HasteAbility;
|
import mage.abilities.keyword.HasteAbility;
|
||||||
|
import mage.abilities.mana.RedManaAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.TransformingDoubleFacedCard;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
|
@ -17,6 +23,7 @@ import mage.constants.ComparisonType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.common.TargetControlledCreaturePermanent;
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -52,16 +59,16 @@ public final class DowsingDevice extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
// Geode Grotto
|
// Geode Grotto
|
||||||
// {T}: Add {R}.
|
// {T}: Add {R}.
|
||||||
this.getRightHalfCard().addAbility(new mage.abilities.mana.RedManaAbility());
|
this.getRightHalfCard().addAbility(new RedManaAbility());
|
||||||
|
|
||||||
// {2}{R}, {T}: Until end of turn, target creature gains haste and gets +X/+0, where X is the number of artifacts you control. Activate only as a sorcery.
|
// {2}{R}, {T}: Until end of turn, target creature gains haste and gets +X/+0, where X is the number of artifacts you control. Activate only as a sorcery.
|
||||||
Ability ability2 = new mage.abilities.common.ActivateAsSorceryActivatedAbility(new GainAbilityTargetEffect(HasteAbility.getInstance())
|
Ability ability2 = new ActivateAsSorceryActivatedAbility(new GainAbilityTargetEffect(HasteAbility.getInstance())
|
||||||
.setText("Until end of turn, target creature gains haste"), new mage.abilities.costs.mana.ManaCostsImpl<>("{2}{R}"));
|
.setText("Until end of turn, target creature gains haste"), new ManaCostsImpl<>("{2}{R}"));
|
||||||
ability2.addCost(new mage.abilities.costs.common.TapSourceCost());
|
ability2.addCost(new TapSourceCost());
|
||||||
ability2.addEffect(new mage.abilities.effects.common.continuous.BoostTargetEffect(
|
ability2.addEffect(new BoostTargetEffect(
|
||||||
mage.abilities.dynamicvalue.common.ArtifactYouControlCount.instance, mage.abilities.dynamicvalue.common.StaticValue.get(0)
|
ArtifactYouControlCount.instance, StaticValue.get(0)
|
||||||
).setText("and gets +X/+0, where X is the number of artifacts you control"));
|
).setText("and gets +X/+0, where X is the number of artifacts you control"));
|
||||||
ability2.addTarget(new mage.target.common.TargetCreaturePermanent());
|
ability2.addTarget(new TargetCreaturePermanent());
|
||||||
this.getRightHalfCard().addAbility(ability2.addHint(ArtifactYouControlHint.instance));
|
this.getRightHalfCard().addAbility(ability2.addHint(ArtifactYouControlHint.instance));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,19 @@ package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
||||||
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||||
|
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.TransformingDoubleFacedCard;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.PutCards;
|
import mage.constants.PutCards;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.filter.common.FilterCreatureCard;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -43,8 +46,8 @@ public final class DuskwatchRecruiter extends TransformingDoubleFacedCard {
|
||||||
this.getRightHalfCard().setPT(3, 3);
|
this.getRightHalfCard().setPT(3, 3);
|
||||||
|
|
||||||
// Creature spells you cast cost {1} less to cast.
|
// Creature spells you cast cost {1} less to cast.
|
||||||
this.getRightHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility(
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(
|
||||||
new mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect(new mage.filter.common.FilterCreatureCard("creature spells"), 1)
|
new SpellsCostReductionControllerEffect(new FilterCreatureCard("creature spells"), 1)
|
||||||
));
|
));
|
||||||
|
|
||||||
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Krallenhorde Howler.
|
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Krallenhorde Howler.
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.TransformSourceEffect;
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
import mage.abilities.keyword.EquipAbility;
|
import mage.abilities.keyword.EquipAbility;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.abilities.keyword.IntimidateAbility;
|
import mage.abilities.keyword.IntimidateAbility;
|
||||||
|
|
@ -98,7 +99,7 @@ class ElbrusTheBindingBladeEffect extends OneShotEffect {
|
||||||
class WithengarUnboundTriggeredAbility extends TriggeredAbilityImpl {
|
class WithengarUnboundTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
|
|
||||||
WithengarUnboundTriggeredAbility() {
|
WithengarUnboundTriggeredAbility() {
|
||||||
super(Zone.BATTLEFIELD, new mage.abilities.effects.common.counter.AddCountersSourceEffect(CounterType.P1P1.createInstance(13)), false);
|
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(13)), false);
|
||||||
setTriggerPhrase("Whenever a player loses the game, ");
|
setTriggerPhrase("Whenever a player loses the game, ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
package mage.cards.e;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.condition.Condition;
|
|
||||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
|
||||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
|
||||||
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
|
||||||
import mage.abilities.hint.Hint;
|
|
||||||
import mage.abilities.hint.ValueHint;
|
|
||||||
import mage.abilities.keyword.IndestructibleAbility;
|
|
||||||
import mage.abilities.keyword.LifelinkAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.ComparisonType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.common.FilterControlledEnchantmentPermanent;
|
|
||||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class EpharaEverSheltering extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterControlledEnchantmentPermanent("another enchantment");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(AnotherPredicate.instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
|
|
||||||
filter, ComparisonType.MORE_THAN, 2, true
|
|
||||||
);
|
|
||||||
private static final Hint hint = new ValueHint(
|
|
||||||
"Other enchantments you control", new PermanentsOnBattlefieldCount(filter)
|
|
||||||
);
|
|
||||||
|
|
||||||
public EpharaEverSheltering(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
|
||||||
this.subtype.add(SubType.GOD);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Ephara, Ever-Sheltering has lifelink and indestructible as long as you control at least three other enchantments.
|
|
||||||
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
|
|
||||||
new GainAbilitySourceEffect(LifelinkAbility.getInstance()),
|
|
||||||
condition, "{this} has lifelink"
|
|
||||||
));
|
|
||||||
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(
|
|
||||||
IndestructibleAbility.getInstance()), condition,
|
|
||||||
"and indestructible as long as you control at least three other enchantments"
|
|
||||||
));
|
|
||||||
this.addAbility(ability.addHint(hint));
|
|
||||||
|
|
||||||
// Whenever another enchantment you control enters, draw a card.
|
|
||||||
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new DrawCardSourceControllerEffect(1), filter));
|
|
||||||
}
|
|
||||||
|
|
||||||
private EpharaEverSheltering(final EpharaEverSheltering card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EpharaEverSheltering copy() {
|
|
||||||
return new EpharaEverSheltering(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
package mage.cards.g;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
|
||||||
import mage.abilities.keyword.TrampleAbility;
|
|
||||||
import mage.abilities.keyword.WardAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.predicate.permanent.TransformedPredicate;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class GargantuanSlabhorn extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterPermanent("transformed permanents");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(TransformedPredicate.instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
public GargantuanSlabhorn(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.BEAST);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Trample
|
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
|
||||||
|
|
||||||
// Ward {2}
|
|
||||||
this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false));
|
|
||||||
|
|
||||||
// Other transformed permanents you control have trample and ward {2}.
|
|
||||||
Ability ability = new SimpleStaticAbility(new GainAbilityControlledEffect(
|
|
||||||
TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true
|
|
||||||
));
|
|
||||||
ability.addEffect(new GainAbilityControlledEffect(
|
|
||||||
new WardAbility(new GenericManaCost(2)), Duration.WhileOnBattlefield, filter, true
|
|
||||||
).setText("and ward {2}"));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private GargantuanSlabhorn(final GargantuanSlabhorn card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public GargantuanSlabhorn copy() {
|
|
||||||
return new GargantuanSlabhorn(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
package mage.cards.g;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.GainLifeEffect;
|
|
||||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.counters.CounterType;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class GrandmotherRaviSengir extends CardImpl {
|
|
||||||
|
|
||||||
public GrandmotherRaviSengir(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.WIZARD);
|
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Whenever a creature an opponent controls dies, put a +1/+1 counter on Grandmother Ravi Sengir and you gain 1 life.
|
|
||||||
Ability ability = new DiesCreatureTriggeredAbility(
|
|
||||||
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
|
||||||
false, StaticFilters.FILTER_OPPONENTS_PERMANENT_A_CREATURE
|
|
||||||
);
|
|
||||||
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private GrandmotherRaviSengir(final GrandmotherRaviSengir card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public GrandmotherRaviSengir copy() {
|
|
||||||
return new GrandmotherRaviSengir(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
package mage.cards.g;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.MageObject;
|
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.PutCards;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.filter.FilterSpell;
|
|
||||||
import mage.filter.predicate.Predicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class GuildpactParagon extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterSpell filter = new FilterSpell("a spell that's exactly two colors");
|
|
||||||
private static final FilterCard filter2 = new FilterCard("a card that's exactly two colors");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(GuildpactParagonPredicate.instance);
|
|
||||||
filter2.add(GuildpactParagonPredicate.instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuildpactParagon(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.CONSTRUCT);
|
|
||||||
this.power = new MageInt(5);
|
|
||||||
this.toughness = new MageInt(5);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Whenever you cast a spell that's exactly two colors, look at the top six cards of your library. You may reveal a card that's exactly two colors from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
|
|
||||||
this.addAbility(new SpellCastControllerTriggeredAbility(new LookLibraryAndPickControllerEffect(
|
|
||||||
6, 1, filter2, PutCards.HAND, PutCards.BOTTOM_RANDOM
|
|
||||||
), filter, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
private GuildpactParagon(final GuildpactParagon card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public GuildpactParagon copy() {
|
|
||||||
return new GuildpactParagon(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum GuildpactParagonPredicate implements Predicate<MageObject> {
|
|
||||||
instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(MageObject input, Game game) {
|
|
||||||
return input.getColor(game).getColorCount() == 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
package mage.cards.h;
|
package mage.cards.h;
|
||||||
|
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||||
|
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.TransformSourceEffect;
|
import mage.abilities.effects.common.TransformSourceEffect;
|
||||||
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
||||||
|
|
@ -45,8 +47,8 @@ public final class HanweirMilitiaCaptain extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
// Westvale Cult Leader
|
// Westvale Cult Leader
|
||||||
// Westvale Cult Leader's power and toughness are each equal to the number of creatures you control.
|
// Westvale Cult Leader's power and toughness are each equal to the number of creatures you control.
|
||||||
this.getRightHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility(Zone.ALL,
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(Zone.ALL,
|
||||||
new SetBasePowerToughnessSourceEffect(mage.abilities.dynamicvalue.common.CreaturesYouControlCount.PLURAL))
|
new SetBasePowerToughnessSourceEffect(CreaturesYouControlCount.PLURAL))
|
||||||
.addHint(CreaturesYouControlHint.instance));
|
.addHint(CreaturesYouControlHint.instance));
|
||||||
|
|
||||||
// At the beginning of your end step, create a 1/1 white and black Human Cleric creature token.
|
// At the beginning of your end step, create a 1/1 white and black Human Cleric creature token.
|
||||||
|
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
package mage.cards.h;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.AttacksAttachedTriggeredAbility;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.keyword.EquipAbility;
|
|
||||||
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.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class HolyFrazzleCannon extends CardImpl {
|
|
||||||
|
|
||||||
public HolyFrazzleCannon(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.EQUIPMENT);
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Whenever equipped creature attacks, put a +1/+1 counter on that creature and each other creature you control that shares a creature type with it.
|
|
||||||
this.addAbility(new AttacksAttachedTriggeredAbility(
|
|
||||||
new HolyFrazzleCannonEffect(), AttachmentType.EQUIPMENT,
|
|
||||||
false, SetTargetPointer.PERMANENT
|
|
||||||
));
|
|
||||||
|
|
||||||
// Equip {1}
|
|
||||||
this.addAbility(new EquipAbility(1, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
private HolyFrazzleCannon(final HolyFrazzleCannon card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public HolyFrazzleCannon copy() {
|
|
||||||
return new HolyFrazzleCannon(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HolyFrazzleCannonEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
HolyFrazzleCannonEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "put a +1/+1 counter on that creature and " +
|
|
||||||
"each other creature you control that shares a creature type with it";
|
|
||||||
}
|
|
||||||
|
|
||||||
private HolyFrazzleCannonEffect(final HolyFrazzleCannonEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public HolyFrazzleCannonEffect copy() {
|
|
||||||
return new HolyFrazzleCannonEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
|
||||||
if (permanent == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (Permanent creature : game.getBattlefield().getActivePermanents(
|
|
||||||
StaticFilters.FILTER_CONTROLLED_CREATURE, source.getControllerId(), source, game
|
|
||||||
)) {
|
|
||||||
if (creature.equals(permanent) || permanent.shareCreatureTypes(game, creature)) {
|
|
||||||
creature.addCounters(CounterType.P1P1.createInstance(), source, game);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
package mage.cards.h;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.DealtDamageAnyTriggeredAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
|
||||||
import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
|
||||||
import mage.abilities.keyword.NightboundAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.SetTargetPointer;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.target.common.TargetAnyTarget;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class HowlpackAvenger extends CardImpl {
|
|
||||||
|
|
||||||
public HowlpackAvenger(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.WEREWOLF);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Whenever a permanent you control is dealt damage, Howlpack Avenger deals that much damage to any target.
|
|
||||||
Ability ability = new DealtDamageAnyTriggeredAbility(new DamageTargetEffect(SavedDamageValue.MUCH),
|
|
||||||
StaticFilters.FILTER_CONTROLLED_A_PERMANENT, SetTargetPointer.NONE, false);
|
|
||||||
ability.addTarget(new TargetAnyTarget());
|
|
||||||
this.addAbility(ability);
|
|
||||||
|
|
||||||
// {1}{R}: Howlpack Avenger gets +2/+0 until end of turn.
|
|
||||||
this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(
|
|
||||||
2, 0, Duration.EndOfTurn
|
|
||||||
), new ManaCostsImpl<>("{1}{R}")));
|
|
||||||
|
|
||||||
// Nightbound
|
|
||||||
this.addAbility(new NightboundAbility());
|
|
||||||
}
|
|
||||||
|
|
||||||
private HowlpackAvenger(final HowlpackAvenger card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public HowlpackAvenger copy() {
|
|
||||||
return new HowlpackAvenger(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -4,6 +4,7 @@ import mage.abilities.Ability;
|
||||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SagaAbility;
|
import mage.abilities.common.SagaAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
|
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
|
||||||
|
|
@ -67,7 +68,7 @@ public final class HuatliPoetOfUnity extends TransformingDoubleFacedCard {
|
||||||
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, new CreateTokenEffect(new DinosaurVanillaToken(), 2));
|
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, new CreateTokenEffect(new DinosaurVanillaToken(), 2));
|
||||||
|
|
||||||
// II -- {this} gains "Creatures you control have '{T}: Add {R}, {G}, or {W}.'"
|
// II -- {this} gains "Creatures you control have '{T}: Add {R}, {G}, or {W}.'"
|
||||||
Ability gainedAbility = new mage.abilities.common.SimpleStaticAbility(new GainAbilityControlledEffect(
|
Ability gainedAbility = new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||||
new RedManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false
|
new RedManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false
|
||||||
).setText("Creatures you control have '{T}: Add {R}"));
|
).setText("Creatures you control have '{T}: Add {R}"));
|
||||||
gainedAbility.addEffect(new GainAbilityControlledEffect(
|
gainedAbility.addEffect(new GainAbilityControlledEffect(
|
||||||
|
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
package mage.cards.i;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.AttacksTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.MayTapOrUntapTargetEffect;
|
|
||||||
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 TheElk801
|
|
||||||
*/
|
|
||||||
public final class IcebergTitan extends CardImpl {
|
|
||||||
|
|
||||||
public IcebergTitan(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.GOLEM);
|
|
||||||
this.power = new MageInt(6);
|
|
||||||
this.toughness = new MageInt(6);
|
|
||||||
this.nightCard = true;
|
|
||||||
this.color.setBlue(true);
|
|
||||||
|
|
||||||
// Whenever Iceberg Titan attacks, you may tap or untap target artifact or creature.
|
|
||||||
Ability ability = new AttacksTriggeredAbility(new MayTapOrUntapTargetEffect());
|
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private IcebergTitan(final IcebergTitan card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IcebergTitan copy() {
|
|
||||||
return new IcebergTitan(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,13 +1,18 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.EntersBattlefieldAttachToTarget;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
||||||
import mage.abilities.keyword.CraftAbility;
|
import mage.abilities.keyword.CraftAbility;
|
||||||
|
import mage.abilities.keyword.EquipAbility;
|
||||||
import mage.abilities.keyword.FlashAbility;
|
import mage.abilities.keyword.FlashAbility;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
import mage.target.common.TargetAnyTarget;
|
import mage.target.common.TargetAnyTarget;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -15,22 +20,36 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class IdolOfTheDeepKing extends CardImpl {
|
public final class IdolOfTheDeepKing extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public IdolOfTheDeepKing(UUID ownerId, CardSetInfo setInfo) {
|
public IdolOfTheDeepKing(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{R}");
|
super(ownerId, setInfo,
|
||||||
this.secondSideCardClazz = mage.cards.s.SovereignsMacuahuitl.class;
|
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}{R}",
|
||||||
|
"Sovereign's Macuahuitl",
|
||||||
|
new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.EQUIPMENT}, "R"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Idol of the Deep King
|
||||||
// Flash
|
// Flash
|
||||||
this.addAbility(FlashAbility.getInstance());
|
this.getLeftHalfCard().addAbility(FlashAbility.getInstance());
|
||||||
|
|
||||||
// When Idol of the Deep King enters the battlefield, it deals 2 damage to any target.
|
// When Idol of the Deep King enters the battlefield, it deals 2 damage to any target.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2));
|
||||||
ability.addTarget(new TargetAnyTarget());
|
ability.addTarget(new TargetAnyTarget());
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
// Craft with artifact {2}{R}
|
// Craft with artifact {2}{R}
|
||||||
this.addAbility(new CraftAbility("{2}{R}"));
|
this.getLeftHalfCard().addAbility(new CraftAbility("{2}{R}"));
|
||||||
|
|
||||||
|
// Sovereign's Macuahuitl
|
||||||
|
// When Sovereign's Macuahuitl enters the battlefield, attach it to target creature you control.
|
||||||
|
this.getRightHalfCard().addAbility(new EntersBattlefieldAttachToTarget());
|
||||||
|
|
||||||
|
// Equipped creature gets +2/+0.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new BoostEquippedEffect(2, 0)));
|
||||||
|
|
||||||
|
// Equip {2}
|
||||||
|
this.getRightHalfCard().addAbility(new EquipAbility(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IdolOfTheDeepKing(final IdolOfTheDeepKing card) {
|
private IdolOfTheDeepKing(final IdolOfTheDeepKing card) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.DealtDamageAnyTriggeredAbility;
|
||||||
import mage.abilities.common.DealtDamageToSourceTriggeredAbility;
|
import mage.abilities.common.DealtDamageToSourceTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
|
@ -9,11 +9,14 @@ import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
import mage.abilities.keyword.DayboundAbility;
|
import mage.abilities.keyword.DayboundAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.NightboundAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SetTargetPointer;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.common.TargetAnyTarget;
|
import mage.target.common.TargetAnyTarget;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -21,30 +24,48 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class IllTemperedLoner extends CardImpl {
|
public final class IllTemperedLoner extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public IllTemperedLoner(UUID ownerId, CardSetInfo setInfo) {
|
public IllTemperedLoner(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{R}{R}",
|
||||||
|
"Howlpack Avenger",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.HUMAN);
|
// Ill-Tempered Loner
|
||||||
this.subtype.add(SubType.WEREWOLF);
|
this.getLeftHalfCard().setPT(3, 3);
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.secondSideCardClazz = mage.cards.h.HowlpackAvenger.class;
|
|
||||||
|
|
||||||
// Whenever Ill-Tempered Loner is dealt damage, it deals that much damage to any target.
|
// Whenever Ill-Tempered Loner is dealt damage, it deals that much damage to any target.
|
||||||
Ability ability = new DealtDamageToSourceTriggeredAbility(
|
Ability ability = new DealtDamageToSourceTriggeredAbility(
|
||||||
new DamageTargetEffect(SavedDamageValue.MUCH, "it"), false);
|
new DamageTargetEffect(SavedDamageValue.MUCH, "it"), false);
|
||||||
ability.addTarget(new TargetAnyTarget());
|
ability.addTarget(new TargetAnyTarget());
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
// {1}{R}: Ill-Tempered Loner gets +2/+0 until end of turn.
|
// {1}{R}: Ill-Tempered Loner gets +2/+0 until end of turn.
|
||||||
this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(
|
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new BoostSourceEffect(
|
||||||
2, 0, Duration.EndOfTurn
|
2, 0, Duration.EndOfTurn
|
||||||
), new ManaCostsImpl<>("{1}{R}")));
|
), new ManaCostsImpl<>("{1}{R}")));
|
||||||
|
|
||||||
// Daybound
|
// Daybound
|
||||||
this.addAbility(new DayboundAbility());
|
this.getLeftHalfCard().addAbility(new DayboundAbility());
|
||||||
|
|
||||||
|
// Howlpack Avenger
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Whenever a permanent you control is dealt damage, Howlpack Avenger deals that much damage to any target.
|
||||||
|
Ability backAbility = new DealtDamageAnyTriggeredAbility(new DamageTargetEffect(SavedDamageValue.MUCH),
|
||||||
|
StaticFilters.FILTER_CONTROLLED_A_PERMANENT, SetTargetPointer.NONE, false);
|
||||||
|
backAbility.addTarget(new TargetAnyTarget());
|
||||||
|
this.getRightHalfCard().addAbility(backAbility);
|
||||||
|
|
||||||
|
// {1}{R}: Howlpack Avenger gets +2/+0 until end of turn.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new BoostSourceEffect(
|
||||||
|
2, 0, Duration.EndOfTurn
|
||||||
|
), new ManaCostsImpl<>("{1}{R}")));
|
||||||
|
|
||||||
|
// Nightbound
|
||||||
|
this.getRightHalfCard().addAbility(new NightboundAbility());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IllTemperedLoner(final IllTemperedLoner card) {
|
private IllTemperedLoner(final IllTemperedLoner card) {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.keyword.DayboundAbility;
|
import mage.abilities.keyword.DayboundAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.NightboundAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.game.permanent.token.InsectToken;
|
import mage.game.permanent.token.InsectToken;
|
||||||
|
|
@ -15,24 +15,36 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InfestationExpert extends CardImpl {
|
public final class InfestationExpert extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InfestationExpert(UUID ownerId, CardSetInfo setInfo) {
|
public InfestationExpert(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{4}{G}",
|
||||||
|
"Infested Werewolf",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.HUMAN);
|
// Infestation Expert
|
||||||
this.subtype.add(SubType.WEREWOLF);
|
this.getLeftHalfCard().setPT(3, 4);
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.secondSideCardClazz = mage.cards.i.InfestedWerewolf.class;
|
|
||||||
|
|
||||||
// Whenever Infestation Expert enters the battlefield or attacks, create a 1/1 green Insect creature token.
|
// Whenever Infestation Expert enters the battlefield or attacks, create a 1/1 green Insect creature token.
|
||||||
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
|
||||||
new CreateTokenEffect(new InsectToken())
|
new CreateTokenEffect(new InsectToken())
|
||||||
));
|
));
|
||||||
|
|
||||||
// Daybound
|
// Daybound
|
||||||
this.addAbility(new DayboundAbility());
|
this.getLeftHalfCard().addAbility(new DayboundAbility());
|
||||||
|
|
||||||
|
// Infested Werewolf
|
||||||
|
this.getRightHalfCard().setPT(4, 5);
|
||||||
|
|
||||||
|
// Whenever Infested Werewolf enters the battlefield or attacks, create two 1/1 green Insect creature token.
|
||||||
|
this.getRightHalfCard().addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
|
||||||
|
new CreateTokenEffect(new InsectToken(), 2)
|
||||||
|
));
|
||||||
|
|
||||||
|
// Nightbound
|
||||||
|
this.getRightHalfCard().addAbility(new NightboundAbility());
|
||||||
}
|
}
|
||||||
|
|
||||||
private InfestationExpert(final InfestationExpert card) {
|
private InfestationExpert(final InfestationExpert card) {
|
||||||
|
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
package mage.cards.i;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
|
||||||
import mage.abilities.keyword.NightboundAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.game.permanent.token.InsectToken;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class InfestedWerewolf extends CardImpl {
|
|
||||||
|
|
||||||
public InfestedWerewolf(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.WEREWOLF);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(5);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Whenever Infested Werewolf enters the battlefield or attacks, create two 1/1 green Insect creature token.
|
|
||||||
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
|
|
||||||
new CreateTokenEffect(new InsectToken(), 2)
|
|
||||||
));
|
|
||||||
|
|
||||||
// Nightbound
|
|
||||||
this.addAbility(new NightboundAbility());
|
|
||||||
}
|
|
||||||
|
|
||||||
private InfestedWerewolf(final InfestedWerewolf card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public InfestedWerewolf copy() {
|
|
||||||
return new InfestedWerewolf(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,13 +1,20 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.common.OpponentControlsPermanentCondition;
|
||||||
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.keyword.TransformAbility;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
|
import mage.abilities.hint.ConditionHint;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
|
|
@ -22,19 +29,36 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InnocentTraveler extends CardImpl {
|
public final class InnocentTraveler extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
|
private static final FilterPermanent humanFilter = new FilterPermanent(SubType.HUMAN, "an opponent controls a Human");
|
||||||
|
private static final Condition condition = new OpponentControlsPermanentCondition(humanFilter);
|
||||||
|
private static final Hint hint = new ConditionHint(condition, "An opponent controls a Human");
|
||||||
|
|
||||||
public InnocentTraveler(UUID ownerId, CardSetInfo setInfo) {
|
public InnocentTraveler(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN}, "{2}{B}{B}",
|
||||||
|
"Malicious Invader",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "B"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.HUMAN);
|
// Innocent Traveler
|
||||||
this.power = new MageInt(1);
|
this.getLeftHalfCard().setPT(1, 3);
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.secondSideCardClazz = mage.cards.m.MaliciousInvader.class;
|
|
||||||
|
|
||||||
// At the beginning of your upkeep, any opponent may sacrifice a creature. If no one does, transform Innocent Traveler.
|
// At the beginning of your upkeep, any opponent may sacrifice a creature. If no one does, transform Innocent Traveler.
|
||||||
this.addAbility(new TransformAbility());
|
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new InnocentTravelerEffect()));
|
||||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new InnocentTravelerEffect()));
|
|
||||||
|
// Malicious Invader
|
||||||
|
this.getRightHalfCard().setPT(3, 3);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Malicious Invader gets +2/+0 as long as an opponent controls a Human.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
|
new BoostSourceEffect(2, 0, Duration.WhileOnBattlefield),
|
||||||
|
condition, "{this} gets +2/+0 as long as an opponent controls a Human"
|
||||||
|
)).addHint(hint));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InnocentTraveler(final InnocentTraveler card) {
|
private InnocentTraveler(final InnocentTraveler card) {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
||||||
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
||||||
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
import mage.abilities.keyword.TransformAbility;
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
|
@ -17,27 +17,41 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author nantuko
|
* @author nantuko
|
||||||
*/
|
*/
|
||||||
public final class InstigatorGang extends CardImpl {
|
public final class InstigatorGang extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InstigatorGang(UUID ownerId, CardSetInfo setInfo) {
|
public InstigatorGang(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
super(ownerId, setInfo,
|
||||||
this.subtype.add(SubType.HUMAN);
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{R}",
|
||||||
this.subtype.add(SubType.WEREWOLF);
|
"Wildblood Pack",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
|
||||||
|
);
|
||||||
|
|
||||||
this.secondSideCardClazz = mage.cards.w.WildbloodPack.class;
|
// Instigator Gang
|
||||||
|
this.getLeftHalfCard().setPT(2, 3);
|
||||||
this.power = new MageInt(2);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
|
|
||||||
// Attacking creatures you control get +1/+0.
|
// Attacking creatures you control get +1/+0.
|
||||||
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(
|
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect(
|
||||||
1, 0, Duration.WhileOnBattlefield,
|
1, 0, Duration.WhileOnBattlefield,
|
||||||
StaticFilters.FILTER_ATTACKING_CREATURES
|
StaticFilters.FILTER_ATTACKING_CREATURES
|
||||||
)));
|
)));
|
||||||
|
|
||||||
// At the beginning of each upkeep, if no spells were cast last turn, transform Instigator Gang.
|
// At the beginning of each upkeep, if no spells were cast last turn, transform Instigator Gang.
|
||||||
this.addAbility(new TransformAbility());
|
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
|
||||||
this.addAbility(new WerewolfFrontTriggeredAbility());
|
|
||||||
|
// Wildblood Pack
|
||||||
|
this.getRightHalfCard().setPT(5, 5);
|
||||||
|
|
||||||
|
// Trample
|
||||||
|
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||||
|
|
||||||
|
// Attacking creatures you control get +3/+0.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect(
|
||||||
|
3, 0, Duration.WhileOnBattlefield,
|
||||||
|
StaticFilters.FILTER_ATTACKING_CREATURES, false
|
||||||
|
)));
|
||||||
|
|
||||||
|
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Wildblood Pack.
|
||||||
|
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
|
||||||
}
|
}
|
||||||
|
|
||||||
private InstigatorGang(final InstigatorGang card) {
|
private InstigatorGang(final InstigatorGang card) {
|
||||||
|
|
|
||||||
|
|
@ -3,17 +3,27 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.*;
|
||||||
import mage.cards.*;
|
import mage.cards.*;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetCard;
|
import mage.target.TargetCard;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
import mage.target.TargetPlayer;
|
||||||
import mage.target.common.TargetCardInExile;
|
import mage.target.common.TargetCardInExile;
|
||||||
|
import mage.target.common.TargetControlledPermanent;
|
||||||
|
import mage.target.common.TargetCreaturePermanentAmount;
|
||||||
|
import mage.target.common.TargetPermanentAmount;
|
||||||
|
import mage.target.targetpointer.SecondTargetPointer;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -21,21 +31,43 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfAlara extends CardImpl {
|
public final class InvasionOfAlara extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfAlara(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfAlara(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{W}{U}{B}{R}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{W}{U}{B}{R}{G}",
|
||||||
|
"Awaken the Maelstrom",
|
||||||
|
new CardType[]{CardType.SORCERY}, new SubType[]{}, "WUBRG"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Alara
|
||||||
this.setStartingDefense(7);
|
this.getLeftHalfCard().setStartingDefense(7);
|
||||||
this.secondSideCardClazz = mage.cards.a.AwakenTheMaelstrom.class;
|
|
||||||
|
|
||||||
Ability ability = new SiegeAbility();
|
Ability siegeAbility = new SiegeAbility();
|
||||||
ability.setRuleVisible(false);
|
siegeAbility.setRuleVisible(false);
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(siegeAbility);
|
||||||
|
|
||||||
// When Invasion of Alara enters the battlefield, exile cards from the top of your library until you exile two nonland cards with mana value 4 or less. You may cast one of those two cards without paying its mana cost. Put one of them into your hand. Then put the other cards exiled this way on the bottom of your library in a random order.
|
// When Invasion of Alara enters the battlefield, exile cards from the top of your library until you exile two nonland cards with mana value 4 or less. You may cast one of those two cards without paying its mana cost. Put one of them into your hand. Then put the other cards exiled this way on the bottom of your library in a random order.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfAlaraEffect()));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfAlaraEffect()));
|
||||||
|
|
||||||
|
// Awaken the Maelstrom
|
||||||
|
// Awaken the Maelstrom is all colors.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("{this} is all colors")));
|
||||||
|
|
||||||
|
// Target player draws two cards.
|
||||||
|
this.getRightHalfCard().getSpellAbility().addEffect(new DrawCardTargetEffect(2));
|
||||||
|
this.getRightHalfCard().getSpellAbility().addTarget(new TargetPlayer().withChooseHint("to draw two cards"));
|
||||||
|
|
||||||
|
// You may put an artifact card from your hand onto the battlefield.
|
||||||
|
this.getRightHalfCard().getSpellAbility().addEffect(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_ARTIFACT_AN));
|
||||||
|
|
||||||
|
// Create a token that's a copy of a permanent you control.
|
||||||
|
// Distribute three +1/+1 counters among one, two, or three creatures you control.
|
||||||
|
this.getRightHalfCard().getSpellAbility().addEffect(new AwakenTheMaelstromEffect());
|
||||||
|
|
||||||
|
// Destroy target permanent an opponent controls.
|
||||||
|
this.getRightHalfCard().getSpellAbility().addEffect(new DestroyTargetEffect().setTargetPointer(new SecondTargetPointer()));
|
||||||
|
this.getRightHalfCard().getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT).withChooseHint("to destroy"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfAlara(final InvasionOfAlara card) {
|
private InvasionOfAlara(final InvasionOfAlara card) {
|
||||||
|
|
@ -101,3 +133,63 @@ class InvasionOfAlaraEffect extends OneShotEffect {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class AwakenTheMaelstromEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
AwakenTheMaelstromEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "Create a token that's a copy of a permanent you control. " +
|
||||||
|
"Distribute three +1/+1 counters among one, two, or three creatures you control.";
|
||||||
|
}
|
||||||
|
|
||||||
|
private AwakenTheMaelstromEffect(final AwakenTheMaelstromEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AwakenTheMaelstromEffect copy() {
|
||||||
|
return new AwakenTheMaelstromEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
|
if (player == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
makeToken(player, game, source);
|
||||||
|
game.processAction();
|
||||||
|
distributeCounters(player, game, source);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeToken(Player player, Game game, Ability source) {
|
||||||
|
TargetPermanent target = new TargetControlledPermanent();
|
||||||
|
target.withNotTarget(true);
|
||||||
|
target.withChooseHint("to copy");
|
||||||
|
if (!target.canChoose(player.getId(), source, game)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
player.choose(outcome, target, source, game);
|
||||||
|
Permanent permanent = game.getPermanent(target.getFirstTarget());
|
||||||
|
if (permanent != null) {
|
||||||
|
new CreateTokenCopyTargetEffect().setSavedPermanent(permanent).apply(game, source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void distributeCounters(Player player, Game game, Ability source) {
|
||||||
|
if (game.getBattlefield().count(StaticFilters.FILTER_CONTROLLED_CREATURE, player.getId(), source, game) < 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TargetPermanentAmount target = new TargetCreaturePermanentAmount(3, StaticFilters.FILTER_CONTROLLED_CREATURE);
|
||||||
|
target.withNotTarget(true);
|
||||||
|
target.withChooseHint("to distribute counters");
|
||||||
|
target.chooseTarget(outcome, player.getId(), source, game);
|
||||||
|
for (UUID targetId : target.getTargets()) {
|
||||||
|
Permanent permanent = game.getPermanent(targetId);
|
||||||
|
if (permanent != null) {
|
||||||
|
permanent.addCounters(CounterType.P1P1.createInstance(target.getTargetAmount(targetId)), source, game);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,33 +1,46 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.MageObject;
|
||||||
|
import mage.ObjectColor;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.CopyEffect;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.effects.common.MillCardsEachPlayerEffect;
|
import mage.abilities.effects.common.MillCardsEachPlayerEffect;
|
||||||
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
|
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.SubType;
|
import mage.constants.*;
|
||||||
import mage.constants.TargetController;
|
import mage.filter.FilterCard;
|
||||||
|
import mage.filter.common.FilterCreatureCard;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.Target;
|
||||||
|
import mage.target.common.TargetCardInGraveyard;
|
||||||
|
import mage.util.functions.CopyApplier;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfAmonkhet extends CardImpl {
|
public final class InvasionOfAmonkhet extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfAmonkhet(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfAmonkhet(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{1}{U}{B}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{1}{U}{B}",
|
||||||
|
"Lazotep Convert",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ZOMBIE}, "UB"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Amonkhet
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.l.LazotepConvert.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Amonkhet enters the battlefield, each player mills three cards, then each opponent discards a card and you draw a card.
|
// When Invasion of Amonkhet enters the battlefield, each player mills three cards, then each opponent discards a card and you draw a card.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(
|
Ability ability = new EntersBattlefieldTriggeredAbility(
|
||||||
|
|
@ -35,7 +48,13 @@ public final class InvasionOfAmonkhet extends CardImpl {
|
||||||
);
|
);
|
||||||
ability.addEffect(new DiscardEachPlayerEffect(TargetController.OPPONENT).concatBy(", then"));
|
ability.addEffect(new DiscardEachPlayerEffect(TargetController.OPPONENT).concatBy(", then"));
|
||||||
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and you"));
|
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and you"));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Lazotep Convert
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// You may have Lazotep Convert enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types.
|
||||||
|
this.getRightHalfCard().addAbility(new mage.abilities.common.EntersBattlefieldAbility(new LazotepConvertCopyEffect(), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfAmonkhet(final InvasionOfAmonkhet card) {
|
private InvasionOfAmonkhet(final InvasionOfAmonkhet card) {
|
||||||
|
|
@ -47,3 +66,59 @@ public final class InvasionOfAmonkhet extends CardImpl {
|
||||||
return new InvasionOfAmonkhet(this);
|
return new InvasionOfAmonkhet(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LazotepConvertCopyEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
private static final CopyApplier applier = new CopyApplier() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, MageObject blueprint, Ability source, UUID copyToObjectId) {
|
||||||
|
blueprint.removePTCDA();
|
||||||
|
blueprint.getPower().setModifiedBaseValue(4);
|
||||||
|
blueprint.getToughness().setModifiedBaseValue(4);
|
||||||
|
blueprint.addSubType(SubType.ZOMBIE);
|
||||||
|
blueprint.getColor().addColor(ObjectColor.BLACK);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final FilterCard filter = new FilterCreatureCard("creature card in a graveyard");
|
||||||
|
|
||||||
|
public LazotepConvertCopyEffect() {
|
||||||
|
super(Outcome.Copy);
|
||||||
|
this.staticText = "as a copy of any creature card in a graveyard, " +
|
||||||
|
"except it's a 4/4 black Zombie in addition to its other colors and types";
|
||||||
|
}
|
||||||
|
|
||||||
|
private LazotepConvertCopyEffect(final LazotepConvertCopyEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
|
if (player == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Target target = new TargetCardInGraveyard(0, 1, filter);
|
||||||
|
target.withNotTarget(true);
|
||||||
|
player.choose(outcome, target, source, game);
|
||||||
|
Card copyFromCard = game.getCard(target.getFirstTarget());
|
||||||
|
if (copyFromCard == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Card modifiedCopy = copyFromCard.copy();
|
||||||
|
//Appliers must be applied before CopyEffect, its applier setting is just for copies of copies
|
||||||
|
// TODO: research applier usage, why it here
|
||||||
|
applier.apply(game, modifiedCopy, source, source.getSourceId());
|
||||||
|
game.addEffect(new CopyEffect(
|
||||||
|
Duration.Custom, modifiedCopy, source.getSourceId()
|
||||||
|
).setApplier(applier), source);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LazotepConvertCopyEffect copy() {
|
||||||
|
return new LazotepConvertCopyEffect(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,16 +3,22 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.WishEffect;
|
import mage.abilities.effects.common.WishEffect;
|
||||||
import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect;
|
import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.filter.FilterSpell;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.filter.common.FilterInstantOrSorcerySpell;
|
||||||
|
import mage.filter.predicate.card.CastFromZonePredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
import mage.game.stack.Spell;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -20,20 +26,36 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfArcavios extends CardImpl {
|
public final class InvasionOfArcavios extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
|
private static final FilterSpell filter
|
||||||
|
= new FilterInstantOrSorcerySpell("an instant or sorcery spell from your hand");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(new CastFromZonePredicate(Zone.HAND));
|
||||||
|
}
|
||||||
|
|
||||||
public InvasionOfArcavios(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfArcavios(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{U}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{U}{U}",
|
||||||
|
"Invocation of the Founders",
|
||||||
|
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "U"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Arcavios
|
||||||
this.setStartingDefense(7);
|
this.getLeftHalfCard().setStartingDefense(7);
|
||||||
this.secondSideCardClazz = mage.cards.i.InvocationOfTheFounders.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Arcavios enters the battlefield, search your library, graveyard, and/or outside the game for an instant or sorcery card you own, reveal it, and put it into your hand. If you search your library this way, shuffle.
|
// When Invasion of Arcavios enters the battlefield, search your library, graveyard, and/or outside the game for an instant or sorcery card you own, reveal it, and put it into your hand. If you search your library this way, shuffle.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfArcaviosEffect()));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfArcaviosEffect()));
|
||||||
|
|
||||||
|
// Invocation of the Founders
|
||||||
|
// Whenever you cast an instant or sorcery spell from your hand, you may copy that spell. You may choose new targets for the copy.
|
||||||
|
this.getRightHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
|
||||||
|
new InvocationOfTheFoundersEffect(), filter, true
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfArcavios(final InvasionOfArcavios card) {
|
private InvasionOfArcavios(final InvasionOfArcavios card) {
|
||||||
|
|
@ -78,3 +100,30 @@ class InvasionOfArcaviosEffect extends OneShotEffect {
|
||||||
).apply(game, source);
|
).apply(game, source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class InvocationOfTheFoundersEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
InvocationOfTheFoundersEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "copy that spell. You may choose new targets for the copy";
|
||||||
|
}
|
||||||
|
|
||||||
|
private InvocationOfTheFoundersEffect(final InvocationOfTheFoundersEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InvocationOfTheFoundersEffect copy() {
|
||||||
|
return new InvocationOfTheFoundersEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Spell spell = (Spell) getValue("spellCast");
|
||||||
|
if (spell != null) {
|
||||||
|
spell.createCopyOnStack(game, source, source.getControllerId(), true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,32 +3,45 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||||
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
||||||
import mage.abilities.effects.common.SacrificeEffect;
|
import mage.abilities.effects.common.SacrificeEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
|
import mage.abilities.keyword.MenaceAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.a.AshenReaper;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.WatcherScope;
|
||||||
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.game.events.ZoneChangeEvent;
|
||||||
import mage.target.TargetPlayer;
|
import mage.target.TargetPlayer;
|
||||||
|
import mage.watchers.Watcher;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfAzgol extends CardImpl {
|
public final class InvasionOfAzgol extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfAzgol(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfAzgol(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{B}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{B}{R}",
|
||||||
|
"Ashen Reaper",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ZOMBIE, SubType.ELEMENTAL}, "BR"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Azgol
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.a.AshenReaper.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Azgol enters the battlefield, target player sacrifices a creature or planeswalker and loses 1 life.
|
// When Invasion of Azgol enters the battlefield, target player sacrifices a creature or planeswalker and loses 1 life.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(
|
Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(
|
||||||
|
|
@ -36,7 +49,23 @@ public final class InvasionOfAzgol extends CardImpl {
|
||||||
));
|
));
|
||||||
ability.addEffect(new LoseLifeTargetEffect(1).setText("and loses 1 life"));
|
ability.addEffect(new LoseLifeTargetEffect(1).setText("and loses 1 life"));
|
||||||
ability.addTarget(new TargetPlayer());
|
ability.addTarget(new TargetPlayer());
|
||||||
this.addAbility(ability, AshenReaper.makeWatcher());
|
ability.addWatcher(new AshenReaperWatcher());
|
||||||
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Ashen Reaper
|
||||||
|
this.getRightHalfCard().setPT(2, 1);
|
||||||
|
|
||||||
|
// Menace
|
||||||
|
this.getRightHalfCard().addAbility(new MenaceAbility(false));
|
||||||
|
|
||||||
|
// At the beginning of your end step, put a +1/+1 counter on Ashen Reaper if a permanent was put into a graveyard from the battlefield this turn.
|
||||||
|
this.getRightHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(
|
||||||
|
new ConditionalOneShotEffect(
|
||||||
|
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
||||||
|
AshenReaperCondition.instance, "put a +1/+1 counter on {this} " +
|
||||||
|
"if a permanent was put into a graveyard from the battlefield this turn"
|
||||||
|
)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfAzgol(final InvasionOfAzgol card) {
|
private InvasionOfAzgol(final InvasionOfAzgol card) {
|
||||||
|
|
@ -48,3 +77,27 @@ public final class InvasionOfAzgol extends CardImpl {
|
||||||
return new InvasionOfAzgol(this);
|
return new InvasionOfAzgol(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum AshenReaperCondition implements Condition {
|
||||||
|
instance;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
return game.getState().getWatcher(AshenReaperWatcher.class).conditionMet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AshenReaperWatcher extends Watcher {
|
||||||
|
|
||||||
|
AshenReaperWatcher() {
|
||||||
|
super(WatcherScope.GAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void watch(GameEvent event, Game game) {
|
||||||
|
if (event.getType() == GameEvent.EventType.ZONE_CHANGE
|
||||||
|
&& ((ZoneChangeEvent) event).isDiesEvent()) {
|
||||||
|
condition = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,8 +5,10 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.effects.common.GainLifeEffect;
|
import mage.abilities.effects.common.GainLifeEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
|
||||||
|
|
@ -15,22 +17,34 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfDominaria extends CardImpl {
|
public final class InvasionOfDominaria extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfDominaria(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfDominaria(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{W}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{W}",
|
||||||
|
"Serra Faithkeeper",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ANGEL}, "W"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Dominaria
|
||||||
this.setStartingDefense(5);
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
this.secondSideCardClazz = mage.cards.s.SerraFaithkeeper.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Dominaria enters the battlefield, you gain 4 life and draw a card.
|
// When Invasion of Dominaria enters the battlefield, you gain 4 life and draw a card.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4));
|
||||||
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and"));
|
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and"));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Serra Faithkeeper
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Vigilance
|
||||||
|
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfDominaria(final InvasionOfDominaria card) {
|
private InvasionOfDominaria(final InvasionOfDominaria card) {
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,15 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.common.CardsInHandCondition;
|
||||||
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.effects.common.discard.DiscardTargetEffect;
|
import mage.abilities.effects.common.discard.DiscardTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.SubType;
|
import mage.constants.*;
|
||||||
import mage.target.common.TargetOpponent;
|
import mage.target.common.TargetOpponent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -15,22 +19,39 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfEldraine extends CardImpl {
|
public final class InvasionOfEldraine extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
|
private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 3, TargetController.ACTIVE);
|
||||||
|
|
||||||
public InvasionOfEldraine(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfEldraine(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{B}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{B}",
|
||||||
|
"Prickle Faeries",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.FAERIE}, "B"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Eldraine
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.p.PrickleFaeries.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Eldraine enters the battlefield, target opponent discards two cards.
|
// When Invasion of Eldraine enters the battlefield, target opponent discards two cards.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(2));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(2));
|
||||||
ability.addTarget(new TargetOpponent());
|
ability.addTarget(new TargetOpponent());
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Prickle Faeries
|
||||||
|
this.getRightHalfCard().setPT(2, 2);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Prickle Faeries deals 2 damage to them.
|
||||||
|
this.getRightHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(
|
||||||
|
Zone.BATTLEFIELD, TargetController.OPPONENT,
|
||||||
|
new DamageTargetEffect(2).withTargetDescription("them"), false
|
||||||
|
).withInterveningIf(condition));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfEldraine(final InvasionOfEldraine card) {
|
private InvasionOfEldraine(final InvasionOfEldraine card) {
|
||||||
|
|
|
||||||
|
|
@ -7,33 +7,60 @@ import mage.abilities.costs.common.DiscardCardCost;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
import mage.abilities.effects.common.DoIfCostPaid;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.FilterCard;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.game.permanent.token.TreasureToken;
|
import mage.game.permanent.token.TreasureToken;
|
||||||
|
import mage.target.common.TargetCardInLibrary;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfErgamon extends CardImpl {
|
public final class InvasionOfErgamon extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
|
private static final FilterCard filter = new FilterCard("a land or battle card");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(Predicates.or(CardType.LAND.getPredicate(), CardType.BATTLE.getPredicate()));
|
||||||
|
}
|
||||||
|
|
||||||
public InvasionOfErgamon(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfErgamon(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{R}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{R}{G}",
|
||||||
|
"Truga Cliffcharger",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.RHINO}, "RG"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Ergamon
|
||||||
this.setStartingDefense(5);
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
this.secondSideCardClazz = mage.cards.t.TrugaCliffcharger.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Ergamon enters the battlefield, create a Treasure token. Then you may discard a card. If you do, draw a card.
|
// When Invasion of Ergamon enters the battlefield, create a Treasure token. Then you may discard a card. If you do, draw a card.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TreasureToken()));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TreasureToken()));
|
||||||
ability.addEffect(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new DiscardCardCost()).concatBy("Then"));
|
ability.addEffect(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new DiscardCardCost()).concatBy("Then"));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Truga Cliffcharger
|
||||||
|
this.getRightHalfCard().setPT(3, 4);
|
||||||
|
|
||||||
|
// Trample
|
||||||
|
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||||
|
|
||||||
|
// When Truga Cliffcharger enters the battlefield, you may discard a card. If you do, search your library for a land or battle card, reveal it, put it into your hand, then shuffle.
|
||||||
|
this.getRightHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(
|
||||||
|
new DoIfCostPaid(new SearchLibraryPutInHandEffect(
|
||||||
|
new TargetCardInLibrary(filter), true
|
||||||
|
), new DiscardCardCost())
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfErgamon(final InvasionOfErgamon card) {
|
private InvasionOfErgamon(final InvasionOfErgamon card) {
|
||||||
|
|
|
||||||
|
|
@ -2,53 +2,94 @@ package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.Mode;
|
import mage.abilities.Mode;
|
||||||
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
import mage.abilities.effects.common.DestroyAllEffect;
|
import mage.abilities.effects.common.DestroyAllEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.counter.RemoveAllCountersPermanentTargetEffect;
|
||||||
|
import mage.abilities.keyword.DeathtouchAbility;
|
||||||
|
import mage.abilities.keyword.MenaceAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.m.MarchesaResoluteMonarch;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.SuperType;
|
import mage.constants.SuperType;
|
||||||
|
import mage.constants.WatcherScope;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.events.DamagedEvent;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
import mage.watchers.Watcher;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfFiora extends CardImpl {
|
public final class InvasionOfFiora extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterCreaturePermanent("legendary creatures");
|
private static final FilterPermanent filterLegend = new FilterCreaturePermanent("legendary creatures");
|
||||||
private static final FilterPermanent filter2 = new FilterCreaturePermanent("nonlegendary creatures");
|
private static final FilterPermanent filterNonLegend = new FilterCreaturePermanent("nonlegendary creatures");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(SuperType.LEGENDARY.getPredicate());
|
filterLegend.add(SuperType.LEGENDARY.getPredicate());
|
||||||
filter2.add(Predicates.not(SuperType.LEGENDARY.getPredicate()));
|
filterNonLegend.add(Predicates.not(SuperType.LEGENDARY.getPredicate()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public InvasionOfFiora(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfFiora(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{4}{B}{B}");
|
super(ownerId, setInfo,
|
||||||
|
new SuperType[]{}, new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{4}{B}{B}",
|
||||||
|
"Marchesa, Resolute Monarch",
|
||||||
|
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.NOBLE}, "B"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Fiora
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.m.MarchesaResoluteMonarch.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Fiora enters the battlefield, choose one or both --
|
// When Invasion of Fiora enters the battlefield, choose one or both --
|
||||||
|
|
||||||
// * Destroy all legendary creatures.
|
// * Destroy all legendary creatures.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filter));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filterLegend));
|
||||||
ability.getModes().setMinModes(1);
|
ability.getModes().setMinModes(1);
|
||||||
ability.getModes().setMaxModes(2);
|
ability.getModes().setMaxModes(2);
|
||||||
|
|
||||||
// * Destroy all nonlegendary creatures.
|
// * Destroy all nonlegendary creatures.
|
||||||
ability.addMode(new Mode(new DestroyAllEffect(filter2)));
|
ability.addMode(new Mode(new DestroyAllEffect(filterNonLegend)));
|
||||||
this.addAbility(ability, MarchesaResoluteMonarch.makeWatcher());
|
ability.addWatcher(new MarchesaResoluteMonarchWatcher());
|
||||||
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Marchesa, Resolute Monarch
|
||||||
|
this.getRightHalfCard().setPT(3, 6);
|
||||||
|
|
||||||
|
// Menace
|
||||||
|
this.getRightHalfCard().addAbility(new MenaceAbility(false));
|
||||||
|
|
||||||
|
// Deathtouch
|
||||||
|
this.getRightHalfCard().addAbility(DeathtouchAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever Marchesa, Resolute Monarch attacks, remove all counters from up to one target permanent.
|
||||||
|
Ability attackAbility = new AttacksTriggeredAbility(new RemoveAllCountersPermanentTargetEffect());
|
||||||
|
attackAbility.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT));
|
||||||
|
this.getRightHalfCard().addAbility(attackAbility);
|
||||||
|
|
||||||
|
// At the beginning of your upkeep, if you haven't been dealt combat damage since your last turn, you draw a card and you lose 1 life.
|
||||||
|
Ability upkeepAbility = new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(1, true))
|
||||||
|
.withInterveningIf(MarchesaResoluteMonarchCondition.instance);
|
||||||
|
upkeepAbility.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
|
||||||
|
this.getRightHalfCard().addAbility(upkeepAbility);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfFiora(final InvasionOfFiora card) {
|
private InvasionOfFiora(final InvasionOfFiora card) {
|
||||||
|
|
@ -60,3 +101,49 @@ public final class InvasionOfFiora extends CardImpl {
|
||||||
return new InvasionOfFiora(this);
|
return new InvasionOfFiora(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum MarchesaResoluteMonarchCondition implements Condition {
|
||||||
|
instance;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
return MarchesaResoluteMonarchWatcher.checkPlayer(game, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "you haven't been dealt combat damage since your last turn";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarchesaResoluteMonarchWatcher extends Watcher {
|
||||||
|
|
||||||
|
private final Set<UUID> players = new HashSet<>();
|
||||||
|
|
||||||
|
MarchesaResoluteMonarchWatcher() {
|
||||||
|
super(WatcherScope.GAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void watch(GameEvent event, Game game) {
|
||||||
|
switch (event.getType()) {
|
||||||
|
case DAMAGED_PLAYER:
|
||||||
|
if (((DamagedEvent) event).isCombatDamage()) {
|
||||||
|
players.add(event.getTargetId());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
case END_TURN_STEP_POST:
|
||||||
|
players.remove(game.getActivePlayerId());
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean checkPlayer(Game game, Ability source) {
|
||||||
|
return !game
|
||||||
|
.getState()
|
||||||
|
.getWatcher(MarchesaResoluteMonarchWatcher.class)
|
||||||
|
.players
|
||||||
|
.contains(source.getControllerId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,25 @@ import mage.abilities.Ability;
|
||||||
import mage.abilities.SpellAbility;
|
import mage.abilities.SpellAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||||
import mage.abilities.effects.AsThoughEffectImpl;
|
import mage.abilities.effects.AsThoughEffectImpl;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||||
|
import mage.abilities.keyword.HexproofAbility;
|
||||||
|
import mage.abilities.keyword.IndestructibleAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetCard;
|
import mage.target.TargetCard;
|
||||||
import mage.target.common.TargetCardInHand;
|
|
||||||
import mage.target.common.TargetOpponent;
|
import mage.target.common.TargetOpponent;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
import mage.watchers.common.AttackedThisTurnWatcher;
|
import mage.watchers.common.AttackedThisTurnWatcher;
|
||||||
|
|
@ -26,22 +33,42 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfGobakhan extends CardImpl {
|
public final class InvasionOfGobakhan extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfGobakhan(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfGobakhan(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{1}{W}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{1}{W}",
|
||||||
|
"Lightshield Array",
|
||||||
|
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "W"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Gobakhan
|
||||||
this.setStartingDefense(3);
|
this.getLeftHalfCard().setStartingDefense(3);
|
||||||
this.secondSideCardClazz = mage.cards.l.LightshieldArray.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Gobakhan enters the battlefield, look at target opponent's hand. You may exile a nonland card from it. For as long as that card remains exiled, its owner may play it. A spell cast this way costs {2} more to cast.
|
// When Invasion of Gobakhan enters the battlefield, look at target opponent's hand. You may exile a nonland card from it. For as long as that card remains exiled, its owner may play it. A spell cast this way costs {2} more to cast.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new InvasionOfGobakhanEffect());
|
Ability ability = new EntersBattlefieldTriggeredAbility(new InvasionOfGobakhanEffect());
|
||||||
ability.addTarget(new TargetOpponent());
|
ability.addTarget(new TargetOpponent());
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Lightshield Array
|
||||||
|
// At the beginning of your end step, put a +1/+1 counter on each creature that attacked this turn.
|
||||||
|
this.getRightHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new LightshieldArrayEffect()));
|
||||||
|
|
||||||
|
// Sacrifice Lightshield Array: Creatures you control gain hexproof and indestructible until end of turn.
|
||||||
|
Ability rightAbility = new SimpleActivatedAbility(
|
||||||
|
new GainAbilityControlledEffect(
|
||||||
|
HexproofAbility.getInstance(), Duration.EndOfTurn,
|
||||||
|
StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||||
|
).setText("creatures you control gain hexproof"), new SacrificeSourceCost()
|
||||||
|
);
|
||||||
|
rightAbility.addEffect(new GainAbilityControlledEffect(
|
||||||
|
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
|
||||||
|
StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||||
|
).setText("and indestructible until end of turn"));
|
||||||
|
this.getRightHalfCard().addAbility(rightAbility);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfGobakhan(final InvasionOfGobakhan card) {
|
private InvasionOfGobakhan(final InvasionOfGobakhan card) {
|
||||||
|
|
@ -96,7 +123,7 @@ class InvasionOfGobakhanCastEffect extends AsThoughEffectImpl {
|
||||||
|
|
||||||
private final MageObjectReference mor;
|
private final MageObjectReference mor;
|
||||||
|
|
||||||
public InvasionOfGobakhanCastEffect(Card card, Game game) {
|
InvasionOfGobakhanCastEffect(Card card, Game game) {
|
||||||
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit);
|
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit);
|
||||||
this.mor = new MageObjectReference(card, game);
|
this.mor = new MageObjectReference(card, game);
|
||||||
}
|
}
|
||||||
|
|
@ -123,8 +150,7 @@ class InvasionOfGobakhanCastEffect extends AsThoughEffectImpl {
|
||||||
discard();
|
discard();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return mor.refersTo(CardUtil.getMainCardId(game, sourceId), game)
|
return mor.refersTo(CardUtil.getMainCardId(game, sourceId), game) && card.isOwnedBy(affectedControllerId);
|
||||||
&& card.isOwnedBy(affectedControllerId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -153,10 +179,10 @@ class InvasionOfGobakhanCostEffect extends CostModificationEffectImpl {
|
||||||
if (!(abilityToModify instanceof SpellAbility)) {
|
if (!(abilityToModify instanceof SpellAbility)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (game.inCheckPlayableState()) { // during playable check, the card is still in exile zone, the zcc is one less
|
if (game.inCheckPlayableState()) {
|
||||||
UUID cardtoCheckId = CardUtil.getMainCardId(game, abilityToModify.getSourceId());
|
UUID cardToCheckId = CardUtil.getMainCardId(game, abilityToModify.getSourceId());
|
||||||
return mor.getSourceId().equals(cardtoCheckId)
|
return mor.getSourceId().equals(cardToCheckId)
|
||||||
&& mor.getZoneChangeCounter() == game.getState().getZoneChangeCounter(cardtoCheckId) + 1;
|
&& mor.getZoneChangeCounter() == game.getState().getZoneChangeCounter(cardToCheckId) + 1;
|
||||||
} else {
|
} else {
|
||||||
return mor.refersTo(CardUtil.getMainCardId(game, abilityToModify.getSourceId()), game);
|
return mor.refersTo(CardUtil.getMainCardId(game, abilityToModify.getSourceId()), game);
|
||||||
}
|
}
|
||||||
|
|
@ -167,3 +193,34 @@ class InvasionOfGobakhanCostEffect extends CostModificationEffectImpl {
|
||||||
return new InvasionOfGobakhanCostEffect(this);
|
return new InvasionOfGobakhanCostEffect(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LightshieldArrayEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
LightshieldArrayEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "put a +1/+1 counter on each creature that attacked this turn";
|
||||||
|
}
|
||||||
|
|
||||||
|
private LightshieldArrayEffect(final LightshieldArrayEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LightshieldArrayEffect copy() {
|
||||||
|
return new LightshieldArrayEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
for (MageObjectReference mor : game
|
||||||
|
.getState()
|
||||||
|
.getWatcher(AttackedThisTurnWatcher.class)
|
||||||
|
.getAttackedThisTurnCreatures()) {
|
||||||
|
Permanent permanent = mor.getPermanent(game);
|
||||||
|
if (permanent != null) {
|
||||||
|
permanent.addCounters(CounterType.P1P1.createInstance(), source, game);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,32 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
import mage.abilities.dynamicvalue.common.GetXValue;
|
||||||
|
import mage.abilities.effects.AsThoughEffectImpl;
|
||||||
import mage.abilities.effects.common.search.SearchLibraryGraveyardPutOntoBattlefieldEffect;
|
import mage.abilities.effects.common.search.SearchLibraryGraveyardPutOntoBattlefieldEffect;
|
||||||
|
import mage.abilities.keyword.ReachAbility;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.SubType;
|
import mage.constants.*;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.common.FilterCreatureCard;
|
import mage.filter.common.FilterCreatureCard;
|
||||||
import mage.filter.predicate.ObjectSourcePlayer;
|
import mage.filter.predicate.ObjectSourcePlayer;
|
||||||
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.players.Player;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfIkoria extends CardImpl {
|
public final class InvasionOfIkoria extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterCreatureCard("non-Human creature card with mana value X or less");
|
private static final FilterCard filter = new FilterCreatureCard("non-Human creature card with mana value X or less");
|
||||||
|
|
||||||
|
|
@ -31,17 +36,29 @@ public final class InvasionOfIkoria extends CardImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
public InvasionOfIkoria(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfIkoria(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{X}{G}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new SuperType[]{}, new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{X}{G}{G}",
|
||||||
|
"Zilortha, Apex of Ikoria",
|
||||||
|
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DINOSAUR}, "G"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Ikoria
|
||||||
this.setStartingDefense(6);
|
this.getLeftHalfCard().setStartingDefense(6);
|
||||||
this.secondSideCardClazz = mage.cards.z.ZilorthaApexOfIkoria.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Ikoria enters the battlefield, search your library and/or graveyard for a non-Human creature card with mana value X or less and put it onto the battlefield. If you search your library this way, shuffle.
|
// When Invasion of Ikoria enters the battlefield, search your library and/or graveyard for a non-Human creature card with mana value X or less and put it onto the battlefield. If you search your library this way, shuffle.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryGraveyardPutOntoBattlefieldEffect(filter)));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryGraveyardPutOntoBattlefieldEffect(filter)));
|
||||||
|
|
||||||
|
// Zilortha, Apex of Ikoria
|
||||||
|
this.getRightHalfCard().setPT(8, 8);
|
||||||
|
|
||||||
|
// Reach
|
||||||
|
this.getRightHalfCard().addAbility(ReachAbility.getInstance());
|
||||||
|
|
||||||
|
// For each non-Human creature you control, you may have that creature assign its combat damage as though it weren't blocked.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new ZilorthaApexOfIkoriaEffect()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfIkoria(final InvasionOfIkoria card) {
|
private InvasionOfIkoria(final InvasionOfIkoria card) {
|
||||||
|
|
@ -59,7 +76,41 @@ enum InvasionOfIkoriaPredicate implements ObjectSourcePlayerPredicate<Card> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(ObjectSourcePlayer<Card> input, Game game) {
|
public boolean apply(ObjectSourcePlayer<Card> input, Game game) {
|
||||||
return input.getObject().getManaValue()
|
return input.getObject().getManaValue() <= GetXValue.instance.calculate(game, input.getSource(), null);
|
||||||
<= GetXValue.instance.calculate(game, input.getSource(), null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ZilorthaApexOfIkoriaEffect extends AsThoughEffectImpl {
|
||||||
|
|
||||||
|
ZilorthaApexOfIkoriaEffect() {
|
||||||
|
super(AsThoughEffectType.DAMAGE_NOT_BLOCKED, Duration.WhileOnBattlefield, Outcome.Damage);
|
||||||
|
this.staticText = "for each non-Human creature you control, you may have that " +
|
||||||
|
"creature assign its combat damage as though it weren't blocked";
|
||||||
|
}
|
||||||
|
|
||||||
|
private ZilorthaApexOfIkoriaEffect(ZilorthaApexOfIkoriaEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
|
||||||
|
Player controller = game.getPlayer(source.getControllerId());
|
||||||
|
Permanent permanent = game.getPermanent(sourceId);
|
||||||
|
return controller != null
|
||||||
|
&& permanent != null
|
||||||
|
&& permanent.isControlledBy(controller.getId())
|
||||||
|
&& !permanent.hasSubtype(SubType.HUMAN, game)
|
||||||
|
&& controller.chooseUse(Outcome.Damage, "Have " + permanent.getLogName()
|
||||||
|
+ " assign damage as though it weren't blocked?", source, game);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ZilorthaApexOfIkoriaEffect copy() {
|
||||||
|
return new ZilorthaApexOfIkoriaEffect(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,23 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||||
import mage.abilities.keyword.FlashAbility;
|
import mage.abilities.keyword.FlashAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.token.ZombieToken;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.common.TargetCardInGraveyard;
|
||||||
import mage.target.common.TargetOpponentsCreaturePermanent;
|
import mage.target.common.TargetOpponentsCreaturePermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -16,25 +27,37 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfInnistrad extends CardImpl {
|
public final class InvasionOfInnistrad extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfInnistrad(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfInnistrad(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{B}{B}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{B}{B}",
|
||||||
|
"Deluge of the Dead",
|
||||||
|
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "B"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Innistrad
|
||||||
this.setStartingDefense(5);
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
this.secondSideCardClazz = mage.cards.d.DelugeOfTheDead.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// Flash
|
// Flash
|
||||||
this.addAbility(FlashAbility.getInstance());
|
this.getLeftHalfCard().addAbility(FlashAbility.getInstance());
|
||||||
|
|
||||||
// When Invasion of Innistrad enters the battlefield, target creature an opponent controls gets -13/-13 until end of turn.
|
// When Invasion of Innistrad enters the battlefield, target creature an opponent controls gets -13/-13 until end of turn.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-13, -13));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-13, -13));
|
||||||
ability.addTarget(new TargetOpponentsCreaturePermanent());
|
ability.addTarget(new TargetOpponentsCreaturePermanent());
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Deluge of the Dead
|
||||||
|
// When Deluge of the Dead enters the battlefield, create two 2/2 black Zombie creature tokens.
|
||||||
|
this.getRightHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 2)));
|
||||||
|
|
||||||
|
// {2}{B}: Exile target card from a graveyard. If it was a creature card, create a 2/2 black Zombie creature token.
|
||||||
|
Ability rightAbility = new SimpleActivatedAbility(new DelugeOfTheDeadEffect(), new ManaCostsImpl<>("{2}{B}"));
|
||||||
|
rightAbility.addTarget(new TargetCardInGraveyard());
|
||||||
|
this.getRightHalfCard().addAbility(rightAbility);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfInnistrad(final InvasionOfInnistrad card) {
|
private InvasionOfInnistrad(final InvasionOfInnistrad card) {
|
||||||
|
|
@ -46,3 +69,35 @@ public final class InvasionOfInnistrad extends CardImpl {
|
||||||
return new InvasionOfInnistrad(this);
|
return new InvasionOfInnistrad(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DelugeOfTheDeadEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
DelugeOfTheDeadEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "exile target card from a graveyard. " +
|
||||||
|
"If it was a creature card, create a 2/2 black Zombie creature token";
|
||||||
|
}
|
||||||
|
|
||||||
|
private DelugeOfTheDeadEffect(final DelugeOfTheDeadEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DelugeOfTheDeadEffect copy() {
|
||||||
|
return new DelugeOfTheDeadEffect(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;
|
||||||
|
}
|
||||||
|
player.moveCards(card, Zone.EXILED, source, game);
|
||||||
|
if (card.isCreature(game)) {
|
||||||
|
new ZombieToken().putOntoBattlefield(1, game, source);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,15 @@ package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||||
|
import mage.abilities.keyword.IndestructibleAbility;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
import mage.constants.PutCards;
|
import mage.constants.PutCards;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
|
@ -15,23 +20,37 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfIxalan extends CardImpl {
|
public final class InvasionOfIxalan extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfIxalan(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfIxalan(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{1}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{1}{G}",
|
||||||
|
"Belligerent Regisaur",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DINOSAUR}, "G"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Ixalan
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.b.BelligerentRegisaur.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Ixalan enters the battlefield, look at the top five cards of your library. You may reveal a permanent card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
|
// When Invasion of Ixalan enters the battlefield, look at the top five cards of your library. You may reveal a permanent card from among them and put it into your hand. 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, StaticFilters.FILTER_CARD_A_PERMANENT,
|
5, 1, StaticFilters.FILTER_CARD_A_PERMANENT,
|
||||||
PutCards.HAND, PutCards.BOTTOM_RANDOM
|
PutCards.HAND, PutCards.BOTTOM_RANDOM
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
// Belligerent Regisaur
|
||||||
|
this.getRightHalfCard().setPT(4, 3);
|
||||||
|
|
||||||
|
// Trample
|
||||||
|
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever you cast a spell, Belligerent Regisaur gains indestructible until end of turn.
|
||||||
|
this.getRightHalfCard().addAbility(new SpellCastControllerTriggeredAbility(new GainAbilitySourceEffect(
|
||||||
|
IndestructibleAbility.getInstance(), Duration.EndOfTurn
|
||||||
|
), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfIxalan(final InvasionOfIxalan card) {
|
private InvasionOfIxalan(final InvasionOfIxalan card) {
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,18 @@ package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.ArtifactYouControlCount;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
|
||||||
|
import mage.abilities.keyword.CrewAbility;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.constants.Zone;
|
||||||
import mage.game.permanent.token.ThopterColorlessToken;
|
import mage.game.permanent.token.ThopterColorlessToken;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -14,20 +21,39 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfKaladesh extends CardImpl {
|
public final class InvasionOfKaladesh extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfKaladesh(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfKaladesh(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{U}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new SuperType[]{}, new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{U}{R}",
|
||||||
|
"Aetherwing, Golden-Scale Flagship",
|
||||||
|
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "UR"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Kaladesh
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.a.AetherwingGoldenScaleFlagship.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Kaladesh enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying.
|
// When Invasion of Kaladesh enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken())));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken())));
|
||||||
|
|
||||||
|
// Aetherwing, Golden-Scale Flagship
|
||||||
|
this.getRightHalfCard().setPT(0, 4);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Aetherwing, Golden-Scale Flagship's power is equal to the number of artifacts you control.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(
|
||||||
|
Zone.ALL,
|
||||||
|
new SetBasePowerSourceEffect(ArtifactYouControlCount.instance)
|
||||||
|
.setText("{this}'s power is equal to the number of artifacts you control")
|
||||||
|
));
|
||||||
|
|
||||||
|
// Crew 1
|
||||||
|
this.getRightHalfCard().addAbility(new CrewAbility(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfKaladesh(final InvasionOfKaladesh card) {
|
private InvasionOfKaladesh(final InvasionOfKaladesh card) {
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,19 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.common.DiscardTargetCost;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
|
import mage.abilities.effects.common.DiscardCardControllerTriggeredAbility;
|
||||||
|
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
|
||||||
import mage.cards.*;
|
import mage.cards.*;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
import mage.target.common.TargetAnyTarget;
|
||||||
|
import mage.target.common.TargetCardInHand;
|
||||||
import mage.util.CardUtil;
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -15,20 +23,38 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfKaldheim extends CardImpl {
|
public final class InvasionOfKaldheim extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfKaldheim(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfKaldheim(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{R}",
|
||||||
|
"Pyre of the World Tree",
|
||||||
|
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "R"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Kaldheim
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.p.PyreOfTheWorldTree.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Kaldheim enters the battlefield, exile all cards from your hand, then draw that many cards. Until the end of your next turn, you may play cards exiled this way.
|
// When Invasion of Kaldheim enters the battlefield, exile all cards from your hand, then draw that many cards. Until the end of your next turn, you may play cards exiled this way.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfKaldheimEffect()));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfKaldheimEffect()));
|
||||||
|
|
||||||
|
// Pyre of the World Tree
|
||||||
|
// Discard a land card: Pyre of the World Tree deals 2 damage to any target.
|
||||||
|
Ability ability = new SimpleActivatedAbility(
|
||||||
|
new DamageTargetEffect(2),
|
||||||
|
new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_LAND_A))
|
||||||
|
);
|
||||||
|
ability.addTarget(new TargetAnyTarget());
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Whenever you discard a land card, exile the top card of your library. You may play that card this turn.
|
||||||
|
this.getRightHalfCard().addAbility(new DiscardCardControllerTriggeredAbility(
|
||||||
|
new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn),
|
||||||
|
false, StaticFilters.FILTER_CARD_LAND_A
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfKaldheim(final InvasionOfKaldheim card) {
|
private InvasionOfKaldheim(final InvasionOfKaldheim card) {
|
||||||
|
|
@ -45,8 +71,7 @@ class InvasionOfKaldheimEffect extends OneShotEffect {
|
||||||
|
|
||||||
InvasionOfKaldheimEffect() {
|
InvasionOfKaldheimEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
staticText = "exile all cards from your hand, then draw that many cards. " +
|
staticText = "exile all cards from your hand, then draw that many cards. Until the end of your next turn, you may play cards exiled this way";
|
||||||
"Until the end of your next turn, you may play cards exiled this way";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfKaldheimEffect(final InvasionOfKaldheimEffect effect) {
|
private InvasionOfKaldheimEffect(final InvasionOfKaldheimEffect effect) {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,15 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.effects.common.TapTargetEffect;
|
import mage.abilities.effects.common.TapTargetEffect;
|
||||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
|
|
@ -18,23 +21,36 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfKamigawa extends CardImpl {
|
public final class InvasionOfKamigawa extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfKamigawa(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfKamigawa(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{U}",
|
||||||
|
"Rooftop Saboteurs",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.MOONFOLK, SubType.NINJA}, "U"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Kamigawa
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.r.RooftopSaboteurs.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect());
|
||||||
|
|
||||||
// When Invasion of Kamigawa enters the battlefield, tap target artifact or creature an opponent controls and put a stun counter on it.
|
// When Invasion of Kamigawa enters the battlefield, tap target artifact or creature an opponent controls and put a stun counter on it.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect());
|
|
||||||
ability.addEffect(new AddCountersTargetEffect(CounterType.STUN.createInstance()).setText("and put a stun counter on it"));
|
ability.addEffect(new AddCountersTargetEffect(CounterType.STUN.createInstance()).setText("and put a stun counter on it"));
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE));
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Rooftop Saboteurs
|
||||||
|
this.getRightHalfCard().setPT(2, 3);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever Rooftop Saboteurs deals combat damage to a player or battle, draw a card.
|
||||||
|
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(
|
||||||
|
new DrawCardSourceControllerEffect(1), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfKamigawa(final InvasionOfKamigawa card) {
|
private InvasionOfKamigawa(final InvasionOfKamigawa card) {
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,16 @@ package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
|
import mage.abilities.costs.common.PayLifeCost;
|
||||||
import mage.abilities.effects.common.DamageAllEffect;
|
import mage.abilities.effects.common.DamageAllEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.DamagePlayersEffect;
|
||||||
|
import mage.abilities.keyword.WardAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.TargetController;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
|
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
|
||||||
|
|
||||||
|
|
@ -15,24 +20,35 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfKarsus extends CardImpl {
|
public final class InvasionOfKarsus extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterPermanent filter
|
private static final FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("creature and each planeswalker");
|
||||||
= new FilterCreatureOrPlaneswalkerPermanent("creature and each planeswalker");
|
|
||||||
|
|
||||||
public InvasionOfKarsus(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfKarsus(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{R}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{R}{R}",
|
||||||
|
"Refraction Elemental",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELEMENTAL}, "R"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Karsus
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.r.RefractionElemental.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Karsus enters the battlefield, it deals 3 damage to each creature and each planeswalker.
|
// When this Siege enters, it deals 3 damage to each creature and each planeswalker.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DamageAllEffect(3, "it", filter)));
|
||||||
new DamageAllEffect(3, "it", filter)
|
|
||||||
|
// Refraction Elemental
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Ward—Pay 2 life.
|
||||||
|
this.getRightHalfCard().addAbility(new WardAbility(new PayLifeCost(2), false));
|
||||||
|
|
||||||
|
// Whenever you cast a spell, Refraction Elemental deals 2 damage to each opponent.
|
||||||
|
this.getRightHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
|
||||||
|
new DamagePlayersEffect(2, TargetController.OPPONENT), false
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,16 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||||
import mage.abilities.keyword.HasteAbility;
|
import mage.abilities.keyword.HasteAbility;
|
||||||
import mage.abilities.keyword.VigilanceAbility;
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.game.permanent.token.ValorsReachTagTeamToken;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -18,17 +20,19 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfKylem extends CardImpl {
|
public final class InvasionOfKylem extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfKylem(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfKylem(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{R}{W}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{R}{W}",
|
||||||
this.subtype.add(SubType.SIEGE);
|
"Valor's Reach Tag Team",
|
||||||
this.setStartingDefense(5);
|
new CardType[]{CardType.SORCERY}, new SubType[]{}, "RW"
|
||||||
this.secondSideCardClazz = mage.cards.v.ValorsReachTagTeam.class;
|
);
|
||||||
|
|
||||||
|
// Invasion of Kylem
|
||||||
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Kylem enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn.
|
// When Invasion of Kylem enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(2, 0)
|
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(2, 0)
|
||||||
|
|
@ -38,7 +42,11 @@ public final class InvasionOfKylem extends CardImpl {
|
||||||
ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance())
|
ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance())
|
||||||
.setText("and haste until end of turn"));
|
.setText("and haste until end of turn"));
|
||||||
ability.addTarget(new TargetCreaturePermanent(0, 2));
|
ability.addTarget(new TargetCreaturePermanent(0, 2));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Valor's Reach Tag Team
|
||||||
|
// Create two 3/2 red and white Warrior creature tokens with "Whenever this creature and at least one other creature token attack, put a +1/+1 counter on this creature."
|
||||||
|
this.getRightHalfCard().getSpellAbility().addEffect(new CreateTokenEffect(new ValorsReachTagTeamToken(), 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfKylem(final InvasionOfKylem card) {
|
private InvasionOfKylem(final InvasionOfKylem card) {
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,16 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.LandsYouControlCount;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
||||||
import mage.abilities.hint.common.LandsYouControlHint;
|
import mage.abilities.hint.common.LandsYouControlHint;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.Zone;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterOpponentsCreaturePermanent;
|
import mage.filter.common.FilterOpponentsCreaturePermanent;
|
||||||
|
|
@ -24,7 +28,7 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfLorwyn extends CardImpl {
|
public final class InvasionOfLorwyn extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterOpponentsCreaturePermanent(
|
private static final FilterPermanent filter = new FilterOpponentsCreaturePermanent(
|
||||||
"non-Elf creature an opponent controls with power X or less, where X is the number of lands you control"
|
"non-Elf creature an opponent controls with power X or less, where X is the number of lands you control"
|
||||||
|
|
@ -36,19 +40,30 @@ public final class InvasionOfLorwyn extends CardImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
public InvasionOfLorwyn(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfLorwyn(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{4}{B}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{4}{B}{G}",
|
||||||
|
"Winnowing Forces",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELF, SubType.WARRIOR}, "BG"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Lorwyn
|
||||||
this.setStartingDefense(5);
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
this.secondSideCardClazz = mage.cards.w.WinnowingForces.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Lorwyn enters the battlefield, destroy target non-Elf creature an opponent controls with power X or less, where X is the number of lands you control.
|
// When Invasion of Lorwyn enters the battlefield, destroy target non-Elf creature an opponent controls with power X or less, where X is the number of lands you control.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect());
|
Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect());
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
this.addAbility(ability.addHint(LandsYouControlHint.instance));
|
this.getLeftHalfCard().addAbility(ability.addHint(LandsYouControlHint.instance));
|
||||||
|
|
||||||
|
// Winnowing Forces
|
||||||
|
this.getRightHalfCard().setPT(0, 0);
|
||||||
|
|
||||||
|
// Winnowing Forces's power and toughness are each equal to the number of lands you control.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(
|
||||||
|
Zone.ALL, new SetBasePowerToughnessSourceEffect(LandsYouControlCount.instance)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfLorwyn(final InvasionOfLorwyn card) {
|
private InvasionOfLorwyn(final InvasionOfLorwyn card) {
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,64 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
import mage.abilities.costs.common.DiscardCardCost;
|
import mage.abilities.costs.common.DiscardCardCost;
|
||||||
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
import mage.abilities.effects.common.DoIfCostPaid;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.keyword.HasteAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.permanent.token.Elemental11BlueRedToken;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfMercadia extends CardImpl {
|
public final class InvasionOfMercadia extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfMercadia(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfMercadia(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{1}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{1}{R}",
|
||||||
|
"Kyren Flamewright",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.GOBLIN, SubType.SPELLSHAPER}, "R"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Mercadia
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.k.KyrenFlamewright.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Mercadia enters the battlefield, you may discard a card. If you do, draw two cards.
|
// When Invasion of Mercadia enters the battlefield, you may discard a card. If you do, draw two cards.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(2), new DiscardCardCost())));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(2), new DiscardCardCost())));
|
||||||
|
|
||||||
|
// Kyren Flamewright
|
||||||
|
this.getRightHalfCard().setPT(3, 3);
|
||||||
|
|
||||||
|
// {2}{R}, {T}, Discard a card: Create two 1/1 blue and red Elemental creature tokens. Creatures you control get +1/+0 and gain haste until end of turn.
|
||||||
|
Ability ability = new SimpleActivatedAbility(
|
||||||
|
new CreateTokenEffect(new Elemental11BlueRedToken(), 2), new ManaCostsImpl<>("{2}{R}")
|
||||||
|
);
|
||||||
|
ability.addCost(new TapSourceCost());
|
||||||
|
ability.addCost(new DiscardCardCost());
|
||||||
|
ability.addEffect(new BoostControlledEffect(1, 0, Duration.EndOfTurn)
|
||||||
|
.setText("creatures you control get +1/+0"));
|
||||||
|
ability.addEffect(new GainAbilityControlledEffect(
|
||||||
|
HasteAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
|
||||||
|
).setText("and gain haste until end of turn"));
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfMercadia(final InvasionOfMercadia card) {
|
private InvasionOfMercadia(final InvasionOfMercadia card) {
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,58 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
|
import mage.abilities.keyword.WardAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfMoag extends CardImpl {
|
public final class InvasionOfMoag extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfMoag(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfMoag(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{G}{W}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{G}{W}",
|
||||||
|
"Bloomwielder Dryads",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DRYAD}, "GW"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Moag
|
||||||
this.setStartingDefense(5);
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
this.secondSideCardClazz = mage.cards.b.BloomwielderDryads.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Moag enters the battlefield, put a +1/+1 counter on each creature you control.
|
// When Invasion of Moag enters the battlefield, put a +1/+1 counter on each creature you control.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect(
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect(
|
||||||
CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE
|
CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
// Bloomwielder Dryads
|
||||||
|
this.getRightHalfCard().setPT(3, 3);
|
||||||
|
|
||||||
|
// Ward {2}
|
||||||
|
this.getRightHalfCard().addAbility(new WardAbility(new ManaCostsImpl<>("{2}")));
|
||||||
|
|
||||||
|
// At the beginning of your end step, put a +1/+1 counter on target creature you control.
|
||||||
|
Ability ability = new BeginningOfEndStepTriggeredAbility(
|
||||||
|
new AddCountersTargetEffect(CounterType.P1P1.createInstance())
|
||||||
|
);
|
||||||
|
ability.addTarget(new TargetControlledCreaturePermanent());
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfMoag(final InvasionOfMoag card) {
|
private InvasionOfMoag(final InvasionOfMoag card) {
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,14 @@ import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
import mage.abilities.effects.common.FightTargetsEffect;
|
import mage.abilities.effects.common.FightTargetsEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.LoseAllAbilitiesTargetEffect;
|
||||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.counters.CounterType;
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
|
@ -19,27 +23,39 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfMuraganda extends CardImpl {
|
public final class InvasionOfMuraganda extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfMuraganda(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfMuraganda(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{4}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{4}{G}",
|
||||||
|
"Primordial Plasm",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.OOZE}, "G"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Muraganda
|
||||||
this.setStartingDefense(6);
|
this.getLeftHalfCard().setStartingDefense(6);
|
||||||
this.secondSideCardClazz = mage.cards.p.PrimordialPlasm.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Muraganda enters the battlefield, put a +1/+1 counter on target creature you control. Then that creature fights up to one target creature you don't control.
|
// When Invasion of Muraganda enters the battlefield, put a +1/+1 counter on target creature you control. Then that creature fights up to one target creature you don't control.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(
|
Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
|
||||||
new AddCountersTargetEffect(CounterType.P1P1.createInstance())
|
ability.addEffect(new FightTargetsEffect().setText("Then that creature fights up to one target creature you don't control"));
|
||||||
);
|
|
||||||
ability.addEffect(new FightTargetsEffect()
|
|
||||||
.setText("Then that creature fights up to one target creature you don't control"));
|
|
||||||
ability.addTarget(new TargetControlledCreaturePermanent());
|
ability.addTarget(new TargetControlledCreaturePermanent());
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
|
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Primordial Plasm
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// At the beginning of combat on your turn, another target creature gets +2/+2 and loses all abilities until end of turn.
|
||||||
|
Ability combatAbility = new BeginningOfCombatTriggeredAbility(
|
||||||
|
new BoostTargetEffect(2, 2).setText("another target creature gets +2/+2")
|
||||||
|
);
|
||||||
|
combatAbility.addEffect(new LoseAllAbilitiesTargetEffect(Duration.EndOfTurn)
|
||||||
|
.setText("and loses all abilities until end of turn"));
|
||||||
|
combatAbility.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
|
||||||
|
this.getRightHalfCard().addAbility(combatAbility);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfMuraganda(final InvasionOfMuraganda card) {
|
private InvasionOfMuraganda(final InvasionOfMuraganda card) {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,22 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.AttacksAttachedTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.DoWhenCostPaid;
|
import mage.abilities.effects.common.DoWhenCostPaid;
|
||||||
import mage.abilities.effects.common.ExileTargetEffect;
|
import mage.abilities.effects.common.ExileTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.EquipAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.SubType;
|
import mage.constants.*;
|
||||||
|
import mage.counters.CounterType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -19,26 +24,39 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfNewCapenna extends CardImpl {
|
public final class InvasionOfNewCapenna extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfNewCapenna(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfNewCapenna(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{W}{B}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{W}{B}",
|
||||||
|
"Holy Frazzle-Cannon",
|
||||||
|
new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.EQUIPMENT}, "WB"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of New Capenna
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.h.HolyFrazzleCannon.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of New Capenna enters the battlefield, you may sacrifice an artifact or creature. When you do, exile target artifact or creature an opponent controls.
|
// When Invasion of New Capenna enters the battlefield, you may sacrifice an artifact or creature. When you do, exile target artifact or creature an opponent controls.
|
||||||
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ExileTargetEffect(), false);
|
ReflexiveTriggeredAbility ref = new ReflexiveTriggeredAbility(new ExileTargetEffect(), false);
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE));
|
ref.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE));
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
|
||||||
ability,
|
ref,
|
||||||
new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE),
|
new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE),
|
||||||
"Sacrifice and artifact or creature?"
|
"Sacrifice an artifact or creature?"
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
// Holy Frazzle-Cannon
|
||||||
|
// Whenever equipped creature attacks, put a +1/+1 counter on that creature and each other creature you control that shares a creature type with it.
|
||||||
|
this.getRightHalfCard().addAbility(new AttacksAttachedTriggeredAbility(
|
||||||
|
new HolyFrazzleCannonEffect(), AttachmentType.EQUIPMENT,
|
||||||
|
false, SetTargetPointer.PERMANENT
|
||||||
|
));
|
||||||
|
|
||||||
|
// Equip {1}
|
||||||
|
this.getRightHalfCard().addAbility(new EquipAbility(1, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfNewCapenna(final InvasionOfNewCapenna card) {
|
private InvasionOfNewCapenna(final InvasionOfNewCapenna card) {
|
||||||
|
|
@ -50,3 +68,37 @@ public final class InvasionOfNewCapenna extends CardImpl {
|
||||||
return new InvasionOfNewCapenna(this);
|
return new InvasionOfNewCapenna(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class HolyFrazzleCannonEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
HolyFrazzleCannonEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "put a +1/+1 counter on that creature and " +
|
||||||
|
"each other creature you control that shares a creature type with it";
|
||||||
|
}
|
||||||
|
|
||||||
|
private HolyFrazzleCannonEffect(final HolyFrazzleCannonEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HolyFrazzleCannonEffect copy() {
|
||||||
|
return new HolyFrazzleCannonEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
||||||
|
if (permanent == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (Permanent creature : game.getBattlefield().getActivePermanents(
|
||||||
|
StaticFilters.FILTER_CONTROLLED_CREATURE, source.getControllerId(), source, game
|
||||||
|
)) {
|
||||||
|
if (creature.equals(permanent) || permanent.shareCreatureTypes(game, creature)) {
|
||||||
|
creature.addCounters(CounterType.P1P1.createInstance(), source, game);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,70 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.LoyaltyAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||||
|
import mage.abilities.costs.common.DiscardTargetCost;
|
||||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
import mage.abilities.dynamicvalue.common.GetXValue;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.*;
|
||||||
|
import mage.abilities.effects.common.discard.DiscardControllerEffect;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.SubType;
|
import mage.constants.*;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.filter.common.FilterNonlandPermanent;
|
||||||
|
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.command.emblems.TeferiAkosaOfZhalfirEmblem;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
import mage.game.permanent.token.KnightWhiteBlueToken;
|
import mage.game.permanent.token.KnightWhiteBlueToken;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
import mage.target.common.TargetCardInHand;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfNewPhyrexia extends CardImpl {
|
public final class InvasionOfNewPhyrexia extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfNewPhyrexia(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfNewPhyrexia(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{X}{W}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new SuperType[]{}, new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{X}{W}{U}",
|
||||||
|
"Teferi Akosa of Zhalfir",
|
||||||
|
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.TEFERI}, "WU"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of New Phyrexia
|
||||||
this.setStartingDefense(6);
|
this.getLeftHalfCard().setStartingDefense(6);
|
||||||
this.secondSideCardClazz = mage.cards.t.TeferiAkosaOfZhalfir.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of New Phyrexia enters the battlefield, create X 2/2 white and blue Knight creature tokens with vigilance.
|
// When Invasion of New Phyrexia enters the battlefield, create X 2/2 white and blue Knight creature tokens with vigilance.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightWhiteBlueToken(), GetXValue.instance)));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightWhiteBlueToken(), GetXValue.instance)));
|
||||||
|
|
||||||
|
// Teferi Akosa of Zhalfir
|
||||||
|
this.getRightHalfCard().setStartingLoyalty(4);
|
||||||
|
|
||||||
|
// +1: Draw two cards. Then discard two cards unless you discard a creature card.
|
||||||
|
Ability ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(2), 1);
|
||||||
|
ability.addEffect(new DoIfCostPaid(
|
||||||
|
null, new DiscardControllerEffect(2),
|
||||||
|
new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A))
|
||||||
|
.setText("discard a creature card instead of discarding two cards")
|
||||||
|
).setText("Then discard two cards unless you discard a creature card"));
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// -2: You get an emblem with "Knights you control get +1/+0 and have ward {1}."
|
||||||
|
this.getRightHalfCard().addAbility(new LoyaltyAbility(new GetEmblemEffect(new TeferiAkosaOfZhalfirEmblem()), -2));
|
||||||
|
|
||||||
|
// -3: Tap any number of untapped creatures you control. When you do, shuffle target nonland permanent an opponent controls with mana value X or less into its owner's library, where X is the number of creatures tapped this way.
|
||||||
|
this.getRightHalfCard().addAbility(new LoyaltyAbility(new TeferiAkosaOfZhalfirEffect(), -3));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfNewPhyrexia(final InvasionOfNewPhyrexia card) {
|
private InvasionOfNewPhyrexia(final InvasionOfNewPhyrexia card) {
|
||||||
|
|
@ -40,3 +76,50 @@ public final class InvasionOfNewPhyrexia extends CardImpl {
|
||||||
return new InvasionOfNewPhyrexia(this);
|
return new InvasionOfNewPhyrexia(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TeferiAkosaOfZhalfirEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
TeferiAkosaOfZhalfirEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "tap any number of untapped creatures you control. When you do, " +
|
||||||
|
"shuffle target nonland permanent an opponent controls with mana value X or less " +
|
||||||
|
"into its owner's library, where X is the number of creatures tapped this way";
|
||||||
|
}
|
||||||
|
|
||||||
|
private TeferiAkosaOfZhalfirEffect(final TeferiAkosaOfZhalfirEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TeferiAkosaOfZhalfirEffect copy() {
|
||||||
|
return new TeferiAkosaOfZhalfirEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
|
if (player == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TargetPermanent target = new TargetPermanent(
|
||||||
|
0, Integer.MAX_VALUE, StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURES, true
|
||||||
|
);
|
||||||
|
player.choose(Outcome.Tap, target, source, game);
|
||||||
|
int count = 0;
|
||||||
|
for (UUID targetId : target.getTargets()) {
|
||||||
|
Permanent permanent = game.getPermanent(targetId);
|
||||||
|
if (permanent != null && permanent.tap(source, game)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FilterPermanent filter = new FilterNonlandPermanent("nonland permanent an opponent controls with mana value " + count + " or less");
|
||||||
|
filter.add(TargetController.OPPONENT.getControllerPredicate());
|
||||||
|
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, count + 1));
|
||||||
|
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ShuffleIntoLibraryTargetEffect()
|
||||||
|
.setText("shuffle target nonland permanent an opponent controls with mana value X or less " +
|
||||||
|
"into its owner's library, where X is the number of creatures tapped this way"), false);
|
||||||
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
|
game.fireReflexiveTriggeredAbility(ability, source);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,20 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
|
import mage.abilities.keyword.WardAbility;
|
||||||
import mage.cards.*;
|
import mage.cards.*;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.predicate.permanent.TransformedPredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
|
||||||
|
|
@ -16,20 +25,43 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfPyrulea extends CardImpl {
|
public final class InvasionOfPyrulea extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfPyrulea(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfPyrulea(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{G}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{G}{U}",
|
||||||
|
"Gargantuan Slabhorn",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BEAST}, "GU"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Pyrulea
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.g.GargantuanSlabhorn.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Pyrulea enters the battlefield, scry 3, then reveal the top card of your library. If it's a land or double-faced card, draw a card.
|
// When Invasion of Pyrulea enters the battlefield, scry 3, then reveal the top card of your library. If it's a land or double-faced card, draw a card.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfPyruleaEffect()));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfPyruleaEffect()));
|
||||||
|
|
||||||
|
// Gargantuan Slabhorn
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Trample
|
||||||
|
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||||
|
|
||||||
|
// Ward {2}
|
||||||
|
this.getRightHalfCard().addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false));
|
||||||
|
|
||||||
|
// Other transformed permanents you control have trample and ward {2}.
|
||||||
|
FilterPermanent filter = new FilterPermanent("transformed permanents");
|
||||||
|
filter.add(TransformedPredicate.instance);
|
||||||
|
Ability ability = new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||||
|
TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true
|
||||||
|
));
|
||||||
|
ability.addEffect(new GainAbilityControlledEffect(
|
||||||
|
new WardAbility(new GenericManaCost(2)), Duration.WhileOnBattlefield, filter, true
|
||||||
|
).setText("and ward {2}"));
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfPyrulea(final InvasionOfPyrulea card) {
|
private InvasionOfPyrulea(final InvasionOfPyrulea card) {
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,21 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
import mage.abilities.effects.common.ExileTargetEffect;
|
import mage.abilities.effects.common.ExileTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.PutCards;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.constants.TargetController;
|
import mage.constants.TargetController;
|
||||||
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.FilterSpell;
|
||||||
import mage.filter.common.FilterNonlandPermanent;
|
import mage.filter.common.FilterNonlandPermanent;
|
||||||
import mage.filter.predicate.Predicate;
|
import mage.filter.predicate.Predicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
|
@ -21,7 +27,7 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfRavnica extends CardImpl {
|
public final class InvasionOfRavnica extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterNonlandPermanent("nonland permanent an opponent controls that isn't exactly two colors");
|
private static final FilterPermanent filter = new FilterNonlandPermanent("nonland permanent an opponent controls that isn't exactly two colors");
|
||||||
|
|
||||||
|
|
@ -30,20 +36,38 @@ public final class InvasionOfRavnica extends CardImpl {
|
||||||
filter.add(InvasionOfRavnicaPredicate.instance);
|
filter.add(InvasionOfRavnicaPredicate.instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final FilterSpell spellFilter = new FilterSpell("a spell that's exactly two colors");
|
||||||
|
private static final FilterCard cardFilter = new FilterCard("a card that's exactly two colors");
|
||||||
|
|
||||||
|
static {
|
||||||
|
spellFilter.add(GuildpactParagonPredicate.instance);
|
||||||
|
cardFilter.add(GuildpactParagonPredicate.instance);
|
||||||
|
}
|
||||||
|
|
||||||
public InvasionOfRavnica(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfRavnica(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{5}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{5}",
|
||||||
this.subtype.add(SubType.SIEGE);
|
"Guildpact Paragon",
|
||||||
this.setStartingDefense(4);
|
new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.CONSTRUCT}, ""
|
||||||
this.secondSideCardClazz = mage.cards.g.GuildpactParagon.class;
|
);
|
||||||
|
|
||||||
|
// Invasion of Ravnica
|
||||||
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Ravnica enters the battlefield, exile target nonland permanent an opponent controls that isn't exactly two colors.
|
// When Invasion of Ravnica enters the battlefield, exile target nonland permanent an opponent controls that isn't exactly two colors.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect());
|
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect());
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
ability.addTarget(new TargetPermanent(filter));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Guildpact Paragon
|
||||||
|
this.getRightHalfCard().setPT(5, 5);
|
||||||
|
|
||||||
|
// Whenever you cast a spell that's exactly two colors, look at the top six cards of your library. You may reveal a card that's exactly two colors from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
|
||||||
|
this.getRightHalfCard().addAbility(new SpellCastControllerTriggeredAbility(new LookLibraryAndPickControllerEffect(
|
||||||
|
6, 1, cardFilter, PutCards.HAND, PutCards.BOTTOM_RANDOM
|
||||||
|
), spellFilter, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfRavnica(final InvasionOfRavnica card) {
|
private InvasionOfRavnica(final InvasionOfRavnica card) {
|
||||||
|
|
@ -64,3 +88,12 @@ enum InvasionOfRavnicaPredicate implements Predicate<Permanent> {
|
||||||
return input.getColor(game).getColorCount() != 2;
|
return input.getColor(game).getColorCount() != 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum GuildpactParagonPredicate implements Predicate<MageObject> {
|
||||||
|
instance;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(MageObject input, Game game) {
|
||||||
|
return input.getColor(game).getColorCount() == 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,39 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.effects.ReplacementEffectImpl;
|
||||||
import mage.abilities.effects.common.DamageTargetAndTargetEffect;
|
import mage.abilities.effects.common.DamageTargetAndTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.ProwessAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.FilterOpponent;
|
import mage.filter.FilterOpponent;
|
||||||
import mage.filter.common.FilterBattlePermanent;
|
import mage.filter.common.FilterBattlePermanent;
|
||||||
import mage.filter.common.FilterPermanentOrPlayer;
|
import mage.filter.common.FilterPermanentOrPlayer;
|
||||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.players.Player;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import mage.target.common.TargetPermanentOrPlayer;
|
import mage.target.common.TargetPermanentOrPlayer;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfRegatha extends CardImpl {
|
public final class InvasionOfRegatha extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterPermanentOrPlayer filter = new FilterPermanentOrPlayer(
|
private static final FilterPermanentOrPlayer filter = new FilterPermanentOrPlayer(
|
||||||
"another target battle or opponent",
|
"another target battle or opponent",
|
||||||
|
|
@ -32,20 +45,31 @@ public final class InvasionOfRegatha extends CardImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
public InvasionOfRegatha(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfRegatha(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{R}",
|
||||||
this.subtype.add(SubType.SIEGE);
|
"Disciples of the Inferno",
|
||||||
this.setStartingDefense(5);
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.MONK}, "R"
|
||||||
this.secondSideCardClazz = mage.cards.d.DisciplesOfTheInferno.class;
|
);
|
||||||
|
|
||||||
|
// Invasion of Regatha
|
||||||
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Regatha enters the battlefield, it deals 4 damage to another target battle or opponent and 1 damage to up to one target creature.
|
// When Invasion of Regatha enters the battlefield, it deals 4 damage to another target battle or opponent and 1 damage to up to one target creature.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndTargetEffect(4, 1));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndTargetEffect(4, 1));
|
||||||
ability.addTarget(new TargetPermanentOrPlayer(filter).setTargetTag(1));
|
ability.addTarget(new TargetPermanentOrPlayer(filter).setTargetTag(1));
|
||||||
ability.addTarget(new TargetCreaturePermanent(0, 1).setTargetTag(2));
|
ability.addTarget(new TargetCreaturePermanent(0, 1).setTargetTag(2));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Disciples of the Inferno
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Prowess
|
||||||
|
this.getRightHalfCard().addAbility(new ProwessAbility());
|
||||||
|
|
||||||
|
// If a noncreature source you control would deal damage to a creature, battle, or opponent, it deals that much damage plus 2 instead.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new DisciplesOfTheInfernoEffect()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfRegatha(final InvasionOfRegatha card) {
|
private InvasionOfRegatha(final InvasionOfRegatha card) {
|
||||||
|
|
@ -57,3 +81,61 @@ public final class InvasionOfRegatha extends CardImpl {
|
||||||
return new InvasionOfRegatha(this);
|
return new InvasionOfRegatha(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DisciplesOfTheInfernoEffect extends ReplacementEffectImpl {
|
||||||
|
|
||||||
|
DisciplesOfTheInfernoEffect() {
|
||||||
|
super(Duration.WhileOnBattlefield, Outcome.Damage);
|
||||||
|
this.staticText = "if a noncreature source you control would deal damage " +
|
||||||
|
"to a creature, battle, or opponent, it deals that much damage plus 2 instead";
|
||||||
|
}
|
||||||
|
|
||||||
|
private DisciplesOfTheInfernoEffect(final DisciplesOfTheInfernoEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||||
|
event.setAmount(CardUtil.overflowInc(event.getAmount(), 2));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checksEventType(GameEvent event, Game game) {
|
||||||
|
switch (event.getType()) {
|
||||||
|
case DAMAGE_PERMANENT:
|
||||||
|
case DAMAGE_PLAYER:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||||
|
Player controller = game.getPlayer(source.getControllerId());
|
||||||
|
if (controller == null || !controller.hasOpponent(event.getTargetId(), game)
|
||||||
|
&& Optional
|
||||||
|
.of(event.getTargetId())
|
||||||
|
.map(game::getPermanent)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.map(permanent -> !permanent.isCreature(game) && !permanent.isBattle(game))
|
||||||
|
.orElse(true)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MageObject sourceObject;
|
||||||
|
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
|
||||||
|
if (sourcePermanent == null) {
|
||||||
|
sourceObject = game.getObject(event.getSourceId());
|
||||||
|
} else {
|
||||||
|
sourceObject = sourcePermanent;
|
||||||
|
}
|
||||||
|
return sourceObject != null
|
||||||
|
&& !sourceObject.isCreature(game)
|
||||||
|
&& event.getAmount() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DisciplesOfTheInfernoEffect copy() {
|
||||||
|
return new DisciplesOfTheInfernoEffect(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,65 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.UntapTargetEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect;
|
||||||
|
import mage.abilities.keyword.ConvokeAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.common.FilterNonlandCard;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.filter.predicate.mageobject.AbilityPredicate;
|
||||||
import mage.game.permanent.token.Kraken11Token;
|
import mage.game.permanent.token.Kraken11Token;
|
||||||
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfSegovia extends CardImpl {
|
public final class InvasionOfSegovia extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
|
private static final FilterNonlandCard filter = new FilterNonlandCard("noncreature spells you cast");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
|
||||||
|
filter.add(Predicates.not(new AbilityPredicate(ConvokeAbility.class)));
|
||||||
|
}
|
||||||
|
|
||||||
public InvasionOfSegovia(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfSegovia(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new SuperType[]{}, new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{U}",
|
||||||
|
"Caetus, Sea Tyrant of Segovia",
|
||||||
|
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SERPENT}, "U"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Segovia
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.c.CaetusSeaTyrantOfSegovia.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Segovia enters the battlefield, create two 1/1 blue Kraken creature tokens with trample.
|
// When Invasion of Segovia enters the battlefield, create two 1/1 blue Kraken creature tokens with trample.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new Kraken11Token(), 2)));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new Kraken11Token(), 2)));
|
||||||
|
|
||||||
|
// Caetus, Sea Tyrant of Segovia
|
||||||
|
this.getRightHalfCard().setPT(3, 3);
|
||||||
|
|
||||||
|
// Noncreature spells you cast have convoke.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledSpellsEffect(new ConvokeAbility(), filter)));
|
||||||
|
|
||||||
|
// At the beginning of your end step, untap up to four target creatures.
|
||||||
|
Ability ability = new BeginningOfEndStepTriggeredAbility(new UntapTargetEffect());
|
||||||
|
ability.addTarget(new TargetCreaturePermanent(0, 4));
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfSegovia(final InvasionOfSegovia card) {
|
private InvasionOfSegovia(final InvasionOfSegovia card) {
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,11 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
|
|
@ -16,22 +18,31 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfShandalar extends CardImpl {
|
public final class InvasionOfShandalar extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfShandalar(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfShandalar(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{G}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{G}{G}",
|
||||||
|
"Leyline Surge",
|
||||||
|
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "G"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Shandalar
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.l.LeylineSurge.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Shandalar enters the battlefield, return up to three target permanent cards from your graveyard to your hand.
|
// When Invasion of Shandalar enters the battlefield, return up to three target permanent cards from your graveyard to your hand.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect());
|
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect());
|
||||||
ability.addTarget(new TargetCardInYourGraveyard(0, 3, StaticFilters.FILTER_CARD_PERMANENTS));
|
ability.addTarget(new TargetCardInYourGraveyard(0, 3, StaticFilters.FILTER_CARD_PERMANENTS));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Leyline Surge
|
||||||
|
// At the beginning of your upkeep, you may put a permanent card from your hand onto the battlefield.
|
||||||
|
this.getRightHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(
|
||||||
|
StaticFilters.FILTER_CARD_A_PERMANENT
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfShandalar(final InvasionOfShandalar card) {
|
private InvasionOfShandalar(final InvasionOfShandalar card) {
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,31 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.MageObjectReference;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.Cards;
|
import mage.cards.Cards;
|
||||||
import mage.cards.CardsImpl;
|
import mage.cards.CardsImpl;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
import mage.filter.common.FilterAnyTarget;
|
import mage.filter.common.FilterAnyTarget;
|
||||||
|
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||||
import mage.filter.common.FilterPermanentOrPlayer;
|
import mage.filter.common.FilterPermanentOrPlayer;
|
||||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetCard;
|
import mage.target.TargetCard;
|
||||||
|
import mage.target.common.TargetAnyTarget;
|
||||||
import mage.target.common.TargetCardInHand;
|
import mage.target.common.TargetCardInHand;
|
||||||
import mage.target.common.TargetPermanentOrPlayer;
|
import mage.target.common.TargetPermanentOrPlayer;
|
||||||
|
|
||||||
|
|
@ -28,20 +34,37 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfTarkir extends CardImpl {
|
public final class InvasionOfTarkir extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfTarkir(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfTarkir(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{1}{R}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{1}{R}",
|
||||||
|
"Defiant Thundermaw",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DRAGON}, "R"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Tarkir
|
||||||
this.setStartingDefense(5);
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
this.secondSideCardClazz = mage.cards.d.DefiantThundermaw.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Tarkir enters the battlefield, reveal any number of Dragon cards from your hand. When you do, Invasion of Tarkir deals X plus 2 damage to any other target, where X is the number of cards revealed this way.
|
// When Invasion of Tarkir enters the battlefield, reveal any number of Dragon cards from your hand. When you do, Invasion of Tarkir deals X plus 2 damage to any other target, where X is the number of cards revealed this way.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfTarkirEffect()));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new InvasionOfTarkirEffect()));
|
||||||
|
|
||||||
|
// Defiant Thundermaw
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Trample
|
||||||
|
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever a Dragon you control attacks, it deals 2 damage to any target.
|
||||||
|
Ability ability = new AttacksCreatureYouControlTriggeredAbility(new DefiantThundermawEffect(), false, new FilterControlledCreaturePermanent(SubType.DRAGON));
|
||||||
|
ability.addTarget(new TargetAnyTarget());
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfTarkir(final InvasionOfTarkir card) {
|
private InvasionOfTarkir(final InvasionOfTarkir card) {
|
||||||
|
|
@ -66,8 +89,7 @@ class InvasionOfTarkirEffect extends OneShotEffect {
|
||||||
|
|
||||||
InvasionOfTarkirEffect() {
|
InvasionOfTarkirEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
staticText = "reveal any number of Dragon cards from your hand. When you do, " +
|
staticText = "reveal any number of Dragon cards from your hand. When you do, {this} deals X plus 2 damage to any other target, where X is the number of cards revealed this way";
|
||||||
"{this} deals X plus 2 damage to any other target, where X is the number of cards revealed this way";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfTarkirEffect(final InvasionOfTarkirEffect effect) {
|
private InvasionOfTarkirEffect(final InvasionOfTarkirEffect effect) {
|
||||||
|
|
@ -97,3 +119,33 @@ class InvasionOfTarkirEffect extends OneShotEffect {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DefiantThundermawEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
DefiantThundermawEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "it deals 2 damage to any target";
|
||||||
|
}
|
||||||
|
|
||||||
|
private DefiantThundermawEffect(final DefiantThundermawEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DefiantThundermawEffect copy() {
|
||||||
|
return new DefiantThundermawEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
MageObjectReference mor = (MageObjectReference) getValue("attackerRef");
|
||||||
|
if (mor == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
game.damagePlayerOrPermanent(
|
||||||
|
getTargetPointer().getFirst(game, source), 2,
|
||||||
|
mor.getSourceId(), source, game, false, true
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,32 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||||
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
|
import mage.abilities.keyword.IndestructibleAbility;
|
||||||
|
import mage.abilities.keyword.LifelinkAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.ComparisonType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterControlledEnchantmentPermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
import mage.target.common.TargetCardInLibrary;
|
import mage.target.common.TargetCardInLibrary;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -16,9 +34,10 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfTheros extends CardImpl {
|
public final class InvasionOfTheros extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterCard("an Aura, God, or Demigod card");
|
private static final FilterCard filter = new FilterCard("an Aura, God, or Demigod card");
|
||||||
|
private static final FilterPermanent epharaFilter = new FilterControlledEnchantmentPermanent("another enchantment");
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filter.add(Predicates.or(
|
filter.add(Predicates.or(
|
||||||
|
|
@ -26,22 +45,55 @@ public final class InvasionOfTheros extends CardImpl {
|
||||||
SubType.GOD.getPredicate(),
|
SubType.GOD.getPredicate(),
|
||||||
SubType.DEMIGOD.getPredicate()
|
SubType.DEMIGOD.getPredicate()
|
||||||
));
|
));
|
||||||
|
epharaFilter.add(AnotherPredicate.instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public InvasionOfTheros(UUID ownerId, CardSetInfo setInfo) {
|
static {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{W}");
|
}
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
|
||||||
this.setStartingDefense(4);
|
epharaFilter, ComparisonType.MORE_THAN, 2, true
|
||||||
this.secondSideCardClazz = mage.cards.e.EpharaEverSheltering.class;
|
);
|
||||||
|
private static final Hint epharaHint = new ValueHint(
|
||||||
|
"Other enchantments you control", new PermanentsOnBattlefieldCount(epharaFilter)
|
||||||
|
);
|
||||||
|
|
||||||
|
public InvasionOfTheros(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo,
|
||||||
|
new SuperType[]{}, new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{W}",
|
||||||
|
"Ephara, Ever-Sheltering",
|
||||||
|
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.GOD}, "WU"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Invasion of Theros
|
||||||
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Theros enters the battlefield, search your library for an Aura, God, or Demigod card, reveal it, put it into your hand, then shuffle.
|
// When Invasion of Theros enters the battlefield, search your library for an Aura, God, or Demigod card, reveal it, put it into your hand, then shuffle.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(
|
||||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
|
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
|
||||||
));
|
));
|
||||||
|
|
||||||
|
// Ephara, Ever-Sheltering
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Ephara, Ever-Sheltering has lifelink and indestructible as long as you control at least three other enchantments.
|
||||||
|
Ability staticAbility = new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
|
new GainAbilitySourceEffect(LifelinkAbility.getInstance()),
|
||||||
|
condition, "{this} has lifelink"
|
||||||
|
));
|
||||||
|
staticAbility.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(
|
||||||
|
IndestructibleAbility.getInstance()), condition,
|
||||||
|
"and indestructible as long as you control at least three other enchantments"
|
||||||
|
));
|
||||||
|
this.getRightHalfCard().addAbility(staticAbility.addHint(epharaHint));
|
||||||
|
|
||||||
|
// Whenever another enchantment you control enters, draw a card.
|
||||||
|
this.getRightHalfCard().addAbility(new EntersBattlefieldControlledTriggeredAbility(
|
||||||
|
new DrawCardSourceControllerEffect(1), epharaFilter
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfTheros(final InvasionOfTheros card) {
|
private InvasionOfTheros(final InvasionOfTheros card) {
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,24 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.keyword.LifelinkAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.FilterCard;
|
import mage.filter.FilterCard;
|
||||||
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.common.FilterPermanentCard;
|
import mage.filter.common.FilterPermanentCard;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.filter.predicate.permanent.TokenPredicate;
|
||||||
|
import mage.game.permanent.token.WhiteBlackSpiritToken;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -18,7 +28,7 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfTolvada extends CardImpl {
|
public final class InvasionOfTolvada extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterPermanentCard("nonbattle permanent card from your graveyard");
|
private static final FilterCard filter = new FilterPermanentCard("nonbattle permanent card from your graveyard");
|
||||||
|
|
||||||
|
|
@ -26,20 +36,44 @@ public final class InvasionOfTolvada extends CardImpl {
|
||||||
filter.add(Predicates.not(CardType.BATTLE.getPredicate()));
|
filter.add(Predicates.not(CardType.BATTLE.getPredicate()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public InvasionOfTolvada(UUID ownerId, CardSetInfo setInfo) {
|
private static final FilterCreaturePermanent tokenFilter = new FilterCreaturePermanent("creature tokens");
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{W}{B}");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
static {
|
||||||
this.setStartingDefense(5);
|
tokenFilter.add(TokenPredicate.TRUE);
|
||||||
this.secondSideCardClazz = mage.cards.t.TheBrokenSky.class;
|
}
|
||||||
|
|
||||||
|
public InvasionOfTolvada(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{W}{B}",
|
||||||
|
"The Broken Sky",
|
||||||
|
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "WB"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Invasion of Tolvada
|
||||||
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Tolvada enters the battlefield, return target nonbattle permanent card from your graveyard to the battlefield.
|
// When Invasion of Tolvada enters the battlefield, return target nonbattle permanent card from your graveyard to the battlefield.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect());
|
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect());
|
||||||
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
ability.addTarget(new TargetCardInYourGraveyard(filter));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// The Broken Sky
|
||||||
|
// Creature tokens you control get +1/+0 and have lifelink.
|
||||||
|
Ability staticAbility = new SimpleStaticAbility(new BoostControlledEffect(
|
||||||
|
1, 0, Duration.WhileOnBattlefield, tokenFilter
|
||||||
|
));
|
||||||
|
staticAbility.addEffect(new GainAbilityControlledEffect(
|
||||||
|
LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, tokenFilter
|
||||||
|
).setText("and have lifelink"));
|
||||||
|
this.getRightHalfCard().addAbility(staticAbility);
|
||||||
|
|
||||||
|
// At the beginning of your end step, create a 1/1 white and black Spirit creature token with flying.
|
||||||
|
this.getRightHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(
|
||||||
|
new CreateTokenEffect(new WhiteBlackSpiritToken())
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfTolvada(final InvasionOfTolvada card) {
|
private InvasionOfTolvada(final InvasionOfTolvada card) {
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,20 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
import mage.abilities.effects.common.DamageTargetEffect;
|
||||||
import mage.abilities.effects.common.GainLifeEffect;
|
import mage.abilities.effects.common.GainLifeEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.common.FilterAnyTarget;
|
import mage.filter.common.FilterAnyTarget;
|
||||||
import mage.filter.common.FilterPermanentOrPlayer;
|
import mage.filter.common.FilterPermanentOrPlayer;
|
||||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||||
|
|
@ -19,7 +25,7 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfUlgrotha extends CardImpl {
|
public final class InvasionOfUlgrotha extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
private static final FilterPermanentOrPlayer filter = new FilterAnyTarget("any other target");
|
private static final FilterPermanentOrPlayer filter = new FilterAnyTarget("any other target");
|
||||||
|
|
||||||
|
|
@ -28,20 +34,37 @@ public final class InvasionOfUlgrotha extends CardImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
public InvasionOfUlgrotha(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfUlgrotha(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{4}{B}");
|
super(ownerId, setInfo,
|
||||||
|
new SuperType[]{}, new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{4}{B}",
|
||||||
|
"Grandmother Ravi Sengir",
|
||||||
|
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD}, "B"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Ulgrotha
|
||||||
this.setStartingDefense(5);
|
this.getLeftHalfCard().setStartingDefense(5);
|
||||||
this.secondSideCardClazz = mage.cards.g.GrandmotherRaviSengir.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Ulgrotha enters the battlefield, it deals 3 damage to any other target and you gain 3 life.
|
// When Invasion of Ulgrotha enters the battlefield, it deals 3 damage to any other target and you gain 3 life.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3, "it"));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3, "it"));
|
||||||
ability.addEffect(new GainLifeEffect(3).concatBy("and"));
|
ability.addEffect(new GainLifeEffect(3).concatBy("and"));
|
||||||
ability.addTarget(new TargetPermanentOrPlayer(filter));
|
ability.addTarget(new TargetPermanentOrPlayer(filter));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Grandmother Ravi Sengir
|
||||||
|
this.getRightHalfCard().setPT(3, 3);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever a creature an opponent controls dies, put a +1/+1 counter on Grandmother Ravi Sengir and you gain 1 life.
|
||||||
|
Ability diesAbility = new DiesCreatureTriggeredAbility(
|
||||||
|
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
||||||
|
false, StaticFilters.FILTER_OPPONENTS_PERMANENT_A_CREATURE
|
||||||
|
);
|
||||||
|
diesAbility.addEffect(new GainLifeEffect(1).concatBy("and"));
|
||||||
|
this.getRightHalfCard().addAbility(diesAbility);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfUlgrotha(final InvasionOfUlgrotha card) {
|
private InvasionOfUlgrotha(final InvasionOfUlgrotha card) {
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,60 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||||
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
|
import mage.abilities.effects.common.CopyTargetStackObjectEffect;
|
||||||
import mage.abilities.effects.common.DrawDiscardControllerEffect;
|
import mage.abilities.effects.common.DrawDiscardControllerEffect;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.TargetController;
|
||||||
|
import mage.filter.FilterSpell;
|
||||||
|
import mage.target.TargetSpell;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfVryn extends CardImpl {
|
public final class InvasionOfVryn extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
|
private static final FilterSpell filter = new FilterSpell("spell you control");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(TargetController.YOU.getControllerPredicate());
|
||||||
|
}
|
||||||
|
|
||||||
public InvasionOfVryn(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfVryn(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{U}",
|
||||||
|
"Overloaded Mage-Ring",
|
||||||
|
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "U"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Vryn
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.o.OverloadedMageRing.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Vryn enters the battlefield, draw three cards, then discard a card.
|
// When Invasion of Vryn enters the battlefield, draw three cards, then discard a card.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(3, 1)));
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(3, 1)));
|
||||||
|
|
||||||
|
// Overloaded Mage-Ring
|
||||||
|
// {1}, {T}, Sacrifice Overloaded Mage-Ring: Copy target spell you control. You may choose new targets for the copy.
|
||||||
|
Ability ability = new SimpleActivatedAbility(
|
||||||
|
new CopyTargetStackObjectEffect(false, false, true), new GenericManaCost(1)
|
||||||
|
);
|
||||||
|
ability.addCost(new TapSourceCost());
|
||||||
|
ability.addCost(new SacrificeSourceCost());
|
||||||
|
ability.addTarget(new TargetSpell(filter));
|
||||||
|
this.getRightHalfCard().addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfVryn(final InvasionOfVryn card) {
|
private InvasionOfVryn(final InvasionOfVryn card) {
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,16 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.Zone;
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -15,22 +20,34 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfXerex extends CardImpl {
|
public final class InvasionOfXerex extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfXerex(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfXerex(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{W}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{W}{U}",
|
||||||
|
"Vertex Paladin",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ANGEL, SubType.KNIGHT}, "WU"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Xerex
|
||||||
this.setStartingDefense(4);
|
this.getLeftHalfCard().setStartingDefense(4);
|
||||||
this.secondSideCardClazz = mage.cards.v.VertexPaladin.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Xerex enters the battlefield, return up to one target creature to its owner's hand.
|
// When Invasion of Xerex enters the battlefield, return up to one target creature to its owner's hand.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect());
|
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect());
|
||||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
|
// Vertex Paladin
|
||||||
|
this.getRightHalfCard().setPT(0, 0);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Vertex Paladin's power and toughness are each equal to the number of creatures you control.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(CreaturesYouControlCount.PLURAL)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfXerex(final InvasionOfXerex card) {
|
private InvasionOfXerex(final InvasionOfXerex card) {
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,16 @@ package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.common.SiegeAbility;
|
import mage.abilities.common.SiegeAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect;
|
||||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
|
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.abilities.keyword.HasteAbility;
|
||||||
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
|
import mage.abilities.mana.AnyColorManaAbility;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.target.common.TargetCardInLibrary;
|
import mage.target.common.TargetCardInLibrary;
|
||||||
|
|
@ -15,22 +21,41 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvasionOfZendikar extends CardImpl {
|
public final class InvasionOfZendikar extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvasionOfZendikar(UUID ownerId, CardSetInfo setInfo) {
|
public InvasionOfZendikar(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{G}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{3}{G}",
|
||||||
|
"Awakened Skyclave",
|
||||||
|
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELEMENTAL}, "G"
|
||||||
|
);
|
||||||
|
|
||||||
this.subtype.add(SubType.SIEGE);
|
// Invasion of Zendikar
|
||||||
this.setStartingDefense(3);
|
this.getLeftHalfCard().setStartingDefense(3);
|
||||||
this.secondSideCardClazz = mage.cards.a.AwakenedSkyclave.class;
|
|
||||||
|
|
||||||
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
|
||||||
this.addAbility(new SiegeAbility());
|
this.getLeftHalfCard().addAbility(new SiegeAbility());
|
||||||
|
|
||||||
// When Invasion of Zendikar enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.
|
// When Invasion of Zendikar enters the battlefield, you may search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library.
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(
|
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(
|
||||||
0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS
|
0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS
|
||||||
), true)));
|
), true)));
|
||||||
|
|
||||||
|
// Awakened Skyclave
|
||||||
|
this.getRightHalfCard().setPT(4, 4);
|
||||||
|
|
||||||
|
// Vigilance
|
||||||
|
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
|
||||||
|
|
||||||
|
// Haste
|
||||||
|
this.getRightHalfCard().addAbility(HasteAbility.getInstance());
|
||||||
|
|
||||||
|
// As long as Awakened Skyclave is on the battlefield, it's a land in addition to its other types.
|
||||||
|
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new AddCardTypeSourceEffect(Duration.WhileOnBattlefield, CardType.LAND)
|
||||||
|
.setText("as long as {this} is on the battlefield, it's a land in addition to its other types")));
|
||||||
|
|
||||||
|
// {T}: Add one mana of any color.
|
||||||
|
this.getRightHalfCard().addAbility(new AnyColorManaAbility());
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvasionOfZendikar(final InvasionOfZendikar card) {
|
private InvasionOfZendikar(final InvasionOfZendikar card) {
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,22 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
|
import mage.MageObject;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SagaAbility;
|
import mage.abilities.common.SagaAbility;
|
||||||
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
|
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
|
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
|
||||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||||
import mage.abilities.keyword.TransformAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.filter.StaticFilters;
|
import mage.filter.StaticFilters;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.game.stack.Spell;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetCard;
|
import mage.target.TargetCard;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
|
|
@ -23,31 +28,41 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InventiveIteration extends CardImpl {
|
public final class InventiveIteration extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InventiveIteration(UUID ownerId, CardSetInfo setInfo) {
|
public InventiveIteration(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
|
super(ownerId, setInfo,
|
||||||
|
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{3}{U}",
|
||||||
this.subtype.add(SubType.SAGA);
|
"Living Breakthrough",
|
||||||
this.secondSideCardClazz = mage.cards.l.LivingBreakthrough.class;
|
new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.MOONFOLK}, "U"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Inventive Iteration
|
||||||
// (As this Saga enters and after your draw step, add a lore counter.)
|
// (As this Saga enters and after your draw step, add a lore counter.)
|
||||||
SagaAbility sagaAbility = new SagaAbility(this);
|
SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
|
||||||
|
|
||||||
// I — Return up to one target creature or planeswalker to its owner's hand.
|
// I — Return up to one target creature or planeswalker to its owner's hand.
|
||||||
sagaAbility.addChapterEffect(
|
sagaAbility.addChapterEffect(
|
||||||
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
|
this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
|
||||||
new ReturnToHandTargetEffect(), new TargetCreatureOrPlaneswalker(0, 1)
|
new ReturnToHandTargetEffect(), new TargetCreatureOrPlaneswalker(0, 1)
|
||||||
);
|
);
|
||||||
|
|
||||||
// II — Return an artifact card from your graveyard to your hand. If you can't, draw a card.
|
// II — Return an artifact card from your graveyard to your hand. If you can't, draw a card.
|
||||||
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new InventiveIterationEffect());
|
sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_II, new InventiveIterationEffect());
|
||||||
|
|
||||||
// III — Exile this Saga, then return it to the battlefield transformed under your control.
|
// III — Exile this Saga, then return it to the battlefield transformed under your control.
|
||||||
this.addAbility(new TransformAbility());
|
sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
|
||||||
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
|
|
||||||
|
|
||||||
this.addAbility(sagaAbility);
|
this.getLeftHalfCard().addAbility(sagaAbility);
|
||||||
|
|
||||||
|
// Living Breakthrough
|
||||||
|
this.getRightHalfCard().setPT(3, 3);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever you cast a spell, your opponents can't cast spells with the same mana value as that spell until your next turn.
|
||||||
|
this.getRightHalfCard().addAbility(new SpellCastControllerTriggeredAbility(new LivingBreakthroughEffect(), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private InventiveIteration(final InventiveIteration card) {
|
private InventiveIteration(final InventiveIteration card) {
|
||||||
|
|
@ -102,3 +117,56 @@ class InventiveIterationEffect extends OneShotEffect {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LivingBreakthroughEffect extends ContinuousRuleModifyingEffectImpl {
|
||||||
|
|
||||||
|
private int manaValue = -1;
|
||||||
|
|
||||||
|
LivingBreakthroughEffect() {
|
||||||
|
super(Duration.UntilYourNextTurn, Outcome.Benefit);
|
||||||
|
staticText = "your opponents can't cast spells with the same mana value as that spell until your next turn";
|
||||||
|
}
|
||||||
|
|
||||||
|
private LivingBreakthroughEffect(final LivingBreakthroughEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
this.manaValue = effect.manaValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LivingBreakthroughEffect copy() {
|
||||||
|
return new LivingBreakthroughEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Ability source, Game game) {
|
||||||
|
super.init(source, game);
|
||||||
|
Spell spell = (Spell) getValue("spellCast");
|
||||||
|
if (spell != null) {
|
||||||
|
this.manaValue = spell.getManaValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getInfoMessage(Ability source, GameEvent event, Game game) {
|
||||||
|
MageObject mageObject = game.getObject(source);
|
||||||
|
if (mageObject != null) {
|
||||||
|
return "You can't cast spells with mana value " + manaValue
|
||||||
|
+ " this turn (" + mageObject.getIdName() + ").";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checksEventType(GameEvent event, Game game) {
|
||||||
|
return event.getType() == GameEvent.EventType.CAST_SPELL_LATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||||
|
if (!game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Spell spell = game.getStack().getSpell(event.getTargetId());
|
||||||
|
return spell != null && spell.getManaValue() == this.manaValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,49 @@
|
||||||
package mage.cards.i;
|
package mage.cards.i;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.MayTapOrUntapTargetEffect;
|
||||||
import mage.abilities.effects.common.MillCardsControllerEffect;
|
import mage.abilities.effects.common.MillCardsControllerEffect;
|
||||||
import mage.abilities.keyword.CraftAbility;
|
import mage.abilities.keyword.CraftAbility;
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.TransformingDoubleFacedCard;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public final class InvertedIceberg extends CardImpl {
|
public final class InvertedIceberg extends TransformingDoubleFacedCard {
|
||||||
|
|
||||||
public InvertedIceberg(UUID ownerId, CardSetInfo setInfo) {
|
public InvertedIceberg(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}");
|
super(ownerId, setInfo,
|
||||||
this.secondSideCardClazz = mage.cards.i.IcebergTitan.class;
|
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{1}{U}",
|
||||||
|
"Iceberg Titan",
|
||||||
|
new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GOLEM}, "U"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Inverted Iceberg
|
||||||
// When Inverted Iceberg enters the battlefield, mill a card, then draw a card.
|
// When Inverted Iceberg enters the battlefield, mill a card, then draw a card.
|
||||||
Ability ability = new EntersBattlefieldTriggeredAbility(new MillCardsControllerEffect(1));
|
Ability ability = new EntersBattlefieldTriggeredAbility(new MillCardsControllerEffect(1));
|
||||||
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy(", then"));
|
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy(", then"));
|
||||||
this.addAbility(ability);
|
this.getLeftHalfCard().addAbility(ability);
|
||||||
|
|
||||||
// Craft with artifact {4}{U}{U}
|
// Craft with artifact {4}{U}{U}
|
||||||
this.addAbility(new CraftAbility("{4}{U}{U}"));
|
this.getLeftHalfCard().addAbility(new CraftAbility("{4}{U}{U}"));
|
||||||
|
|
||||||
|
// Iceberg Titan
|
||||||
|
this.getRightHalfCard().setPT(6, 6);
|
||||||
|
|
||||||
|
// Whenever Iceberg Titan attacks, you may tap or untap target artifact or creature.
|
||||||
|
Ability atkAbility = new AttacksTriggeredAbility(new MayTapOrUntapTargetEffect());
|
||||||
|
atkAbility.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE));
|
||||||
|
this.getRightHalfCard().addAbility(atkAbility);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InvertedIceberg(final InvertedIceberg card) {
|
private InvertedIceberg(final InvertedIceberg card) {
|
||||||
|
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
package mage.cards.i;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.filter.FilterSpell;
|
|
||||||
import mage.filter.common.FilterInstantOrSorcerySpell;
|
|
||||||
import mage.filter.predicate.card.CastFromZonePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.stack.Spell;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class InvocationOfTheFounders extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterSpell filter
|
|
||||||
= new FilterInstantOrSorcerySpell("an instant or sorcery spell from your hand");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(new CastFromZonePredicate(Zone.HAND));
|
|
||||||
}
|
|
||||||
|
|
||||||
public InvocationOfTheFounders(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
|
|
||||||
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Whenever you cast an instant or sorcery spell from your hand, you may copy that spell. You may choose new targets for the copy.
|
|
||||||
this.addAbility(new SpellCastControllerTriggeredAbility(
|
|
||||||
new InvocationOfTheFoundersEffect(), filter, true
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private InvocationOfTheFounders(final InvocationOfTheFounders card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public InvocationOfTheFounders copy() {
|
|
||||||
return new InvocationOfTheFounders(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class InvocationOfTheFoundersEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
InvocationOfTheFoundersEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "copy that spell. You may choose new targets for the copy";
|
|
||||||
}
|
|
||||||
|
|
||||||
private InvocationOfTheFoundersEffect(final InvocationOfTheFoundersEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public InvocationOfTheFoundersEffect copy() {
|
|
||||||
return new InvocationOfTheFoundersEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Spell spell = (Spell) getValue("spellCast");
|
|
||||||
if (spell != null) {
|
|
||||||
spell.createCopyOnStack(game, source, source.getControllerId(), true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
package mage.cards.k;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
|
||||||
import mage.abilities.costs.common.DiscardCardCost;
|
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
|
||||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
|
||||||
import mage.abilities.keyword.HasteAbility;
|
|
||||||
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.game.permanent.token.Elemental11BlueRedToken;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class KyrenFlamewright extends CardImpl {
|
|
||||||
|
|
||||||
public KyrenFlamewright(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.GOBLIN);
|
|
||||||
this.subtype.add(SubType.SPELLSHAPER);
|
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// {2}{R}, {T}, Discard a card: Create two 1/1 blue and red Elemental creature tokens. Creatures you control get +1/+0 and gain haste until end of turn.
|
|
||||||
Ability ability = new SimpleActivatedAbility(
|
|
||||||
new CreateTokenEffect(new Elemental11BlueRedToken(), 2), new ManaCostsImpl<>("{2}{R}")
|
|
||||||
);
|
|
||||||
ability.addCost(new TapSourceCost());
|
|
||||||
ability.addCost(new DiscardCardCost());
|
|
||||||
ability.addEffect(new BoostControlledEffect(1, 0, Duration.EndOfTurn)
|
|
||||||
.setText("creatures you control get +1/+0"));
|
|
||||||
ability.addEffect(new GainAbilityControlledEffect(
|
|
||||||
HasteAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES
|
|
||||||
).setText("and gain haste until end of turn"));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private KyrenFlamewright(final KyrenFlamewright card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public KyrenFlamewright copy() {
|
|
||||||
return new KyrenFlamewright(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,110 +0,0 @@
|
||||||
package mage.cards.l;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.MageObject;
|
|
||||||
import mage.ObjectColor;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.EntersBattlefieldAbility;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.effects.common.CopyEffect;
|
|
||||||
import mage.cards.Card;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.filter.common.FilterCreatureCard;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.Target;
|
|
||||||
import mage.target.common.TargetCardInGraveyard;
|
|
||||||
import mage.util.functions.CopyApplier;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class LazotepConvert extends CardImpl {
|
|
||||||
|
|
||||||
public LazotepConvert(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.ZOMBIE);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// You may have Lazotep Convert enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types.
|
|
||||||
this.addAbility(new EntersBattlefieldAbility(new LazotepConvertCopyEffect(), true));
|
|
||||||
}
|
|
||||||
|
|
||||||
private LazotepConvert(final LazotepConvert card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LazotepConvert copy() {
|
|
||||||
return new LazotepConvert(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class LazotepConvertCopyEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
private static final CopyApplier applier = new CopyApplier() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, MageObject blueprint, Ability source, UUID copyToObjectId) {
|
|
||||||
blueprint.removePTCDA();
|
|
||||||
blueprint.getPower().setModifiedBaseValue(4);
|
|
||||||
blueprint.getToughness().setModifiedBaseValue(4);
|
|
||||||
blueprint.addSubType(SubType.ZOMBIE);
|
|
||||||
blueprint.getColor().addColor(ObjectColor.BLACK);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterCreatureCard("creature card in a graveyard");
|
|
||||||
|
|
||||||
public LazotepConvertCopyEffect() {
|
|
||||||
super(Outcome.Copy);
|
|
||||||
this.staticText = "as a copy of any creature card in a graveyard, " +
|
|
||||||
"except it's a 4/4 black Zombie in addition to its other types";
|
|
||||||
}
|
|
||||||
|
|
||||||
private LazotepConvertCopyEffect(final LazotepConvertCopyEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
|
||||||
if (player == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Target target = new TargetCardInGraveyard(0, 1, filter);
|
|
||||||
target.withNotTarget(true);
|
|
||||||
player.choose(outcome, target, source, game);
|
|
||||||
Card copyFromCard = game.getCard(target.getFirstTarget());
|
|
||||||
if (copyFromCard == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Card modifiedCopy = copyFromCard.copy();
|
|
||||||
//Appliers must be applied before CopyEffect, its applier setting is just for copies of copies
|
|
||||||
// TODO: research applier usage, why it here
|
|
||||||
applier.apply(game, modifiedCopy, source, source.getSourceId());
|
|
||||||
game.addEffect(new CopyEffect(
|
|
||||||
Duration.Custom, modifiedCopy, source.getSourceId()
|
|
||||||
).setApplier(applier), source);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LazotepConvertCopyEffect copy() {
|
|
||||||
return new LazotepConvertCopyEffect(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
package mage.cards.l;
|
|
||||||
|
|
||||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class LeylineSurge extends CardImpl {
|
|
||||||
|
|
||||||
public LeylineSurge(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
|
|
||||||
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// At the beginning of your upkeep, you may put a permanent card from your hand onto the battlefield.
|
|
||||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
|
|
||||||
new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_A_PERMANENT)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private LeylineSurge(final LeylineSurge card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LeylineSurge copy() {
|
|
||||||
return new LeylineSurge(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
package mage.cards.l;
|
|
||||||
|
|
||||||
import mage.MageObjectReference;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
|
||||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
|
||||||
import mage.abilities.keyword.HexproofAbility;
|
|
||||||
import mage.abilities.keyword.IndestructibleAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.counters.CounterType;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.watchers.common.AttackedThisTurnWatcher;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class LightshieldArray extends CardImpl {
|
|
||||||
|
|
||||||
public LightshieldArray(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
|
|
||||||
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// At the beginning of your end step, put a +1/+1 counter on each creature that attacked this turn.
|
|
||||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(
|
|
||||||
new LightshieldArrayEffect()
|
|
||||||
));
|
|
||||||
|
|
||||||
// Sacrifice Lightshield Array: Creatures you control gain hexproof and indestructible until end of turn.
|
|
||||||
Ability ability = new SimpleActivatedAbility(new GainAbilityControlledEffect(
|
|
||||||
HexproofAbility.getInstance(), Duration.EndOfTurn,
|
|
||||||
StaticFilters.FILTER_CONTROLLED_CREATURE
|
|
||||||
).setText("creatures you control gain hexproof"), new SacrificeSourceCost());
|
|
||||||
ability.addEffect(new GainAbilityControlledEffect(
|
|
||||||
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
|
|
||||||
StaticFilters.FILTER_CONTROLLED_CREATURE
|
|
||||||
).setText("and indestructible until end of turn"));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private LightshieldArray(final LightshieldArray card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LightshieldArray copy() {
|
|
||||||
return new LightshieldArray(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class LightshieldArrayEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
LightshieldArrayEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "put a +1/+1 counter on each creature that attacked this turn";
|
|
||||||
}
|
|
||||||
|
|
||||||
private LightshieldArrayEffect(final LightshieldArrayEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LightshieldArrayEffect copy() {
|
|
||||||
return new LightshieldArrayEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
for (MageObjectReference mor : game
|
|
||||||
.getState()
|
|
||||||
.getWatcher(AttackedThisTurnWatcher.class)
|
|
||||||
.getAttackedThisTurnCreatures()) {
|
|
||||||
Permanent permanent = mor.getPermanent(game);
|
|
||||||
if (permanent != null) {
|
|
||||||
permanent.addCounters(CounterType.P1P1.createInstance(), source, game);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,103 +0,0 @@
|
||||||
package mage.cards.l;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.MageObject;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
|
||||||
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.game.stack.Spell;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class LivingBreakthrough extends CardImpl {
|
|
||||||
|
|
||||||
public LivingBreakthrough(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.MOONFOLK);
|
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Whenever you cast a spell, your opponents can't cast spells with the same mana value as that spell until your next turn.
|
|
||||||
this.addAbility(new SpellCastControllerTriggeredAbility(new LivingBreakthroughEffect(), false));
|
|
||||||
}
|
|
||||||
|
|
||||||
private LivingBreakthrough(final LivingBreakthrough card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LivingBreakthrough copy() {
|
|
||||||
return new LivingBreakthrough(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class LivingBreakthroughEffect extends ContinuousRuleModifyingEffectImpl {
|
|
||||||
|
|
||||||
private int manaValue = -1;
|
|
||||||
|
|
||||||
LivingBreakthroughEffect() {
|
|
||||||
super(Duration.UntilYourNextTurn, Outcome.Benefit);
|
|
||||||
staticText = "your opponents can't cast spells with the same mana value as that spell until your next turn";
|
|
||||||
}
|
|
||||||
|
|
||||||
private LivingBreakthroughEffect(final LivingBreakthroughEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
this.manaValue = effect.manaValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LivingBreakthroughEffect copy() {
|
|
||||||
return new LivingBreakthroughEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Ability source, Game game) {
|
|
||||||
super.init(source, game);
|
|
||||||
Spell spell = (Spell) getValue("spellCast");
|
|
||||||
if (spell != null) {
|
|
||||||
this.manaValue = spell.getManaValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getInfoMessage(Ability source, GameEvent event, Game game) {
|
|
||||||
MageObject mageObject = game.getObject(source);
|
|
||||||
if (mageObject != null) {
|
|
||||||
return "You can't cast spells with mana value " + manaValue
|
|
||||||
+ " this turn (" + mageObject.getIdName() + ").";
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean checksEventType(GameEvent event, Game game) {
|
|
||||||
return event.getType() == GameEvent.EventType.CAST_SPELL_LATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
|
||||||
if (!game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Spell spell = game.getStack().getSpell(event.getTargetId());
|
|
||||||
return spell != null && spell.getManaValue() == this.manaValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
package mage.cards.m;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.condition.Condition;
|
|
||||||
import mage.abilities.condition.common.OpponentControlsPermanentCondition;
|
|
||||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
|
||||||
import mage.abilities.hint.ConditionHint;
|
|
||||||
import mage.abilities.hint.Hint;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.TargetController;
|
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class MaliciousInvader extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterPermanent filter = new FilterPermanent(SubType.HUMAN, "an opponent controls a Human");
|
|
||||||
|
|
||||||
private static final Condition condition = new OpponentControlsPermanentCondition(filter);
|
|
||||||
private static final Hint hint = new ConditionHint(condition, "An opponent controls a Human");
|
|
||||||
|
|
||||||
public MaliciousInvader(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.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Malicious Invader gets +2/+0 as long as an opponent controls a Human.
|
|
||||||
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
|
||||||
new BoostSourceEffect(2, 0, Duration.WhileOnBattlefield),
|
|
||||||
condition, "{this} gets +2/+0 as long as an opponent controls a Human"
|
|
||||||
)).addHint(hint));
|
|
||||||
}
|
|
||||||
|
|
||||||
private MaliciousInvader(final MaliciousInvader card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MaliciousInvader copy() {
|
|
||||||
return new MaliciousInvader(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
package mage.cards.m;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.AttacksTriggeredAbility;
|
|
||||||
import mage.abilities.condition.Condition;
|
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
|
||||||
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
|
|
||||||
import mage.abilities.effects.common.counter.RemoveAllCountersPermanentTargetEffect;
|
|
||||||
import mage.abilities.keyword.DeathtouchAbility;
|
|
||||||
import mage.abilities.keyword.MenaceAbility;
|
|
||||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.SuperType;
|
|
||||||
import mage.constants.WatcherScope;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.events.DamagedEvent;
|
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.watchers.Watcher;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class MarchesaResoluteMonarch extends CardImpl {
|
|
||||||
|
|
||||||
public MarchesaResoluteMonarch(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.NOBLE);
|
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(6);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Menace
|
|
||||||
this.addAbility(new MenaceAbility(false));
|
|
||||||
|
|
||||||
// Deathtouch
|
|
||||||
this.addAbility(DeathtouchAbility.getInstance());
|
|
||||||
|
|
||||||
// Whenever Marchesa, Resolute Monarch attacks, remove all counters from up to one target permanent.
|
|
||||||
Ability ability = new AttacksTriggeredAbility(new RemoveAllCountersPermanentTargetEffect());
|
|
||||||
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT));
|
|
||||||
this.addAbility(ability);
|
|
||||||
|
|
||||||
// At the beginning of your upkeep, if you haven't been dealt combat damage since your last turn, you draw a card and you lose 1 life.
|
|
||||||
ability = new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(1, true))
|
|
||||||
.withInterveningIf(MarchesaResoluteMonarchCondition.instance);
|
|
||||||
ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private MarchesaResoluteMonarch(final MarchesaResoluteMonarch card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MarchesaResoluteMonarch copy() {
|
|
||||||
return new MarchesaResoluteMonarch(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MarchesaResoluteMonarchWatcher makeWatcher() {
|
|
||||||
return new MarchesaResoluteMonarchWatcher();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum MarchesaResoluteMonarchCondition implements Condition {
|
|
||||||
instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
return MarchesaResoluteMonarchWatcher.checkPlayer(game, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "you haven't been dealt combat damage since your last turn";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MarchesaResoluteMonarchWatcher extends Watcher {
|
|
||||||
|
|
||||||
private final Set<UUID> players = new HashSet<>();
|
|
||||||
|
|
||||||
MarchesaResoluteMonarchWatcher() {
|
|
||||||
super(WatcherScope.GAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void watch(GameEvent event, Game game) {
|
|
||||||
switch (event.getType()) {
|
|
||||||
case DAMAGED_PLAYER:
|
|
||||||
if (((DamagedEvent) event).isCombatDamage()) {
|
|
||||||
players.add(event.getTargetId());
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case END_TURN_STEP_POST:
|
|
||||||
players.remove(game.getActivePlayerId());
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean checkPlayer(Game game, Ability source) {
|
|
||||||
return !game
|
|
||||||
.getState()
|
|
||||||
.getWatcher(MarchesaResoluteMonarchWatcher.class)
|
|
||||||
.players
|
|
||||||
.contains(source.getControllerId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
package mage.cards.o;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
|
||||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
|
||||||
import mage.abilities.costs.common.TapSourceCost;
|
|
||||||
import mage.abilities.costs.mana.GenericManaCost;
|
|
||||||
import mage.abilities.effects.common.CopyTargetStackObjectEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.TargetController;
|
|
||||||
import mage.filter.FilterSpell;
|
|
||||||
import mage.target.TargetSpell;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class OverloadedMageRing extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterSpell filter = new FilterSpell("spell you control");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(TargetController.YOU.getControllerPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
public OverloadedMageRing(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
|
|
||||||
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// {1}, {T}, Sacrifice Overloaded Mage-Ring: Copy target spell you control. You may choose new targets for the copy.
|
|
||||||
Ability ability = new SimpleActivatedAbility(
|
|
||||||
new CopyTargetStackObjectEffect(false, false, true), new GenericManaCost(1)
|
|
||||||
);
|
|
||||||
ability.addCost(new TapSourceCost());
|
|
||||||
ability.addCost(new SacrificeSourceCost());
|
|
||||||
ability.addTarget(new TargetSpell(filter));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private OverloadedMageRing(final OverloadedMageRing card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public OverloadedMageRing copy() {
|
|
||||||
return new OverloadedMageRing(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
package mage.cards.p;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.condition.Condition;
|
|
||||||
import mage.abilities.condition.common.CardsInHandCondition;
|
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.*;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class PrickleFaeries extends CardImpl {
|
|
||||||
|
|
||||||
private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 3, TargetController.ACTIVE);
|
|
||||||
|
|
||||||
public PrickleFaeries(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.FAERIE);
|
|
||||||
this.power = new MageInt(2);
|
|
||||||
this.toughness = new MageInt(2);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Prickle Faeries deals 2 damage to them.
|
|
||||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
|
|
||||||
Zone.BATTLEFIELD, TargetController.OPPONENT,
|
|
||||||
new DamageTargetEffect(2).withTargetDescription("them"), false
|
|
||||||
).withInterveningIf(condition));
|
|
||||||
}
|
|
||||||
|
|
||||||
private PrickleFaeries(final PrickleFaeries card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PrickleFaeries copy() {
|
|
||||||
return new PrickleFaeries(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
package mage.cards.p;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.LoseAllAbilitiesTargetEffect;
|
|
||||||
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 PrimordialPlasm extends CardImpl {
|
|
||||||
|
|
||||||
public PrimordialPlasm(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.OOZE);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// At the beginning of combat on your turn, another target creature gets +2/+2 and loses all abilities until end of turn.
|
|
||||||
Ability ability = new BeginningOfCombatTriggeredAbility(
|
|
||||||
new BoostTargetEffect(2, 2)
|
|
||||||
.setText("another target creature gets +2/+2")
|
|
||||||
);
|
|
||||||
ability.addEffect(new LoseAllAbilitiesTargetEffect(Duration.EndOfTurn)
|
|
||||||
.setText("and loses all abilities until end of turn"));
|
|
||||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
|
|
||||||
this.addAbility(ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PrimordialPlasm(final PrimordialPlasm card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PrimordialPlasm copy() {
|
|
||||||
return new PrimordialPlasm(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
package mage.cards.p;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleActivatedAbility;
|
|
||||||
import mage.abilities.costs.common.DiscardTargetCost;
|
|
||||||
import mage.abilities.effects.common.DamageTargetEffect;
|
|
||||||
import mage.abilities.effects.common.DiscardCardControllerTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.target.common.TargetAnyTarget;
|
|
||||||
import mage.target.common.TargetCardInHand;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class PyreOfTheWorldTree extends CardImpl {
|
|
||||||
|
|
||||||
public PyreOfTheWorldTree(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
|
|
||||||
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Discard a land card: Pyre of the World Tree deals 2 damage to any target.
|
|
||||||
Ability ability = new SimpleActivatedAbility(
|
|
||||||
new DamageTargetEffect(2),
|
|
||||||
new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_LAND_A))
|
|
||||||
);
|
|
||||||
ability.addTarget(new TargetAnyTarget());
|
|
||||||
this.addAbility(ability);
|
|
||||||
|
|
||||||
// Whenever you discard a land card, exile the top card of your library. You may play that card this turn.
|
|
||||||
this.addAbility(new DiscardCardControllerTriggeredAbility(
|
|
||||||
new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn),
|
|
||||||
false, StaticFilters.FILTER_CARD_LAND_A
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private PyreOfTheWorldTree(final PyreOfTheWorldTree card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PyreOfTheWorldTree copy() {
|
|
||||||
return new PyreOfTheWorldTree(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
package mage.cards.r;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
|
||||||
import mage.abilities.costs.common.PayLifeCost;
|
|
||||||
import mage.abilities.effects.common.DamagePlayersEffect;
|
|
||||||
import mage.abilities.keyword.WardAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.TargetController;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class RefractionElemental extends CardImpl {
|
|
||||||
|
|
||||||
public RefractionElemental(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.ELEMENTAL);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Ward--Pay 2 life.
|
|
||||||
this.addAbility(new WardAbility(new PayLifeCost(2), false));
|
|
||||||
|
|
||||||
// Whenever you cast a spell, Refraction Elemental deals 2 damage to each opponent.
|
|
||||||
this.addAbility(new SpellCastControllerTriggeredAbility(
|
|
||||||
new DamagePlayersEffect(2, TargetController.OPPONENT), false
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private RefractionElemental(final RefractionElemental card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RefractionElemental copy() {
|
|
||||||
return new RefractionElemental(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
package mage.cards.r;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
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 RooftopSaboteurs extends CardImpl {
|
|
||||||
|
|
||||||
public RooftopSaboteurs(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.MOONFOLK);
|
|
||||||
this.subtype.add(SubType.NINJA);
|
|
||||||
this.power = new MageInt(2);
|
|
||||||
this.toughness = new MageInt(3);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Whenever Rooftop Saboteurs deals combat damage to a player or battle, draw a card.
|
|
||||||
this.addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(
|
|
||||||
new DrawCardSourceControllerEffect(1), false));
|
|
||||||
}
|
|
||||||
|
|
||||||
private RooftopSaboteurs(final RooftopSaboteurs card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RooftopSaboteurs copy() {
|
|
||||||
return new RooftopSaboteurs(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
package mage.cards.s;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.abilities.keyword.VigilanceAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class SerraFaithkeeper extends CardImpl {
|
|
||||||
|
|
||||||
public SerraFaithkeeper(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.ANGEL);
|
|
||||||
this.power = new MageInt(4);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Vigilance
|
|
||||||
this.addAbility(VigilanceAbility.getInstance());
|
|
||||||
}
|
|
||||||
|
|
||||||
private SerraFaithkeeper(final SerraFaithkeeper card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SerraFaithkeeper copy() {
|
|
||||||
return new SerraFaithkeeper(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
package mage.cards.s;
|
|
||||||
|
|
||||||
import mage.abilities.common.EntersBattlefieldAttachToTarget;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
|
||||||
import mage.abilities.keyword.EquipAbility;
|
|
||||||
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 SovereignsMacuahuitl extends CardImpl {
|
|
||||||
|
|
||||||
public SovereignsMacuahuitl(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.EQUIPMENT);
|
|
||||||
this.nightCard = true;
|
|
||||||
this.color.setRed(true);
|
|
||||||
|
|
||||||
// When Sovereign's Macuahuitl enters the battlefield, attach it to target creature you control.
|
|
||||||
this.addAbility(new EntersBattlefieldAttachToTarget());
|
|
||||||
|
|
||||||
// Equipped creature gets +2/+0.
|
|
||||||
this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(2, 0)));
|
|
||||||
|
|
||||||
// Equip {2}
|
|
||||||
this.addAbility(new EquipAbility(2));
|
|
||||||
}
|
|
||||||
|
|
||||||
private SovereignsMacuahuitl(final SovereignsMacuahuitl card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SovereignsMacuahuitl copy() {
|
|
||||||
return new SovereignsMacuahuitl(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,115 +0,0 @@
|
||||||
package mage.cards.t;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.LoyaltyAbility;
|
|
||||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
|
||||||
import mage.abilities.costs.common.DiscardTargetCost;
|
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
|
||||||
import mage.abilities.effects.common.GetEmblemEffect;
|
|
||||||
import mage.abilities.effects.common.ShuffleIntoLibraryTargetEffect;
|
|
||||||
import mage.abilities.effects.common.discard.DiscardControllerEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.*;
|
|
||||||
import mage.filter.FilterPermanent;
|
|
||||||
import mage.filter.StaticFilters;
|
|
||||||
import mage.filter.common.FilterNonlandPermanent;
|
|
||||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.command.emblems.TeferiAkosaOfZhalfirEmblem;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.TargetPermanent;
|
|
||||||
import mage.target.common.TargetCardInHand;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class TeferiAkosaOfZhalfir extends CardImpl {
|
|
||||||
|
|
||||||
public TeferiAkosaOfZhalfir(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
|
|
||||||
|
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
|
||||||
this.subtype.add(SubType.TEFERI);
|
|
||||||
this.setStartingLoyalty(4);
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// +1: Draw two cards. Then discard two cards unless you discard a creature card.
|
|
||||||
Ability ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(2), 1);
|
|
||||||
ability.addEffect(new DoIfCostPaid(
|
|
||||||
null, new DiscardControllerEffect(2),
|
|
||||||
new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A))
|
|
||||||
.setText("discard a creature card instead of discarding two cards")
|
|
||||||
).setText("Then discard two cards unless you discard a creature card"));
|
|
||||||
this.addAbility(ability);
|
|
||||||
|
|
||||||
// -2: You get an emblem with "Knights you control get +1/+0 and have ward {1}."
|
|
||||||
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new TeferiAkosaOfZhalfirEmblem()), -2));
|
|
||||||
|
|
||||||
// -3: Tap any number of untapped creatures you control. When you do, shuffle target nonland permanent an opponent controls with mana value X or less into its owner's library, where X is the number of creatures tapped this way.
|
|
||||||
this.addAbility(new LoyaltyAbility(new TeferiAkosaOfZhalfirEffect(), -3));
|
|
||||||
}
|
|
||||||
|
|
||||||
private TeferiAkosaOfZhalfir(final TeferiAkosaOfZhalfir card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TeferiAkosaOfZhalfir copy() {
|
|
||||||
return new TeferiAkosaOfZhalfir(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TeferiAkosaOfZhalfirEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
TeferiAkosaOfZhalfirEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "tap any number of untapped creatures you control. When you do, " +
|
|
||||||
"shuffle target nonland permanent an opponent controls with mana value X or less " +
|
|
||||||
"into its owner's library, where X is the number of creatures tapped this way";
|
|
||||||
}
|
|
||||||
|
|
||||||
private TeferiAkosaOfZhalfirEffect(final TeferiAkosaOfZhalfirEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TeferiAkosaOfZhalfirEffect copy() {
|
|
||||||
return new TeferiAkosaOfZhalfirEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
|
||||||
if (player == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
TargetPermanent target = new TargetPermanent(
|
|
||||||
0, Integer.MAX_VALUE, StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURES, true
|
|
||||||
);
|
|
||||||
player.choose(Outcome.Tap, target, source, game);
|
|
||||||
int count = 0;
|
|
||||||
for (UUID targetId : target.getTargets()) {
|
|
||||||
Permanent permanent = game.getPermanent(targetId);
|
|
||||||
if (permanent != null && permanent.tap(source, game)) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FilterPermanent filter = new FilterNonlandPermanent("nonland permanent an opponent controls with mana value " + count + " or less");
|
|
||||||
filter.add(TargetController.OPPONENT.getControllerPredicate());
|
|
||||||
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, count + 1));
|
|
||||||
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ShuffleIntoLibraryTargetEffect()
|
|
||||||
.setText("shuffle target nonland permanent an opponent controls with mana value X or less " +
|
|
||||||
"into its owner's library, where X is the number of creatures tapped this way"), false);
|
|
||||||
ability.addTarget(new TargetPermanent(filter));
|
|
||||||
game.fireReflexiveTriggeredAbility(ability, source);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
package mage.cards.t;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
|
||||||
import mage.abilities.keyword.LifelinkAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.Duration;
|
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
|
||||||
import mage.filter.predicate.permanent.TokenPredicate;
|
|
||||||
import mage.game.permanent.token.WhiteBlackSpiritToken;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class TheBrokenSky extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature tokens");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(TokenPredicate.TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public TheBrokenSky(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
|
|
||||||
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Creature tokens you control get +1/+0 and have lifelink.
|
|
||||||
Ability ability = new SimpleStaticAbility(new BoostControlledEffect(
|
|
||||||
1, 0, Duration.WhileOnBattlefield, filter
|
|
||||||
));
|
|
||||||
ability.addEffect(new GainAbilityControlledEffect(
|
|
||||||
LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, filter
|
|
||||||
).setText("and have lifelink"));
|
|
||||||
this.addAbility(ability);
|
|
||||||
|
|
||||||
// At the beginning of your end step, create a 1/1 white and black Spirit creature token with flying.
|
|
||||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(
|
|
||||||
new CreateTokenEffect(new WhiteBlackSpiritToken())
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private TheBrokenSky(final TheBrokenSky card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TheBrokenSky copy() {
|
|
||||||
return new TheBrokenSky(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
package mage.cards.t;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
|
||||||
import mage.abilities.costs.common.DiscardCardCost;
|
|
||||||
import mage.abilities.effects.common.DoIfCostPaid;
|
|
||||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
|
||||||
import mage.abilities.keyword.TrampleAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.filter.predicate.Predicates;
|
|
||||||
import mage.target.common.TargetCardInLibrary;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class TrugaCliffcharger extends CardImpl {
|
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterCard("a land or battle card");
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter.add(Predicates.or(
|
|
||||||
CardType.LAND.getPredicate(),
|
|
||||||
CardType.BATTLE.getPredicate()
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrugaCliffcharger(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.RHINO);
|
|
||||||
this.power = new MageInt(3);
|
|
||||||
this.toughness = new MageInt(4);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Trample
|
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
|
||||||
|
|
||||||
// When Truga Cliffcharger enters the battlefield, you may discard a card. If you do, search your library for a land or battle card, reveal it, put it into your hand, then shuffle.
|
|
||||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
|
||||||
new DoIfCostPaid(new SearchLibraryPutInHandEffect(
|
|
||||||
new TargetCardInLibrary(filter), true
|
|
||||||
), new DiscardCardCost())
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private TrugaCliffcharger(final TrugaCliffcharger card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TrugaCliffcharger copy() {
|
|
||||||
return new TrugaCliffcharger(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
package mage.cards.v;
|
|
||||||
|
|
||||||
import mage.abilities.effects.common.CreateTokenEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.game.permanent.token.ValorsReachTagTeamToken;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class ValorsReachTagTeam extends CardImpl {
|
|
||||||
|
|
||||||
public ValorsReachTagTeam(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "");
|
|
||||||
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setRed(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Create two 3/2 red and white Warrior creature tokens with "Whenever this creature and at least one other creature token attack, put a +1/+1 counter on this creature."
|
|
||||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new ValorsReachTagTeamToken(), 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
private ValorsReachTagTeam(final ValorsReachTagTeam card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ValorsReachTagTeam copy() {
|
|
||||||
return new ValorsReachTagTeam(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
package mage.cards.v;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
|
||||||
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class VertexPaladin extends CardImpl {
|
|
||||||
|
|
||||||
public VertexPaladin(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.ANGEL);
|
|
||||||
this.subtype.add(SubType.KNIGHT);
|
|
||||||
this.power = new MageInt(0);
|
|
||||||
this.toughness = new MageInt(0);
|
|
||||||
this.color.setWhite(true);
|
|
||||||
this.color.setBlue(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Flying
|
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
|
||||||
|
|
||||||
// Vertex Paladin's power and toughness are each equal to the number of creatures you control.
|
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(CreaturesYouControlCount.PLURAL)));
|
|
||||||
}
|
|
||||||
|
|
||||||
private VertexPaladin(final VertexPaladin card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VertexPaladin copy() {
|
|
||||||
return new VertexPaladin(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
package mage.cards.w;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
|
||||||
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
|
||||||
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 java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author nantuko
|
|
||||||
*/
|
|
||||||
public final class WildbloodPack extends CardImpl {
|
|
||||||
|
|
||||||
public WildbloodPack(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(5);
|
|
||||||
|
|
||||||
this.addAbility(TrampleAbility.getInstance());
|
|
||||||
|
|
||||||
// Attacking creatures you control get +3/+0.
|
|
||||||
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(
|
|
||||||
3, 0, Duration.WhileOnBattlefield,
|
|
||||||
StaticFilters.FILTER_ATTACKING_CREATURES, false
|
|
||||||
)));
|
|
||||||
|
|
||||||
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Wildblood Pack.
|
|
||||||
this.addAbility(new WerewolfBackTriggeredAbility());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private WildbloodPack(final WildbloodPack card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public WildbloodPack copy() {
|
|
||||||
return new WildbloodPack(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
package mage.cards.w;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.dynamicvalue.common.LandsYouControlCount;
|
|
||||||
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.CardType;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.constants.Zone;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class WinnowingForces extends CardImpl {
|
|
||||||
|
|
||||||
public WinnowingForces(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.subtype.add(SubType.ELF);
|
|
||||||
this.subtype.add(SubType.WARRIOR);
|
|
||||||
this.power = new MageInt(0);
|
|
||||||
this.toughness = new MageInt(0);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.color.setBlack(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Winnowing Forces's power and toughness are each equal to the number of lands you control.
|
|
||||||
this.addAbility(new SimpleStaticAbility(
|
|
||||||
Zone.ALL, new SetBasePowerToughnessSourceEffect(LandsYouControlCount.instance)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
private WinnowingForces(final WinnowingForces card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public WinnowingForces copy() {
|
|
||||||
return new WinnowingForces(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
package mage.cards.z;
|
|
||||||
|
|
||||||
import mage.MageInt;
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
|
||||||
import mage.abilities.effects.AsThoughEffectImpl;
|
|
||||||
import mage.abilities.keyword.ReachAbility;
|
|
||||||
import mage.cards.CardImpl;
|
|
||||||
import mage.cards.CardSetInfo;
|
|
||||||
import mage.constants.*;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author TheElk801
|
|
||||||
*/
|
|
||||||
public final class ZilorthaApexOfIkoria extends CardImpl {
|
|
||||||
|
|
||||||
public ZilorthaApexOfIkoria(UUID ownerId, CardSetInfo setInfo) {
|
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
|
||||||
|
|
||||||
this.supertype.add(SuperType.LEGENDARY);
|
|
||||||
this.subtype.add(SubType.DINOSAUR);
|
|
||||||
this.power = new MageInt(8);
|
|
||||||
this.toughness = new MageInt(8);
|
|
||||||
this.color.setGreen(true);
|
|
||||||
this.nightCard = true;
|
|
||||||
|
|
||||||
// Reach
|
|
||||||
this.addAbility(ReachAbility.getInstance());
|
|
||||||
|
|
||||||
// For each non-Human creature you control, you may have that creature assign its combat damage as though it weren't blocked.
|
|
||||||
this.addAbility(new SimpleStaticAbility(new ZilorthaApexOfIkoriaEffect()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private ZilorthaApexOfIkoria(final ZilorthaApexOfIkoria card) {
|
|
||||||
super(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ZilorthaApexOfIkoria copy() {
|
|
||||||
return new ZilorthaApexOfIkoria(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ZilorthaApexOfIkoriaEffect extends AsThoughEffectImpl {
|
|
||||||
|
|
||||||
ZilorthaApexOfIkoriaEffect() {
|
|
||||||
super(AsThoughEffectType.DAMAGE_NOT_BLOCKED, Duration.WhileOnBattlefield, Outcome.Damage);
|
|
||||||
this.staticText = "for each non-Human creature you control, you may have that " +
|
|
||||||
"creature assign its combat damage as though it weren't blocked";
|
|
||||||
}
|
|
||||||
|
|
||||||
private ZilorthaApexOfIkoriaEffect(ZilorthaApexOfIkoriaEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
|
|
||||||
Player controller = game.getPlayer(source.getControllerId());
|
|
||||||
Permanent permanent = game.getPermanent(sourceId);
|
|
||||||
return controller != null
|
|
||||||
&& permanent != null
|
|
||||||
&& permanent.isControlledBy(controller.getId())
|
|
||||||
&& !permanent.hasSubtype(SubType.HUMAN, game)
|
|
||||||
&& controller.chooseUse(Outcome.Damage, "Have " + permanent.getLogName()
|
|
||||||
+ " assign damage as though it weren't blocked?", source, game);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ZilorthaApexOfIkoriaEffect copy() {
|
|
||||||
return new ZilorthaApexOfIkoriaEffect(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -303,7 +303,6 @@ public final class Innistrad extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Villagers of Estwald", 209, Rarity.COMMON, mage.cards.v.VillagersOfEstwald.class));
|
cards.add(new SetCardInfo("Villagers of Estwald", 209, Rarity.COMMON, mage.cards.v.VillagersOfEstwald.class));
|
||||||
cards.add(new SetCardInfo("Voiceless Spirit", 42, Rarity.COMMON, mage.cards.v.VoicelessSpirit.class));
|
cards.add(new SetCardInfo("Voiceless Spirit", 42, Rarity.COMMON, mage.cards.v.VoicelessSpirit.class));
|
||||||
cards.add(new SetCardInfo("Walking Corpse", 126, Rarity.COMMON, mage.cards.w.WalkingCorpse.class));
|
cards.add(new SetCardInfo("Walking Corpse", 126, Rarity.COMMON, mage.cards.w.WalkingCorpse.class));
|
||||||
cards.add(new SetCardInfo("Wildblood Pack", 149, Rarity.RARE, mage.cards.w.WildbloodPack.class));
|
|
||||||
cards.add(new SetCardInfo("Witchbane Orb", 236, Rarity.RARE, mage.cards.w.WitchbaneOrb.class));
|
cards.add(new SetCardInfo("Witchbane Orb", 236, Rarity.RARE, mage.cards.w.WitchbaneOrb.class));
|
||||||
cards.add(new SetCardInfo("Wooden Stake", 237, Rarity.COMMON, mage.cards.w.WoodenStake.class));
|
cards.add(new SetCardInfo("Wooden Stake", 237, Rarity.COMMON, mage.cards.w.WoodenStake.class));
|
||||||
cards.add(new SetCardInfo("Woodland Cemetery", 249, Rarity.RARE, mage.cards.w.WoodlandCemetery.class));
|
cards.add(new SetCardInfo("Woodland Cemetery", 249, Rarity.RARE, mage.cards.w.WoodlandCemetery.class));
|
||||||
|
|
|
||||||
|
|
@ -247,8 +247,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Hopeful Initiate", 350, Rarity.RARE, mage.cards.h.HopefulInitiate.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Hopeful Initiate", 350, Rarity.RARE, mage.cards.h.HopefulInitiate.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Howling Moon", 204, Rarity.RARE, mage.cards.h.HowlingMoon.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Howling Moon", 204, Rarity.RARE, mage.cards.h.HowlingMoon.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Howling Moon", 391, Rarity.RARE, mage.cards.h.HowlingMoon.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Howling Moon", 391, Rarity.RARE, mage.cards.h.HowlingMoon.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Howlpack Avenger", 162, Rarity.RARE, mage.cards.h.HowlpackAvenger.class, NON_FULL_USE_VARIOUS));
|
|
||||||
cards.add(new SetCardInfo("Howlpack Avenger", 378, Rarity.RARE, mage.cards.h.HowlpackAvenger.class, NON_FULL_USE_VARIOUS));
|
|
||||||
cards.add(new SetCardInfo("Howlpack Piper", 205, Rarity.RARE, mage.cards.h.HowlpackPiper.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Howlpack Piper", 205, Rarity.RARE, mage.cards.h.HowlpackPiper.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Howlpack Piper", 392, Rarity.RARE, mage.cards.h.HowlpackPiper.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Howlpack Piper", 392, Rarity.RARE, mage.cards.h.HowlpackPiper.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Hullbreaker Horror", 359, Rarity.RARE, mage.cards.h.HullbreakerHorror.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Hullbreaker Horror", 359, Rarity.RARE, mage.cards.h.HullbreakerHorror.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -257,7 +255,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Ill-Tempered Loner", 162, Rarity.RARE, mage.cards.i.IllTemperedLoner.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Ill-Tempered Loner", 162, Rarity.RARE, mage.cards.i.IllTemperedLoner.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Ill-Tempered Loner", 378, Rarity.RARE, mage.cards.i.IllTemperedLoner.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Ill-Tempered Loner", 378, Rarity.RARE, mage.cards.i.IllTemperedLoner.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Infestation Expert", 206, Rarity.UNCOMMON, mage.cards.i.InfestationExpert.class));
|
cards.add(new SetCardInfo("Infestation Expert", 206, Rarity.UNCOMMON, mage.cards.i.InfestationExpert.class));
|
||||||
cards.add(new SetCardInfo("Infested Werewolf", 206, Rarity.UNCOMMON, mage.cards.i.InfestedWerewolf.class));
|
|
||||||
cards.add(new SetCardInfo("Innocent Traveler", 121, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Innocent Traveler", 121, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Innocent Traveler", 294, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Innocent Traveler", 294, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Innocent Traveler", 336, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Innocent Traveler", 336, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -299,9 +296,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Lightning Wolf", 168, Rarity.COMMON, mage.cards.l.LightningWolf.class));
|
cards.add(new SetCardInfo("Lightning Wolf", 168, Rarity.COMMON, mage.cards.l.LightningWolf.class));
|
||||||
cards.add(new SetCardInfo("Lunar Rejection", 67, Rarity.UNCOMMON, mage.cards.l.LunarRejection.class));
|
cards.add(new SetCardInfo("Lunar Rejection", 67, Rarity.UNCOMMON, mage.cards.l.LunarRejection.class));
|
||||||
cards.add(new SetCardInfo("Magma Pummeler", 169, Rarity.UNCOMMON, mage.cards.m.MagmaPummeler.class));
|
cards.add(new SetCardInfo("Magma Pummeler", 169, Rarity.UNCOMMON, mage.cards.m.MagmaPummeler.class));
|
||||||
cards.add(new SetCardInfo("Malicious Invader", 121, Rarity.UNCOMMON, mage.cards.m.MaliciousInvader.class, NON_FULL_USE_VARIOUS));
|
|
||||||
cards.add(new SetCardInfo("Malicious Invader", 294, Rarity.UNCOMMON, mage.cards.m.MaliciousInvader.class, NON_FULL_USE_VARIOUS));
|
|
||||||
cards.add(new SetCardInfo("Malicious Invader", 336, Rarity.UNCOMMON, mage.cards.m.MaliciousInvader.class, NON_FULL_USE_VARIOUS));
|
|
||||||
cards.add(new SetCardInfo("Manaform Hellkite", 170, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Manaform Hellkite", 170, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Manaform Hellkite", 380, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Manaform Hellkite", 380, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Markov Purifier", 241, Rarity.UNCOMMON, mage.cards.m.MarkovPurifier.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Markov Purifier", 241, Rarity.UNCOMMON, mage.cards.m.MarkovPurifier.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Hound Tamer", 187, Rarity.UNCOMMON, mage.cards.h.HoundTamer.class));
|
cards.add(new SetCardInfo("Hound Tamer", 187, Rarity.UNCOMMON, mage.cards.h.HoundTamer.class));
|
||||||
cards.add(new SetCardInfo("Howl of the Hunt", 188, Rarity.COMMON, mage.cards.h.HowlOfTheHunt.class));
|
cards.add(new SetCardInfo("Howl of the Hunt", 188, Rarity.COMMON, mage.cards.h.HowlOfTheHunt.class));
|
||||||
cards.add(new SetCardInfo("Howling Moon", 471, Rarity.RARE, mage.cards.h.HowlingMoon.class));
|
cards.add(new SetCardInfo("Howling Moon", 471, Rarity.RARE, mage.cards.h.HowlingMoon.class));
|
||||||
cards.add(new SetCardInfo("Howlpack Avenger", 429, Rarity.RARE, mage.cards.h.HowlpackAvenger.class));
|
|
||||||
cards.add(new SetCardInfo("Howlpack Piper", 472, Rarity.RARE, mage.cards.h.HowlpackPiper.class));
|
cards.add(new SetCardInfo("Howlpack Piper", 472, Rarity.RARE, mage.cards.h.HowlpackPiper.class));
|
||||||
cards.add(new SetCardInfo("Hullbreaker Horror", 330, Rarity.RARE, mage.cards.h.HullbreakerHorror.class));
|
cards.add(new SetCardInfo("Hullbreaker Horror", 330, Rarity.RARE, mage.cards.h.HullbreakerHorror.class));
|
||||||
cards.add(new SetCardInfo("Hungry for More", 228, Rarity.UNCOMMON, mage.cards.h.HungryForMore.class));
|
cards.add(new SetCardInfo("Hungry for More", 228, Rarity.UNCOMMON, mage.cards.h.HungryForMore.class));
|
||||||
|
|
@ -305,7 +304,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Immolation", 144, Rarity.COMMON, mage.cards.i.Immolation.class));
|
cards.add(new SetCardInfo("Immolation", 144, Rarity.COMMON, mage.cards.i.Immolation.class));
|
||||||
cards.add(new SetCardInfo("Infernal Grasp", 107, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class));
|
cards.add(new SetCardInfo("Infernal Grasp", 107, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class));
|
||||||
cards.add(new SetCardInfo("Infestation Expert", 473, Rarity.UNCOMMON, mage.cards.i.InfestationExpert.class));
|
cards.add(new SetCardInfo("Infestation Expert", 473, Rarity.UNCOMMON, mage.cards.i.InfestationExpert.class));
|
||||||
cards.add(new SetCardInfo("Infested Werewolf", 473, Rarity.UNCOMMON, mage.cards.i.InfestedWerewolf.class));
|
|
||||||
cards.add(new SetCardInfo("Innocent Traveler", 388, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class));
|
cards.add(new SetCardInfo("Innocent Traveler", 388, Rarity.UNCOMMON, mage.cards.i.InnocentTraveler.class));
|
||||||
cards.add(new SetCardInfo("Inspired Idea", 331, Rarity.RARE, mage.cards.i.InspiredIdea.class));
|
cards.add(new SetCardInfo("Inspired Idea", 331, Rarity.RARE, mage.cards.i.InspiredIdea.class));
|
||||||
cards.add(new SetCardInfo("Into the Night", 430, Rarity.UNCOMMON, mage.cards.i.IntoTheNight.class));
|
cards.add(new SetCardInfo("Into the Night", 430, Rarity.UNCOMMON, mage.cards.i.IntoTheNight.class));
|
||||||
|
|
@ -350,7 +348,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Lunarch Veteran", 27, Rarity.COMMON, mage.cards.l.LunarchVeteran.class));
|
cards.add(new SetCardInfo("Lunarch Veteran", 27, Rarity.COMMON, mage.cards.l.LunarchVeteran.class));
|
||||||
cards.add(new SetCardInfo("Magma Pummeler", 436, Rarity.UNCOMMON, mage.cards.m.MagmaPummeler.class));
|
cards.add(new SetCardInfo("Magma Pummeler", 436, Rarity.UNCOMMON, mage.cards.m.MagmaPummeler.class));
|
||||||
cards.add(new SetCardInfo("Malevolent Hermit", 61, Rarity.RARE, mage.cards.m.MalevolentHermit.class));
|
cards.add(new SetCardInfo("Malevolent Hermit", 61, Rarity.RARE, mage.cards.m.MalevolentHermit.class));
|
||||||
cards.add(new SetCardInfo("Malicious Invader", 388, Rarity.UNCOMMON, mage.cards.m.MaliciousInvader.class));
|
|
||||||
cards.add(new SetCardInfo("Manaform Hellkite", 437, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class));
|
cards.add(new SetCardInfo("Manaform Hellkite", 437, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class));
|
||||||
cards.add(new SetCardInfo("Markov Purifier", 508, Rarity.UNCOMMON, mage.cards.m.MarkovPurifier.class));
|
cards.add(new SetCardInfo("Markov Purifier", 508, Rarity.UNCOMMON, mage.cards.m.MarkovPurifier.class));
|
||||||
cards.add(new SetCardInfo("Markov Retribution", 438, Rarity.UNCOMMON, mage.cards.m.MarkovRetribution.class));
|
cards.add(new SetCardInfo("Markov Retribution", 438, Rarity.UNCOMMON, mage.cards.m.MarkovRetribution.class));
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,6 @@ public class InnistradRemastered extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Deadly Allure", 103, Rarity.UNCOMMON, mage.cards.d.DeadlyAllure.class));
|
cards.add(new SetCardInfo("Deadly Allure", 103, Rarity.UNCOMMON, mage.cards.d.DeadlyAllure.class));
|
||||||
cards.add(new SetCardInfo("Deathcap Glade", 275, Rarity.RARE, mage.cards.d.DeathcapGlade.class));
|
cards.add(new SetCardInfo("Deathcap Glade", 275, Rarity.RARE, mage.cards.d.DeathcapGlade.class));
|
||||||
cards.add(new SetCardInfo("Decimator of the Provinces", 2, Rarity.RARE, mage.cards.d.DecimatorOfTheProvinces.class));
|
cards.add(new SetCardInfo("Decimator of the Provinces", 2, Rarity.RARE, mage.cards.d.DecimatorOfTheProvinces.class));
|
||||||
cards.add(new SetCardInfo("Deluge of the Dead", 120, Rarity.RARE, mage.cards.d.DelugeOfTheDead.class));
|
|
||||||
cards.add(new SetCardInfo("Delver of Secrets", 457, Rarity.COMMON, mage.cards.d.DelverOfSecrets.class, RETRO_ART_USE_VARIOUS));
|
cards.add(new SetCardInfo("Delver of Secrets", 457, Rarity.COMMON, mage.cards.d.DelverOfSecrets.class, RETRO_ART_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Delver of Secrets", 60, Rarity.COMMON, mage.cards.d.DelverOfSecrets.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Delver of Secrets", 60, Rarity.COMMON, mage.cards.d.DelverOfSecrets.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Demonic Taskmaster", 104, Rarity.UNCOMMON, mage.cards.d.DemonicTaskmaster.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Demonic Taskmaster", 104, Rarity.UNCOMMON, mage.cards.d.DemonicTaskmaster.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue