From ba3269155695b936e5bd7f52143237f12d9b5e2d Mon Sep 17 00:00:00 2001 From: jmlundeen Date: Sun, 30 Nov 2025 14:47:16 -0600 Subject: [PATCH] convert transforming "I" cards to single class file part of #14099 --- .../a/AetherwingGoldenScaleFlagship.java | 53 -------- Mage.Sets/src/mage/cards/a/AshenReaper.java | 88 ------------ .../src/mage/cards/a/AwakenTheMaelstrom.java | 128 ------------------ .../src/mage/cards/a/AwakenedSkyclave.java | 53 -------- .../src/mage/cards/b/BelligerentRegisaur.java | 47 ------- .../src/mage/cards/b/BloomwielderDryads.java | 52 ------- .../cards/c/CaetusSeaTyrantOfSegovia.java | 63 --------- .../src/mage/cards/c/ConcealingCurtains.java | 6 +- .../src/mage/cards/d/DefiantThundermaw.java | 90 ------------ .../src/mage/cards/d/DelugeOfTheDead.java | 82 ----------- .../mage/cards/d/DionBahamutsDominant.java | 22 +-- Mage.Sets/src/mage/cards/d/DireFlail.java | 11 +- .../mage/cards/d/DisciplesOfTheInferno.java | 113 ---------------- .../src/mage/cards/d/DistractingGeist.java | 7 +- Mage.Sets/src/mage/cards/d/DormantGrove.java | 12 +- .../mage/cards/d/DorotheaVengefulVictim.java | 20 ++- Mage.Sets/src/mage/cards/d/DowsingDagger.java | 11 +- Mage.Sets/src/mage/cards/d/DowsingDevice.java | 21 ++- .../src/mage/cards/d/DuskwatchRecruiter.java | 7 +- .../mage/cards/e/ElbrusTheBindingBlade.java | 3 +- .../mage/cards/e/EpharaEverSheltering.java | 81 ----------- .../src/mage/cards/g/GargantuanSlabhorn.java | 66 --------- .../mage/cards/g/GrandmotherRaviSengir.java | 55 -------- .../src/mage/cards/g/GuildpactParagon.java | 63 --------- .../mage/cards/h/HanweirMilitiaCaptain.java | 6 +- .../src/mage/cards/h/HolyFrazzleCannon.java | 82 ----------- .../src/mage/cards/h/HowlpackAvenger.java | 60 -------- .../src/mage/cards/h/HuatliPoetOfUnity.java | 3 +- Mage.Sets/src/mage/cards/i/IcebergTitan.java | 44 ------ .../src/mage/cards/i/IdolOfTheDeepKing.java | 33 ++++- .../src/mage/cards/i/IllTemperedLoner.java | 45 ++++-- .../src/mage/cards/i/InfestationExpert.java | 34 +++-- .../src/mage/cards/i/InfestedWerewolf.java | 46 ------- .../src/mage/cards/i/InnocentTraveler.java | 46 +++++-- .../src/mage/cards/i/InstigatorGang.java | 42 ++++-- .../src/mage/cards/i/InvasionOfAlara.java | 110 +++++++++++++-- .../src/mage/cards/i/InvasionOfAmonkhet.java | 97 +++++++++++-- .../src/mage/cards/i/InvasionOfArcavios.java | 65 +++++++-- .../src/mage/cards/i/InvasionOfAzgol.java | 71 ++++++++-- .../src/mage/cards/i/InvasionOfDominaria.java | 30 ++-- .../src/mage/cards/i/InvasionOfEldraine.java | 41 ++++-- .../src/mage/cards/i/InvasionOfErgamon.java | 43 ++++-- .../src/mage/cards/i/InvasionOfFiora.java | 117 ++++++++++++++-- .../src/mage/cards/i/InvasionOfGobakhan.java | 89 +++++++++--- .../src/mage/cards/i/InvasionOfIkoria.java | 77 +++++++++-- .../src/mage/cards/i/InvasionOfInnistrad.java | 73 ++++++++-- .../src/mage/cards/i/InvasionOfIxalan.java | 35 +++-- .../src/mage/cards/i/InvasionOfKaladesh.java | 42 ++++-- .../src/mage/cards/i/InvasionOfKaldheim.java | 43 ++++-- .../src/mage/cards/i/InvasionOfKamigawa.java | 34 +++-- .../src/mage/cards/i/InvasionOfKarsus.java | 40 ++++-- .../src/mage/cards/i/InvasionOfKylem.java | 26 ++-- .../src/mage/cards/i/InvasionOfLorwyn.java | 31 +++-- .../src/mage/cards/i/InvasionOfMercadia.java | 46 +++++-- .../src/mage/cards/i/InvasionOfMoag.java | 38 ++++-- .../src/mage/cards/i/InvasionOfMuraganda.java | 42 ++++-- .../mage/cards/i/InvasionOfNewCapenna.java | 82 +++++++++-- .../mage/cards/i/InvasionOfNewPhyrexia.java | 105 ++++++++++++-- .../src/mage/cards/i/InvasionOfPyrulea.java | 46 ++++++- .../src/mage/cards/i/InvasionOfRavnica.java | 51 +++++-- .../src/mage/cards/i/InvasionOfRegatha.java | 100 ++++++++++++-- .../src/mage/cards/i/InvasionOfSegovia.java | 48 +++++-- .../src/mage/cards/i/InvasionOfShandalar.java | 27 ++-- .../src/mage/cards/i/InvasionOfTarkir.java | 72 ++++++++-- .../src/mage/cards/i/InvasionOfTheros.java | 70 ++++++++-- .../src/mage/cards/i/InvasionOfTolvada.java | 52 +++++-- .../src/mage/cards/i/InvasionOfUlgrotha.java | 39 ++++-- .../src/mage/cards/i/InvasionOfVryn.java | 44 ++++-- .../src/mage/cards/i/InvasionOfXerex.java | 33 +++-- .../src/mage/cards/i/InvasionOfZendikar.java | 43 ++++-- .../src/mage/cards/i/InventiveIteration.java | 94 +++++++++++-- .../src/mage/cards/i/InvertedIceberg.java | 29 +++- .../mage/cards/i/InvocationOfTheFounders.java | 78 ----------- .../src/mage/cards/k/KyrenFlamewright.java | 60 -------- .../src/mage/cards/l/LazotepConvert.java | 110 --------------- Mage.Sets/src/mage/cards/l/LeylineSurge.java | 37 ----- .../src/mage/cards/l/LightshieldArray.java | 92 ------------- .../src/mage/cards/l/LivingBreakthrough.java | 103 -------------- .../src/mage/cards/m/MaliciousInvader.java | 59 -------- .../mage/cards/m/MarchesaResoluteMonarch.java | 122 ----------------- .../src/mage/cards/o/OverloadedMageRing.java | 53 -------- .../src/mage/cards/p/PrickleFaeries.java | 49 ------- .../src/mage/cards/p/PrimordialPlasm.java | 51 ------- .../src/mage/cards/p/PyreOfTheWorldTree.java | 53 -------- .../src/mage/cards/r/RefractionElemental.java | 47 ------- .../src/mage/cards/r/RooftopSaboteurs.java | 45 ------ .../src/mage/cards/s/SerraFaithkeeper.java | 42 ------ .../mage/cards/s/SovereignsMacuahuitl.java | 44 ------ .../mage/cards/t/TeferiAkosaOfZhalfir.java | 115 ---------------- Mage.Sets/src/mage/cards/t/TheBrokenSky.java | 61 --------- .../src/mage/cards/t/TrugaCliffcharger.java | 62 --------- .../src/mage/cards/v/ValorsReachTagTeam.java | 35 ----- Mage.Sets/src/mage/cards/v/VertexPaladin.java | 47 ------- Mage.Sets/src/mage/cards/w/WildbloodPack.java | 54 -------- .../src/mage/cards/w/WinnowingForces.java | 45 ------ .../mage/cards/z/ZilorthaApexOfIkoria.java | 82 ----------- Mage.Sets/src/mage/sets/Innistrad.java | 1 - .../src/mage/sets/InnistradCrimsonVow.java | 6 - .../src/mage/sets/InnistradDoubleFeature.java | 3 - .../src/mage/sets/InnistradRemastered.java | 1 - .../src/mage/sets/KamigawaNeonDynasty.java | 3 - .../src/mage/sets/MagicOnlinePromos.java | 2 - .../src/mage/sets/MarchOfTheMachine.java | 35 ----- .../src/mage/sets/TheLostCavernsOfIxalan.java | 2 - 104 files changed, 2002 insertions(+), 3317 deletions(-) delete mode 100644 Mage.Sets/src/mage/cards/a/AetherwingGoldenScaleFlagship.java delete mode 100644 Mage.Sets/src/mage/cards/a/AshenReaper.java delete mode 100644 Mage.Sets/src/mage/cards/a/AwakenTheMaelstrom.java delete mode 100644 Mage.Sets/src/mage/cards/a/AwakenedSkyclave.java delete mode 100644 Mage.Sets/src/mage/cards/b/BelligerentRegisaur.java delete mode 100644 Mage.Sets/src/mage/cards/b/BloomwielderDryads.java delete mode 100644 Mage.Sets/src/mage/cards/c/CaetusSeaTyrantOfSegovia.java delete mode 100644 Mage.Sets/src/mage/cards/d/DefiantThundermaw.java delete mode 100644 Mage.Sets/src/mage/cards/d/DelugeOfTheDead.java delete mode 100644 Mage.Sets/src/mage/cards/d/DisciplesOfTheInferno.java delete mode 100644 Mage.Sets/src/mage/cards/e/EpharaEverSheltering.java delete mode 100644 Mage.Sets/src/mage/cards/g/GargantuanSlabhorn.java delete mode 100644 Mage.Sets/src/mage/cards/g/GrandmotherRaviSengir.java delete mode 100644 Mage.Sets/src/mage/cards/g/GuildpactParagon.java delete mode 100644 Mage.Sets/src/mage/cards/h/HolyFrazzleCannon.java delete mode 100644 Mage.Sets/src/mage/cards/h/HowlpackAvenger.java delete mode 100644 Mage.Sets/src/mage/cards/i/IcebergTitan.java delete mode 100644 Mage.Sets/src/mage/cards/i/InfestedWerewolf.java delete mode 100644 Mage.Sets/src/mage/cards/i/InvocationOfTheFounders.java delete mode 100644 Mage.Sets/src/mage/cards/k/KyrenFlamewright.java delete mode 100644 Mage.Sets/src/mage/cards/l/LazotepConvert.java delete mode 100644 Mage.Sets/src/mage/cards/l/LeylineSurge.java delete mode 100644 Mage.Sets/src/mage/cards/l/LightshieldArray.java delete mode 100644 Mage.Sets/src/mage/cards/l/LivingBreakthrough.java delete mode 100644 Mage.Sets/src/mage/cards/m/MaliciousInvader.java delete mode 100644 Mage.Sets/src/mage/cards/m/MarchesaResoluteMonarch.java delete mode 100644 Mage.Sets/src/mage/cards/o/OverloadedMageRing.java delete mode 100644 Mage.Sets/src/mage/cards/p/PrickleFaeries.java delete mode 100644 Mage.Sets/src/mage/cards/p/PrimordialPlasm.java delete mode 100644 Mage.Sets/src/mage/cards/p/PyreOfTheWorldTree.java delete mode 100644 Mage.Sets/src/mage/cards/r/RefractionElemental.java delete mode 100644 Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java delete mode 100644 Mage.Sets/src/mage/cards/s/SerraFaithkeeper.java delete mode 100644 Mage.Sets/src/mage/cards/s/SovereignsMacuahuitl.java delete mode 100644 Mage.Sets/src/mage/cards/t/TeferiAkosaOfZhalfir.java delete mode 100644 Mage.Sets/src/mage/cards/t/TheBrokenSky.java delete mode 100644 Mage.Sets/src/mage/cards/t/TrugaCliffcharger.java delete mode 100644 Mage.Sets/src/mage/cards/v/ValorsReachTagTeam.java delete mode 100644 Mage.Sets/src/mage/cards/v/VertexPaladin.java delete mode 100644 Mage.Sets/src/mage/cards/w/WildbloodPack.java delete mode 100644 Mage.Sets/src/mage/cards/w/WinnowingForces.java delete mode 100644 Mage.Sets/src/mage/cards/z/ZilorthaApexOfIkoria.java diff --git a/Mage.Sets/src/mage/cards/a/AetherwingGoldenScaleFlagship.java b/Mage.Sets/src/mage/cards/a/AetherwingGoldenScaleFlagship.java deleted file mode 100644 index 2edb57f2800..00000000000 --- a/Mage.Sets/src/mage/cards/a/AetherwingGoldenScaleFlagship.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/a/AshenReaper.java b/Mage.Sets/src/mage/cards/a/AshenReaper.java deleted file mode 100644 index 42bf48228ce..00000000000 --- a/Mage.Sets/src/mage/cards/a/AshenReaper.java +++ /dev/null @@ -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; - } - } -} diff --git a/Mage.Sets/src/mage/cards/a/AwakenTheMaelstrom.java b/Mage.Sets/src/mage/cards/a/AwakenTheMaelstrom.java deleted file mode 100644 index 3ff192f04d9..00000000000 --- a/Mage.Sets/src/mage/cards/a/AwakenTheMaelstrom.java +++ /dev/null @@ -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); - } - } - } -} diff --git a/Mage.Sets/src/mage/cards/a/AwakenedSkyclave.java b/Mage.Sets/src/mage/cards/a/AwakenedSkyclave.java deleted file mode 100644 index 48e9a24dee8..00000000000 --- a/Mage.Sets/src/mage/cards/a/AwakenedSkyclave.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BelligerentRegisaur.java b/Mage.Sets/src/mage/cards/b/BelligerentRegisaur.java deleted file mode 100644 index 030117c9ab4..00000000000 --- a/Mage.Sets/src/mage/cards/b/BelligerentRegisaur.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BloomwielderDryads.java b/Mage.Sets/src/mage/cards/b/BloomwielderDryads.java deleted file mode 100644 index e3782f4aedc..00000000000 --- a/Mage.Sets/src/mage/cards/b/BloomwielderDryads.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/c/CaetusSeaTyrantOfSegovia.java b/Mage.Sets/src/mage/cards/c/CaetusSeaTyrantOfSegovia.java deleted file mode 100644 index be5fd3a7870..00000000000 --- a/Mage.Sets/src/mage/cards/c/CaetusSeaTyrantOfSegovia.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/c/ConcealingCurtains.java b/Mage.Sets/src/mage/cards/c/ConcealingCurtains.java index bb17274ce09..7ba82a0c253 100644 --- a/Mage.Sets/src/mage/cards/c/ConcealingCurtains.java +++ b/Mage.Sets/src/mage/cards/c/ConcealingCurtains.java @@ -8,6 +8,7 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.MenaceAbility; +import mage.cards.Card; import mage.cards.CardSetInfo; import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; @@ -15,6 +16,7 @@ import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.StaticFilters; +import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetOpponent; @@ -83,7 +85,7 @@ class RevealingEyeEffect extends OneShotEffect { } @Override - public boolean apply(mage.game.Game game, Ability source) { + public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player opponent = game.getPlayer(source.getFirstTarget()); 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); 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) { return true; } diff --git a/Mage.Sets/src/mage/cards/d/DefiantThundermaw.java b/Mage.Sets/src/mage/cards/d/DefiantThundermaw.java deleted file mode 100644 index 79190ed8b56..00000000000 --- a/Mage.Sets/src/mage/cards/d/DefiantThundermaw.java +++ /dev/null @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DelugeOfTheDead.java b/Mage.Sets/src/mage/cards/d/DelugeOfTheDead.java deleted file mode 100644 index a8c1e8478aa..00000000000 --- a/Mage.Sets/src/mage/cards/d/DelugeOfTheDead.java +++ /dev/null @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DionBahamutsDominant.java b/Mage.Sets/src/mage/cards/d/DionBahamutsDominant.java index a3e0809935c..1026ddb5fe7 100644 --- a/Mage.Sets/src/mage/cards/d/DionBahamutsDominant.java +++ b/Mage.Sets/src/mage/cards/d/DionBahamutsDominant.java @@ -3,22 +3,28 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SagaAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DestroyTargetEffect; 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.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardSetInfo; import mage.cards.TransformingDoubleFacedCard; import mage.constants.*; import mage.counters.CounterType; import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.game.permanent.token.WaylayToken; +import mage.target.TargetPermanent; import java.util.UUID; @@ -63,25 +69,25 @@ public final class DionBahamutsDominant extends TransformingDoubleFacedCard { this.getRightHalfCard().setPT(5, 5); // (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. sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, ability3 -> { - ability3.addEffect(new mage.abilities.effects.common.counter.AddCountersAllEffect( - CounterType.P1P1.createInstance(), mage.filter.StaticFilters.FILTER_OTHER_CONTROLLED_CREATURE + ability3.addEffect(new AddCountersAllEffect( + 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, - mage.filter.StaticFilters.FILTER_CONTROLLED_CREATURE + StaticFilters.FILTER_CONTROLLED_CREATURE ).setText("Those creatures gain flying until end of turn")); ability3.withFlavorWord("Wings of Light"); }); // III -- Gigaflare -- Destroy target permanent. Exile Bahamut, then return it to the battlefield. sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_III, ability4 -> { - ability4.addEffect(new mage.abilities.effects.common.DestroyTargetEffect()); - ability4.addEffect(new mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect()); - ability4.addTarget(new mage.target.TargetPermanent()); + ability4.addEffect(new DestroyTargetEffect()); + ability4.addEffect(new ExileSourceAndReturnFaceUpEffect()); + ability4.addTarget(new TargetPermanent()); ability4.withFlavorWord("Gigaflare"); }); this.getRightHalfCard().addAbility(sagaAbility); diff --git a/Mage.Sets/src/mage/cards/d/DireFlail.java b/Mage.Sets/src/mage/cards/d/DireFlail.java index 1b2412b1318..d4e1ab257c1 100644 --- a/Mage.Sets/src/mage/cards/d/DireFlail.java +++ b/Mage.Sets/src/mage/cards/d/DireFlail.java @@ -1,10 +1,13 @@ package mage.cards.d; import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.Cost; import mage.abilities.costs.SacrificeCost; import mage.abilities.costs.UseAttachedCost; +import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.DamageWithPowerFromSourceToAnotherTargetEffect; import mage.abilities.effects.common.DoWhenCostPaid; @@ -116,7 +119,7 @@ class DireBlunderbussGainAbilityEffect extends ContinuousEffectImpl { new DamageWithPowerFromSourceToAnotherTargetEffect("this creature"), false ); reflexive.addTarget(new TargetCreaturePermanent()); - Ability grant = new mage.abilities.common.AttacksTriggeredAbility( + Ability grant = new AttacksTriggeredAbility( new DoWhenCostPaid( reflexive, new DireBlunderbussSacrificeCost(source, game), "Sacrifice an artifact other than the equipment?" @@ -129,7 +132,7 @@ class DireBlunderbussGainAbilityEffect extends ContinuousEffectImpl { class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeCost { - private final mage.abilities.costs.common.SacrificeTargetCost sacrificeCost; + private final SacrificeTargetCost sacrificeCost; private final mage.MageObjectReference mageObjectReference; DireBlunderbussSacrificeCost(Ability source, Game game) { @@ -137,7 +140,7 @@ class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeC this.mageObjectReference = new mage.MageObjectReference(source.getSourceObject(game), game); FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent(); 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) { @@ -152,7 +155,7 @@ class DireBlunderbussSacrificeCost extends UseAttachedCost implements SacrificeC } @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()); if (equipment == null) { return paid; diff --git a/Mage.Sets/src/mage/cards/d/DisciplesOfTheInferno.java b/Mage.Sets/src/mage/cards/d/DisciplesOfTheInferno.java deleted file mode 100644 index 8344681452f..00000000000 --- a/Mage.Sets/src/mage/cards/d/DisciplesOfTheInferno.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DistractingGeist.java b/Mage.Sets/src/mage/cards/d/DistractingGeist.java index 4ee77838c3a..9abe93864d9 100644 --- a/Mage.Sets/src/mage/cards/d/DistractingGeist.java +++ b/Mage.Sets/src/mage/cards/d/DistractingGeist.java @@ -2,7 +2,10 @@ package mage.cards.d; import mage.abilities.Ability; 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.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.DisturbAbility; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardSetInfo; @@ -50,7 +53,7 @@ public final class DistractingGeist extends TransformingDoubleFacedCard { // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); 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)); // 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." Ability ability2 = new AttacksTriggeredAbility(new TapTargetEffect()).setTriggerPhrase("Whenever this creature attacks, "); 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. this.getRightHalfCard().addAbility(DisturbAbility.makeBackAbility()); diff --git a/Mage.Sets/src/mage/cards/d/DormantGrove.java b/Mage.Sets/src/mage/cards/d/DormantGrove.java index 17988a2eea7..b0bbfe62961 100644 --- a/Mage.Sets/src/mage/cards/d/DormantGrove.java +++ b/Mage.Sets/src/mage/cards/d/DormantGrove.java @@ -1,10 +1,13 @@ package mage.cards.d; import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.VigilanceAbility; import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardSetInfo; import mage.cards.TransformingDoubleFacedCard; @@ -12,6 +15,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.counters.CounterType; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetControlledCreaturePermanent; @@ -46,12 +50,12 @@ public final class DormantGrove extends TransformingDoubleFacedCard { this.getRightHalfCard().setPT(3, 6); // Vigilance - this.getRightHalfCard().addAbility(mage.abilities.keyword.VigilanceAbility.getInstance()); + this.getRightHalfCard().addAbility(VigilanceAbility.getInstance()); // Other creatures you control have vigilance. - this.getRightHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility(new mage.abilities.effects.common.continuous.GainAbilityControlledEffect( - mage.abilities.keyword.VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, - mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES, true + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, + StaticFilters.FILTER_PERMANENT_CREATURES, true ))); } diff --git a/Mage.Sets/src/mage/cards/d/DorotheaVengefulVictim.java b/Mage.Sets/src/mage/cards/d/DorotheaVengefulVictim.java index c41dfd68ebf..2987e7c54e2 100644 --- a/Mage.Sets/src/mage/cards/d/DorotheaVengefulVictim.java +++ b/Mage.Sets/src/mage/cards/d/DorotheaVengefulVictim.java @@ -1,11 +1,15 @@ package mage.cards.d; +import mage.abilities.Ability; import mage.abilities.common.AttacksOrBlocksTriggeredAbility; +import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.DisturbAbility; import mage.abilities.keyword.EnchantAbility; @@ -13,8 +17,12 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardSetInfo; import mage.cards.TransformingDoubleFacedCard; 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.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTargets; 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." 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 ))); @@ -72,7 +80,7 @@ public final class DorotheaVengefulVictim extends TransformingDoubleFacedCard { } } -class DorotheasRetributionEffect extends mage.abilities.effects.OneShotEffect { +class DorotheasRetributionEffect extends OneShotEffect { DorotheasRetributionEffect() { super(Outcome.Benefit); @@ -89,12 +97,12 @@ class DorotheasRetributionEffect extends mage.abilities.effects.OneShotEffect { } @Override - public boolean apply(mage.game.Game game, mage.abilities.Ability source) { - mage.game.permanent.token.Token token = new mage.game.permanent.token.DorotheasRetributionSpiritToken(); + public boolean apply(Game game, Ability source) { + Token token = new DorotheasRetributionSpiritToken(); token.putOntoBattlefield(1, game, source, source.getControllerId(), true, true); game.addDelayedTriggeredAbility(new AtTheEndOfCombatDelayedTriggeredAbility( - new mage.abilities.effects.common.SacrificeTargetEffect() - .setTargetPointer(new mage.target.targetpointer.FixedTargets(token, game)) + new SacrificeTargetEffect() + .setTargetPointer(new FixedTargets(token, game)) .setText("sacrifice that token") ), source); return true; diff --git a/Mage.Sets/src/mage/cards/d/DowsingDagger.java b/Mage.Sets/src/mage/cards/d/DowsingDagger.java index e1325e4438f..6f3ff63dd5f 100644 --- a/Mage.Sets/src/mage/cards/d/DowsingDagger.java +++ b/Mage.Sets/src/mage/cards/d/DowsingDagger.java @@ -3,10 +3,15 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility; 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.TransformSourceEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.keyword.EquipAbility; +import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardSetInfo; import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; @@ -35,17 +40,17 @@ public final class DowsingDagger extends TransformingDoubleFacedCard { this.getLeftHalfCard().addAbility(ability); // 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. this.getLeftHalfCard().addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new TransformSourceEffect(), "equipped", true)); // 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 // 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) { diff --git a/Mage.Sets/src/mage/cards/d/DowsingDevice.java b/Mage.Sets/src/mage/cards/d/DowsingDevice.java index a8dcf8c9663..53025077ab2 100644 --- a/Mage.Sets/src/mage/cards/d/DowsingDevice.java +++ b/Mage.Sets/src/mage/cards/d/DowsingDevice.java @@ -1,15 +1,21 @@ package mage.cards.d; import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility; import mage.abilities.condition.Condition; 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.dynamicvalue.common.ArtifactYouControlCount; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.hint.common.ArtifactYouControlHint; import mage.abilities.keyword.HasteAbility; +import mage.abilities.mana.RedManaAbility; import mage.cards.CardSetInfo; import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; @@ -17,6 +23,7 @@ import mage.constants.ComparisonType; import mage.constants.SubType; import mage.filter.StaticFilters; import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -52,16 +59,16 @@ public final class DowsingDevice extends TransformingDoubleFacedCard { // Geode Grotto // {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. - Ability ability2 = new mage.abilities.common.ActivateAsSorceryActivatedAbility(new GainAbilityTargetEffect(HasteAbility.getInstance()) - .setText("Until end of turn, target creature gains haste"), new mage.abilities.costs.mana.ManaCostsImpl<>("{2}{R}")); - ability2.addCost(new mage.abilities.costs.common.TapSourceCost()); - ability2.addEffect(new mage.abilities.effects.common.continuous.BoostTargetEffect( - mage.abilities.dynamicvalue.common.ArtifactYouControlCount.instance, mage.abilities.dynamicvalue.common.StaticValue.get(0) + Ability ability2 = new ActivateAsSorceryActivatedAbility(new GainAbilityTargetEffect(HasteAbility.getInstance()) + .setText("Until end of turn, target creature gains haste"), new ManaCostsImpl<>("{2}{R}")); + ability2.addCost(new TapSourceCost()); + ability2.addEffect(new BoostTargetEffect( + ArtifactYouControlCount.instance, StaticValue.get(0) ).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)); } diff --git a/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java b/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java index 7ae652dd555..23b20194dae 100644 --- a/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java +++ b/Mage.Sets/src/mage/cards/d/DuskwatchRecruiter.java @@ -2,16 +2,19 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.WerewolfBackTriggeredAbility; import mage.abilities.common.WerewolfFrontTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; import mage.cards.CardSetInfo; import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.PutCards; import mage.constants.SubType; import mage.filter.StaticFilters; +import mage.filter.common.FilterCreatureCard; import java.util.UUID; @@ -43,8 +46,8 @@ public final class DuskwatchRecruiter extends TransformingDoubleFacedCard { this.getRightHalfCard().setPT(3, 3); // Creature spells you cast cost {1} less to cast. - this.getRightHalfCard().addAbility(new mage.abilities.common.SimpleStaticAbility( - new mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect(new mage.filter.common.FilterCreatureCard("creature spells"), 1) + this.getRightHalfCard().addAbility(new SimpleStaticAbility( + 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. diff --git a/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java b/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java index 23af1fe5d14..bc9dcbfd858 100644 --- a/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java +++ b/Mage.Sets/src/mage/cards/e/ElbrusTheBindingBlade.java @@ -7,6 +7,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.IntimidateAbility; @@ -98,7 +99,7 @@ class ElbrusTheBindingBladeEffect extends OneShotEffect { class WithengarUnboundTriggeredAbility extends TriggeredAbilityImpl { 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, "); } diff --git a/Mage.Sets/src/mage/cards/e/EpharaEverSheltering.java b/Mage.Sets/src/mage/cards/e/EpharaEverSheltering.java deleted file mode 100644 index 24431e2dee6..00000000000 --- a/Mage.Sets/src/mage/cards/e/EpharaEverSheltering.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/g/GargantuanSlabhorn.java b/Mage.Sets/src/mage/cards/g/GargantuanSlabhorn.java deleted file mode 100644 index dd19a481a83..00000000000 --- a/Mage.Sets/src/mage/cards/g/GargantuanSlabhorn.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/g/GrandmotherRaviSengir.java b/Mage.Sets/src/mage/cards/g/GrandmotherRaviSengir.java deleted file mode 100644 index c535576b30f..00000000000 --- a/Mage.Sets/src/mage/cards/g/GrandmotherRaviSengir.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/g/GuildpactParagon.java b/Mage.Sets/src/mage/cards/g/GuildpactParagon.java deleted file mode 100644 index c0dd3510078..00000000000 --- a/Mage.Sets/src/mage/cards/g/GuildpactParagon.java +++ /dev/null @@ -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 { - instance; - - @Override - public boolean apply(MageObject input, Game game) { - return input.getColor(game).getColorCount() == 2; - } -} diff --git a/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java b/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java index f768ea03fdb..39db9ab604e 100644 --- a/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java +++ b/Mage.Sets/src/mage/cards/h/HanweirMilitiaCaptain.java @@ -1,7 +1,9 @@ package mage.cards.h; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; @@ -45,8 +47,8 @@ public final class HanweirMilitiaCaptain extends TransformingDoubleFacedCard { // Westvale Cult Leader // 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, - new SetBasePowerToughnessSourceEffect(mage.abilities.dynamicvalue.common.CreaturesYouControlCount.PLURAL)) + this.getRightHalfCard().addAbility(new SimpleStaticAbility(Zone.ALL, + new SetBasePowerToughnessSourceEffect(CreaturesYouControlCount.PLURAL)) .addHint(CreaturesYouControlHint.instance)); // At the beginning of your end step, create a 1/1 white and black Human Cleric creature token. diff --git a/Mage.Sets/src/mage/cards/h/HolyFrazzleCannon.java b/Mage.Sets/src/mage/cards/h/HolyFrazzleCannon.java deleted file mode 100644 index 60301909b4f..00000000000 --- a/Mage.Sets/src/mage/cards/h/HolyFrazzleCannon.java +++ /dev/null @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/h/HowlpackAvenger.java b/Mage.Sets/src/mage/cards/h/HowlpackAvenger.java deleted file mode 100644 index f0ee5d31421..00000000000 --- a/Mage.Sets/src/mage/cards/h/HowlpackAvenger.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java b/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java index 04cc0feb6e5..1d5c124a1b3 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java +++ b/Mage.Sets/src/mage/cards/h/HuatliPoetOfUnity.java @@ -4,6 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SagaAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CreateTokenEffect; 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)); // 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 ).setText("Creatures you control have '{T}: Add {R}")); gainedAbility.addEffect(new GainAbilityControlledEffect( diff --git a/Mage.Sets/src/mage/cards/i/IcebergTitan.java b/Mage.Sets/src/mage/cards/i/IcebergTitan.java deleted file mode 100644 index b5422ca61da..00000000000 --- a/Mage.Sets/src/mage/cards/i/IcebergTitan.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/i/IdolOfTheDeepKing.java b/Mage.Sets/src/mage/cards/i/IdolOfTheDeepKing.java index c76243b2c49..13abd8dc05f 100644 --- a/Mage.Sets/src/mage/cards/i/IdolOfTheDeepKing.java +++ b/Mage.Sets/src/mage/cards/i/IdolOfTheDeepKing.java @@ -1,13 +1,18 @@ package mage.cards.i; import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAttachToTarget; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.keyword.CraftAbility; +import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.FlashAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.SubType; import mage.target.common.TargetAnyTarget; import java.util.UUID; @@ -15,22 +20,36 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class IdolOfTheDeepKing extends CardImpl { +public final class IdolOfTheDeepKing extends TransformingDoubleFacedCard { public IdolOfTheDeepKing(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{R}"); - this.secondSideCardClazz = mage.cards.s.SovereignsMacuahuitl.class; + super(ownerId, setInfo, + 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 - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2)); ability.addTarget(new TargetAnyTarget()); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); // 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) { diff --git a/Mage.Sets/src/mage/cards/i/IllTemperedLoner.java b/Mage.Sets/src/mage/cards/i/IllTemperedLoner.java index 08b861d29d1..2c789994b55 100644 --- a/Mage.Sets/src/mage/cards/i/IllTemperedLoner.java +++ b/Mage.Sets/src/mage/cards/i/IllTemperedLoner.java @@ -1,7 +1,7 @@ package mage.cards.i; -import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.common.DealtDamageAnyTriggeredAbility; import mage.abilities.common.DealtDamageToSourceTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; 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.continuous.BoostSourceEffect; import mage.abilities.keyword.DayboundAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.NightboundAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; 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; @@ -21,30 +24,48 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class IllTemperedLoner extends CardImpl { +public final class IllTemperedLoner extends TransformingDoubleFacedCard { 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); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(3); - this.toughness = new MageInt(3); - this.secondSideCardClazz = mage.cards.h.HowlpackAvenger.class; + // Ill-Tempered Loner + this.getLeftHalfCard().setPT(3, 3); // Whenever Ill-Tempered Loner is dealt damage, it deals that much damage to any target. Ability ability = new DealtDamageToSourceTriggeredAbility( new DamageTargetEffect(SavedDamageValue.MUCH, "it"), false); ability.addTarget(new TargetAnyTarget()); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); // {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 ), new ManaCostsImpl<>("{1}{R}"))); // 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) { diff --git a/Mage.Sets/src/mage/cards/i/InfestationExpert.java b/Mage.Sets/src/mage/cards/i/InfestationExpert.java index b5bd768744e..726d58f041d 100644 --- a/Mage.Sets/src/mage/cards/i/InfestationExpert.java +++ b/Mage.Sets/src/mage/cards/i/InfestationExpert.java @@ -1,11 +1,11 @@ package mage.cards.i; -import mage.MageInt; import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.DayboundAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.NightboundAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; import mage.game.permanent.token.InsectToken; @@ -15,24 +15,36 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InfestationExpert extends CardImpl { +public final class InfestationExpert extends TransformingDoubleFacedCard { 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); - this.subtype.add(SubType.WEREWOLF); - this.power = new MageInt(3); - this.toughness = new MageInt(4); - this.secondSideCardClazz = mage.cards.i.InfestedWerewolf.class; + // Infestation Expert + this.getLeftHalfCard().setPT(3, 4); // 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()) )); // 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) { diff --git a/Mage.Sets/src/mage/cards/i/InfestedWerewolf.java b/Mage.Sets/src/mage/cards/i/InfestedWerewolf.java deleted file mode 100644 index 96f815e0c32..00000000000 --- a/Mage.Sets/src/mage/cards/i/InfestedWerewolf.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/i/InnocentTraveler.java b/Mage.Sets/src/mage/cards/i/InnocentTraveler.java index 76e0b94422b..3987e659882 100644 --- a/Mage.Sets/src/mage/cards/i/InnocentTraveler.java +++ b/Mage.Sets/src/mage/cards/i/InnocentTraveler.java @@ -1,13 +1,20 @@ package mage.cards.i; -import mage.MageInt; 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.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.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.FilterPermanent; @@ -22,19 +29,36 @@ import java.util.UUID; /** * @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) { - 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); - this.power = new MageInt(1); - this.toughness = new MageInt(3); - this.secondSideCardClazz = mage.cards.m.MaliciousInvader.class; + // Innocent Traveler + this.getLeftHalfCard().setPT(1, 3); // At the beginning of your upkeep, any opponent may sacrifice a creature. If no one does, transform Innocent Traveler. - this.addAbility(new TransformAbility()); - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new InnocentTravelerEffect())); + this.getLeftHalfCard().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) { diff --git a/Mage.Sets/src/mage/cards/i/InstigatorGang.java b/Mage.Sets/src/mage/cards/i/InstigatorGang.java index a88e96462f2..cfd163c2d97 100644 --- a/Mage.Sets/src/mage/cards/i/InstigatorGang.java +++ b/Mage.Sets/src/mage/cards/i/InstigatorGang.java @@ -1,12 +1,12 @@ package mage.cards.i; -import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.WerewolfBackTriggeredAbility; import mage.abilities.common.WerewolfFrontTriggeredAbility; import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; +import mage.abilities.keyword.TrampleAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; @@ -17,27 +17,41 @@ import java.util.UUID; /** * @author nantuko */ -public final class InstigatorGang extends CardImpl { +public final class InstigatorGang extends TransformingDoubleFacedCard { public InstigatorGang(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); - this.subtype.add(SubType.HUMAN); - this.subtype.add(SubType.WEREWOLF); + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{R}", + "Wildblood Pack", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R" + ); - this.secondSideCardClazz = mage.cards.w.WildbloodPack.class; - - this.power = new MageInt(2); - this.toughness = new MageInt(3); + // Instigator Gang + this.getLeftHalfCard().setPT(2, 3); // Attacking creatures you control get +1/+0. - this.addAbility(new SimpleStaticAbility(new BoostControlledEffect( + this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect( 1, 0, Duration.WhileOnBattlefield, StaticFilters.FILTER_ATTACKING_CREATURES ))); // At the beginning of each upkeep, if no spells were cast last turn, transform Instigator Gang. - this.addAbility(new TransformAbility()); - this.addAbility(new WerewolfFrontTriggeredAbility()); + this.getLeftHalfCard().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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfAlara.java b/Mage.Sets/src/mage/cards/i/InvasionOfAlara.java index fd2160e9b63..cb0cb01ab51 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfAlara.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfAlara.java @@ -3,17 +3,27 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.*; import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; 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.TargetCard; +import mage.target.TargetPermanent; +import mage.target.TargetPlayer; 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 java.util.UUID; @@ -21,21 +31,43 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfAlara extends CardImpl { +public final class InvasionOfAlara extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(7); - this.secondSideCardClazz = mage.cards.a.AwakenTheMaelstrom.class; + // Invasion of Alara + this.getLeftHalfCard().setStartingDefense(7); - Ability ability = new SiegeAbility(); - ability.setRuleVisible(false); - this.addAbility(ability); + Ability siegeAbility = new SiegeAbility(); + siegeAbility.setRuleVisible(false); + 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. - 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) { @@ -101,3 +133,63 @@ class InvasionOfAlaraEffect extends OneShotEffect { 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); + } + } + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java b/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java index 804e097c03a..b1e66fe84e1 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java @@ -1,33 +1,46 @@ package mage.cards.i; +import mage.MageObject; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.MillCardsEachPlayerEffect; import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; -import mage.cards.CardImpl; +import mage.cards.Card; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.TargetController; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; +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 InvasionOfAmonkhet extends CardImpl { +public final class InvasionOfAmonkhet extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.l.LazotepConvert.class; + // Invasion of Amonkhet + 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.) - 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. 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 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) { @@ -47,3 +66,59 @@ public final class InvasionOfAmonkhet extends CardImpl { 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); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfArcavios.java b/Mage.Sets/src/mage/cards/i/InvasionOfArcavios.java index 5e9b57214d3..7937789e674 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfArcavios.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfArcavios.java @@ -3,16 +3,22 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.WishEffect; import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterSpell; import mage.filter.StaticFilters; +import mage.filter.common.FilterInstantOrSorcerySpell; +import mage.filter.predicate.card.CastFromZonePredicate; import mage.game.Game; +import mage.game.stack.Spell; import mage.players.Player; import java.util.UUID; @@ -20,20 +26,36 @@ import java.util.UUID; /** * @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) { - 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); - this.setStartingDefense(7); - this.secondSideCardClazz = mage.cards.i.InvocationOfTheFounders.class; + // Invasion of Arcavios + this.getLeftHalfCard().setStartingDefense(7); // (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. - 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) { @@ -78,3 +100,30 @@ class InvasionOfArcaviosEffect extends OneShotEffect { ).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; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfAzgol.java b/Mage.Sets/src/mage/cards/i/InvasionOfAzgol.java index 4e01acdf485..b7f157d7d19 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfAzgol.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfAzgol.java @@ -3,32 +3,45 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.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.a.AshenReaper; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.constants.WatcherScope; +import mage.counters.CounterType; import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; import mage.target.TargetPlayer; +import mage.watchers.Watcher; import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfAzgol extends CardImpl { +public final class InvasionOfAzgol extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.a.AshenReaper.class; + // Invasion of Azgol + 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.) - 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. 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.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) { @@ -48,3 +77,27 @@ public final class InvasionOfAzgol extends CardImpl { 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; + } + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfDominaria.java b/Mage.Sets/src/mage/cards/i/InvasionOfDominaria.java index be85c55fce3..0a4a3619e4c 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfDominaria.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfDominaria.java @@ -5,8 +5,10 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; 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.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; @@ -15,22 +17,34 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfDominaria extends CardImpl { +public final class InvasionOfDominaria extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.s.SerraFaithkeeper.class; + // Invasion of Dominaria + 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.) - this.addAbility(new SiegeAbility()); + this.getLeftHalfCard().addAbility(new SiegeAbility()); // When Invasion of Dominaria enters the battlefield, you gain 4 life and draw a card. Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4)); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfEldraine.java b/Mage.Sets/src/mage/cards/i/InvasionOfEldraine.java index c42444b31d7..1a13b1e4fe7 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfEldraine.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfEldraine.java @@ -3,11 +3,15 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.cards.CardImpl; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; import mage.target.common.TargetOpponent; import java.util.UUID; @@ -15,22 +19,39 @@ import java.util.UUID; /** * @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) { - 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.p.PrickleFaeries.class; + // Invasion of Eldraine + 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.) - this.addAbility(new SiegeAbility()); + this.getLeftHalfCard().addAbility(new SiegeAbility()); // When Invasion of Eldraine enters the battlefield, target opponent discards two cards. Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(2)); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfErgamon.java b/Mage.Sets/src/mage/cards/i/InvasionOfErgamon.java index 4a7e2e63e7f..2fdafc9c45e 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfErgamon.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfErgamon.java @@ -7,33 +7,60 @@ import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DoIfCostPaid; 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.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; import mage.game.permanent.token.TreasureToken; +import mage.target.common.TargetCardInLibrary; import java.util.UUID; /** * @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) { - 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); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.t.TrugaCliffcharger.class; + // Invasion of Ergamon + 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TreasureToken())); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfFiora.java b/Mage.Sets/src/mage/cards/i/InvasionOfFiora.java index 339488dbb37..df1a598c3de 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfFiora.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfFiora.java @@ -2,53 +2,94 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.Mode; +import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.condition.Condition; 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.m.MarchesaResoluteMonarch; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; +import mage.constants.WatcherScope; import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; 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; /** * @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 filter2 = new FilterCreaturePermanent("nonlegendary creatures"); + private static final FilterPermanent filterLegend = new FilterCreaturePermanent("legendary creatures"); + private static final FilterPermanent filterNonLegend = new FilterCreaturePermanent("nonlegendary creatures"); static { - filter.add(SuperType.LEGENDARY.getPredicate()); - filter2.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); + filterLegend.add(SuperType.LEGENDARY.getPredicate()); + filterNonLegend.add(Predicates.not(SuperType.LEGENDARY.getPredicate())); } 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.m.MarchesaResoluteMonarch.class; + // Invasion of Fiora + 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.) - this.addAbility(new SiegeAbility()); + this.getLeftHalfCard().addAbility(new SiegeAbility()); // When Invasion of Fiora enters the battlefield, choose one or both -- + // * Destroy all legendary creatures. - Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filter)); + Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filterLegend)); ability.getModes().setMinModes(1); ability.getModes().setMaxModes(2); // * Destroy all nonlegendary creatures. - ability.addMode(new Mode(new DestroyAllEffect(filter2))); - this.addAbility(ability, MarchesaResoluteMonarch.makeWatcher()); + ability.addMode(new Mode(new DestroyAllEffect(filterNonLegend))); + 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) { @@ -60,3 +101,49 @@ public final class InvasionOfFiora extends CardImpl { 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 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()); + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfGobakhan.java b/Mage.Sets/src/mage/cards/i/InvasionOfGobakhan.java index d44cf14a51b..c507c2a5339 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfGobakhan.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfGobakhan.java @@ -5,18 +5,25 @@ import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; 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.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.*; +import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetOpponent; import mage.util.CardUtil; import mage.watchers.common.AttackedThisTurnWatcher; @@ -26,22 +33,42 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfGobakhan extends CardImpl { +public final class InvasionOfGobakhan extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(3); - this.secondSideCardClazz = mage.cards.l.LightshieldArray.class; + // Invasion of Gobakhan + this.getLeftHalfCard().setStartingDefense(3); // (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. Ability ability = new EntersBattlefieldTriggeredAbility(new InvasionOfGobakhanEffect()); 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) { @@ -96,7 +123,7 @@ class InvasionOfGobakhanCastEffect extends AsThoughEffectImpl { 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); this.mor = new MageObjectReference(card, game); } @@ -123,8 +150,7 @@ class InvasionOfGobakhanCastEffect extends AsThoughEffectImpl { discard(); return false; } - return mor.refersTo(CardUtil.getMainCardId(game, sourceId), game) - && card.isOwnedBy(affectedControllerId); + return mor.refersTo(CardUtil.getMainCardId(game, sourceId), game) && card.isOwnedBy(affectedControllerId); } } @@ -153,10 +179,10 @@ class InvasionOfGobakhanCostEffect extends CostModificationEffectImpl { if (!(abilityToModify instanceof SpellAbility)) { return false; } - if (game.inCheckPlayableState()) { // during playable check, the card is still in exile zone, the zcc is one less - UUID cardtoCheckId = CardUtil.getMainCardId(game, abilityToModify.getSourceId()); - return mor.getSourceId().equals(cardtoCheckId) - && mor.getZoneChangeCounter() == game.getState().getZoneChangeCounter(cardtoCheckId) + 1; + if (game.inCheckPlayableState()) { + UUID cardToCheckId = CardUtil.getMainCardId(game, abilityToModify.getSourceId()); + return mor.getSourceId().equals(cardToCheckId) + && mor.getZoneChangeCounter() == game.getState().getZoneChangeCounter(cardToCheckId) + 1; } else { return mor.refersTo(CardUtil.getMainCardId(game, abilityToModify.getSourceId()), game); } @@ -167,3 +193,34 @@ class InvasionOfGobakhanCostEffect extends CostModificationEffectImpl { 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; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java b/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java index babbe2657ba..6f71ad803ce 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java @@ -1,27 +1,32 @@ package mage.cards.i; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.common.search.SearchLibraryGraveyardPutOntoBattlefieldEffect; +import mage.abilities.keyword.ReachAbility; import mage.cards.Card; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.ObjectSourcePlayer; import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.filter.predicate.Predicates; import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import java.util.UUID; /** * @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"); @@ -31,17 +36,29 @@ public final class InvasionOfIkoria extends CardImpl { } 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); - this.setStartingDefense(6); - this.secondSideCardClazz = mage.cards.z.ZilorthaApexOfIkoria.class; + // Invasion of Ikoria + this.getLeftHalfCard().setStartingDefense(6); // (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. - 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) { @@ -59,7 +76,41 @@ enum InvasionOfIkoriaPredicate implements ObjectSourcePlayerPredicate { @Override public boolean apply(ObjectSourcePlayer input, Game game) { - return input.getObject().getManaValue() - <= GetXValue.instance.calculate(game, input.getSource(), null); + return input.getObject().getManaValue() <= GetXValue.instance.calculate(game, input.getSource(), null); } -} \ No newline at end of file +} + +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); + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfInnistrad.java b/Mage.Sets/src/mage/cards/i/InvasionOfInnistrad.java index 5505e05ceae..de4ac0e8e43 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfInnistrad.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfInnistrad.java @@ -3,12 +3,23 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.keyword.FlashAbility; -import mage.cards.CardImpl; +import mage.cards.Card; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Outcome; import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.token.ZombieToken; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetOpponentsCreaturePermanent; import java.util.UUID; @@ -16,25 +27,37 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfInnistrad extends CardImpl { +public final class InvasionOfInnistrad extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.d.DelugeOfTheDead.class; + // Invasion of Innistrad + 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.) - this.addAbility(new SiegeAbility()); + this.getLeftHalfCard().addAbility(new SiegeAbility()); // 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. Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-13, -13)); 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) { @@ -46,3 +69,35 @@ public final class InvasionOfInnistrad extends CardImpl { 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; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfIxalan.java b/Mage.Sets/src/mage/cards/i/InvasionOfIxalan.java index e9f5063c2d7..127c4ec565c 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfIxalan.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfIxalan.java @@ -2,10 +2,15 @@ package mage.cards.i; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; 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.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.PutCards; import mage.constants.SubType; import mage.filter.StaticFilters; @@ -15,23 +20,37 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfIxalan extends CardImpl { +public final class InvasionOfIxalan extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.b.BelligerentRegisaur.class; + // Invasion of Ixalan + 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.) - 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. - this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( 5, 1, StaticFilters.FILTER_CARD_A_PERMANENT, 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfKaladesh.java b/Mage.Sets/src/mage/cards/i/InvasionOfKaladesh.java index c4ed5fb6da3..47779abf9b8 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfKaladesh.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfKaladesh.java @@ -2,11 +2,18 @@ package mage.cards.i; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.ArtifactYouControlCount; 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.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; import mage.game.permanent.token.ThopterColorlessToken; import java.util.UUID; @@ -14,20 +21,39 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfKaladesh extends CardImpl { +public final class InvasionOfKaladesh extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.a.AetherwingGoldenScaleFlagship.class; + // Invasion of Kaladesh + 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.) - 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. - 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfKaldheim.java b/Mage.Sets/src/mage/cards/i/InvasionOfKaldheim.java index b43d0aa8575..b8db517a142 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfKaldheim.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfKaldheim.java @@ -3,11 +3,19 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.common.DamageTargetEffect; +import mage.abilities.effects.common.DiscardCardControllerTriggeredAbility; +import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect; import mage.cards.*; import mage.constants.*; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; +import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetCardInHand; import mage.util.CardUtil; import java.util.UUID; @@ -15,20 +23,38 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfKaldheim extends CardImpl { +public final class InvasionOfKaldheim extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.p.PyreOfTheWorldTree.class; + // Invasion of Kaldheim + 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.) - 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. - 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) { @@ -45,8 +71,7 @@ class InvasionOfKaldheimEffect extends OneShotEffect { InvasionOfKaldheimEffect() { super(Outcome.Benefit); - 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"; + 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"; } private InvasionOfKaldheimEffect(final InvasionOfKaldheimEffect effect) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfKamigawa.java b/Mage.Sets/src/mage/cards/i/InvasionOfKamigawa.java index fbbba61f607..8c4b1b8f77b 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfKamigawa.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfKamigawa.java @@ -1,12 +1,15 @@ package mage.cards.i; import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.cards.CardImpl; +import mage.abilities.keyword.FlyingAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; @@ -18,23 +21,36 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfKamigawa extends CardImpl { +public final class InvasionOfKamigawa extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.r.RooftopSaboteurs.class; + // Invasion of Kamigawa + 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.) - 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. - Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect()); 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)); - 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfKarsus.java b/Mage.Sets/src/mage/cards/i/InvasionOfKarsus.java index 3e0ad498ef9..2321710b2a7 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfKarsus.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfKarsus.java @@ -2,11 +2,16 @@ package mage.cards.i; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.common.PayLifeCost; 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.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.constants.TargetController; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; @@ -15,24 +20,35 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfKarsus extends CardImpl { +public final class InvasionOfKarsus extends TransformingDoubleFacedCard { - private static final FilterPermanent filter - = new FilterCreatureOrPlaneswalkerPermanent("creature and each planeswalker"); + private static final FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("creature and each planeswalker"); 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.r.RefractionElemental.class; + // Invasion of Karsus + 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.) - 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. - this.addAbility(new EntersBattlefieldTriggeredAbility( - new DamageAllEffect(3, "it", filter) + // When this Siege enters, it deals 3 damage to each creature and each planeswalker. + this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(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 )); } diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfKylem.java b/Mage.Sets/src/mage/cards/i/InvasionOfKylem.java index 9fe9458f3a3..5670eb9d905 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfKylem.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfKylem.java @@ -3,14 +3,16 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.VigilanceAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.game.permanent.token.ValorsReachTagTeamToken; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -18,17 +20,19 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfKylem extends CardImpl { +public final class InvasionOfKylem extends TransformingDoubleFacedCard { public InvasionOfKylem(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{R}{W}"); - - this.subtype.add(SubType.SIEGE); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.v.ValorsReachTagTeam.class; + super(ownerId, setInfo, + new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{R}{W}", + "Valor's Reach Tag Team", + new CardType[]{CardType.SORCERY}, new SubType[]{}, "RW" + ); + // 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(2, 0) @@ -38,7 +42,11 @@ public final class InvasionOfKylem extends CardImpl { ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance()) .setText("and haste until end of turn")); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfLorwyn.java b/Mage.Sets/src/mage/cards/i/InvasionOfLorwyn.java index 128f73733a2..0da2e27ff23 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfLorwyn.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfLorwyn.java @@ -3,12 +3,16 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.continuous.SetBasePowerToughnessSourceEffect; import mage.abilities.hint.common.LandsYouControlHint; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterOpponentsCreaturePermanent; @@ -24,7 +28,7 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfLorwyn extends CardImpl { +public final class InvasionOfLorwyn extends TransformingDoubleFacedCard { 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" @@ -36,19 +40,30 @@ public final class InvasionOfLorwyn extends CardImpl { } 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); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.w.WinnowingForces.class; + // Invasion of Lorwyn + 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfMercadia.java b/Mage.Sets/src/mage/cards/i/InvasionOfMercadia.java index fc5c4e94077..19bb6ae49a0 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfMercadia.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfMercadia.java @@ -1,34 +1,64 @@ package mage.cards.i; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +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.DoIfCostPaid; 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.TransformingDoubleFacedCard; 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 InvasionOfMercadia extends CardImpl { +public final class InvasionOfMercadia extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.k.KyrenFlamewright.class; + // Invasion of Mercadia + 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.) - 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. - 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfMoag.java b/Mage.Sets/src/mage/cards/i/InvasionOfMoag.java index 00f81345e85..8b396921c48 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfMoag.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfMoag.java @@ -1,36 +1,58 @@ package mage.cards.i; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.costs.mana.ManaCostsImpl; 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.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; +import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfMoag extends CardImpl { +public final class InvasionOfMoag extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.b.BloomwielderDryads.class; + // Invasion of Moag + 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.) - 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. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect( + this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect( 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfMuraganda.java b/Mage.Sets/src/mage/cards/i/InvasionOfMuraganda.java index 6c312f0611b..3e6c7b295a3 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfMuraganda.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfMuraganda.java @@ -4,10 +4,14 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; 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.cards.CardImpl; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; @@ -19,27 +23,39 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfMuraganda extends CardImpl { +public final class InvasionOfMuraganda extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(6); - this.secondSideCardClazz = mage.cards.p.PrimordialPlasm.class; + // Invasion of Muraganda + this.getLeftHalfCard().setStartingDefense(6); // (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. - Ability ability = new EntersBattlefieldTriggeredAbility( - new AddCountersTargetEffect(CounterType.P1P1.createInstance()) - ); - ability.addEffect(new FightTargetsEffect() - .setText("Then that creature fights up to one target creature you don't control")); + Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); + 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 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfNewCapenna.java b/Mage.Sets/src/mage/cards/i/InvasionOfNewCapenna.java index a63d9651ffc..ce1de7da376 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfNewCapenna.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfNewCapenna.java @@ -1,17 +1,22 @@ package mage.cards.i; +import mage.abilities.Ability; +import mage.abilities.common.AttacksAttachedTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility; 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.ExileTargetEffect; -import mage.cards.CardImpl; +import mage.abilities.keyword.EquipAbility; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; +import mage.counters.CounterType; import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import java.util.UUID; @@ -19,26 +24,39 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfNewCapenna extends CardImpl { +public final class InvasionOfNewCapenna extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.h.HolyFrazzleCannon.class; + // Invasion of New Capenna + 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.) - 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. - ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ExileTargetEffect(), false); - ability.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE)); - this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid( - ability, + ReflexiveTriggeredAbility ref = new ReflexiveTriggeredAbility(new ExileTargetEffect(), false); + ref.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE)); + this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid( + ref, 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) { @@ -50,3 +68,37 @@ public final class InvasionOfNewCapenna extends CardImpl { 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; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java b/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java index 314ce51080c..3d962924ae3 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java @@ -1,34 +1,70 @@ package mage.cards.i; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.effects.common.CreateTokenEffect; -import mage.cards.CardImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.*; +import mage.abilities.effects.common.discard.DiscardControllerEffect; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; +import mage.cards.TransformingDoubleFacedCard; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.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.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInHand; import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfNewPhyrexia extends CardImpl { +public final class InvasionOfNewPhyrexia extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(6); - this.secondSideCardClazz = mage.cards.t.TeferiAkosaOfZhalfir.class; + // Invasion of New Phyrexia + this.getLeftHalfCard().setStartingDefense(6); // (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. - 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) { @@ -40,3 +76,50 @@ public final class InvasionOfNewPhyrexia extends CardImpl { 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; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfPyrulea.java b/Mage.Sets/src/mage/cards/i/InvasionOfPyrulea.java index 0c7368ae308..7845112de81 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfPyrulea.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfPyrulea.java @@ -3,11 +3,20 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.keyword.WardAbility; import mage.cards.*; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.permanent.TransformedPredicate; import mage.game.Game; import mage.players.Player; @@ -16,20 +25,43 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfPyrulea extends CardImpl { +public final class InvasionOfPyrulea extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.g.GargantuanSlabhorn.class; + // Invasion of Pyrulea + 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.) - 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. - 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfRavnica.java b/Mage.Sets/src/mage/cards/i/InvasionOfRavnica.java index 49b3a60b26f..26ffe207513 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfRavnica.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfRavnica.java @@ -1,15 +1,21 @@ package mage.cards.i; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.ExileTargetEffect; -import mage.cards.CardImpl; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.PutCards; import mage.constants.SubType; import mage.constants.TargetController; +import mage.filter.FilterCard; import mage.filter.FilterPermanent; +import mage.filter.FilterSpell; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.Predicate; import mage.game.Game; @@ -21,7 +27,7 @@ import java.util.UUID; /** * @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"); @@ -30,20 +36,38 @@ public final class InvasionOfRavnica extends CardImpl { 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) { - super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{5}"); - - this.subtype.add(SubType.SIEGE); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.g.GuildpactParagon.class; + super(ownerId, setInfo, + new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{5}", + "Guildpact Paragon", + new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.CONSTRUCT}, "" + ); + // 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect()); 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) { @@ -64,3 +88,12 @@ enum InvasionOfRavnicaPredicate implements Predicate { return input.getColor(game).getColorCount() != 2; } } + +enum GuildpactParagonPredicate implements Predicate { + instance; + + @Override + public boolean apply(MageObject input, Game game) { + return input.getColor(game).getColorCount() == 2; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java b/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java index 4f7ff4dda05..b8ef97f2586 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfRegatha.java @@ -1,26 +1,39 @@ package mage.cards.i; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.DamageTargetAndTargetEffect; -import mage.cards.CardImpl; +import mage.abilities.keyword.ProwessAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.FilterOpponent; import mage.filter.common.FilterBattlePermanent; import mage.filter.common.FilterPermanentOrPlayer; 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.TargetPermanentOrPlayer; +import mage.util.CardUtil; +import java.util.Objects; +import java.util.Optional; import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfRegatha extends CardImpl { +public final class InvasionOfRegatha extends TransformingDoubleFacedCard { private static final FilterPermanentOrPlayer filter = new FilterPermanentOrPlayer( "another target battle or opponent", @@ -32,20 +45,31 @@ public final class InvasionOfRegatha extends CardImpl { } public InvasionOfRegatha(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{R}"); - - this.subtype.add(SubType.SIEGE); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.d.DisciplesOfTheInferno.class; + super(ownerId, setInfo, + new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{R}", + "Disciples of the Inferno", + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.MONK}, "R" + ); + // 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetAndTargetEffect(4, 1)); ability.addTarget(new TargetPermanentOrPlayer(filter).setTargetTag(1)); 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) { @@ -57,3 +81,61 @@ public final class InvasionOfRegatha extends CardImpl { 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); + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfSegovia.java b/Mage.Sets/src/mage/cards/i/InvasionOfSegovia.java index fee4ad0287b..4b44e712ab9 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfSegovia.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfSegovia.java @@ -1,33 +1,65 @@ package mage.cards.i; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SimpleStaticAbility; 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.TransformingDoubleFacedCard; 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.game.permanent.token.Kraken11Token; +import mage.target.common.TargetCreaturePermanent; import java.util.UUID; /** * @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) { - 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.c.CaetusSeaTyrantOfSegovia.class; + // Invasion of Segovia + 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.) - 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. - 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfShandalar.java b/Mage.Sets/src/mage/cards/i/InvasionOfShandalar.java index c1d9fa06b7a..b16c4ffcacb 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfShandalar.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfShandalar.java @@ -3,9 +3,11 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; -import mage.cards.CardImpl; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.StaticFilters; @@ -16,22 +18,31 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfShandalar extends CardImpl { +public final class InvasionOfShandalar extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.l.LeylineSurge.class; + // Invasion of Shandalar + 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfTarkir.java b/Mage.Sets/src/mage/cards/i/InvasionOfTarkir.java index c75e07bea0f..e13393a4eee 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfTarkir.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfTarkir.java @@ -1,25 +1,31 @@ package mage.cards.i; +import mage.MageObjectReference; import mage.abilities.Ability; +import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.effects.OneShotEffect; 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.Cards; import mage.cards.CardsImpl; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.common.FilterAnyTarget; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterPermanentOrPlayer; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; +import mage.target.common.TargetAnyTarget; import mage.target.common.TargetCardInHand; import mage.target.common.TargetPermanentOrPlayer; @@ -28,20 +34,37 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfTarkir extends CardImpl { +public final class InvasionOfTarkir extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.d.DefiantThundermaw.class; + // Invasion of Tarkir + 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.) - 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. - 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) { @@ -66,8 +89,7 @@ class InvasionOfTarkirEffect extends OneShotEffect { InvasionOfTarkirEffect() { super(Outcome.Benefit); - 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"; + 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"; } private InvasionOfTarkirEffect(final InvasionOfTarkirEffect effect) { @@ -97,3 +119,33 @@ class InvasionOfTarkirEffect extends OneShotEffect { 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; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfTheros.java b/Mage.Sets/src/mage/cards/i/InvasionOfTheros.java index 91f8f74d716..44671b41d9f 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfTheros.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfTheros.java @@ -1,14 +1,32 @@ package mage.cards.i; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.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.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.SubType; +import mage.constants.SuperType; import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledEnchantmentPermanent; import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AnotherPredicate; import mage.target.common.TargetCardInLibrary; import java.util.UUID; @@ -16,9 +34,10 @@ import java.util.UUID; /** * @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 FilterPermanent epharaFilter = new FilterControlledEnchantmentPermanent("another enchantment"); static { filter.add(Predicates.or( @@ -26,22 +45,55 @@ public final class InvasionOfTheros extends CardImpl { SubType.GOD.getPredicate(), SubType.DEMIGOD.getPredicate() )); + epharaFilter.add(AnotherPredicate.instance); } - public InvasionOfTheros(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{W}"); + static { + } - this.subtype.add(SubType.SIEGE); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.e.EpharaEverSheltering.class; + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + epharaFilter, ComparisonType.MORE_THAN, 2, true + ); + 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.) - 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. - this.addAbility(new EntersBattlefieldTriggeredAbility( + this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility( 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfTolvada.java b/Mage.Sets/src/mage/cards/i/InvasionOfTolvada.java index ed40650ae77..c618967a88c 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfTolvada.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfTolvada.java @@ -3,14 +3,24 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CreateTokenEffect; 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.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.permanent.token.WhiteBlackSpiritToken; import mage.target.common.TargetCardInYourGraveyard; import java.util.UUID; @@ -18,7 +28,7 @@ import java.util.UUID; /** * @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"); @@ -26,20 +36,44 @@ public final class InvasionOfTolvada extends CardImpl { filter.add(Predicates.not(CardType.BATTLE.getPredicate())); } - public InvasionOfTolvada(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{3}{W}{B}"); + private static final FilterCreaturePermanent tokenFilter = new FilterCreaturePermanent("creature tokens"); - this.subtype.add(SubType.SIEGE); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.t.TheBrokenSky.class; + static { + tokenFilter.add(TokenPredicate.TRUE); + } + + 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfUlgrotha.java b/Mage.Sets/src/mage/cards/i/InvasionOfUlgrotha.java index f9c523ca427..2325d7277b8 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfUlgrotha.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfUlgrotha.java @@ -1,14 +1,20 @@ package mage.cards.i; import mage.abilities.Ability; +import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; import mage.abilities.effects.common.DamageTargetEffect; 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.TransformingDoubleFacedCard; import mage.constants.CardType; 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.FilterPermanentOrPlayer; import mage.filter.predicate.mageobject.AnotherPredicate; @@ -19,7 +25,7 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfUlgrotha extends CardImpl { +public final class InvasionOfUlgrotha extends TransformingDoubleFacedCard { 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) { - 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); - this.setStartingDefense(5); - this.secondSideCardClazz = mage.cards.g.GrandmotherRaviSengir.class; + // Invasion of Ulgrotha + 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3, "it")); ability.addEffect(new GainLifeEffect(3).concatBy("and")); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfVryn.java b/Mage.Sets/src/mage/cards/i/InvasionOfVryn.java index c4107e3b0fe..69ccb87ab25 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfVryn.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfVryn.java @@ -1,32 +1,60 @@ package mage.cards.i; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.FilterSpell; +import mage.target.TargetSpell; import java.util.UUID; /** * @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) { - 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.o.OverloadedMageRing.class; + // Invasion of Vryn + 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.) - this.addAbility(new SiegeAbility()); + this.getLeftHalfCard().addAbility(new SiegeAbility()); // 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfXerex.java b/Mage.Sets/src/mage/cards/i/InvasionOfXerex.java index fa5253a7bc9..d93de2b2ccc 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfXerex.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfXerex.java @@ -3,11 +3,16 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; 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.TransformingDoubleFacedCard; import mage.constants.CardType; import mage.constants.SubType; +import mage.constants.Zone; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -15,22 +20,34 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfXerex extends CardImpl { +public final class InvasionOfXerex extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(4); - this.secondSideCardClazz = mage.cards.v.VertexPaladin.class; + // Invasion of Xerex + 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.) - 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. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfZendikar.java b/Mage.Sets/src/mage/cards/i/InvasionOfZendikar.java index 5f83a364830..f0b3955c634 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfZendikar.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfZendikar.java @@ -2,10 +2,16 @@ package mage.cards.i; import mage.abilities.common.EntersBattlefieldTriggeredAbility; 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.cards.CardImpl; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.abilities.mana.AnyColorManaAbility; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; import mage.filter.StaticFilters; import mage.target.common.TargetCardInLibrary; @@ -15,22 +21,41 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InvasionOfZendikar extends CardImpl { +public final class InvasionOfZendikar extends TransformingDoubleFacedCard { 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); - this.setStartingDefense(3); - this.secondSideCardClazz = mage.cards.a.AwakenedSkyclave.class; + // Invasion of Zendikar + this.getLeftHalfCard().setStartingDefense(3); // (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. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary( + // 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.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary( 0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS ), 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) { diff --git a/Mage.Sets/src/mage/cards/i/InventiveIteration.java b/Mage.Sets/src/mage/cards/i/InventiveIteration.java index 01b9469198f..95379ab1c8e 100644 --- a/Mage.Sets/src/mage/cards/i/InventiveIteration.java +++ b/Mage.Sets/src/mage/cards/i/InventiveIteration.java @@ -1,17 +1,22 @@ package mage.cards.i; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SagaAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; -import mage.abilities.keyword.TransformAbility; +import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.*; import mage.filter.StaticFilters; import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInYourGraveyard; @@ -23,31 +28,41 @@ import java.util.UUID; /** * @author TheElk801 */ -public final class InventiveIteration extends CardImpl { +public final class InventiveIteration extends TransformingDoubleFacedCard { public InventiveIteration(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); - - this.subtype.add(SubType.SAGA); - this.secondSideCardClazz = mage.cards.l.LivingBreakthrough.class; + super(ownerId, setInfo, + new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{3}{U}", + "Living Breakthrough", + 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.) - 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. sagaAbility.addChapterEffect( - this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I, + this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I, new ReturnToHandTargetEffect(), new TargetCreatureOrPlaneswalker(0, 1) ); // 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. - this.addAbility(new TransformAbility()); - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect()); + sagaAbility.addChapterEffect(this.getLeftHalfCard(), 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) { @@ -102,3 +117,56 @@ class InventiveIterationEffect extends OneShotEffect { 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; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvertedIceberg.java b/Mage.Sets/src/mage/cards/i/InvertedIceberg.java index 0a4c7d497d3..28419263d17 100644 --- a/Mage.Sets/src/mage/cards/i/InvertedIceberg.java +++ b/Mage.Sets/src/mage/cards/i/InvertedIceberg.java @@ -1,32 +1,49 @@ package mage.cards.i; import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.MayTapOrUntapTargetEffect; import mage.abilities.effects.common.MillCardsControllerEffect; import mage.abilities.keyword.CraftAbility; -import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.TransformingDoubleFacedCard; import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; import java.util.UUID; /** * @author TheElk801 */ -public final class InvertedIceberg extends CardImpl { +public final class InvertedIceberg extends TransformingDoubleFacedCard { public InvertedIceberg(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}"); - this.secondSideCardClazz = mage.cards.i.IcebergTitan.class; + super(ownerId, setInfo, + 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. Ability ability = new EntersBattlefieldTriggeredAbility(new MillCardsControllerEffect(1)); ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy(", then")); - this.addAbility(ability); + this.getLeftHalfCard().addAbility(ability); // 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) { diff --git a/Mage.Sets/src/mage/cards/i/InvocationOfTheFounders.java b/Mage.Sets/src/mage/cards/i/InvocationOfTheFounders.java deleted file mode 100644 index 798d94dea5f..00000000000 --- a/Mage.Sets/src/mage/cards/i/InvocationOfTheFounders.java +++ /dev/null @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/k/KyrenFlamewright.java b/Mage.Sets/src/mage/cards/k/KyrenFlamewright.java deleted file mode 100644 index a0e95b8626e..00000000000 --- a/Mage.Sets/src/mage/cards/k/KyrenFlamewright.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LazotepConvert.java b/Mage.Sets/src/mage/cards/l/LazotepConvert.java deleted file mode 100644 index 6c6bf532331..00000000000 --- a/Mage.Sets/src/mage/cards/l/LazotepConvert.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LeylineSurge.java b/Mage.Sets/src/mage/cards/l/LeylineSurge.java deleted file mode 100644 index 42a10f256e7..00000000000 --- a/Mage.Sets/src/mage/cards/l/LeylineSurge.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LightshieldArray.java b/Mage.Sets/src/mage/cards/l/LightshieldArray.java deleted file mode 100644 index 45076095e12..00000000000 --- a/Mage.Sets/src/mage/cards/l/LightshieldArray.java +++ /dev/null @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/l/LivingBreakthrough.java b/Mage.Sets/src/mage/cards/l/LivingBreakthrough.java deleted file mode 100644 index 861156384e3..00000000000 --- a/Mage.Sets/src/mage/cards/l/LivingBreakthrough.java +++ /dev/null @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/m/MaliciousInvader.java b/Mage.Sets/src/mage/cards/m/MaliciousInvader.java deleted file mode 100644 index a86263bc19f..00000000000 --- a/Mage.Sets/src/mage/cards/m/MaliciousInvader.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MarchesaResoluteMonarch.java b/Mage.Sets/src/mage/cards/m/MarchesaResoluteMonarch.java deleted file mode 100644 index 37cea498d81..00000000000 --- a/Mage.Sets/src/mage/cards/m/MarchesaResoluteMonarch.java +++ /dev/null @@ -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 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()); - } -} diff --git a/Mage.Sets/src/mage/cards/o/OverloadedMageRing.java b/Mage.Sets/src/mage/cards/o/OverloadedMageRing.java deleted file mode 100644 index 65100d111e6..00000000000 --- a/Mage.Sets/src/mage/cards/o/OverloadedMageRing.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/p/PrickleFaeries.java b/Mage.Sets/src/mage/cards/p/PrickleFaeries.java deleted file mode 100644 index 331dcf20681..00000000000 --- a/Mage.Sets/src/mage/cards/p/PrickleFaeries.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/p/PrimordialPlasm.java b/Mage.Sets/src/mage/cards/p/PrimordialPlasm.java deleted file mode 100644 index bae0d2e9ea0..00000000000 --- a/Mage.Sets/src/mage/cards/p/PrimordialPlasm.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/p/PyreOfTheWorldTree.java b/Mage.Sets/src/mage/cards/p/PyreOfTheWorldTree.java deleted file mode 100644 index 860d255f500..00000000000 --- a/Mage.Sets/src/mage/cards/p/PyreOfTheWorldTree.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RefractionElemental.java b/Mage.Sets/src/mage/cards/r/RefractionElemental.java deleted file mode 100644 index d68099354eb..00000000000 --- a/Mage.Sets/src/mage/cards/r/RefractionElemental.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java b/Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java deleted file mode 100644 index 7d78c7b665f..00000000000 --- a/Mage.Sets/src/mage/cards/r/RooftopSaboteurs.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SerraFaithkeeper.java b/Mage.Sets/src/mage/cards/s/SerraFaithkeeper.java deleted file mode 100644 index 21a7c081401..00000000000 --- a/Mage.Sets/src/mage/cards/s/SerraFaithkeeper.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SovereignsMacuahuitl.java b/Mage.Sets/src/mage/cards/s/SovereignsMacuahuitl.java deleted file mode 100644 index 86401a5368f..00000000000 --- a/Mage.Sets/src/mage/cards/s/SovereignsMacuahuitl.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TeferiAkosaOfZhalfir.java b/Mage.Sets/src/mage/cards/t/TeferiAkosaOfZhalfir.java deleted file mode 100644 index 738954cfd63..00000000000 --- a/Mage.Sets/src/mage/cards/t/TeferiAkosaOfZhalfir.java +++ /dev/null @@ -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; - } -} diff --git a/Mage.Sets/src/mage/cards/t/TheBrokenSky.java b/Mage.Sets/src/mage/cards/t/TheBrokenSky.java deleted file mode 100644 index 934cbd712ea..00000000000 --- a/Mage.Sets/src/mage/cards/t/TheBrokenSky.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TrugaCliffcharger.java b/Mage.Sets/src/mage/cards/t/TrugaCliffcharger.java deleted file mode 100644 index 79f4a82dd9c..00000000000 --- a/Mage.Sets/src/mage/cards/t/TrugaCliffcharger.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/v/ValorsReachTagTeam.java b/Mage.Sets/src/mage/cards/v/ValorsReachTagTeam.java deleted file mode 100644 index b01d199a7c8..00000000000 --- a/Mage.Sets/src/mage/cards/v/ValorsReachTagTeam.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/v/VertexPaladin.java b/Mage.Sets/src/mage/cards/v/VertexPaladin.java deleted file mode 100644 index 179114e6001..00000000000 --- a/Mage.Sets/src/mage/cards/v/VertexPaladin.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/w/WildbloodPack.java b/Mage.Sets/src/mage/cards/w/WildbloodPack.java deleted file mode 100644 index 6dd0d6f908a..00000000000 --- a/Mage.Sets/src/mage/cards/w/WildbloodPack.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/w/WinnowingForces.java b/Mage.Sets/src/mage/cards/w/WinnowingForces.java deleted file mode 100644 index 34ccc655ee8..00000000000 --- a/Mage.Sets/src/mage/cards/w/WinnowingForces.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/z/ZilorthaApexOfIkoria.java b/Mage.Sets/src/mage/cards/z/ZilorthaApexOfIkoria.java deleted file mode 100644 index 3509c40ef64..00000000000 --- a/Mage.Sets/src/mage/cards/z/ZilorthaApexOfIkoria.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/sets/Innistrad.java b/Mage.Sets/src/mage/sets/Innistrad.java index 0db4878763a..5e71d3b2c63 100644 --- a/Mage.Sets/src/mage/sets/Innistrad.java +++ b/Mage.Sets/src/mage/sets/Innistrad.java @@ -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("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("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("Wooden Stake", 237, Rarity.COMMON, mage.cards.w.WoodenStake.class)); cards.add(new SetCardInfo("Woodland Cemetery", 249, Rarity.RARE, mage.cards.w.WoodlandCemetery.class)); diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java index ff32e1a9792..c8ecba6c6f8 100644 --- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java +++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java @@ -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("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("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", 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)); @@ -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", 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("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", 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)); @@ -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("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("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", 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)); diff --git a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java index d8340b7fea4..95d3a13e58d 100644 --- a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java +++ b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java @@ -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("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("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("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)); @@ -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("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("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("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)); @@ -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("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("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("Markov Purifier", 508, Rarity.UNCOMMON, mage.cards.m.MarkovPurifier.class)); cards.add(new SetCardInfo("Markov Retribution", 438, Rarity.UNCOMMON, mage.cards.m.MarkovRetribution.class)); diff --git a/Mage.Sets/src/mage/sets/InnistradRemastered.java b/Mage.Sets/src/mage/sets/InnistradRemastered.java index d9fbc5da324..dbc84c583a6 100644 --- a/Mage.Sets/src/mage/sets/InnistradRemastered.java +++ b/Mage.Sets/src/mage/sets/InnistradRemastered.java @@ -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("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("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", 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)); diff --git a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java index ef391d49bb0..bc12d2625af 100644 --- a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java +++ b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java @@ -312,9 +312,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet { cards.add(new SetCardInfo("Lion Sash", 26, Rarity.RARE, mage.cards.l.LionSash.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lion Sash", 368, Rarity.RARE, mage.cards.l.LionSash.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lion Sash", 440, Rarity.RARE, mage.cards.l.LionSash.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Living Breakthrough", 355, Rarity.RARE, mage.cards.l.LivingBreakthrough.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Living Breakthrough", 443, Rarity.RARE, mage.cards.l.LivingBreakthrough.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Living Breakthrough", 57, Rarity.RARE, mage.cards.l.LivingBreakthrough.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lizard Blades", 153, Rarity.RARE, mage.cards.l.LizardBlades.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lizard Blades", 385, Rarity.RARE, mage.cards.l.LizardBlades.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lizard Blades", 468, Rarity.RARE, mage.cards.l.LizardBlades.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java index 75665dc54d0..96604e13741 100644 --- a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java +++ b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java @@ -1240,7 +1240,6 @@ public class MagicOnlinePromos extends ExpansionSet { cards.add(new SetCardInfo("Hostile Negotiations", 105712, Rarity.RARE, mage.cards.h.HostileNegotiations.class)); cards.add(new SetCardInfo("Howling Moon", 95417, Rarity.RARE, mage.cards.h.HowlingMoon.class)); cards.add(new SetCardInfo("Howlpack Alpha", 42866, Rarity.RARE, mage.cards.h.HowlpackAlpha.class)); - cards.add(new SetCardInfo("Howlpack Avenger", 95389, Rarity.RARE, mage.cards.h.HowlpackAvenger.class)); cards.add(new SetCardInfo("Howlpack Piper", 95425, Rarity.RARE, mage.cards.h.HowlpackPiper.class)); cards.add(new SetCardInfo("Huatli, the Sun's Heart", 72241, Rarity.UNCOMMON, mage.cards.h.HuatliTheSunsHeart.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Huatli, the Sun's Heart", 77975, Rarity.UNCOMMON, mage.cards.h.HuatliTheSunsHeart.class, NON_FULL_USE_VARIOUS)); @@ -1560,7 +1559,6 @@ public class MagicOnlinePromos extends ExpansionSet { cards.add(new SetCardInfo("Lion Sash", 97887, Rarity.RARE, mage.cards.l.LionSash.class)); cards.add(new SetCardInfo("Lion's Eye Diamond", 51936, Rarity.RARE, mage.cards.l.LionsEyeDiamond.class)); cards.add(new SetCardInfo("Lithoform Engine", 83722, Rarity.MYTHIC, mage.cards.l.LithoformEngine.class)); - cards.add(new SetCardInfo("Living Breakthrough", 97937, Rarity.RARE, mage.cards.l.LivingBreakthrough.class)); cards.add(new SetCardInfo("Living Death", 36042, Rarity.RARE, mage.cards.l.LivingDeath.class, RETRO_ART)); cards.add(new SetCardInfo("Living Wish", 35068, Rarity.RARE, mage.cards.l.LivingWish.class)); cards.add(new SetCardInfo("Livio, Oathsworn Sentinel", 86348, Rarity.RARE, mage.cards.l.LivioOathswornSentinel.class)); diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java index af91b11fb6b..cbef8d4b348 100644 --- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java +++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java @@ -41,7 +41,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Aerial Boost", 2, Rarity.COMMON, mage.cards.a.AerialBoost.class)); cards.add(new SetCardInfo("Aetherblade Agent", 88, Rarity.COMMON, mage.cards.a.AetherbladeAgent.class)); - cards.add(new SetCardInfo("Aetherwing, Golden-Scale Flagship", 234, Rarity.UNCOMMON, mage.cards.a.AetherwingGoldenScaleFlagship.class)); cards.add(new SetCardInfo("Akki Scrapchomper", 130, Rarity.COMMON, mage.cards.a.AkkiScrapchomper.class)); cards.add(new SetCardInfo("Alabaster Host Intercessor", 3, Rarity.COMMON, mage.cards.a.AlabasterHostIntercessor.class)); cards.add(new SetCardInfo("Alabaster Host Sanctifier", 4, Rarity.COMMON, mage.cards.a.AlabasterHostSanctifier.class)); @@ -54,20 +53,16 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Archpriest of Shadows", 356, Rarity.RARE, mage.cards.a.ArchpriestOfShadows.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Archpriest of Shadows", 89, Rarity.RARE, mage.cards.a.ArchpriestOfShadows.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Artistic Refusal", 46, Rarity.UNCOMMON, mage.cards.a.ArtisticRefusal.class)); - cards.add(new SetCardInfo("Ashen Reaper", 232, Rarity.UNCOMMON, mage.cards.a.AshenReaper.class)); cards.add(new SetCardInfo("Assimilate Essence", 47, Rarity.COMMON, mage.cards.a.AssimilateEssence.class)); cards.add(new SetCardInfo("Astral Wingspan", 48, Rarity.UNCOMMON, mage.cards.a.AstralWingspan.class)); cards.add(new SetCardInfo("Atraxa's Fall", 176, Rarity.COMMON, mage.cards.a.AtraxasFall.class)); cards.add(new SetCardInfo("Attentive Skywarden", 7, Rarity.COMMON, mage.cards.a.AttentiveSkywarden.class)); - cards.add(new SetCardInfo("Awaken the Maelstrom", 230, Rarity.RARE, mage.cards.a.AwakenTheMaelstrom.class)); - cards.add(new SetCardInfo("Awakened Skyclave", 194, Rarity.UNCOMMON, mage.cards.a.AwakenedSkyclave.class)); cards.add(new SetCardInfo("Axgard Artisan", 332, Rarity.UNCOMMON, mage.cards.a.AxgardArtisan.class)); cards.add(new SetCardInfo("Ayara, Widow of the Realm", 296, Rarity.RARE, mage.cards.a.AyaraWidowOfTheRealm.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ayara, Widow of the Realm", 90, Rarity.RARE, mage.cards.a.AyaraWidowOfTheRealm.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Baral and Kari Zev", 218, Rarity.RARE, mage.cards.b.BaralAndKariZev.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Baral and Kari Zev", 302, Rarity.RARE, mage.cards.b.BaralAndKariZev.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Beamtown Beatstick", 131, Rarity.COMMON, mage.cards.b.BeamtownBeatstick.class)); - cards.add(new SetCardInfo("Belligerent Regisaur", 191, Rarity.RARE, mage.cards.b.BelligerentRegisaur.class)); cards.add(new SetCardInfo("Bladed Battle-Fan", 91, Rarity.COMMON, mage.cards.b.BladedBattleFan.class)); cards.add(new SetCardInfo("Blighted Burgeoning", 177, Rarity.COMMON, mage.cards.b.BlightedBurgeoning.class)); cards.add(new SetCardInfo("Blightreaper Thallid", 92, Rarity.UNCOMMON, mage.cards.b.BlightreaperThallid.class)); @@ -76,7 +71,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Bloodfeather Phoenix", 132, Rarity.RARE, mage.cards.b.BloodfeatherPhoenix.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bloodfeather Phoenix", 362, Rarity.RARE, mage.cards.b.BloodfeatherPhoenix.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bloodfell Caves", 267, Rarity.COMMON, mage.cards.b.BloodfellCaves.class)); - cards.add(new SetCardInfo("Bloomwielder Dryads", 237, Rarity.UNCOMMON, mage.cards.b.BloomwielderDryads.class)); cards.add(new SetCardInfo("Blossoming Sands", 268, Rarity.COMMON, mage.cards.b.BlossomingSands.class)); cards.add(new SetCardInfo("Bola Slinger", 8, Rarity.COMMON, mage.cards.b.BolaSlinger.class)); cards.add(new SetCardInfo("Bonded Herdbeast", 178, Rarity.COMMON, mage.cards.b.BondedHerdbeast.class)); @@ -90,7 +84,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Breach the Multiverse", 94, Rarity.RARE, mage.cards.b.BreachTheMultiverse.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Burning Sun's Fury", 133, Rarity.COMMON, mage.cards.b.BurningSunsFury.class)); cards.add(new SetCardInfo("Burnished Dunestomper", 43, Rarity.COMMON, mage.cards.b.BurnishedDunestomper.class)); - cards.add(new SetCardInfo("Caetus, Sea Tyrant of Segovia", 63, Rarity.RARE, mage.cards.c.CaetusSeaTyrantOfSegovia.class)); cards.add(new SetCardInfo("Captive Weird", 49, Rarity.UNCOMMON, mage.cards.c.CaptiveWeird.class)); cards.add(new SetCardInfo("Chandra, Hope's Beacon", 134, Rarity.MYTHIC, mage.cards.c.ChandraHopesBeacon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Chandra, Hope's Beacon", 321, Rarity.MYTHIC, mage.cards.c.ChandraHopesBeacon.class, NON_FULL_USE_VARIOUS)); @@ -117,9 +110,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Deadly Derision", 99, Rarity.COMMON, mage.cards.d.DeadlyDerision.class)); cards.add(new SetCardInfo("Deeproot Wayfinder", 184, Rarity.RARE, mage.cards.d.DeeprootWayfinder.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Deeproot Wayfinder", 369, Rarity.RARE, mage.cards.d.DeeprootWayfinder.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Defiant Thundermaw", 149, Rarity.MYTHIC, mage.cards.d.DefiantThundermaw.class)); - cards.add(new SetCardInfo("Deluge of the Dead", 115, Rarity.MYTHIC, mage.cards.d.DelugeOfTheDead.class)); - cards.add(new SetCardInfo("Disciples of the Inferno", 148, Rarity.UNCOMMON, mage.cards.d.DisciplesOfTheInferno.class)); cards.add(new SetCardInfo("Dismal Backwater", 269, Rarity.COMMON, mage.cards.d.DismalBackwater.class)); cards.add(new SetCardInfo("Disturbing Conversion", 54, Rarity.COMMON, mage.cards.d.DisturbingConversion.class)); cards.add(new SetCardInfo("Djeru and Hazoret", 221, Rarity.RARE, mage.cards.d.DjeruAndHazoret.class, NON_FULL_USE_VARIOUS)); @@ -138,7 +128,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Elvish Vatkeeper", 223, Rarity.UNCOMMON, mage.cards.e.ElvishVatkeeper.class)); cards.add(new SetCardInfo("Enduring Bondwarden", 14, Rarity.COMMON, mage.cards.e.EnduringBondwarden.class)); cards.add(new SetCardInfo("Ephara's Dispersal", 55, Rarity.COMMON, mage.cards.e.EpharasDispersal.class)); - cards.add(new SetCardInfo("Ephara, Ever-Sheltering", 23, Rarity.RARE, mage.cards.e.EpharaEverSheltering.class)); cards.add(new SetCardInfo("Errant and Giada", 224, Rarity.RARE, mage.cards.e.ErrantAndGiada.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Errant and Giada", 306, Rarity.RARE, mage.cards.e.ErrantAndGiada.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Essence of Orthodoxy", 323, Rarity.RARE, mage.cards.e.EssenceOfOrthodoxy.class, NON_FULL_USE_VARIOUS)); @@ -166,7 +155,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Furnace Reins", 141, Rarity.UNCOMMON, mage.cards.f.FurnaceReins.class)); cards.add(new SetCardInfo("Furnace-Blessed Conqueror", 38, Rarity.UNCOMMON, mage.cards.f.FurnaceBlessedConqueror.class)); cards.add(new SetCardInfo("Furtive Analyst", 59, Rarity.COMMON, mage.cards.f.FurtiveAnalyst.class)); - cards.add(new SetCardInfo("Gargantuan Slabhorn", 240, Rarity.UNCOMMON, mage.cards.g.GargantuanSlabhorn.class)); cards.add(new SetCardInfo("Ghalta and Mavren", 225, Rarity.RARE, mage.cards.g.GhaltaAndMavren.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ghalta and Mavren", 307, Rarity.RARE, mage.cards.g.GhaltaAndMavren.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ghalta and Mavren", 386, Rarity.RARE, mage.cards.g.GhaltaAndMavren.class, NON_FULL_USE_VARIOUS)); @@ -183,10 +171,8 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Golden-Scale Aeronaut", 15, Rarity.COMMON, mage.cards.g.GoldenScaleAeronaut.class)); cards.add(new SetCardInfo("Grafted Butcher", 109, Rarity.RARE, mage.cards.g.GraftedButcher.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Grafted Butcher", 359, Rarity.RARE, mage.cards.g.GraftedButcher.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Grandmother Ravi Sengir", 116, Rarity.UNCOMMON, mage.cards.g.GrandmotherRaviSengir.class)); cards.add(new SetCardInfo("Guardian of Ghirapur", 16, Rarity.RARE, mage.cards.g.GuardianOfGhirapur.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Guardian of Ghirapur", 345, Rarity.RARE, mage.cards.g.GuardianOfGhirapur.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Guildpact Paragon", 1, Rarity.MYTHIC, mage.cards.g.GuildpactParagon.class)); cards.add(new SetCardInfo("Halo Forager", 227, Rarity.UNCOMMON, mage.cards.h.HaloForager.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Halo Forager", 385, Rarity.UNCOMMON, mage.cards.h.HaloForager.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Halo Hopper", 260, Rarity.COMMON, mage.cards.h.HaloHopper.class)); @@ -201,7 +187,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Hidetsugu and Kairi", 309, Rarity.RARE, mage.cards.h.HidetsuguAndKairi.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hoarding Broodlord", 110, Rarity.RARE, mage.cards.h.HoardingBroodlord.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hoarding Broodlord", 360, Rarity.RARE, mage.cards.h.HoardingBroodlord.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Holy Frazzle-Cannon", 238, Rarity.UNCOMMON, mage.cards.h.HolyFrazzleCannon.class)); cards.add(new SetCardInfo("Ichor Drinker", 111, Rarity.COMMON, mage.cards.i.IchorDrinker.class)); cards.add(new SetCardInfo("Ichor Shade", 112, Rarity.COMMON, mage.cards.i.IchorShade.class)); cards.add(new SetCardInfo("Infected Defector", 18, Rarity.COMMON, mage.cards.i.InfectedDefector.class)); @@ -249,7 +234,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Invasion of Vryn", 64, Rarity.UNCOMMON, mage.cards.i.InvasionOfVryn.class)); cards.add(new SetCardInfo("Invasion of Xerex", 242, Rarity.UNCOMMON, mage.cards.i.InvasionOfXerex.class)); cards.add(new SetCardInfo("Invasion of Zendikar", 194, Rarity.UNCOMMON, mage.cards.i.InvasionOfZendikar.class)); - cards.add(new SetCardInfo("Invocation of the Founders", 61, Rarity.RARE, mage.cards.i.InvocationOfTheFounders.class)); cards.add(new SetCardInfo("Iridescent Blademaster", 195, Rarity.COMMON, mage.cards.i.IridescentBlademaster.class)); cards.add(new SetCardInfo("Island", 278, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 284, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); @@ -273,13 +257,8 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Kor Halberd", 27, Rarity.COMMON, mage.cards.k.KorHalberd.class)); cards.add(new SetCardInfo("Kroxa and Kunoros", 245, Rarity.MYTHIC, mage.cards.k.KroxaAndKunoros.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kroxa and Kunoros", 312, Rarity.MYTHIC, mage.cards.k.KroxaAndKunoros.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Kyren Flamewright", 147, Rarity.UNCOMMON, mage.cards.k.KyrenFlamewright.class)); - cards.add(new SetCardInfo("Lazotep Convert", 231, Rarity.UNCOMMON, mage.cards.l.LazotepConvert.class)); - cards.add(new SetCardInfo("Leyline Surge", 193, Rarity.MYTHIC, mage.cards.l.LeylineSurge.class)); - cards.add(new SetCardInfo("Lightshield Array", 22, Rarity.RARE, mage.cards.l.LightshieldArray.class)); cards.add(new SetCardInfo("Lithomantic Barrage", 152, Rarity.UNCOMMON, mage.cards.l.LithomanticBarrage.class)); cards.add(new SetCardInfo("Marauding Dreadship", 153, Rarity.COMMON, mage.cards.m.MaraudingDreadship.class)); - cards.add(new SetCardInfo("Marchesa, Resolute Monarch", 114, Rarity.RARE, mage.cards.m.MarchesaResoluteMonarch.class)); cards.add(new SetCardInfo("Marshal of Zhalfir", 246, Rarity.UNCOMMON, mage.cards.m.MarshalOfZhalfir.class)); cards.add(new SetCardInfo("Meeting of Minds", 66, Rarity.COMMON, mage.cards.m.MeetingOfMinds.class)); cards.add(new SetCardInfo("Merciless Repurposing", 117, Rarity.UNCOMMON, mage.cards.m.MercilessRepurposing.class)); @@ -312,7 +291,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Orthion, Hero of Lavabrink", 334, Rarity.RARE, mage.cards.o.OrthionHeroOfLavabrink.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Orthion, Hero of Lavabrink", 379, Rarity.RARE, mage.cards.o.OrthionHeroOfLavabrink.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Overgrown Pest", 197, Rarity.COMMON, mage.cards.o.OvergrownPest.class)); - cards.add(new SetCardInfo("Overloaded Mage-Ring", 64, Rarity.UNCOMMON, mage.cards.o.OverloadedMageRing.class)); cards.add(new SetCardInfo("Ozolith, the Shattered Spire", 198, Rarity.RARE, mage.cards.o.OzolithTheShatteredSpire.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ozolith, the Shattered Spire", 372, Rarity.RARE, mage.cards.o.OzolithTheShatteredSpire.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Phyrexian Archivist", 262, Rarity.COMMON, mage.cards.p.PhyrexianArchivist.class)); @@ -332,12 +310,9 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Polukranos, Engine of Ruin", 300, Rarity.RARE, mage.cards.p.PolukranosEngineOfRuin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Portent Tracker", 201, Rarity.COMMON, mage.cards.p.PortentTracker.class)); cards.add(new SetCardInfo("Preening Champion", 73, Rarity.COMMON, mage.cards.p.PreeningChampion.class)); - cards.add(new SetCardInfo("Prickle Faeries", 113, Rarity.UNCOMMON, mage.cards.p.PrickleFaeries.class)); - cards.add(new SetCardInfo("Primordial Plasm", 192, Rarity.UNCOMMON, mage.cards.p.PrimordialPlasm.class)); cards.add(new SetCardInfo("Progenitor Exarch", 32, Rarity.RARE, mage.cards.p.ProgenitorExarch.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Progenitor Exarch", 348, Rarity.RARE, mage.cards.p.ProgenitorExarch.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Protocol Knight", 74, Rarity.COMMON, mage.cards.p.ProtocolKnight.class)); - cards.add(new SetCardInfo("Pyre of the World Tree", 145, Rarity.RARE, mage.cards.p.PyreOfTheWorldTree.class)); cards.add(new SetCardInfo("Pyretic Prankster", 157, Rarity.COMMON, mage.cards.p.PyreticPrankster.class)); cards.add(new SetCardInfo("Quintorius, Loremaster", 250, Rarity.RARE, mage.cards.q.QuintoriusLoremaster.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Quintorius, Loremaster", 314, Rarity.RARE, mage.cards.q.QuintoriusLoremaster.class, NON_FULL_USE_VARIOUS)); @@ -354,13 +329,11 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Realmbreaker, the Invasion Tree", 374, Rarity.RARE, mage.cards.r.RealmbreakerTheInvasionTree.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Redcap Heelslasher", 161, Rarity.COMMON, mage.cards.r.RedcapHeelslasher.class)); cards.add(new SetCardInfo("Referee Squad", 327, Rarity.UNCOMMON, mage.cards.r.RefereeSquad.class)); - cards.add(new SetCardInfo("Refraction Elemental", 146, Rarity.RARE, mage.cards.r.RefractionElemental.class)); cards.add(new SetCardInfo("Render Inert", 123, Rarity.UNCOMMON, mage.cards.r.RenderInert.class)); cards.add(new SetCardInfo("Rona, Herald of Invasion", 295, Rarity.RARE, mage.cards.r.RonaHeraldOfInvasion.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rona, Herald of Invasion", 75, Rarity.RARE, mage.cards.r.RonaHeraldOfInvasion.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rona, Tolarian Obliterator", 295, Rarity.RARE, mage.cards.r.RonaTolarianObliterator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rona, Tolarian Obliterator", 75, Rarity.RARE, mage.cards.r.RonaTolarianObliterator.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Rooftop Saboteurs", 62, Rarity.UNCOMMON, mage.cards.r.RooftopSaboteurs.class)); cards.add(new SetCardInfo("Rugged Highlands", 271, Rarity.COMMON, mage.cards.r.RuggedHighlands.class)); cards.add(new SetCardInfo("Ruins Recluse", 336, Rarity.UNCOMMON, mage.cards.r.RuinsRecluse.class)); cards.add(new SetCardInfo("Saiba Cryptomancer", 76, Rarity.COMMON, mage.cards.s.SaibaCryptomancer.class)); @@ -381,7 +354,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Seraph of New Capenna", 36, Rarity.UNCOMMON, mage.cards.s.SeraphOfNewCapenna.class)); cards.add(new SetCardInfo("Seraph of New Phyrexia", 36, Rarity.UNCOMMON, mage.cards.s.SeraphOfNewPhyrexia.class)); cards.add(new SetCardInfo("Serpent-Blade Assailant", 205, Rarity.COMMON, mage.cards.s.SerpentBladeAssailant.class)); - cards.add(new SetCardInfo("Serra Faithkeeper", 21, Rarity.UNCOMMON, mage.cards.s.SerraFaithkeeper.class)); cards.add(new SetCardInfo("Shatter the Source", 164, Rarity.COMMON, mage.cards.s.ShatterTheSource.class)); cards.add(new SetCardInfo("Sheoldred", 125, Rarity.MYTHIC, mage.cards.s.Sheoldred.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sheoldred", 297, Rarity.MYTHIC, mage.cards.s.Sheoldred.class, NON_FULL_USE_VARIOUS)); @@ -413,14 +385,12 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Tandem Takedown", 208, Rarity.UNCOMMON, mage.cards.t.TandemTakedown.class)); cards.add(new SetCardInfo("Tangled Skyline", 209, Rarity.UNCOMMON, mage.cards.t.TangledSkyline.class)); cards.add(new SetCardInfo("Tarkir Duneshaper", 43, Rarity.COMMON, mage.cards.t.TarkirDuneshaper.class)); - cards.add(new SetCardInfo("Teferi Akosa of Zhalfir", 239, Rarity.MYTHIC, mage.cards.t.TeferiAkosaOfZhalfir.class)); cards.add(new SetCardInfo("Temporal Cleansing", 80, Rarity.COMMON, mage.cards.t.TemporalCleansing.class)); cards.add(new SetCardInfo("Tenured Oilcaster", 126, Rarity.COMMON, mage.cards.t.TenuredOilcaster.class)); cards.add(new SetCardInfo("Terror of Towashi", 331, Rarity.RARE, mage.cards.t.TerrorOfTowashi.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Terror of Towashi", 378, Rarity.RARE, mage.cards.t.TerrorOfTowashi.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thalia and The Gitrog Monster", 255, Rarity.MYTHIC, mage.cards.t.ThaliaAndTheGitrogMonster.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thalia and The Gitrog Monster", 316, Rarity.MYTHIC, mage.cards.t.ThaliaAndTheGitrogMonster.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("The Broken Sky", 241, Rarity.RARE, mage.cards.t.TheBrokenSky.class)); cards.add(new SetCardInfo("The Grand Evolution", 213, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("The Grand Evolution", 301, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("The Grand Evolution", 342, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS)); @@ -446,16 +416,13 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Traumatic Revelation", 127, Rarity.COMMON, mage.cards.t.TraumaticRevelation.class)); cards.add(new SetCardInfo("Tribute to the World Tree", 211, Rarity.RARE, mage.cards.t.TributeToTheWorldTree.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tribute to the World Tree", 373, Rarity.RARE, mage.cards.t.TributeToTheWorldTree.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Truga Cliffcharger", 233, Rarity.UNCOMMON, mage.cards.t.TrugaCliffcharger.class)); cards.add(new SetCardInfo("Unseal the Necropolis", 128, Rarity.COMMON, mage.cards.u.UnsealTheNecropolis.class)); cards.add(new SetCardInfo("Urabrask", 169, Rarity.MYTHIC, mage.cards.u.Urabrask.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Urabrask", 299, Rarity.MYTHIC, mage.cards.u.Urabrask.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Urabrask", 341, Rarity.MYTHIC, mage.cards.u.Urabrask.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Urn of Godfire", 266, Rarity.COMMON, mage.cards.u.UrnOfGodfire.class)); - cards.add(new SetCardInfo("Valor's Reach Tag Team", 235, Rarity.UNCOMMON, mage.cards.v.ValorsReachTagTeam.class)); cards.add(new SetCardInfo("Vanquish the Weak", 129, Rarity.COMMON, mage.cards.v.VanquishTheWeak.class)); cards.add(new SetCardInfo("Vengeant Earth", 212, Rarity.COMMON, mage.cards.v.VengeantEarth.class)); - cards.add(new SetCardInfo("Vertex Paladin", 242, Rarity.UNCOMMON, mage.cards.v.VertexPaladin.class)); cards.add(new SetCardInfo("Volcanic Spite", 170, Rarity.COMMON, mage.cards.v.VolcanicSpite.class)); cards.add(new SetCardInfo("Voldaren Thrillseeker", 171, Rarity.RARE, mage.cards.v.VoldarenThrillseeker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Voldaren Thrillseeker", 367, Rarity.RARE, mage.cards.v.VoldarenThrillseeker.class, NON_FULL_USE_VARIOUS)); @@ -468,7 +435,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Wicked Slumber", 84, Rarity.UNCOMMON, mage.cards.w.WickedSlumber.class)); cards.add(new SetCardInfo("Wildwood Escort", 216, Rarity.COMMON, mage.cards.w.WildwoodEscort.class)); cards.add(new SetCardInfo("Wind-Scarred Crag", 276, Rarity.COMMON, mage.cards.w.WindScarredCrag.class)); - cards.add(new SetCardInfo("Winnowing Forces", 236, Rarity.UNCOMMON, mage.cards.w.WinnowingForces.class)); cards.add(new SetCardInfo("Wrenn and Realmbreaker", 217, Rarity.MYTHIC, mage.cards.w.WrennAndRealmbreaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wrenn and Realmbreaker", 322, Rarity.MYTHIC, mage.cards.w.WrennAndRealmbreaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wrenn's Resolve", 173, Rarity.COMMON, mage.cards.w.WrennsResolve.class)); @@ -480,7 +446,6 @@ public final class MarchOfTheMachine extends ExpansionSet { cards.add(new SetCardInfo("Zephyr Winder", 328, Rarity.COMMON, mage.cards.z.ZephyrWinder.class)); cards.add(new SetCardInfo("Zhalfirin Lancer", 45, Rarity.UNCOMMON, mage.cards.z.ZhalfirinLancer.class)); cards.add(new SetCardInfo("Zhalfirin Shapecraft", 87, Rarity.COMMON, mage.cards.z.ZhalfirinShapecraft.class)); - cards.add(new SetCardInfo("Zilortha, Apex of Ikoria", 190, Rarity.RARE, mage.cards.z.ZilorthaApexOfIkoria.class)); cards.add(new SetCardInfo("Zimone and Dina", 257, Rarity.MYTHIC, mage.cards.z.ZimoneAndDina.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Zimone and Dina", 318, Rarity.MYTHIC, mage.cards.z.ZimoneAndDina.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Zurgo and Ojutai", 258, Rarity.MYTHIC, mage.cards.z.ZurgoAndOjutai.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java index 810438c919d..65e022f8f0a 100644 --- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java @@ -217,7 +217,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Hulking Raptor", 327, Rarity.RARE, mage.cards.h.HulkingRaptor.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hunter's Blowgun", 255, Rarity.COMMON, mage.cards.h.HuntersBlowgun.class)); cards.add(new SetCardInfo("Hurl into History", 59, Rarity.UNCOMMON, mage.cards.h.HurlIntoHistory.class)); - cards.add(new SetCardInfo("Iceberg Titan", 60, Rarity.COMMON, mage.cards.i.IcebergTitan.class)); cards.add(new SetCardInfo("Idol of the Deep King", 155, Rarity.COMMON, mage.cards.i.IdolOfTheDeepKing.class)); cards.add(new SetCardInfo("In the Presence of Ages", 192, Rarity.COMMON, mage.cards.i.InThePresenceOfAges.class)); cards.add(new SetCardInfo("Inti, Seneschal of the Sun", 156, Rarity.RARE, mage.cards.i.IntiSeneschalOfTheSun.class, NON_FULL_USE_VARIOUS)); @@ -378,7 +377,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Souls of the Lost", 369, Rarity.RARE, mage.cards.s.SoulsOfTheLost.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sovereign Okinec Ahau", 240, Rarity.MYTHIC, mage.cards.s.SovereignOkinecAhau.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sovereign Okinec Ahau", 309, Rarity.MYTHIC, mage.cards.s.SovereignOkinecAhau.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Sovereign's Macuahuitl", 155, Rarity.COMMON, mage.cards.s.SovereignsMacuahuitl.class)); cards.add(new SetCardInfo("Spelunking", 213, Rarity.UNCOMMON, mage.cards.s.Spelunking.class)); cards.add(new SetCardInfo("Spring-Loaded Sawblades", 36, Rarity.UNCOMMON, mage.cards.s.SpringLoadedSawblades.class)); cards.add(new SetCardInfo("Spyglass Siren", 405, Rarity.UNCOMMON, mage.cards.s.SpyglassSiren.class, NON_FULL_USE_VARIOUS));