Elspeth vs Tezzeret started, SOM cards, static text support for abilities

This commit is contained in:
Loki 2011-01-23 11:07:16 +02:00
parent a314c40206
commit 3710f275db
15 changed files with 705 additions and 21 deletions

View file

@ -14,7 +14,7 @@ public class GathererSets implements Iterable<DownloadJob> {
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<DownloadJob> iterator() {

View file

@ -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);
}
}

View file

@ -64,6 +64,7 @@ public class Sets extends HashMap<String, ExpansionSet> {
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());

View file

@ -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);
}
}

View file

@ -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);
}
}

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.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<BellowingTanglewurm> {
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);
}
}

View file

@ -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<BlunttheAssault> {
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);
}
}

View file

@ -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<MeltTerrain> {
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> {
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";
}
}

View file

@ -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<MyrGalvanizer> {
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> {
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);
}
}

View file

@ -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<VigilfortheLost> {
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> {
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> {
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";
}
}

View file

@ -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();
}
}

View file

@ -42,6 +42,7 @@ public abstract class EffectImpl<T extends Effect<T>> implements Effect<T> {
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<T extends Effect<T>> implements Effect<T> {
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<T extends Effect<T>> implements Effect<T> {
@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;

View file

@ -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<BoostSourceEffect> {
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<BoostSourceEffect> {
@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();
}
}

View file

@ -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<GainLifeEffect> {
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<GainLifeEffect> {
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";
}
}

View file

@ -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';