diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java index 63f5fdba850..84ac8a0d959 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java @@ -14,7 +14,7 @@ public class GathererSets implements Iterable { private static final File outDir = new File("plugins/images/sets"); private static final String[] symbols = {"DIS", "GPT", "RAV", "MRD", "10E", "HOP"}; - private static final String[] withMythics = {"ALA", "CFX", "ARB", "ZEN", "WWK", "ROE", "SOM", "M10","M11"}; + private static final String[] withMythics = {"ALA", "CFX", "ARB", "ZEN", "WWK", "ROE", "SOM", "M10", "M11", "DDF"}; @Override public Iterator iterator() { diff --git a/Mage.Sets/src/mage/sets/ElspethvsTezzeret.java b/Mage.Sets/src/mage/sets/ElspethvsTezzeret.java new file mode 100644 index 00000000000..7789c588b77 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ElspethvsTezzeret.java @@ -0,0 +1,18 @@ +package mage.sets; + +import mage.Constants; +import mage.cards.ExpansionSet; + +import java.util.GregorianCalendar; + +public class ElspethvsTezzeret extends ExpansionSet { + private static final ElspethvsTezzeret fINSTANCE = new ElspethvsTezzeret(); + + public static ElspethvsTezzeret getInstance() { + return fINSTANCE; + } + + private ElspethvsTezzeret() { + super("Duel Decks: Elspeth vs. Tezzeret", "DDF", "", "mage.sets.elspethvstezzeret", new GregorianCalendar(2010, 8, 3).getTime(), Constants.SetType.REPRINT); + } +} diff --git a/Mage.Sets/src/mage/sets/Sets.java b/Mage.Sets/src/mage/sets/Sets.java index f58448f531e..c905f9a6f0e 100644 --- a/Mage.Sets/src/mage/sets/Sets.java +++ b/Mage.Sets/src/mage/sets/Sets.java @@ -64,6 +64,7 @@ public class Sets extends HashMap { this.addSet(AlaraReborn.getInstance()); this.addSet(Conflux.getInstance()); this.addSet(Dissension.getInstance()); + this.addSet(ElspethvsTezzeret.getInstance()); this.addSet(Guildpact.getInstance()); this.addSet(Magic2010.getInstance()); this.addSet(Magic2011.getInstance()); diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/EliteVanguard.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/EliteVanguard.java new file mode 100644 index 00000000000..3821e6b122a --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/EliteVanguard.java @@ -0,0 +1,54 @@ +/* + * 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.elspethvstezzeret; + +import java.util.UUID; + +/** + * + * @author Loki + */ +public class EliteVanguard extends mage.sets.magic2010.EliteVanguard { + + public EliteVanguard (UUID ownerId) { + super(ownerId); + this.expansionSetCode = "DDF"; + this.cardNumber = 2; + } + + public EliteVanguard (final EliteVanguard card) { + super(card); + } + + @Override + public EliteVanguard copy() { + return new EliteVanguard(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/ElspethKnightErrant.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/ElspethKnightErrant.java new file mode 100644 index 00000000000..d8009ac5bf1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/ElspethKnightErrant.java @@ -0,0 +1,54 @@ +/* + * 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.elspethvstezzeret; + +import java.util.UUID; + +/** + * + * @author Loki + */ +public class ElspethKnightErrant extends mage.sets.shardsofalara.ElspethKnightErrant { + + public ElspethKnightErrant (UUID ownerId) { + super(ownerId); + this.expansionSetCode = "DDF"; + this.cardNumber = 1; + } + + public ElspethKnightErrant (final ElspethKnightErrant card) { + super(card); + } + + @Override + public ElspethKnightErrant copy() { + return new ElspethKnightErrant(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/BellowingTanglewurm.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/BellowingTanglewurm.java new file mode 100644 index 00000000000..07a651bedde --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/BellowingTanglewurm.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.sets.scarsofmirrodin; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.GainAbilityControlledEffect; +import mage.abilities.keyword.IntimidateAbility; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.FilterPermanent; + +/** + * + * @author Loki + */ +public class BellowingTanglewurm extends CardImpl { + private static final FilterPermanent filter = new FilterPermanent("green creatures"); + + static { + filter.getCardType().add(CardType.CREATURE); + filter.setScopeCardType(Filter.ComparisonScope.Any); + filter.setUseColor(true); + filter.getColor().setGreen(true); + } + + public BellowingTanglewurm (UUID ownerId) { + super(ownerId, 111, "Bellowing Tanglewurm", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + this.expansionSetCode = "SOM"; + this.subtype.add("Wurm"); + this.color.setGreen(true); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + this.addAbility(IntimidateAbility.getInstance()); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(IntimidateAbility.getInstance(), Duration.WhileOnBattlefield, filter, true))); + } + + public BellowingTanglewurm (final BellowingTanglewurm card) { + super(card); + } + + @Override + public BellowingTanglewurm copy() { + return new BellowingTanglewurm(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/BlunttheAssault.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/BlunttheAssault.java new file mode 100644 index 00000000000..ca3c3ec1b3d --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/BlunttheAssault.java @@ -0,0 +1,67 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.sets.scarsofmirrodin; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.dynamicvalue.common.CreaturesOnBattlefieldCount; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.PreventAllCombatDamageEffect; +import mage.cards.CardImpl; + +/** + * + * @author Loki + */ +public class BlunttheAssault extends CardImpl { + + public BlunttheAssault (UUID ownerId) { + super(ownerId, 113, "Blunt the Assault", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{G}"); + this.expansionSetCode = "SOM"; + this.color.setGreen(true); + GainLifeEffect effect = new GainLifeEffect(new CreaturesOnBattlefieldCount()); + effect.setStaticText("You gain 1 life for each creature on the battlefield"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addEffect(new PreventAllCombatDamageEffect(Constants.Duration.EndOfTurn)); + } + + public BlunttheAssault (final BlunttheAssault card) { + super(card); + } + + @Override + public BlunttheAssault copy() { + return new BlunttheAssault(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MeltTerrain.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MeltTerrain.java new file mode 100644 index 00000000000..708e0905766 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MeltTerrain.java @@ -0,0 +1,105 @@ +/* + * 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.scarsofmirrodin; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author Loki + */ +public class MeltTerrain extends CardImpl { + + public MeltTerrain (UUID ownerId) { + super(ownerId, 97, "Melt Terrain", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{R}{R}"); + this.expansionSetCode = "SOM"; + this.color.setRed(true); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addEffect(new MeltTerrainEffect()); + this.getSpellAbility().addTarget(new TargetLandPermanent()); + } + + public MeltTerrain (final MeltTerrain card) { + super(card); + } + + @Override + public MeltTerrain copy() { + return new MeltTerrain(this); + } + +} + +class MeltTerrainEffect extends OneShotEffect { + MeltTerrainEffect() { + super(Constants.Outcome.Damage); + } + + MeltTerrainEffect(final MeltTerrainEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent p = game.getBattlefield().getPermanent(source.getFirstTarget()); + if (p == null) { + p = (Permanent) game.getLastKnownInformation(source.getFirstTarget(), Zone.BATTLEFIELD); + } + if (p != null) { + Player player = game.getPlayer(p.getControllerId()); + if (player != null) { + player.damage(2, source.getSourceId(), game, false, true); + } + } + return false; + } + + @Override + public MeltTerrainEffect copy() { + return new MeltTerrainEffect(this); + } + + @Override + public String getText(Ability source) { + return "Melt Terrain deals 2 damage to that land's controller"; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrGalvanizer.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrGalvanizer.java new file mode 100644 index 00000000000..0a31e27a59a --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrGalvanizer.java @@ -0,0 +1,109 @@ +/* + * 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.scarsofmirrodin; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author Loki + */ +public class MyrGalvanizer extends CardImpl { + static FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.getSubtype().add("Myr"); + filter.setScopeSubtype(Filter.ComparisonScope.Any); + } + + public MyrGalvanizer (UUID ownerId) { + super(ownerId, 181, "Myr Galvanizer", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + this.expansionSetCode = "SOM"; + this.subtype.add("Myr"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true))); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MyrGalvanizerEffect(), new TapSourceCost()); + ability.addCost(new GenericManaCost(1)); + this.addAbility(ability); + } + + public MyrGalvanizer (final MyrGalvanizer card) { + super(card); + } + + @Override + public MyrGalvanizer copy() { + return new MyrGalvanizer(this); + } +} + +class MyrGalvanizerEffect extends OneShotEffect { + + MyrGalvanizerEffect() { + super(Constants.Outcome.Untap); + } + + MyrGalvanizerEffect(final MyrGalvanizerEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent permanent: game.getBattlefield().getActivePermanents(MyrGalvanizer.filter, source.getControllerId(), game)) { + if (!permanent.getId().equals(source.getSourceId())) + permanent.untap(game); + } + return true; + } + + @Override + public MyrGalvanizerEffect copy() { + return new MyrGalvanizerEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/VigilfortheLost.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/VigilfortheLost.java new file mode 100644 index 00000000000..06c6b88d4a6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/VigilfortheLost.java @@ -0,0 +1,140 @@ +/* + * 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.scarsofmirrodin; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.costs.VariableCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.costs.mana.VariableManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.TableEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author Loki + */ +public class VigilfortheLost extends CardImpl { + + public VigilfortheLost (UUID ownerId) { + super(ownerId, 26, "Vigil for the Lost", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + this.expansionSetCode = "SOM"; + this.color.setWhite(true); + this.addAbility(new VigilfortheLostTriggeredAbility()); + } + + public VigilfortheLost (final VigilfortheLost card) { + super(card); + } + + @Override + public VigilfortheLost copy() { + return new VigilfortheLost(this); + } + +} + +class VigilfortheLostTriggeredAbility extends TriggeredAbilityImpl { + VigilfortheLostTriggeredAbility() { + super(Zone.BATTLEFIELD, new VigilfortheLostEffect()); + } + + VigilfortheLostTriggeredAbility(final VigilfortheLostTriggeredAbility ability) { + super(ability); + } + + @Override + public VigilfortheLostTriggeredAbility copy() { + return new VigilfortheLostTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.ZONE_CHANGE && + ((ZoneChangeEvent)event).getToZone() == Zone.GRAVEYARD && + ((ZoneChangeEvent)event).getFromZone() == Zone.BATTLEFIELD) { + Permanent p = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); + if (p.getControllerId().equals(this.getControllerId())) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a creature you control is put into a graveyard from the battlefield, you may pay {X}. If you do, you gain X life."; + } +} + +class VigilfortheLostEffect extends OneShotEffect { + VigilfortheLostEffect() { + super(Constants.Outcome.GainLife); + } + + VigilfortheLostEffect(final VigilfortheLostEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + ManaCostsImpl cost = new ManaCostsImpl("{X}"); + cost.clearPaid(); + if (cost.pay(game, source.getId(), source.getControllerId(), false)) { + Player player = game.getPlayer(source.getControllerId()); + player.gainLife(((VariableCost)cost.getVariableCosts().get(0)).getAmount(), game); + return true; + } else { + return false; + } + } + + @Override + public VigilfortheLostEffect copy() { + return new VigilfortheLostEffect(this); + } + + @Override + public String getText(Ability source) { + return "you may pay {X}. If you do, you gain X life"; + } +} \ No newline at end of file diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CreaturesOnBattlefieldCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CreaturesOnBattlefieldCount.java new file mode 100644 index 00000000000..e84769b8cde --- /dev/null +++ b/Mage/src/mage/abilities/dynamicvalue/common/CreaturesOnBattlefieldCount.java @@ -0,0 +1,27 @@ +package mage.abilities.dynamicvalue.common; + +import mage.Constants; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.filter.Filter; +import mage.filter.FilterPermanent; +import mage.game.Game; + +public class CreaturesOnBattlefieldCount implements DynamicValue { + private static final FilterPermanent filter = new FilterPermanent(); + + static { + filter.getCardType().add(Constants.CardType.CREATURE); + filter.setScopeCardType(Filter.ComparisonScope.Any); + } + + @Override + public int calculate(Game game, Ability sourceAbility) { + return game.getBattlefield().countAll(filter); + } + + @Override + public DynamicValue clone() { + return new CreaturesOnBattlefieldCount(); + } +} diff --git a/Mage/src/mage/abilities/effects/EffectImpl.java b/Mage/src/mage/abilities/effects/EffectImpl.java index 7d8f71ba276..33e4c5232f2 100644 --- a/Mage/src/mage/abilities/effects/EffectImpl.java +++ b/Mage/src/mage/abilities/effects/EffectImpl.java @@ -42,6 +42,7 @@ public abstract class EffectImpl> implements Effect { protected UUID id; protected final Outcome outcome; protected EffectType effectType; + protected String staticText = ""; public EffectImpl(Outcome outcome) { this.id = UUID.randomUUID(); @@ -52,6 +53,7 @@ public abstract class EffectImpl> implements Effect { this.id = effect.id; this.outcome = effect.outcome; this.effectType = effect.effectType; + this.staticText = effect.staticText; } @Override @@ -61,9 +63,21 @@ public abstract class EffectImpl> implements Effect { @Override public String getText(Ability source) { - return ""; + if (staticText.equals("")) { + return getDynamicText(source); + } else { + return staticText; + } } + protected String getDynamicText(Ability source) { + return ""; + } + + public void setStaticText(String staticText) { + this.staticText = staticText; + } + @Override public Outcome getOutcome() { return outcome; diff --git a/Mage/src/mage/abilities/effects/common/BoostSourceEffect.java b/Mage/src/mage/abilities/effects/common/BoostSourceEffect.java index eaf2ccf0a99..aa4107aab81 100644 --- a/Mage/src/mage/abilities/effects/common/BoostSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/BoostSourceEffect.java @@ -33,6 +33,8 @@ import mage.Constants.Layer; import mage.Constants.Outcome; import mage.Constants.SubLayer; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.ContinuousEffectImpl; import mage.game.Game; import mage.game.permanent.Permanent; @@ -42,20 +44,23 @@ import mage.game.permanent.Permanent; * @author BetaSteward_at_googlemail.com */ public class BoostSourceEffect extends ContinuousEffectImpl { - - private int power; - private int toughness; + private DynamicValue power; + private DynamicValue toughness; public BoostSourceEffect(int power, int toughness, Duration duration) { - super(duration, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); - this.power = power; - this.toughness = toughness; + this(new StaticValue(power), new StaticValue(toughness), duration); } + public BoostSourceEffect(DynamicValue power, DynamicValue toughness, Duration duration) { + super(duration, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); + this.power = power; + this.toughness = toughness; + } + public BoostSourceEffect(final BoostSourceEffect effect) { super(effect); - this.power = effect.power; - this.toughness = effect.toughness; + this.power = effect.power.clone(); + this.toughness = effect.toughness.clone(); } @Override @@ -65,18 +70,18 @@ public class BoostSourceEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - Permanent target = (Permanent) game.getPermanent(source.getSourceId()); + Permanent target = game.getPermanent(source.getSourceId()); if (target != null) { - target.addPower(power); - target.addToughness(toughness); + target.addPower(power.calculate(game, source)); + target.addToughness(toughness.calculate(game, source)); return true; } return false; } @Override - public String getText(Ability source) { - return "{this} gets " + String.format("%1$+d/%2$+d", power, toughness) + " " + duration.toString(); + public String getDynamicText(Ability source) { + return "{this} gets " + power.toString() + "/" + toughness.toString() + " " + duration.toString(); } } diff --git a/Mage/src/mage/abilities/effects/common/GainLifeEffect.java b/Mage/src/mage/abilities/effects/common/GainLifeEffect.java index 2aec9839a81..5c02454070f 100644 --- a/Mage/src/mage/abilities/effects/common/GainLifeEffect.java +++ b/Mage/src/mage/abilities/effects/common/GainLifeEffect.java @@ -30,6 +30,8 @@ package mage.abilities.effects.common; import mage.Constants.Outcome; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.game.Game; import mage.players.Player; @@ -40,16 +42,20 @@ import mage.players.Player; */ public class GainLifeEffect extends OneShotEffect { - private int life; + private DynamicValue life; - public GainLifeEffect(int life) { + public GainLifeEffect(int life) { + this(new StaticValue(life)); + } + + public GainLifeEffect(DynamicValue life) { super(Outcome.GainLife); this.life = life; } public GainLifeEffect(final GainLifeEffect effect) { super(effect); - this.life = effect.life; + this.life = effect.life.clone(); } @Override @@ -61,14 +67,14 @@ public class GainLifeEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - player.gainLife(life, game); + player.gainLife(life.calculate(game, source), game); } return true; } @Override - public String getText(Ability source) { - return "you gain " + Integer.toString(life) + " life"; + public String getDynamicText(Ability source) { + return "you gain " + life.toString() + " life"; } } diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index e22ac4b86de..3dc1a0fc358 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -121,6 +121,8 @@ $fulltoshort{'Worldwake'} = 'WWK'; $fulltoshort{'Zendikar'} = 'ZEN'; $fulltoshort{'Archenemy'} = 'ARC'; $fulltoshort{'Scars of Mirrodin'} = 'SOM'; +$fulltoshort{'From the Vault: Relics'} = 'FVR'; +$fulltoshort{'Duel Decks: Elspeth vs. Tezzeret'} = 'DDF'; my %wizardstous; $wizardstous{'6E'} = '6ED'; @@ -203,6 +205,8 @@ $wizardstous{'LGN'} = 'LGN'; $wizardstous{'AN'} = 'ARN'; $wizardstous{'WWK'} = 'WWK'; $wizardstous{'SOM'} = 'SOM'; +$wizardstous{'V10'} = 'FVR'; +$wizardstous{'DDF'} = 'DDF'; my %knownSets; $knownSets{'ARB'} = 'alarareborn'; @@ -219,6 +223,8 @@ $knownSets{'ZEN'} = 'zendikar'; $knownSets{'SOM'} = 'scarsofmirrodin'; $knownSets{'GPT'} = 'guildpact'; $knownSets{'DIS'} = 'dissension'; +$knownSets{'MRD'} = 'mirrodin'; +$knownSets{'DDF'} = 'elspethvstezzeret'; my %raritiesConversion; $raritiesConversion{'C'} = 'COMMON';