diff --git a/Mage.Sets/src/mage/sets/kaladesh/BomatCourier.java b/Mage.Sets/src/mage/sets/kaladesh/BomatCourier.java new file mode 100644 index 0000000000..9d2d7e708e --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/BomatCourier.java @@ -0,0 +1,144 @@ +/* + * 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.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardHandCost; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author emerald000 + */ +public class BomatCourier extends CardImpl { + + public BomatCourier(UUID ownerId) { + super(ownerId, 199, "Bomat Courier", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Construct"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Whenever Bomat Courier attacks, exile the top card of your library face down. + this.addAbility(new AttacksTriggeredAbility(new BomatCourierExileEffect(), false)); + + // {R}, Discard your hand, Sacrifice Bomat Courier: Put all cards exiled with Bomat Courier into their owners' hands. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BomatCourierReturnEffect(), new ColoredManaCost(ColoredManaSymbol.R)); + ability.addCost(new DiscardHandCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public BomatCourier(final BomatCourier card) { + super(card); + } + + @Override + public BomatCourier copy() { + return new BomatCourier(this); + } +} + +class BomatCourierExileEffect extends OneShotEffect { + + BomatCourierExileEffect() { + super(Outcome.Exile); + this.staticText = "exile the top card of your library face down"; + } + + BomatCourierExileEffect(final BomatCourierExileEffect effect) { + super(effect); + } + + @Override + public BomatCourierExileEffect copy() { + return new BomatCourierExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); + if (card != null) { + UUID exileZoneId = CardUtil.getCardExileZoneId(game, source); + card.setFaceDown(true, game); + controller.moveCardsToExile(card, source, game, false, exileZoneId, "Bomat Courier"); + card.setFaceDown(true, game); + return true; + } + } + return false; + } +} + +class BomatCourierReturnEffect extends OneShotEffect { + + BomatCourierReturnEffect() { + super(Outcome.DrawCard); + this.staticText = "Put all cards exiled with {this} into their owners' hands"; + } + + BomatCourierReturnEffect(final BomatCourierReturnEffect effect) { + super(effect); + } + + @Override + public BomatCourierReturnEffect copy() { + return new BomatCourierReturnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return controller.moveCards(game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source.getSourceId(), true)), Zone.HAND, source, game); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/DovinBaan.java b/Mage.Sets/src/mage/sets/kaladesh/DovinBaan.java new file mode 100644 index 0000000000..959b559c5f --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/DovinBaan.java @@ -0,0 +1,159 @@ +/* + * 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.LoyaltyAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.RestrictionUntapNotMoreThanEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.GetEmblemEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author emerald000 + */ +public class DovinBaan extends CardImpl { + + public DovinBaan(UUID ownerId) { + super(ownerId, 179, "Dovin Baan", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{U}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Dovin"); + + this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + + // +1: Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. + Effect effect = new BoostTargetEffect(-3, 0, Duration.UntilYourNextTurn); + effect.setText("Until your next turn, up to one target creature gets -3/-0"); + Ability ability = new LoyaltyAbility(effect, 1); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + ability.addEffect(new DovinBaanCantActivateAbilitiesEffect()); + this.addAbility(ability); + + // -1: You gain 2 life and draw a card. + ability = new LoyaltyAbility(new GainLifeEffect(2), -1); + effect = new DrawCardSourceControllerEffect(1); + effect.setText("and draw a card"); + ability.addEffect(effect); + this.addAbility(ability); + + // -7: You get an emblem with "Your opponents can't untap more than two permanents during their untap steps." + this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new DovinBaanEmblem()), -7)); + } + + public DovinBaan(final DovinBaan card) { + super(card); + } + + @Override + public DovinBaan copy() { + return new DovinBaan(this); + } +} + +class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffectImpl { + + DovinBaanCantActivateAbilitiesEffect() { + super(Duration.UntilYourNextTurn, Outcome.UnboostCreature); + staticText = "and its activated abilities can't be activated"; + } + + DovinBaanCantActivateAbilitiesEffect(final DovinBaanCantActivateAbilitiesEffect effect) { + super(effect); + } + + @Override + public DovinBaanCantActivateAbilitiesEffect copy() { + return new DovinBaanCantActivateAbilitiesEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.ACTIVATE_ABILITY; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getSourceId().equals(this.getTargetPointer().getFirst(game, source)); + } +} + +class DovinBaanEmblem extends Emblem { + + DovinBaanEmblem() { + this.setName("EMBLEM: Dovin Baan"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect()); + this.getAbilities().add(ability); + } +} + +class DovinBaanCantUntapEffect extends RestrictionUntapNotMoreThanEffect { + + DovinBaanCantUntapEffect() { + super(Duration.WhileOnBattlefield, 2, new FilterControlledPermanent()); + staticText = "Your opponents can't untap more than two permanents during their untap steps."; + } + + DovinBaanCantUntapEffect(final DovinBaanCantUntapEffect effect) { + super(effect); + } + + @Override + public boolean applies(Player player, Ability source, Game game) { + return game.getOpponents(source.getControllerId()).contains(player.getId()); + } + + @Override + public DovinBaanCantUntapEffect copy() { + return new DovinBaanCantUntapEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/ElectrostaticPummeler.java b/Mage.Sets/src/mage/sets/kaladesh/ElectrostaticPummeler.java new file mode 100644 index 0000000000..ef3fba62e6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/ElectrostaticPummeler.java @@ -0,0 +1,72 @@ +/* + * 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.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +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.constants.Zone; + +/** + * + * @author emerald000 + */ +public class ElectrostaticPummeler extends CardImpl { + + public ElectrostaticPummeler(UUID ownerId) { + super(ownerId, 210, "Electrostatic Pummeler", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Construct"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Electrostatic Pummeler enters the battlefield, you get {E}{E}{E}. + this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(3))); + + // Pay {E}{E}{E}: Electrostatic Pummeler gets +X/+X until end of turn, where X is its power. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(new SourcePermanentPowerCount(), new SourcePermanentPowerCount(), Duration.EndOfTurn, true), new PayEnergyCost(3))); + } + + public ElectrostaticPummeler(final ElectrostaticPummeler card) { + super(card); + } + + @Override + public ElectrostaticPummeler copy() { + return new ElectrostaticPummeler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/ScrapheapScrounger.java b/Mage.Sets/src/mage/sets/kaladesh/ScrapheapScrounger.java new file mode 100644 index 0000000000..698fed25bd --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/ScrapheapScrounger.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.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.CantBlockAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.AnotherCardPredicate; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author emerald000 + */ +public class ScrapheapScrounger extends CardImpl { + + private static final FilterCard filter = new FilterCreatureCard("another creature card"); + static { + filter.add(new AnotherCardPredicate()); + } + + public ScrapheapScrounger(UUID ownerId) { + super(ownerId, 231, "Scrapheap Scrounger", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Construct"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Scrapheap Scrounger can't block. + this.addAbility(new CantBlockAbility()); + + // {1}{B}, Exile another creature card from your graveyard: Return Scrapheap Scrounger from your graveyard to the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(false), new ManaCostsImpl<>("{1}{B}")); + ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(filter))); + this.addAbility(ability); + } + + public ScrapheapScrounger(final ScrapheapScrounger card) { + super(card); + } + + @Override + public ScrapheapScrounger copy() { + return new ScrapheapScrounger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/WhirlerVirtuoso.java b/Mage.Sets/src/mage/sets/kaladesh/WhirlerVirtuoso.java new file mode 100644 index 0000000000..1cc8c66cbd --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/WhirlerVirtuoso.java @@ -0,0 +1,72 @@ +/* + * 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.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.common.CreateTokenEffect; +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.game.permanent.token.ThopterColorlessToken; + +/** + * + * @author emerald000 + */ +public class WhirlerVirtuoso extends CardImpl { + + public WhirlerVirtuoso(UUID ownerId) { + super(ownerId, 190, "Whirler Virtuoso", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Vedalken"); + this.subtype.add("Artificer"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // When Whirler Virtuoso enters the battlefield, you get {E}{E}{E}. + this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(3))); + + // Pay {E}{E}{E}: Create a 1/1 colorless Thopter artifact creature token with flying. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new ThopterColorlessToken()), new PayEnergyCost(3))); + } + + public WhirlerVirtuoso(final WhirlerVirtuoso card) { + super(card); + } + + @Override + public WhirlerVirtuoso copy() { + return new WhirlerVirtuoso(this); + } +}