diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java index 278d81c448..bb16c5c90f 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java @@ -25,7 +25,7 @@ public class ManaSymbols { private static final String[] sets = {"DIS", "GPT", "RAV", "MRD", "10E", "HOP", "ALA", "CFX", "ARB", "ZEN", "WWK", "ROE", "SOM", "M10", "M11", - "MBS", "DDF", "DST", "EVE"}; + "MBS", "DDF", "DST", "EVE", "APC"}; static public void loadImages() { 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 d96b6af5e8..7e065591fd 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 @@ -5,6 +5,7 @@ import org.mage.plugins.card.dl.DownloadJob; import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import static org.mage.plugins.card.dl.DownloadJob.fromURL; @@ -12,8 +13,14 @@ import static org.mage.plugins.card.dl.DownloadJob.toFile; public class GathererSets implements Iterable { private static final File outDir = new File("plugins/images/sets"); - private static final String[] symbols = {"DIS", "DST", "GPT", "RAV", "MRD", "10E", "HOP", "EVE"}; + private static final String[] symbols = {"DIS", "DST", "GPT", "RAV", "MRD", "10E", "HOP", "EVE", "APC"}; private static final String[] withMythics = {"ALA", "CFX", "ARB", "ZEN", "WWK", "ROE", "SOM", "M10", "M11", "DDF", "MBS"}; + private static final HashMap symbolsReplacements = new HashMap(); + + static { + symbolsReplacements.put("CFX", "CON"); + symbolsReplacements.put("APC", "AP"); + } @Override public Iterator iterator() { @@ -34,8 +41,8 @@ public class GathererSets implements Iterable { private DownloadJob generateDownloadJob(String set, String rarity) { File dst = new File(outDir, set + "-" + rarity + ".jpg"); - if (set.equals("CFX")) { // hack for special reserved filaname "CON" in Windows - set = "CON"; + if (symbolsReplacements.containsKey(set)) { + set = symbolsReplacements.get(set); } String url = "http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=" + set + "&size=small&rarity=" + rarity; return new DownloadJob(set + "-" + rarity, fromURL(url), toFile(dst)); diff --git a/Mage.Sets/src/mage/sets/Apocalypse.java b/Mage.Sets/src/mage/sets/Apocalypse.java new file mode 100644 index 0000000000..7fe17cb0ca --- /dev/null +++ b/Mage.Sets/src/mage/sets/Apocalypse.java @@ -0,0 +1,26 @@ +package mage.sets; + +import mage.Constants; +import mage.cards.ExpansionSet; + +import java.util.GregorianCalendar; + +public class Apocalypse extends ExpansionSet { + private static final Apocalypse fINSTANCE = new Apocalypse(); + + public static Apocalypse getInstance() { + return fINSTANCE; + } + + private Apocalypse() { + super("Apocalypse", "APC", "", "mage.sets.apocalypse", new GregorianCalendar(2009, 5, 1).getTime(), Constants.SetType.EXPANSION); + this.blockName = "Invasion "; +// this.parentSet = + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + } +} diff --git a/Mage.Sets/src/mage/sets/Darksteel.java b/Mage.Sets/src/mage/sets/Darksteel.java index 1f171b4668..deffa27cde 100644 --- a/Mage.Sets/src/mage/sets/Darksteel.java +++ b/Mage.Sets/src/mage/sets/Darksteel.java @@ -16,6 +16,7 @@ public class Darksteel extends ExpansionSet { public Darksteel() { super("Darksteel", "DST", "", "mage.sets.darksteel", new GregorianCalendar(2004, 1, 6).getTime(), Constants.SetType.EXPANSION); this.blockName = "Mirrodin"; + this.parentSet = Mirrodin.getInstance(); this.hasBoosters = true; this.numBoosterLands = 1; this.numBoosterCommon = 10; diff --git a/Mage.Sets/src/mage/sets/Sets.java b/Mage.Sets/src/mage/sets/Sets.java index 0710f72325..acae3d42d6 100644 --- a/Mage.Sets/src/mage/sets/Sets.java +++ b/Mage.Sets/src/mage/sets/Sets.java @@ -65,6 +65,7 @@ public class Sets extends HashMap { names = new TreeSet(); cards = new ArrayList(); this.addSet(AlaraReborn.getInstance()); + this.addSet(Apocalypse.getInstance()); this.addSet(Conflux.getInstance()); this.addSet(Darksteel.getInstance()); this.addSet(Dissension.getInstance()); diff --git a/Mage.Sets/src/mage/sets/apocalypse/DeathGrasp.java b/Mage.Sets/src/mage/sets/apocalypse/DeathGrasp.java new file mode 100644 index 0000000000..46a80f369d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/DeathGrasp.java @@ -0,0 +1,65 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author Loki + */ +public class DeathGrasp extends CardImpl { + + public DeathGrasp (UUID ownerId) { + super(ownerId, 95, "Death Grasp", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{X}{W}{B}"); + this.expansionSetCode = "APC"; + this.color.setWhite(true); + this.color.setBlack(true); + this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue())); + this.getSpellAbility().addEffect(new GainLifeEffect(new ManacostVariableValue())); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + } + + public DeathGrasp (final DeathGrasp card) { + super(card); + } + + @Override + public DeathGrasp copy() { + return new DeathGrasp(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/DesolationAngel.java b/Mage.Sets/src/mage/sets/apocalypse/DesolationAngel.java new file mode 100644 index 0000000000..fbaf1b5cc7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/DesolationAngel.java @@ -0,0 +1,135 @@ +/* + * 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.apocalypse; + +import java.util.ArrayList; +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author Loki + */ +public class DesolationAngel extends CardImpl { + + public DesolationAngel (UUID ownerId) { + super(ownerId, 38, "Desolation Angel", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); + this.expansionSetCode = "APC"; + this.subtype.add("Angel"); + this.color.setBlack(true); + this.color.setBlack(true); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + Ability ability = new KickerAbility(new DesolationAngelDummyEffect(), false); + ability.addManaCost(new ManaCostsImpl("{W}{W}")); + this.addAbility(ability); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DesolationAngelEntersBattlefieldEffect())); + } + + public DesolationAngel (final DesolationAngel card) { + super(card); + } + + @Override + public DesolationAngel copy() { + return new DesolationAngel(this); + } +} + +class DesolationAngelDummyEffect extends OneShotEffect { + DesolationAngelDummyEffect() { + super(Constants.Outcome.Benefit); + } + + DesolationAngelDummyEffect(final DesolationAngelDummyEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public DesolationAngelDummyEffect copy() { + return new DesolationAngelDummyEffect(this); + } +} + +class DesolationAngelEntersBattlefieldEffect extends OneShotEffect { + DesolationAngelEntersBattlefieldEffect() { + super(Constants.Outcome.DestroyPermanent); + } + + DesolationAngelEntersBattlefieldEffect(final DesolationAngelEntersBattlefieldEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent p = game.getPermanent(source.getSourceId()); + if (p != null) { + boolean kicked = false; + for (KickerAbility kicker: p.getAbilities().getKickerAbilities()) { + kicked |= kicker.isKicked(); + } + for (Permanent permanent : game.getBattlefield().getAllActivePermanents()) { + if (permanent.getCardType().contains(CardType.LAND)) { + if ((!kicked && permanent.getControllerId() == source.getControllerId()) || kicked) { + permanent.destroy(source.getSourceId(), game, false); + } + } + } + return true; + } + return false; + } + + @Override + public DesolationAngelEntersBattlefieldEffect copy() { + return new DesolationAngelEntersBattlefieldEffect(this); + } + + @Override + public String getText(Ability source) { + return "destroy all lands you control. If it was kicked, destroy all lands instead"; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/apocalypse/Vindicate.java b/Mage.Sets/src/mage/sets/apocalypse/Vindicate.java new file mode 100644 index 0000000000..01bb119bd0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/Vindicate.java @@ -0,0 +1,62 @@ +/* + * 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.apocalypse; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.target.TargetPermanent; + +/** + * + * @author Loki + */ +public class Vindicate extends CardImpl { + + public Vindicate (UUID ownerId) { + super(ownerId, 126, "Vindicate", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{W}{B}"); + this.expansionSetCode = "APC"; + this.color.setWhite(true); + this.color.setBlack(true); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent()); + } + + public Vindicate (final Vindicate card) { + super(card); + } + + @Override + public Vindicate copy() { + return new Vindicate(this); + } + +} diff --git a/Mage/src/mage/abilities/effects/common/DamageTargetEffect.java b/Mage/src/mage/abilities/effects/common/DamageTargetEffect.java index 524502d0c5..394334e5da 100644 --- a/Mage/src/mage/abilities/effects/common/DamageTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/DamageTargetEffect.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.game.permanent.Permanent; @@ -41,26 +43,38 @@ import mage.players.Player; */ public class DamageTargetEffect extends OneShotEffect { - protected int amount; + protected DynamicValue amount; protected boolean preventable; public DamageTargetEffect(int amount) { - this(amount, true); + this(new StaticValue(amount), true); } public DamageTargetEffect(int amount, boolean preventable) { - super(Outcome.Damage); - this.amount = amount; - this.preventable = preventable; + this(new StaticValue(amount), preventable); } + public DamageTargetEffect(DynamicValue amount) { + this(amount, true); + } + + public DamageTargetEffect(DynamicValue amount, boolean preventable) { + super(Outcome.Damage); + this.amount = amount; + this.preventable = preventable; + } + public int getAmount() { - return amount; + if (amount instanceof StaticValue) { + return amount.calculate(null, null); + } else { + return 0; + } } public DamageTargetEffect(final DamageTargetEffect effect) { super(effect); - this.amount = effect.amount; + this.amount = effect.amount.clone(); this.preventable = effect.preventable; } @@ -73,12 +87,12 @@ public class DamageTargetEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - permanent.damage(amount, source.getSourceId(), game, preventable, false); + permanent.damage(amount.calculate(game, source), source.getSourceId(), game, preventable, false); return true; } Player player = game.getPlayer(source.getFirstTarget()); if (player != null) { - player.damage(amount, source.getSourceId(), game, false, preventable); + player.damage(amount.calculate(game, source), source.getSourceId(), game, false, preventable); return true; } return false; @@ -87,7 +101,7 @@ public class DamageTargetEffect extends OneShotEffect { @Override public String getText(Ability source) { StringBuilder sb = new StringBuilder(); - sb.append("{source} deals ").append(Integer.toString(amount)).append(" damage to target "); + sb.append("{source} deals ").append(amount).append(" damage to target "); sb.append(source.getTargets().get(0).getTargetName()); if (!preventable) sb.append(". The damage can't be prevented"); diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index e3619bf721..4e8e6ee7f3 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -214,6 +214,7 @@ $wizardstous{'MBS'} = 'MBS'; my %knownSets; $knownSets{'ARB'} = 'alarareborn'; +$knownSets{'APC'} = 'apocalypse'; $knownSets{'CON'} = 'conflux'; $knownSets{'DST'} = 'darksteel'; $knownSets{'EVE'} = 'eventide';