From e7c5effa7f24d93594ca78cf44fac2ea8631e18c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 17 Sep 2016 15:18:34 +0200 Subject: [PATCH] [KLD] Added 13 red cards. --- .../championsofkamigawa/SoratamiSeer.java | 48 +------ .../darkascension/ShatteredPerception.java | 49 +------ .../mage/sets/dragonsmaze/CatchRelease.java | 30 ++--- .../sets/kaladesh/AethertorchRenegade.java | 84 ++++++++++++ .../src/mage/sets/kaladesh/BuiltToLast.java | 3 +- .../src/mage/sets/kaladesh/BuiltToSmash.java | 56 ++------ .../sets/kaladesh/ConsulsShieldguard.java | 2 +- .../src/mage/sets/kaladesh/DieYoung.java | 2 +- .../mage/sets/kaladesh/FatefulShowdown.java | 67 ++++++++++ .../mage/sets/kaladesh/GiantSpectacle.java | 82 ++++++++++++ .../sets/kaladesh/HarnessedLightning.java | 106 +++++++++++++++ Mage.Sets/src/mage/sets/kaladesh/Hijack.java | 73 +++++++++++ .../mage/sets/kaladesh/MadcapExperiment.java | 123 ++++++++++++++++++ .../sets/kaladesh/MaulfistDoorbuster.java | 78 +++++++++++ .../src/mage/sets/kaladesh/PiaNalaar.java | 91 +++++++++++++ .../mage/sets/kaladesh/QuicksmithGenius.java | 77 +++++++++++ .../mage/sets/kaladesh/RenegadeTactics.java | 64 +++++++++ .../mage/sets/kaladesh/RuinousGremlin.java | 71 ++++++++++ .../sets/kaladesh/SpiresideInfiltrator.java | 65 +++++++++ .../mage/sets/kaladesh/SpontaneousArtist.java | 80 ++++++++++++ .../magic2015/JaliraMasterPolymorphist.java | 10 +- .../sets/scarsofmirrodin/GolemArtisan.java | 29 ++--- .../mage/sets/urzassaga/TolarianWinds.java | 43 +----- ...DiscardHandDrawSameNumberSourceEffect.java | 68 ++++++++++ .../main/java/mage/filter/StaticFilters.java | 2 + .../FilterArtifactCreaturePermanent.java | 56 ++++++++ Utils/mtg-cards-data.txt | 2 +- 27 files changed, 1243 insertions(+), 218 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/kaladesh/AethertorchRenegade.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/FatefulShowdown.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/GiantSpectacle.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/HarnessedLightning.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/Hijack.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/MadcapExperiment.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/MaulfistDoorbuster.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/PiaNalaar.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/QuicksmithGenius.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/RenegadeTactics.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/RuinousGremlin.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/SpiresideInfiltrator.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/SpontaneousArtist.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandDrawSameNumberSourceEffect.java create mode 100644 Mage/src/main/java/mage/filter/common/FilterArtifactCreaturePermanent.java diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java index 2a753bc66c4..bb5c37a83e4 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java @@ -25,28 +25,22 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.championsofkamigawa; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardHandDrawSameNumberSourceEffect; import mage.abilities.keyword.FlyingAbility; -import mage.cards.Card; import mage.cards.CardImpl; -import mage.constants.Outcome; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledPermanent; -import mage.game.Game; -import mage.players.Player; import mage.target.common.TargetControlledPermanent; /** @@ -69,7 +63,7 @@ public class SoratamiSeer extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // {4}, Return two lands you control to their owner's hand: Discard all the cards in your hand, then draw that many cards. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SoratamiSeerEffect(), new GenericManaCost(4)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DiscardHandDrawSameNumberSourceEffect(), new GenericManaCost(4)); ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, filter, false))); this.addAbility(ability); } @@ -84,35 +78,3 @@ public class SoratamiSeer extends CardImpl { } } - -class SoratamiSeerEffect extends OneShotEffect { - - public SoratamiSeerEffect() { - super(Outcome.DrawCard); - staticText = "Discard all the cards in your hand, then draw that many cards"; - } - - public SoratamiSeerEffect(final SoratamiSeerEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - int amount = player.getHand().getCards(game).size(); - for (Card c : player.getHand().getCards(game)) { - player.discard(c, source, game); - } - player.drawCards(amount, game); - return true; - } - return false; - } - - @Override - public SoratamiSeerEffect copy() { - return new SoratamiSeerEffect(this); - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/darkascension/ShatteredPerception.java b/Mage.Sets/src/mage/sets/darkascension/ShatteredPerception.java index 3708ef34b13..9aa29d703b5 100644 --- a/Mage.Sets/src/mage/sets/darkascension/ShatteredPerception.java +++ b/Mage.Sets/src/mage/sets/darkascension/ShatteredPerception.java @@ -27,20 +27,14 @@ */ package mage.sets.darkascension; -import java.util.Set; import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.discard.DiscardHandDrawSameNumberSourceEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.TimingRule; -import mage.abilities.Ability; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.keyword.FlashbackAbility; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.game.Game; -import mage.players.Player; /** * @@ -52,9 +46,8 @@ public class ShatteredPerception extends CardImpl { super(ownerId, 104, "Shattered Perception", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{R}"); this.expansionSetCode = "DKA"; - // Discard all the cards in your hand, then draw that many cards. - this.getSpellAbility().addEffect(new ShatteredPerceptionEffect()); + this.getSpellAbility().addEffect(new DiscardHandDrawSameNumberSourceEffect()); // Flashback {5}{R} this.addAbility(new FlashbackAbility(new ManaCostsImpl("{5}{R}"), TimingRule.SORCERY)); } @@ -68,35 +61,3 @@ public class ShatteredPerception extends CardImpl { return new ShatteredPerception(this); } } - -class ShatteredPerceptionEffect extends OneShotEffect { - - public ShatteredPerceptionEffect() { - super(Outcome.DrawCard); - this.staticText = "Discard all the cards in your hand, then draw that many cards"; - } - - public ShatteredPerceptionEffect(final ShatteredPerceptionEffect effect) { - super(effect); - } - - @Override - public ShatteredPerceptionEffect copy() { - return new ShatteredPerceptionEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - Set cardsInHand = player.getHand().getCards(game); - int amount = cardsInHand.size(); - for (Card card : cardsInHand) { - player.discard(card, source, game); - } - player.drawCards(amount, game); - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java b/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java index 0a7f28c8a4b..499f469067c 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java @@ -25,24 +25,23 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.dragonsmaze; import java.util.ArrayList; import java.util.List; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; import mage.abilities.Ability; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledArtifactPermanent; import mage.filter.common.FilterControlledCreaturePermanent; @@ -56,28 +55,27 @@ import mage.target.Target; import mage.target.TargetPermanent; import mage.target.common.TargetControlledPermanent; -/** - * - * @author LevelX2 - */ - - public class CatchRelease extends SplitCard { public CatchRelease(UUID ownerId) { - super(ownerId, 125, "Catch", "Release", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{U}{R}", "{4}{R}{W}",true); + super(ownerId, 125, "Catch", "Release", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{U}{R}", "{4}{R}{W}", true); this.expansionSetCode = "DGM"; // Catch // Gain control of target permanent until end of turn. Untap it. It gains haste until end of turn. getLeftHalfCard().getSpellAbility().addTarget(new TargetPermanent(new FilterPermanent())); getLeftHalfCard().getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)); - getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); - getLeftHalfCard().getSpellAbility().addEffect(new UntapTargetEffect()); + Effect effect = new UntapTargetEffect(); + effect.setText("Untap it"); + this.getSpellAbility().addEffect(effect); + getLeftHalfCard().getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setText("It gains haste until end of turn"); + getLeftHalfCard().getSpellAbility().addEffect(effect); // Release // Each player sacrifices an artifact, a creature, an enchantment, a land, and a planeswalker. - getRightHalfCard().getSpellAbility().addEffect(new ReleaseSacrificeEffect()); + getRightHalfCard().getSpellAbility().addEffect(new ReleaseSacrificeEffect()); } diff --git a/Mage.Sets/src/mage/sets/kaladesh/AethertorchRenegade.java b/Mage.Sets/src/mage/sets/kaladesh/AethertorchRenegade.java new file mode 100644 index 00000000000..ac8e45168ff --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/AethertorchRenegade.java @@ -0,0 +1,84 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class AethertorchRenegade extends CardImpl { + + public AethertorchRenegade(UUID ownerId) { + super(ownerId, 106, "Aethertorch Renegade", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // When Aethertorch Renegade enters the battlefield, you get {E}{E}{E}{E} + this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(4))); + + // {t}, Pay {E}{E} Aethertorch Renegade deals 1 damage to target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + ability.addCost(new PayEnergyCost(2)); + this.addAbility(ability); + // {t}, Pay {E}{E}{E}{E}{E}{E}{E}{E}: Aethertorch Renegade deals 6 damage to target player. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(6), new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + ability.addCost(new PayEnergyCost(8)); + this.addAbility(ability); + + } + + public AethertorchRenegade(final AethertorchRenegade card) { + super(card); + } + + @Override + public AethertorchRenegade copy() { + return new AethertorchRenegade(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/BuiltToLast.java b/Mage.Sets/src/mage/sets/kaladesh/BuiltToLast.java index e0fb62cdb2e..defd4f870eb 100644 --- a/Mage.Sets/src/mage/sets/kaladesh/BuiltToLast.java +++ b/Mage.Sets/src/mage/sets/kaladesh/BuiltToLast.java @@ -28,6 +28,7 @@ package mage.sets.kaladesh; import java.util.UUID; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.TargetHasCardTypeCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -53,7 +54,7 @@ public class BuiltToLast extends CardImpl { this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new ConditionalContinuousEffect( - new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new TargetHasCardTypeCondition(CardType.ARTIFACT), + new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new LockedInCondition(new TargetHasCardTypeCondition(CardType.ARTIFACT)), "If its an artifact creature, it gains indestructible until end of turn")); } diff --git a/Mage.Sets/src/mage/sets/kaladesh/BuiltToSmash.java b/Mage.Sets/src/mage/sets/kaladesh/BuiltToSmash.java index 3784bd8e911..12db12869e9 100644 --- a/Mage.Sets/src/mage/sets/kaladesh/BuiltToSmash.java +++ b/Mage.Sets/src/mage/sets/kaladesh/BuiltToSmash.java @@ -28,23 +28,17 @@ package mage.sets.kaladesh; import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.condition.LockedInCondition; +import mage.abilities.condition.common.TargetHasCardTypeCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.constants.SubLayer; -import mage.filter.common.FilterAttackingCreature; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.common.TargetCreaturePermanent; - - +import mage.target.common.TargetAttackingCreature; /** * @@ -56,11 +50,12 @@ public class BuiltToSmash extends CardImpl { super(ownerId, 108, "Built to Smash", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{R}"); this.expansionSetCode = "KLD"; - // Target attacking creature gets +3/+3 until end of turn/... + // Target attacking creature gets +3/+3 until end of turn. If it's an artifact creature, it gains trample until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterAttackingCreature())); - // ... If it's an artifact creature, it gains trample until end of turn. - this.getSpellAbility().addEffect(new BuiltToSmashTrampleEffect()); + this.getSpellAbility().addTarget(new TargetAttackingCreature()); + this.getSpellAbility().addEffect(new ConditionalContinuousEffect( + new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn), new LockedInCondition(new TargetHasCardTypeCondition(CardType.ARTIFACT)), + "If its an artifact creature, it gains trample until end of turn")); } public BuiltToSmash(final BuiltToSmash card) { @@ -71,35 +66,4 @@ public class BuiltToSmash extends CardImpl { public BuiltToSmash copy() { return new BuiltToSmash(this); } - - private class BuiltToSmashTrampleEffect extends ContinuousEffectImpl { - - public BuiltToSmashTrampleEffect() { - super(Duration.EndOfTurn, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - staticText = "If it's an Artifact, it gains trample until end of turn"; - } - - public BuiltToSmashTrampleEffect(final BuiltToSmashTrampleEffect effect) { - super(effect); - } - - @Override - public BuiltToSmashTrampleEffect copy() { - return new BuiltToSmashTrampleEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - int affectedTargets = 0; - for (UUID permanentId : targetPointer.getTargets(game, source)) { - Permanent permanent = game.getPermanent(permanentId); - if (permanent != null && permanent.hasSubtype("Artifact", game)) { - permanent.addAbility(TrampleAbility.getInstance(), source.getSourceId(), game); - affectedTargets++; - } - } - return affectedTargets > 0; - } - - } } diff --git a/Mage.Sets/src/mage/sets/kaladesh/ConsulsShieldguard.java b/Mage.Sets/src/mage/sets/kaladesh/ConsulsShieldguard.java index 5194bdac8f8..c15a76122b7 100644 --- a/Mage.Sets/src/mage/sets/kaladesh/ConsulsShieldguard.java +++ b/Mage.Sets/src/mage/sets/kaladesh/ConsulsShieldguard.java @@ -71,7 +71,7 @@ public class ConsulsShieldguard extends CardImpl { // Whenever Consul's Shiedguard attacks, you may pay {E}. If you do, another target attacking creature gets indestructible until end of turn. DoIfCostPaid doIfCostPaidEffect = new DoIfCostPaid(new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new PayEnergyCost(1)); Ability ability = new AttacksTriggeredAbility(doIfCostPaidEffect, false, - "Whenever {this} attacks you may pay {E}. If you do, another target attacking creature gets indestructible until end of turn."); + "Whenever {this} attacks, you may pay {E}. If you do, another target attacking creature gets indestructible until end of turn."); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/kaladesh/DieYoung.java b/Mage.Sets/src/mage/sets/kaladesh/DieYoung.java index aa4ac91db34..35a98ab0fee 100644 --- a/Mage.Sets/src/mage/sets/kaladesh/DieYoung.java +++ b/Mage.Sets/src/mage/sets/kaladesh/DieYoung.java @@ -93,7 +93,7 @@ class DieYoungEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { new GetEnergyCountersControllerEffect(2).apply(game, source); - int numberToPayed = controller.getAmount(0, controller.getCounters().getCount(CounterType.ENERGY), "staticText", game); + int numberToPayed = controller.getAmount(0, controller.getCounters().getCount(CounterType.ENERGY), "How many {E} do you like to pay?", game); if (numberToPayed > 0) { Cost cost = new PayEnergyCost(numberToPayed); if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), true)) { diff --git a/Mage.Sets/src/mage/sets/kaladesh/FatefulShowdown.java b/Mage.Sets/src/mage/sets/kaladesh/FatefulShowdown.java new file mode 100644 index 00000000000..1e8a9674669 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/FatefulShowdown.java @@ -0,0 +1,67 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.discard.DiscardHandDrawSameNumberSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LevelX2 + */ +public class FatefulShowdown extends CardImpl { + + public FatefulShowdown(UUID ownerId) { + super(ownerId, 114, "Fateful Showdown", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{R}{R}"); + this.expansionSetCode = "KLD"; + + // Fateful Showdown deals damage to target creature or player equal to the number of cards in your hand. Discard all the cards in your hand, then draw that many cards. + Effect effect = new DamageTargetEffect(new CardsInControllerHandCount()); + effect.setText("{this} deals damage to target creature or player equal to the number of cards in your hand"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + this.getSpellAbility().addEffect(new DiscardHandDrawSameNumberSourceEffect()); + + } + + public FatefulShowdown(final FatefulShowdown card) { + super(card); + } + + @Override + public FatefulShowdown copy() { + return new FatefulShowdown(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/GiantSpectacle.java b/Mage.Sets/src/mage/sets/kaladesh/GiantSpectacle.java new file mode 100644 index 00000000000..5b72011b571 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/GiantSpectacle.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class GiantSpectacle extends CardImpl { + + public GiantSpectacle(UUID ownerId) { + super(ownerId, 116, "Giant Spectacle", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Aura"); + + // Enchant Creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +2/+1 and has menace. + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 1)); + Effect effect = new GainAbilityAttachedEffect(new MenaceAbility(), AttachmentType.AURA); + effect.setText("and has menace"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public GiantSpectacle(final GiantSpectacle card) { + super(card); + } + + @Override + public GiantSpectacle copy() { + return new GiantSpectacle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/HarnessedLightning.java b/Mage.Sets/src/mage/sets/kaladesh/HarnessedLightning.java new file mode 100644 index 00000000000..186434c9db3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/HarnessedLightning.java @@ -0,0 +1,106 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class HarnessedLightning extends CardImpl { + + public HarnessedLightning(UUID ownerId) { + super(ownerId, 117, "Harnessed Lightning", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{R}"); + this.expansionSetCode = "KLD"; + + // Choose target creature. You get {E}{E}{E}, then you may pay any amount of {E}. Harnessed Lightning deals that much damage to that creature. + this.getSpellAbility().addEffect(new HarnessedLightningEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public HarnessedLightning(final HarnessedLightning card) { + super(card); + } + + @Override + public HarnessedLightning copy() { + return new HarnessedLightning(this); + } +} + +class HarnessedLightningEffect extends OneShotEffect { + + public HarnessedLightningEffect() { + super(Outcome.UnboostCreature); + this.staticText = "Choose target creature. You get {E}{E}{E}, then you may pay any amount of {E}. Harnessed Lightning deals that much damage to that creature"; + } + + public HarnessedLightningEffect(final HarnessedLightningEffect effect) { + super(effect); + } + + @Override + public HarnessedLightningEffect copy() { + return new HarnessedLightningEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + new GetEnergyCountersControllerEffect(3).apply(game, source); + int numberToPayed = controller.getAmount(0, controller.getCounters().getCount(CounterType.ENERGY), "How many {E} do you like to pay?", game); + if (numberToPayed > 0) { + Cost cost = new PayEnergyCost(numberToPayed); + if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), true)) { + Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (targetCreature != null) { + targetCreature.damage(numberToPayed, source.getSourceId(), game, false, true); + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/Hijack.java b/Mage.Sets/src/mage/sets/kaladesh/Hijack.java new file mode 100644 index 00000000000..46fd8c83c02 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/Hijack.java @@ -0,0 +1,73 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; + +/** + * + * @author LevelX2 + */ +public class Hijack extends CardImpl { + + public Hijack(UUID ownerId) { + super(ownerId, 118, "Hijack", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{R}{R}"); + this.expansionSetCode = "KLD"; + + // Gain control of target artifact or creature until end of turn. Untap it. It gains haste until end of turn. + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE)); + this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)); + Effect effect = new UntapTargetEffect(); + effect.setText("Untap it"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setText("It gains haste until end of turn"); + this.getSpellAbility().addEffect(effect); + + } + + public Hijack(final Hijack card) { + super(card); + } + + @Override + public Hijack copy() { + return new Hijack(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/MadcapExperiment.java b/Mage.Sets/src/mage/sets/kaladesh/MadcapExperiment.java new file mode 100644 index 00000000000..81a8036d4bd --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/MadcapExperiment.java @@ -0,0 +1,123 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Library; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class MadcapExperiment extends CardImpl { + + public MadcapExperiment(UUID ownerId) { + super(ownerId, 122, "Madcap Experiment", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{R}"); + this.expansionSetCode = "KLD"; + + // Reveal cards from the top of your library until you reveal an artifact card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. Madcap Experiment deals damage to you equal to the number of cards revealed this way. + this.getSpellAbility().addEffect(new MadcapExperimentEffect()); + } + + public MadcapExperiment(final MadcapExperiment card) { + super(card); + } + + @Override + public MadcapExperiment copy() { + return new MadcapExperiment(this); + } +} + +class MadcapExperimentEffect extends OneShotEffect { + + public MadcapExperimentEffect() { + super(Outcome.PutCardInPlay); + this.staticText = "Reveal cards from the top of your library until you reveal an artifact card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. {this} deals damage to you equal to the number of cards revealed this way"; + } + + public MadcapExperimentEffect(final MadcapExperimentEffect effect) { + super(effect); + } + + @Override + public MadcapExperimentEffect copy() { + return new MadcapExperimentEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && controller.getLibrary().size() > 0) { + CardsImpl cards = new CardsImpl(); + Library library = controller.getLibrary(); + Card card = null; + do { + card = library.removeFromTop(game); + if (card != null) { + cards.add(card); + } + } while (library.size() > 0 && card != null && !card.getCardType().contains(CardType.ARTIFACT)); + // reveal cards + if (!cards.isEmpty()) { + controller.revealCards(sourceObject.getIdName(), cards, game); + } + int revealed = cards.size(); + if (card != null && card.getCardType().contains(CardType.ARTIFACT)) { + // put artifact card to battlefield + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + // remove it from revealed card list + cards.remove(card); + } + // Put the rest on the bottom of your library in a random order + while (cards.size() > 0) { + card = cards.getRandom(game); + if (card != null) { + cards.remove(card); + controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.HAND, false, false); + } + } + controller.damage(revealed, source.getSourceId(), game, false, true); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/MaulfistDoorbuster.java b/Mage.Sets/src/mage/sets/kaladesh/MaulfistDoorbuster.java new file mode 100644 index 00000000000..b35ac1b7941 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/MaulfistDoorbuster.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class MaulfistDoorbuster extends CardImpl { + + public MaulfistDoorbuster(UUID ownerId) { + super(ownerId, 123, "Maulfist Doorbuster", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(4); + this.toughness = new MageInt(2); + + // When Maulfist Doorbuster enters the battlefield, you get {E}{E}. + this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(2))); + + // Whenever Maulfist Doorbuster attacks, you may pay {E}. If you do, target creature can't block this turn. + DoIfCostPaid doIfCostPaidEffect = new DoIfCostPaid(new CantBlockTargetEffect(Duration.EndOfTurn), new PayEnergyCost(1)); + Ability ability = new AttacksTriggeredAbility(doIfCostPaidEffect, false, + "Whenever {this} attacks, you may pay {E}. If you do, target creature can't block this turn."); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public MaulfistDoorbuster(final MaulfistDoorbuster card) { + super(card); + } + + @Override + public MaulfistDoorbuster copy() { + return new MaulfistDoorbuster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/PiaNalaar.java b/Mage.Sets/src/mage/sets/kaladesh/PiaNalaar.java new file mode 100644 index 00000000000..17c0db94fa5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/PiaNalaar.java @@ -0,0 +1,91 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.game.permanent.token.ThopterColorlessToken; +import mage.target.common.TargetArtifactPermanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class PiaNalaar extends CardImpl { + + public PiaNalaar(UUID ownerId) { + super(ownerId, 124, "Pia Nalaar", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "KLD"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Artificer"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Pia Nalaar enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken()))); + + // {1}{R}: Target artifact creature gets +1/+0 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl<>("{1}{R}")); + ability.addTarget(new TargetArtifactPermanent(StaticFilters.FILTER_ARTIFACT_CREATURE_PERMANENT)); + this.addAbility(ability); + + // {1}, Sacrifice an artifact: Target creature can't block this turn. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBlockTargetEffect(Duration.EndOfTurn), new GenericManaCost(1)); + ability.addTarget(new TargetCreaturePermanent()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact")))); + this.addAbility(ability); + } + + public PiaNalaar(final PiaNalaar card) { + super(card); + } + + @Override + public PiaNalaar copy() { + return new PiaNalaar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/QuicksmithGenius.java b/Mage.Sets/src/mage/sets/kaladesh/QuicksmithGenius.java new file mode 100644 index 00000000000..a8eacdda3be --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/QuicksmithGenius.java @@ -0,0 +1,77 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LevelX2 + */ +public class QuicksmithGenius extends CardImpl { + + private static final FilterPermanent filter = new FilterArtifactPermanent("an artifact"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public QuicksmithGenius(UUID ownerId) { + super(ownerId, 125, "Quicksmith Genius", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Artificer"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Whenever an artifact enters the battlefield under your control, you may discard a card. If you do, draw a card. + this.addAbility(new EntersBattlefieldAllTriggeredAbility( + Zone.BATTLEFIELD, new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new DiscardCardCost()), filter, true)); + } + + public QuicksmithGenius(final QuicksmithGenius card) { + super(card); + } + + @Override + public QuicksmithGenius copy() { + return new QuicksmithGenius(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/RenegadeTactics.java b/Mage.Sets/src/mage/sets/kaladesh/RenegadeTactics.java new file mode 100644 index 00000000000..488580e0e54 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/RenegadeTactics.java @@ -0,0 +1,64 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class RenegadeTactics extends CardImpl { + + public RenegadeTactics(UUID ownerId) { + super(ownerId, 127, "Renegade Tactics", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{R}"); + this.expansionSetCode = "KLD"; + + // Target Creature can't block this turn. + this.getSpellAbility().addEffect(new CantBlockTargetEffect(Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public RenegadeTactics(final RenegadeTactics card) { + super(card); + } + + @Override + public RenegadeTactics copy() { + return new RenegadeTactics(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/RuinousGremlin.java b/Mage.Sets/src/mage/sets/kaladesh/RuinousGremlin.java new file mode 100644 index 00000000000..1f665c4d0c1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/RuinousGremlin.java @@ -0,0 +1,71 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetArtifactPermanent; + +/** + * + * @author LevelX2 + */ +public class RuinousGremlin extends CardImpl { + + public RuinousGremlin(UUID ownerId) { + super(ownerId, 128, "Ruinous Gremlin", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Gremlin"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {2}{R}, Sacrifice Ruinous Gremlin: Destroy target artifact. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl<>("{2}{R}")); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetArtifactPermanent()); + this.addAbility(ability); + } + + public RuinousGremlin(final RuinousGremlin card) { + super(card); + } + + @Override + public RuinousGremlin copy() { + return new RuinousGremlin(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/SpiresideInfiltrator.java b/Mage.Sets/src/mage/sets/kaladesh/SpiresideInfiltrator.java new file mode 100644 index 00000000000..7fa690dca51 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/SpiresideInfiltrator.java @@ -0,0 +1,65 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesTappedSourceTriggeredAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author LevelX2 + */ +public class SpiresideInfiltrator extends CardImpl { + + public SpiresideInfiltrator(UUID ownerId) { + super(ownerId, 133, "Spireside Infiltrator", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Whenever Spireside Infiltrator becomes tapped, it deals one damage to each opponent. + this.addAbility(new BecomesTappedSourceTriggeredAbility(new DamagePlayersEffect(1, TargetController.OPPONENT))); + } + + public SpiresideInfiltrator(final SpiresideInfiltrator card) { + super(card); + } + + @Override + public SpiresideInfiltrator copy() { + return new SpiresideInfiltrator(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/SpontaneousArtist.java b/Mage.Sets/src/mage/sets/kaladesh/SpontaneousArtist.java new file mode 100644 index 00000000000..a5fbc4dd3df --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/SpontaneousArtist.java @@ -0,0 +1,80 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class SpontaneousArtist extends CardImpl { + + public SpontaneousArtist(UUID ownerId) { + super(ownerId, 134, "Spontaneous Artist", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When Spontaneous Artist enters the battlefield, you get {E}. + this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(1))); + + // Pay {E}: Target creature gains haste until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn), + new PayEnergyCost(1)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + } + + public SpontaneousArtist(final SpontaneousArtist card) { + super(card); + } + + @Override + public SpontaneousArtist copy() { + return new SpontaneousArtist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/JaliraMasterPolymorphist.java b/Mage.Sets/src/mage/sets/magic2015/JaliraMasterPolymorphist.java index 51f79eb0676..88c48f500a2 100644 --- a/Mage.Sets/src/mage/sets/magic2015/JaliraMasterPolymorphist.java +++ b/Mage.Sets/src/mage/sets/magic2015/JaliraMasterPolymorphist.java @@ -134,10 +134,12 @@ class JaliraMasterPolymorphistEffect extends OneShotEffect { if (!cards.isEmpty()) { controller.revealCards(sourceObject.getIdName(), cards, game); } - // put nonlegendary creature card to battlefield - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - // remove it from revealed card list - cards.remove(card); + if (card != null && filter.match(card, game)) { + // put nonlegendary creature card to battlefield + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + // remove it from revealed card list + cards.remove(card); + } // Put the rest on the bottom of your library in a random order while (cards.size() > 0) { card = cards.getRandom(game); diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/GolemArtisan.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/GolemArtisan.java index d11278e60d4..28aa562ee3c 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/GolemArtisan.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/GolemArtisan.java @@ -27,7 +27,9 @@ */ package mage.sets.scarsofmirrodin; -import mage.constants.*; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -42,30 +44,18 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.choices.Choice; import mage.choices.ChoiceImpl; -import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.Target; -import mage.target.TargetPermanent; - -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import mage.target.common.TargetArtifactPermanent; /** * @author nantuko */ public class GolemArtisan extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("artifact creature"); - - static { - filter.add(new CardTypePredicate(CardType.ARTIFACT)); - filter.add(new CardTypePredicate(CardType.CREATURE)); - } - public GolemArtisan(UUID ownerId) { super(ownerId, 159, "Golem Artisan", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{5}"); this.expansionSetCode = "SOM"; @@ -76,14 +66,12 @@ public class GolemArtisan extends CardImpl { // {2}: Target artifact creature gets +1/+1 until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 1, Duration.EndOfTurn), new GenericManaCost(2)); - Target target = new TargetPermanent(filter); - ability.addTarget(target); + ability.addTarget(new TargetArtifactPermanent(StaticFilters.FILTER_ARTIFACT_CREATURE_PERMANENT)); this.addAbility(ability); // {2}: Target artifact creature gains your choice of flying, trample, or haste until end of turn. ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GolemArtisanEffect(), new GenericManaCost(2)); - target = new TargetPermanent(filter); - ability.addTarget(target); + ability.addTarget(new TargetArtifactPermanent(StaticFilters.FILTER_ARTIFACT_CREATURE_PERMANENT)); this.addAbility(ability); } @@ -99,6 +87,7 @@ public class GolemArtisan extends CardImpl { } class GolemArtisanEffect extends OneShotEffect { + GolemArtisanEffect() { super(Outcome.AddAbility); staticText = "Target artifact creature gains your choice of flying, trample, or haste until end of turn"; diff --git a/Mage.Sets/src/mage/sets/urzassaga/TolarianWinds.java b/Mage.Sets/src/mage/sets/urzassaga/TolarianWinds.java index 514b50525d2..4b85b18a379 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/TolarianWinds.java +++ b/Mage.Sets/src/mage/sets/urzassaga/TolarianWinds.java @@ -27,17 +27,11 @@ */ package mage.sets.urzassaga; -import java.util.Set; import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.discard.DiscardHandDrawSameNumberSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.game.Game; -import mage.players.Player; /** * @@ -49,9 +43,8 @@ public class TolarianWinds extends CardImpl { super(ownerId, 104, "Tolarian Winds", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); this.expansionSetCode = "USG"; - // Discard all the cards in your hand, then draw that many cards. - this.getSpellAbility().addEffect(new TolarianWindsEffect()); + this.getSpellAbility().addEffect(new DiscardHandDrawSameNumberSourceEffect()); } public TolarianWinds(final TolarianWinds card) { @@ -63,35 +56,3 @@ public class TolarianWinds extends CardImpl { return new TolarianWinds(this); } } - -class TolarianWindsEffect extends OneShotEffect { - - TolarianWindsEffect() { - super(Outcome.DrawCard); - this.staticText = "Discard all the cards in your hand, then draw that many cards"; - } - - TolarianWindsEffect(final TolarianWindsEffect effect) { - super(effect); - } - - @Override - public TolarianWindsEffect copy() { - return new TolarianWindsEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - Set cardsInHand = player.getHand().getCards(game); - int amount = cardsInHand.size(); - for (Card card : cardsInHand) { - player.discard(card, source, game); - } - player.drawCards(amount, game); - return true; - } - return false; - } -} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandDrawSameNumberSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandDrawSameNumberSourceEffect.java new file mode 100644 index 00000000000..f4079f6dfe1 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardHandDrawSameNumberSourceEffect.java @@ -0,0 +1,68 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.abilities.effects.common.discard; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class DiscardHandDrawSameNumberSourceEffect extends OneShotEffect { + + public DiscardHandDrawSameNumberSourceEffect() { + super(Outcome.DrawCard); + staticText = "Discard all the cards in your hand, then draw that many cards"; + } + + public DiscardHandDrawSameNumberSourceEffect(final DiscardHandDrawSameNumberSourceEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + int amount = player.getHand().getCards(game).size(); + player.discard(amount, false, source, game); + player.drawCards(amount, game); + return true; + } + return false; + } + + @Override + public DiscardHandDrawSameNumberSourceEffect copy() { + return new DiscardHandDrawSameNumberSourceEffect(this); + } + +} diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 8c423ef922d..6a1d00ac0d1 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -6,6 +6,7 @@ package mage.filter; import mage.constants.CardType; +import mage.filter.common.FilterArtifactCreaturePermanent; import mage.filter.common.FilterControlledArtifactPermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.Predicates; @@ -21,6 +22,7 @@ public class StaticFilters { public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE = new FilterControlledPermanent("artifact or creature you control"); public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent(); public static final FilterCard FILTER_CARD_ARTIFACT_OR_CREATURE = new FilterCard("artifact or creature card"); + public static final FilterArtifactCreaturePermanent FILTER_ARTIFACT_CREATURE_PERMANENT = new FilterArtifactCreaturePermanent(); static { FILTER_PERMANENT_ARTIFACT_OR_CREATURE.add(Predicates.or( diff --git a/Mage/src/main/java/mage/filter/common/FilterArtifactCreaturePermanent.java b/Mage/src/main/java/mage/filter/common/FilterArtifactCreaturePermanent.java new file mode 100644 index 00000000000..a8d935c3c51 --- /dev/null +++ b/Mage/src/main/java/mage/filter/common/FilterArtifactCreaturePermanent.java @@ -0,0 +1,56 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. + */ +package mage.filter.common; + +import mage.constants.CardType; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author LevelX2 + */ +public class FilterArtifactCreaturePermanent extends FilterArtifactPermanent { + + public FilterArtifactCreaturePermanent() { + this("artifact creature"); + } + + public FilterArtifactCreaturePermanent(String name) { + super(name); + this.add(new CardTypePredicate(CardType.CREATURE)); + } + + public FilterArtifactCreaturePermanent(final FilterArtifactCreaturePermanent filter) { + super(filter); + } + + @Override + public FilterArtifactCreaturePermanent copy() { + return new FilterArtifactCreaturePermanent(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index a6498f0ab33..fd5e39ef878 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -29772,7 +29772,7 @@ Fateful Showdown|Kaladesh|114|R|{2}{R}{R}|Instant|||Fateful Showdown deals damag Furious Reprisal|Kaladesh|115|U|{3}{R}|Sorcery|||Furious Reprisal deals 2 damage to each of two target creatures and/or players.| Giant Spectacle|Kaladesh|116|C|{1}{R}|Enchantment - Aura|||Enchant Creature$Enchanted creature gets +2/+1 and has menace| Harnessed Lightning|Kaladesh|117|U|{1}{R}|Instant|||Choose target creature. You get {E}{E}{E} (three energy counters), then you may pay any amount of {E}. Harnessed Lightning deals that much damage to that creature.| -Hijack|Kaladesh|118|C|{1}{R}{R}|Sorcery|||Gain control of target artifact or creature until end of turn. Untap it gains haste until end of turn.| +Hijack|Kaladesh|118|C|{1}{R}{R}|Sorcery|||Gain control of target artifact or creature until end of turn. Untap it. It gains haste until end of turn.| Incendiary Sabotage|Kaladesh|119|U|{2}{R}{R}|Instant|||As an additional cost to cast Incendiary Sabotage, sacrifice an artifact.$Incendiary Sabotage deals 3 damage to each creature.| Inventor's Apprentice|Kaladesh|120|U|{R}|Creature - Human Artificer|1|2|Inventor's Apprentice gets +1/+1 as long as you control an artifact.| Lathnu Hellion|Kaladesh|121|R|{2}{R}|Creature - Hellion|4|4|Haste$When Lathnu Hellion enters the battlefield, you get {E}{E} (two energy counters).$At the beginning of your end step, sacrifice Lathnu Hellion unless you pay {E}{E}.|