Merge branch 'magefree/master'

This commit is contained in:
Samuel Sandeen 2016-09-08 19:12:19 -04:00
commit ac6a289275
95 changed files with 2166 additions and 145 deletions

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Forest10 extends mage.cards.basiclands.Forest {
public Forest10(UUID ownerId) {
super(ownerId, "274b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Forest10(final Forest10 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Forest6 extends mage.cards.basiclands.Forest {
public Forest6(UUID ownerId) {
super(ownerId, "270b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Forest6(final Forest6 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Forest7 extends mage.cards.basiclands.Forest {
public Forest7(UUID ownerId) {
super(ownerId, "271b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Forest7(final Forest7 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Forest8 extends mage.cards.basiclands.Forest {
public Forest8(UUID ownerId) {
super(ownerId, "272b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Forest8(final Forest8 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Forest9 extends mage.cards.basiclands.Forest {
public Forest9(UUID ownerId) {
super(ownerId, "273b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Forest9(final Forest9 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Island10 extends mage.cards.basiclands.Island {
public Island10(UUID ownerId) {
super(ownerId, "259b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Island10(final Island10 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Island6 extends mage.cards.basiclands.Island {
public Island6(UUID ownerId) {
super(ownerId, "255b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Island6(final Island6 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Island7 extends mage.cards.basiclands.Island {
public Island7(UUID ownerId) {
super(ownerId, "256b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Island7(final Island7 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Island8 extends mage.cards.basiclands.Island {
public Island8(UUID ownerId) {
super(ownerId, "257b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Island8(final Island8 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Island9 extends mage.cards.basiclands.Island {
public Island9(UUID ownerId) {
super(ownerId, "258b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Island9(final Island9 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Mountain10 extends mage.cards.basiclands.Mountain {
public Mountain10(UUID ownerId) {
super(ownerId, "269b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Mountain10(final Mountain10 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Mountain6 extends mage.cards.basiclands.Mountain {
public Mountain6(UUID ownerId) {
super(ownerId, "265b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Mountain6(final Mountain6 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Mountain7 extends mage.cards.basiclands.Mountain {
public Mountain7(UUID ownerId) {
super(ownerId, "266b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Mountain7(final Mountain7 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Mountain8 extends mage.cards.basiclands.Mountain {
public Mountain8(UUID ownerId) {
super(ownerId, "267b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Mountain8(final Mountain8 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Mountain9 extends mage.cards.basiclands.Mountain {
public Mountain9(UUID ownerId) {
super(ownerId, "268b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Mountain9(final Mountain9 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Plains10 extends mage.cards.basiclands.Plains {
public Plains10(UUID ownerId) {
super(ownerId, "254b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Plains10(final Plains10 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Plains6 extends mage.cards.basiclands.Plains {
public Plains6(UUID ownerId) {
super(ownerId, "250b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Plains6(final Plains6 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Plains7 extends mage.cards.basiclands.Plains {
public Plains7(UUID ownerId) {
super(ownerId, "251b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Plains7(final Plains7 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Plains8 extends mage.cards.basiclands.Plains {
public Plains8(UUID ownerId) {
super(ownerId, "252b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Plains8(final Plains8 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Plains9 extends mage.cards.basiclands.Plains {
public Plains9(UUID ownerId) {
super(ownerId, "253b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Plains9(final Plains9 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Swamp10 extends mage.cards.basiclands.Swamp {
public Swamp10(UUID ownerId) {
super(ownerId, "264b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Swamp10(final Swamp10 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Swamp6 extends mage.cards.basiclands.Swamp {
public Swamp6(UUID ownerId) {
super(ownerId, "260b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Swamp6(final Swamp6 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Swamp7 extends mage.cards.basiclands.Swamp {
public Swamp7(UUID ownerId) {
super(ownerId, "261b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Swamp7(final Swamp7 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Swamp8 extends mage.cards.basiclands.Swamp {
public Swamp8(UUID ownerId) {
super(ownerId, "262b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Swamp8(final Swamp8 card) {

View file

@ -27,6 +27,8 @@
*/
package mage.sets.battleforzendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Swamp9 extends mage.cards.basiclands.Swamp {
public Swamp9(UUID ownerId) {
super(ownerId, "263b");
this.expansionSetCode = "BFZ";
this.frameStyle = FrameStyle.BFZ_FULL_ART_BASIC;
}
public Swamp9(final Swamp9 card) {

View file

@ -57,8 +57,8 @@ public class SoulSeparator extends CardImpl {
super(ownerId, 199, "Soul Separator", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}");
this.expansionSetCode = "EMN";
// {5}, {T}, Sacrifice Soul Separator: Exile target creature card from your graveyard.
// Put a token onto the battlefield that's a copy of that card except it's 1/1, it's a Spirit in addition to its other types, and it has flying.
// {5}, {T}, Sacrifice Soul Separator: Exile target creature card from your graveyard.
// Put a token onto the battlefield that's a copy of that card except it's 1/1, it's a Spirit in addition to its other types, and it has flying.
// Put a black Zombie creature token onto the battlefield with power equal to that card's power and toughness equal that card's toughness.
PutTokenOntoBattlefieldCopyTargetEffect copyEffect = new PutTokenOntoBattlefieldCopyTargetEffect(null, null, false, 1, false, false, null, 1, 1, true);
copyEffect.setAdditionalSubType("Spirit");
@ -85,7 +85,7 @@ class SoulSeparatorEffect extends OneShotEffect {
public SoulSeparatorEffect() {
super(Outcome.PutCreatureInPlay);
this.staticText = "Put a black Zombie creature token onto the battlefield with power equal to that card's power and toughness equal that card's toughness.";
this.staticText = "Put a black Zombie creature token onto the battlefield with power equal to that card's power and toughness equal that card's toughness";
}
public SoulSeparatorEffect(final SoulSeparatorEffect effect) {

View file

@ -0,0 +1,99 @@
/*
* 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.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.costs.common.PayLifeCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.game.Game;
import mage.target.common.TargetCreatureOrPlayer;
import mage.watchers.common.CastSpellLastTurnWatcher;
/**
*
* @author emerald000
*/
public class AetherfluxReservoir extends CardImpl {
public AetherfluxReservoir(UUID ownerId) {
super(ownerId, 192, "Aetherflux Reservoir", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}");
this.expansionSetCode = "KLD";
// Whenever you cast a spell, you gain 1 life for each spell you've cast this turn.
this.addAbility(new SpellCastControllerTriggeredAbility(new GainLifeEffect(new AetherfluxReservoirDynamicValue()), false));
// Pay 50 life: Aetherflux Reservoir deals 50 damage to target creature or player.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(50), new PayLifeCost(50));
ability.addTarget(new TargetCreatureOrPlayer());
this.addAbility(ability);
}
public AetherfluxReservoir(final AetherfluxReservoir card) {
super(card);
}
@Override
public AetherfluxReservoir copy() {
return new AetherfluxReservoir(this);
}
}
class AetherfluxReservoirDynamicValue implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getName());
return watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(sourceAbility.getControllerId());
}
@Override
public AetherfluxReservoirDynamicValue copy() {
return new AetherfluxReservoirDynamicValue();
}
@Override
public String toString() {
return "1";
}
@Override
public String getMessage() {
return "spell you've cast this turn";
}
}

View file

@ -0,0 +1,121 @@
/*
* 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.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.PayEnergyCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterNonlandCard;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInLibrary;
/**
*
* @author emerald000
*/
public class AetherworksMarvel extends CardImpl {
public AetherworksMarvel(UUID ownerId) {
super(ownerId, 193, "Aetherworks Marvel", Rarity.MYTHIC, new CardType[]{CardType.ARTIFACT}, "{4}");
this.expansionSetCode = "KLD";
this.supertype.add("Legendary");
// Whenever a permanent you control is put into a graveyard, you get {E}.
this.addAbility(new PutIntoGraveFromBattlefieldAllTriggeredAbility(new GetEnergyCountersControllerEffect(1), false, new FilterPermanent("a permanent"), false));
// {T}, Pay {E}{E}{E}{E}{E}{E}: Look at the top six cards of your library. You may cast a card from among them without paying its mana cost. Put the rest on the bottom of your library in a random order.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AetherworksMarvelEffect(), new TapSourceCost());
ability.addCost(new PayEnergyCost(6));
this.addAbility(ability);
}
public AetherworksMarvel(final AetherworksMarvel card) {
super(card);
}
@Override
public AetherworksMarvel copy() {
return new AetherworksMarvel(this);
}
}
class AetherworksMarvelEffect extends OneShotEffect {
AetherworksMarvelEffect() {
super(Outcome.PlayForFree);
this.staticText = "Look at the top six cards of your library. You may cast a card from among them without paying its mana cost. Put the rest on the bottom of your library in a random order";
}
AetherworksMarvelEffect(final AetherworksMarvelEffect effect) {
super(effect);
}
@Override
public AetherworksMarvelEffect copy() {
return new AetherworksMarvelEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Set<Card> cardsSet = controller.getLibrary().getTopCards(game, 6);
Cards cards = new CardsImpl();
for (Card card : cardsSet) {
cards.add(card);
}
TargetCard target = new TargetCardInLibrary(0, 1, new FilterNonlandCard("card to cast without paying its mana cost"));
if (controller.choose(Outcome.PlayForFree, cards, target, game)) {
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
if (card != null && controller.cast(card.getSpellAbility(), game, true)) {
cards.remove(card);
}
}
controller.putCardsOnBottomOfLibrary(cards, game, source, false);
return true;
}
return false;
}
}

View file

@ -0,0 +1,206 @@
/*
* 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.HashSet;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.cards.CardImpl;
import mage.choices.Choice;
import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.counters.Counter;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.ServoToken;
import mage.players.Player;
import mage.target.common.TargetPermanentOrPlayer;
/**
*
* @author emerald000
*/
public class AnimationModule extends CardImpl {
public AnimationModule(UUID ownerId) {
super(ownerId, 194, "Animation Module", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{1}");
this.expansionSetCode = "KLD";
// Whenever one or more +1/+1 counters are placed on a permanent you control, you may pay {1}. If you do, create a 1/1 colorless Servo artifact creature token.
this.addAbility(new AnimationModuleTriggeredAbility());
// {3}, {T}: Choose a counter on target permanent or player. Give that permanent or player another counter of that kind.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AnimationModuleEffect(), new GenericManaCost(3));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetPermanentOrPlayer());
this.addAbility(ability);
}
public AnimationModule(final AnimationModule card) {
super(card);
}
@Override
public AnimationModule copy() {
return new AnimationModule(this);
}
}
class AnimationModuleTriggeredAbility extends TriggeredAbilityImpl {
AnimationModuleTriggeredAbility() {
super(Zone.BATTLEFIELD, new DoIfCostPaid(new CreateTokenEffect(new ServoToken()), new GenericManaCost(1)), false);
}
AnimationModuleTriggeredAbility(final AnimationModuleTriggeredAbility ability) {
super(ability);
}
@Override
public AnimationModuleTriggeredAbility copy() {
return new AnimationModuleTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.COUNTERS_ADDED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getData().equals(CounterType.P1P1.getName())) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId());
if (permanent == null) {
permanent = game.getPermanentEntering(event.getTargetId());
}
return permanent != null && permanent.getControllerId().equals(this.getControllerId());
}
return false;
}
@Override
public String getRule() {
return "Whenever one or more +1/+1 counters are placed on a permanent you control, you may pay {1}. If you do, create a 1/1 colorless Servo artifact creature token.";
}
}
class AnimationModuleEffect extends OneShotEffect {
AnimationModuleEffect() {
super(Outcome.Neutral);
this.staticText = "Choose a counter on target permanent or player. Give that permanent or player another counter of that kind";
}
AnimationModuleEffect(final AnimationModuleEffect effect) {
super(effect);
}
@Override
public AnimationModuleEffect copy() {
return new AnimationModuleEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source));
if (permanent != null) {
if (permanent.getCounters(game).size() > 0) {
if (permanent.getCounters(game).size() == 1) {
for (Counter counter : permanent.getCounters(game).values()) {
Counter newCounter = new Counter(counter.getName());
permanent.addCounters(newCounter, game);
}
}
else {
Choice choice = new ChoiceImpl(true);
Set<String> choices = new HashSet<>(permanent.getCounters(game).size());
for (Counter counter : permanent.getCounters(game).values()) {
choices.add(counter.getName());
}
choice.setChoices(choices);
choice.setMessage("Choose a counter");
controller.choose(Outcome.Benefit, choice, game);
for (Counter counter : permanent.getCounters(game).values()) {
if (counter.getName().equals(choice.getChoice())) {
Counter newCounter = new Counter(counter.getName());
permanent.addCounters(newCounter, game);
break;
}
}
}
}
}
else {
Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source));
if (player != null) {
if (player.getCounters().size() > 0) {
if (player.getCounters().size() == 1) {
for (Counter counter : player.getCounters().values()) {
Counter newCounter = new Counter(counter.getName());
player.addCounters(newCounter, game);
}
}
else {
Choice choice = new ChoiceImpl(true);
Set<String> choices = new HashSet<>(player.getCounters().size());
for (Counter counter : player.getCounters().values()) {
choices.add(counter.getName());
}
choice.setChoices(choices);
choice.setMessage("Choose a counter");
controller.choose(Outcome.Benefit, choice, game);
for (Counter counter : player.getCounters().values()) {
if (counter.getName().equals(choice.getChoice())) {
Counter newCounter = new Counter(counter.getName());
player.addCounters(newCounter, game);
break;
}
}
}
}
}
}
}
return false;
}
}

View file

@ -0,0 +1,70 @@
/*
* 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.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.game.permanent.token.ServoToken;
/**
*
* @author emerald000
*/
public class CogworkersPuzzleknot extends CardImpl {
public CogworkersPuzzleknot(UUID ownerId) {
super(ownerId, 201, "Cogworker's Puzzleknot", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
this.expansionSetCode = "KLD";
// When Cogworker's Puzzleknot enters the battlefield, create a 1/1 colorless Servo artifact creature token.
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ServoToken())));
// {1}{W}, Sacrifice Cogworker's Puzzleknot: Create a 1/1 colorless Servo artifact creature token.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new ServoToken()), new ManaCostsImpl<>("{1}{W}"));
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
public CogworkersPuzzleknot(final CogworkersPuzzleknot card) {
super(card);
}
@Override
public CogworkersPuzzleknot copy() {
return new CogworkersPuzzleknot(this);
}
}

View file

@ -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.abilities.Ability;
import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
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.common.TargetControlledCreaturePermanent;
/**
*
* @author emerald000
*/
public class DecoctionModule extends CardImpl {
public DecoctionModule(UUID ownerId) {
super(ownerId, 205, "Decoction Module", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
this.expansionSetCode = "KLD";
// Whenever a creature enters the battlefield under your control, you get {E}.
this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(1)));
// {4}, {T}: Return target creature you control to its owner's hand.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new GenericManaCost(4));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
}
public DecoctionModule(final DecoctionModule card) {
super(card);
}
@Override
public DecoctionModule copy() {
return new DecoctionModule(this);
}
}

View file

@ -0,0 +1,76 @@
/*
* 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.SimpleEvasionAbility;
import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.filter.Filter;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
/**
*
* @author emerald000
*/
public class DemolitionStomper extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with power 2 or less");
static {
filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, 3));
}
public DemolitionStomper(UUID ownerId) {
super(ownerId, 206, "Demolition Stomper", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{6}");
this.expansionSetCode = "KLD";
this.subtype.add("Vehicle");
this.power = new MageInt(10);
this.toughness = new MageInt(7);
// Demolition Stomper can't be blocked by creatures with power 2 or less.
this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield)));
// Crew 5
this.addAbility(new CrewAbility(5));
}
public DemolitionStomper(final DemolitionStomper card) {
super(card);
}
@Override
public DemolitionStomper copy() {
return new DemolitionStomper(this);
}
}

View file

@ -0,0 +1,110 @@
/*
* 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.TriggeredAbilityImpl;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
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.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.target.common.TargetControlledCreaturePermanent;
/**
*
* @author emerald000
*/
public class FabricationModule extends CardImpl {
public FabricationModule(UUID ownerId) {
super(ownerId, 211, "Fabrication Module", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}");
this.expansionSetCode = "KLD";
// Whenever you get one or more {E}, put a +1/+1 counter on target creature you control.
Ability ability = new FabricationModuleTriggeredAbility();
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
// {4}, {T}: You get {E}.
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GetEnergyCountersControllerEffect(1), new GenericManaCost(4));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
public FabricationModule(final FabricationModule card) {
super(card);
}
@Override
public FabricationModule copy() {
return new FabricationModule(this);
}
}
class FabricationModuleTriggeredAbility extends TriggeredAbilityImpl {
FabricationModuleTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false);
}
FabricationModuleTriggeredAbility(final FabricationModuleTriggeredAbility ability) {
super(ability);
}
@Override
public FabricationModuleTriggeredAbility copy() {
return new FabricationModuleTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.COUNTERS_ADDED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getData().equals(CounterType.ENERGY.getName())) {
return event.getTargetId() == this.getControllerId();
}
return false;
}
@Override
public String getRule() {
return "Whenever you get one or more {E}, put a +1/+1 counter on target creature you control.";
}
}

View file

@ -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.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.target.common.TargetCreatureOrPlayer;
/**
*
* @author emerald000
*/
public class FireforgersPuzzleknot extends CardImpl {
public FireforgersPuzzleknot(UUID ownerId) {
super(ownerId, 213, "Fireforger's Puzzleknot", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
this.expansionSetCode = "KLD";
// When Fireforger's Puzzleknot enters the battlefield, it deals 1 damage to target creature or player.
Effect effect = new DamageTargetEffect(1);
effect.setText("it deals 1 damage to target creature or player");
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
ability.addTarget(new TargetCreatureOrPlayer());
this.addAbility(ability);
// {2}{R}, Sacrifice Fireforger's Puzzleknot: It deals 1 damage to target creature or player.
effect.setText("It deals 1 damage to target creature or player");
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{2}{R}"));
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetCreatureOrPlayer());
this.addAbility(ability);
}
public FireforgersPuzzleknot(final FireforgersPuzzleknot card) {
super(card);
}
@Override
public FireforgersPuzzleknot copy() {
return new FireforgersPuzzleknot(this);
}
}

View file

@ -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.effects.Effect;
import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
/**
*
* @author emerald000
*/
public class FleetwheelCruiser extends CardImpl {
public FleetwheelCruiser(UUID ownerId) {
super(ownerId, 214, "Fleetwheel Cruiser", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}");
this.expansionSetCode = "KLD";
this.subtype.add("Vehicle");
this.power = new MageInt(5);
this.toughness = new MageInt(3);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// When Fleetwheel Cruiser enters the battlefield, it becomes an artifact creature until the end of turn.
Effect effect = new AddCardTypeSourceEffect(CardType.ARTIFACT, Duration.EndOfTurn);
effect.setText("it becomes an artifact");
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
effect = new AddCardTypeSourceEffect(CardType.CREATURE, Duration.EndOfTurn);
effect.setText(" creature until end of turn");
ability.addEffect(effect);
this.addAbility(ability);
// Crew 2
this.addAbility(new CrewAbility(2));
}
public FleetwheelCruiser(final FleetwheelCruiser card) {
super(card);
}
@Override
public FleetwheelCruiser copy() {
return new FleetwheelCruiser(this);
}
}

View file

@ -0,0 +1,90 @@
/*
* 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.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.IntCompareCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.DrawCardTargetEffect;
import mage.abilities.effects.common.continuous.PlayAdditionalLandsAllEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
/**
*
* @author emerald000
*/
public class GhirapurOrrery extends CardImpl {
public GhirapurOrrery(UUID ownerId) {
super(ownerId, 216, "Ghirapur Orrery", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}");
this.expansionSetCode = "KLD";
// Each player may play an additional land on each of his or her turns.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayAdditionalLandsAllEffect()));
// At the beginning of each player's upkeep, if that player has no cards in hand, that player draws three cards.
this.addAbility(new ConditionalTriggeredAbility(
new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DrawCardTargetEffect(3), TargetController.ANY, false, true),
new GhirapurOrreryCondition(),
"At the beginning of each player's upkeep, if that player has no cards in hand, that player draws three cards."));
}
public GhirapurOrrery(final GhirapurOrrery card) {
super(card);
}
@Override
public GhirapurOrrery copy() {
return new GhirapurOrrery(this);
}
}
class GhirapurOrreryCondition extends IntCompareCondition {
GhirapurOrreryCondition() {
super(ComparisonType.Equal, 0);
}
@Override
protected int getInputValue(Game game, Ability source) {
Player activePlayer = game.getPlayer(game.getActivePlayerId());
if (activePlayer != null) {
return activePlayer.getHand().size();
}
return 0;
}
}

View file

@ -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.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
/**
*
* @author emerald000
*/
public class GlassblowersPuzzleknot extends CardImpl {
public GlassblowersPuzzleknot(UUID ownerId) {
super(ownerId, 217, "Glassblower's Puzzleknot", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
this.expansionSetCode = "KLD";
// When Glassblower's Puzzleknot enters the battlefield, scry 2, then you get {E}{E}.
Effect scryEffect = new ScryEffect(2);
scryEffect.setText("scry 2");
Ability ability = new EntersBattlefieldTriggeredAbility(scryEffect);
Effect energyEffect = new GetEnergyCountersControllerEffect(2);
energyEffect.setText(", then you get {E}{E}");
ability.addEffect(energyEffect);
this.addAbility(ability);
// {2}{U}, Sacrifice Glassblower's Puzzleknot: Scry 2, then you get {E}{E}.
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, scryEffect, new ManaCostsImpl<>("{2}{U}"));
ability.addCost(new SacrificeSourceCost());
ability.addEffect(energyEffect);
this.addAbility(ability);
}
public GlassblowersPuzzleknot(final GlassblowersPuzzleknot card) {
super(card);
}
@Override
public GlassblowersPuzzleknot copy() {
return new GlassblowersPuzzleknot(this);
}
}

View file

@ -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.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.keyword.EquipAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.SetTargetPointer;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
/**
*
* @author emerald000
*/
public class InventorsGoggles extends CardImpl {
public InventorsGoggles(UUID ownerId) {
super(ownerId, 218, "Inventor's Goggles", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{1}");
this.expansionSetCode = "KLD";
this.subtype.add("Equipment");
// Equipped creature gets +1/+2.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 2, Duration.WhileOnBattlefield)));
// Whenever an Artificer enters the battlefield under your control, you may attach Inventor's Goggles to it.
this.addAbility(new EntersBattlefieldAllTriggeredAbility(
Zone.BATTLEFIELD,
new AttachEffect(Outcome.BoostCreature, "attach {this} to it"),
new FilterPermanent("Artificer", "Artificer"),
true,
SetTargetPointer.PERMANENT,
null,
true));
// Equip {2}
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2)));
}
public InventorsGoggles(final InventorsGoggles card) {
super(card);
}
@Override
public InventorsGoggles copy() {
return new InventorsGoggles(this);
}
}

View file

@ -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.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
/**
*
* @author emerald000
*/
public class MetalspinnersPuzzleknot extends CardImpl {
public MetalspinnersPuzzleknot(UUID ownerId) {
super(ownerId, 221, "Metalspinner's Puzzleknot", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
this.expansionSetCode = "KLD";
// When Metalspinner's Puzzleknot enters the battlefield, you draw a card and you lose 1 life.
Effect drawEffect = new DrawCardSourceControllerEffect(1);
drawEffect.setText("you draw a card");
Ability ability = new EntersBattlefieldTriggeredAbility(drawEffect);
Effect lifeEffect = new LoseLifeSourceControllerEffect(1);
lifeEffect.setText("and you lose 1 life");
ability.addEffect(lifeEffect);
this.addAbility(ability);
// {2}{B}, Sacrifice Metalspinner's Puzzleknot: You draw a card and you lose 1 life.
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, drawEffect, new ManaCostsImpl<>("{2}{B}"));
ability.addCost(new SacrificeSourceCost());
ability.addEffect(lifeEffect);
this.addAbility(ability);
}
public MetalspinnersPuzzleknot(final MetalspinnersPuzzleknot card) {
super(card);
}
@Override
public MetalspinnersPuzzleknot copy() {
return new MetalspinnersPuzzleknot(this);
}
}

View file

@ -0,0 +1,70 @@
/*
* 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.keyword.CrewAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
/**
*
* @author emerald000
*/
public class OvalchaseDragster extends CardImpl {
public OvalchaseDragster(UUID ownerId) {
super(ownerId, 225, "Ovalchase Dragster", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{4}");
this.expansionSetCode = "KLD";
this.subtype.add("Vehicle");
this.power = new MageInt(6);
this.toughness = new MageInt(1);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// Crew 1
this.addAbility(new CrewAbility(1));
}
public OvalchaseDragster(final OvalchaseDragster card) {
super(card);
}
@Override
public OvalchaseDragster copy() {
return new OvalchaseDragster(this);
}
}

View file

@ -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.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.SweepNumber;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.keyword.SweepEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.permanent.TokenPredicate;
/**
*
* @author spjspj
*/
public class ParadoxicalOutcome extends CardImpl {
public ParadoxicalOutcome(UUID ownerId) {
super(ownerId, 60, "Paradoxical Outcome", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{U}");
this.expansionSetCode = "KLD";
// Return any number of target nonland, nontoken permanents you control to their owners' hands. Draw a card for each card returned to your hand this way.
FilterPermanent filter = new FilterControlledPermanent(new StringBuilder("any number of of target nonland, nontoken permanents you control").toString());
filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
filter.add(Predicates.not(new TokenPredicate()));
this.getSpellAbility().addEffect(new SweepEffect(filter, "nonland, nontoken permanents ", false));
DynamicValue paradoxicalOutcomeValue = new SweepNumber("nonland, nontoken permanents ", false);
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(paradoxicalOutcomeValue));
}
public ParadoxicalOutcome(final ParadoxicalOutcome card) {
super(card);
}
@Override
public ParadoxicalOutcome copy() {
return new ParadoxicalOutcome(this);
}
}

View file

@ -0,0 +1,122 @@
/*
* 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.TriggeredAbilityImpl;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.target.common.TargetCreatureOrPlaneswalker;
/**
*
* @author emerald000
*/
public class SkysovereignConsulFlagship extends CardImpl {
private static final FilterCreatureOrPlaneswalkerPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("creature or planeswalker an opponent controls");
static {
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
public SkysovereignConsulFlagship(UUID ownerId) {
super(ownerId, 234, "Skysovereign, Consul Flagship", Rarity.MYTHIC, new CardType[]{CardType.ARTIFACT}, "{5}");
this.expansionSetCode = "KLD";
this.supertype.add("Legendary");
this.subtype.add("Vehicle");
this.power = new MageInt(6);
this.toughness = new MageInt(5);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever Skysovereign, Consul Flagship enters the battlefield or attacks, it deals 3 damage to target creature or planeswalker an opponent controls.
Ability ability = new SkysovereignConsulFlagshipTriggeredAbility();
ability.addTarget(new TargetCreatureOrPlaneswalker(1, 1, filter, false));
this.addAbility(ability);
// Crew 3
this.addAbility(new CrewAbility(3));
}
public SkysovereignConsulFlagship(final SkysovereignConsulFlagship card) {
super(card);
}
@Override
public SkysovereignConsulFlagship copy() {
return new SkysovereignConsulFlagship(this);
}
}
class SkysovereignConsulFlagshipTriggeredAbility extends TriggeredAbilityImpl {
SkysovereignConsulFlagshipTriggeredAbility() {
super(Zone.BATTLEFIELD, new DamageTargetEffect(3), false);
}
SkysovereignConsulFlagshipTriggeredAbility(final SkysovereignConsulFlagshipTriggeredAbility ability) {
super(ability);
}
@Override
public SkysovereignConsulFlagshipTriggeredAbility copy() {
return new SkysovereignConsulFlagshipTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.ATTACKER_DECLARED || event.getType() == EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) {
return true;
}
return event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId());
}
@Override
public String getRule() {
return "Whenever {this} enters the battlefield or attacks, it deals 3 damage to target creature or planeswalker an opponent controls.";
}
}

View file

@ -28,6 +28,8 @@
package mage.sets.unglued;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Forest extends mage.cards.basiclands.Forest {
public Forest(UUID ownerId) {
super(ownerId, 88);
this.expansionSetCode = "UGL";
this.frameStyle = FrameStyle.UGL_FULL_ART_BASIC;
}
public Forest(final Forest card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unglued;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Island extends mage.cards.basiclands.Island {
public Island(UUID ownerId) {
super(ownerId, 85);
this.expansionSetCode = "UGL";
this.frameStyle = FrameStyle.UGL_FULL_ART_BASIC;
}
public Island(final Island card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unglued;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Mountain extends mage.cards.basiclands.Mountain {
public Mountain(UUID ownerId) {
super(ownerId, 87);
this.expansionSetCode = "UGL";
this.frameStyle = FrameStyle.UGL_FULL_ART_BASIC;
}
public Mountain(final Mountain card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unglued;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Plains extends mage.cards.basiclands.Plains {
public Plains(UUID ownerId) {
super(ownerId, 84);
this.expansionSetCode = "UGL";
this.frameStyle = FrameStyle.UGL_FULL_ART_BASIC;
}
public Plains(final Plains card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unglued;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Swamp extends mage.cards.basiclands.Swamp {
public Swamp(UUID ownerId) {
super(ownerId, 86);
this.expansionSetCode = "UGL";
this.frameStyle = FrameStyle.UGL_FULL_ART_BASIC;
}
public Swamp(final Swamp card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unhinged;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -38,6 +40,7 @@ public class Forest extends mage.cards.basiclands.Forest {
public Forest(UUID ownerId) {
super(ownerId, 140);
this.expansionSetCode = "UNH";
this.frameStyle = FrameStyle.UNH_FULL_ART_BASIC;
}
public Forest(final Forest card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unhinged;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Island extends mage.cards.basiclands.Island {
public Island(UUID ownerId) {
super(ownerId, 137);
this.expansionSetCode = "UNH";
this.frameStyle = FrameStyle.UNH_FULL_ART_BASIC;
}
public Island(final Island card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unhinged;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Mountain extends mage.cards.basiclands.Mountain {
public Mountain(UUID ownerId) {
super(ownerId, 139);
this.expansionSetCode = "UNH";
this.frameStyle = FrameStyle.UNH_FULL_ART_BASIC;
}
public Mountain(final Mountain card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unhinged;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Plains extends mage.cards.basiclands.Plains {
public Plains(UUID ownerId) {
super(ownerId, 136);
this.expansionSetCode = "UNH";
this.frameStyle = FrameStyle.UNH_FULL_ART_BASIC;
}
public Plains(final Plains card) {

View file

@ -28,6 +28,8 @@
package mage.sets.unhinged;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Swamp extends mage.cards.basiclands.Swamp {
public Swamp(UUID ownerId) {
super(ownerId, 138);
this.expansionSetCode = "UNH";
this.frameStyle = FrameStyle.UNH_FULL_ART_BASIC;
}
public Swamp(final Swamp card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Forest1 extends mage.cards.basiclands.Forest {
public Forest1(UUID ownerId) {
super(ownerId, 246);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Forest1(final Forest1 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Forest2 extends mage.cards.basiclands.Forest {
public Forest2(UUID ownerId) {
super(ownerId, 247);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Forest2(final Forest2 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Forest3 extends mage.cards.basiclands.Forest {
public Forest3(UUID ownerId) {
super(ownerId, 248);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Forest3(final Forest3 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Forest4 extends mage.cards.basiclands.Forest {
public Forest4(UUID ownerId) {
super(ownerId, 249);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Forest4(final Forest4 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Island1 extends mage.cards.basiclands.Island {
public Island1(UUID ownerId) {
super(ownerId, 234);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Island1(final Island1 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Island2 extends mage.cards.basiclands.Island {
public Island2(UUID ownerId) {
super(ownerId, 235);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Island2(final Island2 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Island3 extends mage.cards.basiclands.Island {
public Island3(UUID ownerId) {
super(ownerId, 236);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Island3(final Island3 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Island4 extends mage.cards.basiclands.Island {
public Island4(UUID ownerId) {
super(ownerId, 237);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Island4(final Island4 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Mountain1 extends mage.cards.basiclands.Mountain {
public Mountain1(UUID ownerId) {
super(ownerId, 242);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Mountain1(final Mountain1 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Mountain2 extends mage.cards.basiclands.Mountain {
public Mountain2(UUID ownerId) {
super(ownerId, 243);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Mountain2(final Mountain2 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Mountain3 extends mage.cards.basiclands.Mountain {
public Mountain3(UUID ownerId) {
super(ownerId, 244);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Mountain3(final Mountain3 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Mountain4 extends mage.cards.basiclands.Mountain {
public Mountain4(UUID ownerId) {
super(ownerId, 245);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Mountain4(final Mountain4 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Plains1 extends mage.cards.basiclands.Plains {
public Plains1(UUID ownerId) {
super(ownerId, 230);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Plains1(final Plains1 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Plains2 extends mage.cards.basiclands.Plains {
public Plains2(UUID ownerId) {
super(ownerId, 231);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Plains2(final Plains2 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Plains3 extends mage.cards.basiclands.Plains {
public Plains3(UUID ownerId) {
super(ownerId, 232);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Plains3(final Plains3 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Plains4 extends mage.cards.basiclands.Plains {
public Plains4(UUID ownerId) {
super(ownerId, 233);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Plains4(final Plains4 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Swamp1 extends mage.cards.basiclands.Swamp {
public Swamp1(UUID ownerId) {
super(ownerId, 238);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Swamp1(final Swamp1 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Swamp2 extends mage.cards.basiclands.Swamp {
public Swamp2(UUID ownerId) {
super(ownerId, 239);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Swamp2(final Swamp2 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Swamp3 extends mage.cards.basiclands.Swamp {
public Swamp3(UUID ownerId) {
super(ownerId, 240);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Swamp3(final Swamp3 card) {

View file

@ -28,6 +28,8 @@
package mage.sets.zendikar;
import mage.cards.FrameStyle;
import java.util.UUID;
/**
@ -39,6 +41,7 @@ public class Swamp4 extends mage.cards.basiclands.Swamp {
public Swamp4(UUID ownerId) {
super(ownerId, 241);
this.expansionSetCode = "ZEN";
this.frameStyle = FrameStyle.ZEN_FULL_ART_BASIC;
}
public Swamp4(final Swamp4 card) {