From 1ec6e139e1fa0339ab906fb46ff45757a5bb444b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:01:06 +0200 Subject: [PATCH 001/375] Some improvements to deck text import (ignore more group names also on other order, ignore x after number e.g. 2x = 2). --- .../cards/decks/importer/TxtDeckImporter.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java index 20a0a050b4e..0c0589baf73 100644 --- a/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java +++ b/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.cards.decks.importer; import java.util.Arrays; @@ -48,13 +47,13 @@ import mage.constants.SetType; */ public class TxtDeckImporter extends DeckImporter { - public static final String[] SET_VALUES = new String[] { "lands", "creatures", "planeswalkers","other spells","sideboard cards" }; + public static final String[] SET_VALUES = new String[]{"lands", "creatures", "planeswalkers", "other spells", "sideboard cards", + "Instant", "Land", "Enchantment", "Artifact", "Sorcery", "Planeswalker", "Creature"}; public static final Set IGNORE_NAMES = new HashSet<>(Arrays.asList(SET_VALUES)); - + private boolean sideboard = false; private int emptyLinesInARow = 0; - @Override protected void readLine(String line, DeckCardLists deckList) { if (line.startsWith("//")) { @@ -75,22 +74,25 @@ public class TxtDeckImporter extends DeckImporter { return; } - line = line.replace("\t"," "); // changing tabs to blanks as delimiter + line = line.replace("\t", " "); // changing tabs to blanks as delimiter int delim = line.indexOf(' '); if (delim < 0) { return; } String lineNum = line.substring(0, delim).trim(); - String lineName = line.substring(delim).replace("’","\'").trim(); - lineName = lineName.replace("&","//").replace("Æ", "AE").replace("ö", "ö"); + String lineName = line.substring(delim).replace("’", "\'").trim(); + lineName = lineName.replace("&", "//").replace("Æ", "AE").replace("ö", "ö"); if (lineName.contains("//") && !lineName.contains(" // ")) { - lineName = lineName.replace("//"," // "); + lineName = lineName.replace("//", " // "); } - if (IGNORE_NAMES.contains(lineName)) { + if (lineName.contains(" / ")) { + lineName = lineName.replace(" / ", " // "); + } + if (IGNORE_NAMES.contains(lineName) || IGNORE_NAMES.contains(lineNum)) { return; } try { - int num = Integer.parseInt(lineNum); + int num = Integer.parseInt(lineNum.replaceAll("\\D+", "")); List cards = CardRepository.instance.findCards(lineName); if (cards.isEmpty()) { sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append("\n"); @@ -99,11 +101,11 @@ public class TxtDeckImporter extends DeckImporter { Date lastReleaseDate = new GregorianCalendar(1900, 1, 1).getTime(); Date lastExpansionDate = new GregorianCalendar(1900, 1, 1).getTime(); CardInfo cardToUse = null; - for (CardInfo cardinfo: cards) { + for (CardInfo cardinfo : cards) { ExpansionInfo set = ExpansionRepository.instance.getSetByCode(cardinfo.getSetCode()); if (set != null) { - if ((set.getType().equals(SetType.EXPANSION) || set.getType().equals(SetType.CORE)) && - (lastExpansionDate == null || set.getReleaseDate().after(lastExpansionDate))) { + if ((set.getType().equals(SetType.EXPANSION) || set.getType().equals(SetType.CORE)) + && (lastExpansionDate == null || set.getReleaseDate().after(lastExpansionDate))) { cardToUse = cardinfo; lastExpansionDate = set.getReleaseDate(); } @@ -118,9 +120,9 @@ public class TxtDeckImporter extends DeckImporter { } for (int i = 0; i < num; i++) { if (!sideboard) { - deckList.getCards().add(new DeckCardInfo(cardToUse.getName(),cardToUse.getCardNumber(), cardToUse.getSetCode())); + deckList.getCards().add(new DeckCardInfo(cardToUse.getName(), cardToUse.getCardNumber(), cardToUse.getSetCode())); } else { - deckList.getSideboard().add(new DeckCardInfo(cardToUse.getName(),cardToUse.getCardNumber(), cardToUse.getSetCode())); + deckList.getSideboard().add(new DeckCardInfo(cardToUse.getName(), cardToUse.getCardNumber(), cardToUse.getSetCode())); } } } From 23d7713498b720ea950dc63d4be46df24fc9b1f0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:01:40 +0200 Subject: [PATCH 002/375] Fixed possible npe during combat. --- Mage/src/mage/game/combat/Combat.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Mage/src/mage/game/combat/Combat.java b/Mage/src/mage/game/combat/Combat.java index 2c61cdbf047..4cc23e31414 100644 --- a/Mage/src/mage/game/combat/Combat.java +++ b/Mage/src/mage/game/combat/Combat.java @@ -166,13 +166,13 @@ public class Combat implements Serializable, Copyable { public void checkForRemoveFromCombat(Game game) { for (UUID creatureId : getAttackers()) { Permanent creature = game.getPermanent(creatureId); - if (!creature.getCardType().contains(CardType.CREATURE)) { + if (creature != null && !creature.getCardType().contains(CardType.CREATURE)) { removeFromCombat(creatureId, game, true); } } for (UUID creatureId : getBlockers()) { Permanent creature = game.getPermanent(creatureId); - if (!creature.getCardType().contains(CardType.CREATURE)) { + if (creature != null && !creature.getCardType().contains(CardType.CREATURE)) { removeFromCombat(creatureId, game, true); } } @@ -246,7 +246,6 @@ public class Combat implements Serializable, Copyable { } public void resumeSelectAttackers(Game game) { - Player player = game.getPlayer(attackerId); for (CombatGroup group : groups) { for (UUID attacker : group.getAttackers()) { game.fireEvent(GameEvent.getEvent(GameEvent.EventType.ATTACKER_DECLARED, group.defenderId, attacker, attackerId)); @@ -254,7 +253,10 @@ public class Combat implements Serializable, Copyable { } game.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_ATTACKERS, attackerId, attackerId)); if (!game.isSimulation()) { - game.informPlayers(new StringBuilder(player.getLogName()).append(" attacks with ").append(groups.size()).append(groups.size() == 1 ? " creature" : " creatures").toString()); + Player player = game.getPlayer(attackerId); + if (player != null) { + game.informPlayers(player.getLogName() + " attacks with " + groups.size() + (groups.size() == 1 ? " creature" : " creatures")); + } } } From ae38a67c5c2b444d0bb3e4feaca4d69b5bdd638a Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 12 Jul 2015 10:01:53 +0300 Subject: [PATCH 003/375] Implement cards: Bind, Pouncing Kavu, Vicious Kavu, and Vodalian Serpent --- Mage.Sets/src/mage/sets/invasion/Bind.java | 64 +++++++++++++++ .../src/mage/sets/invasion/PouncingKavu.java | 80 +++++++++++++++++++ .../src/mage/sets/invasion/ViciousKavu.java | 65 +++++++++++++++ .../mage/sets/invasion/VodalianSerpent.java | 76 ++++++++++++++++++ 4 files changed, 285 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/invasion/Bind.java create mode 100644 Mage.Sets/src/mage/sets/invasion/PouncingKavu.java create mode 100644 Mage.Sets/src/mage/sets/invasion/ViciousKavu.java create mode 100644 Mage.Sets/src/mage/sets/invasion/VodalianSerpent.java diff --git a/Mage.Sets/src/mage/sets/invasion/Bind.java b/Mage.Sets/src/mage/sets/invasion/Bind.java new file mode 100644 index 00000000000..07372a3655f --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/Bind.java @@ -0,0 +1,64 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetActivatedAbility; + +/** + * + * @author LoneFox + + */ +public class Bind extends CardImpl { + + public Bind(UUID ownerId) { + super(ownerId, 182, "Bind", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{G}"); + this.expansionSetCode = "INV"; + + // Counter target activated ability. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetActivatedAbility()); + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public Bind(final Bind card) { + super(card); + } + + @Override + public Bind copy() { + return new Bind(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/PouncingKavu.java b/Mage.Sets/src/mage/sets/invasion/PouncingKavu.java new file mode 100644 index 00000000000..966430d562d --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/PouncingKavu.java @@ -0,0 +1,80 @@ +/* + * 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.invasion; + + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.counters.CounterType; + +/** + * + * @author LoneFox + + */ +public class PouncingKavu extends CardImpl { + + public PouncingKavu(UUID ownerId) { + super(ownerId, 158, "Pouncing Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Kavu"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Kicker {2}{R} + this.addAbility(new KickerAbility("{2}{R}")); + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + // If Pouncing Kavu was kicked, it enters the battlefield with two +1/+1 counters on it and with haste. + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), + KickedCondition.getInstance(), true, "If {this} was kicked, it enters the battlefield with two +1/+1 counters on it and with haste.", ""); + ability.addEffect(new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield)); + this.addAbility(ability); + } + + public PouncingKavu(final PouncingKavu card) { + super(card); + } + + @Override + public PouncingKavu copy() { + return new PouncingKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/ViciousKavu.java b/Mage.Sets/src/mage/sets/invasion/ViciousKavu.java new file mode 100644 index 00000000000..e6bb20543db --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/ViciousKavu.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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + + */ +public class ViciousKavu extends CardImpl { + + public ViciousKavu(UUID ownerId) { + super(ownerId, 284, "Vicious Kavu", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Kavu"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Vicious Kavu attacks, it gets +2/+0 until end of turn. + this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn), false)); + } + + public ViciousKavu(final ViciousKavu card) { + super(card); + } + + @Override + public ViciousKavu copy() { + return new ViciousKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/VodalianSerpent.java b/Mage.Sets/src/mage/sets/invasion/VodalianSerpent.java new file mode 100644 index 00000000000..02703289141 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/VodalianSerpent.java @@ -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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author LoneFox + + */ +public class VodalianSerpent extends CardImpl { + + public VodalianSerpent(UUID ownerId) { + super(ownerId, 86, "Vodalian Serpent", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "INV"; + this.subtype.add("Serpent"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Kicker {2} + this.addAbility(new KickerAbility("{2}")); + // Vodalian Serpent can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + // If Vodalian Serpent was kicked, it enters the battlefield with four +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(4)), + KickedCondition.getInstance(), true, "If {this} was kicked, it enters the battlefield with four +1/+1 counters on it.", "")); + } + + public VodalianSerpent(final VodalianSerpent card) { + super(card); + } + + @Override + public VodalianSerpent copy() { + return new VodalianSerpent(this); + } +} From c9cc7d792025e7c133f0f6fe00ef828f09b7bf69 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:03:04 +0200 Subject: [PATCH 004/375] * Zurgo Helmsmasher - Fixed a bug that could happen if Zurgo is used as commander. --- .../Commander/Zurgo Helmsmasher RWB.dck | 90 +++++++++++++++++++ Mage/src/mage/game/command/Commander.java | 90 +++++++++---------- 2 files changed, 131 insertions(+), 49 deletions(-) create mode 100644 Mage.Client/release/sample-decks/Commander/Zurgo Helmsmasher RWB.dck diff --git a/Mage.Client/release/sample-decks/Commander/Zurgo Helmsmasher RWB.dck b/Mage.Client/release/sample-decks/Commander/Zurgo Helmsmasher RWB.dck new file mode 100644 index 00000000000..2e5fce7b615 --- /dev/null +++ b/Mage.Client/release/sample-decks/Commander/Zurgo Helmsmasher RWB.dck @@ -0,0 +1,90 @@ +1 [M15:36] Spectra Ward +1 [MBS:43] Go for the Throat +1 [8ED:204] Obliterate +1 [BNG:4] Archetype of Courage +1 [EVE:176] Fetid Heath +1 [AVR:6] Avacyn, Angel of Hope +1 [10E:61] Wrath of God +1 [CHK:283] Shizo, Death's Storehouse +1 [M11:221] Whispersilk Cloak +1 [PLC:85] Damnation +1 [M15:110] Ob Nixilis, Unshackled +1 [M15:100] In Garruk's Wake +1 [M14:210] Fireshrieker +1 [AVR:209] Gisela, Blade of Goldnight +1 [M12:160] Warstorm Surge +1 [BNG:93] Fall of the Hammer +1 [TSB:117] Arena +5 [ORI:261] Swamp +1 [GTC:17] Holy Mantle +1 [M15:225] Phyrexian Revoker +1 [TOR:139] Cabal Coffers +1 [NPH:9] Elesh Norn, Grand Cenobite +1 [BNG:58] Archetype of Finality +1 [MBS:39] Black Sun's Zenith +1 [M12:98] Grave Titan +1 [GTC:245] Sacred Foundry +1 [ALA:217] Quietus Spike +1 [WWK:20] Stoneforge Mystic +1 [M12:12] Day of Judgment +1 [ULG:63] Phyrexian Reclamation +1 [GTC:242] Godless Shrine +4 [ORI:265] Mountain +1 [GTC:6] Blind Obedience +1 [M14:1] Ajani, Caller of the Pride +1 [M12:109] Sorin Markov +1 [M12:147] Inferno Titan +1 [ICE:278] Swords to Plowshares +1 [CMD:269] Command Tower +1 [M12:222] Worldslayer +1 [M15:133] Burning Anger +1 [ORI:250] Rogue's Passage +1 [10E:359] Sulfurous Springs +1 [M14:209] Elixir of Immortality +1 [GTC:61] Crypt Ghast +1 [BNG:151] Mogis, God of Slaughter +4 [ORI:253] Plains +1 [M12:39] Sun Titan +1 [CHK:268] Sensei's Divining Top +1 [SOM:25] True Conviction +1 [THS:187] Ashen Rider +1 [9ED:152] Phyrexian Arena +1 [AVR:86] Blood Artist +1 [SHM:278] Reflecting Pool +1 [SHM:272] Graven Cairns +1 [M13:222] Dragonskull Summit +1 [THS:227] Temple of Silence +1 [THS:228] Temple of Triumph +1 [3ED:274] Sol Ring +1 [MOR:24] Stonehewer Giant +1 [NPH:73] Sheoldred, Whispering One +1 [C13:310] Opal Palace +1 [CON:15] Path to Exile +1 [ZEN:208] Trailblazer's Boots +1 [ISD:242] Isolated Chapel +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [ZEN:203] Grappling Hook +1 [ORI:244] Battlefield Forge +1 [ORI:245] Caves of Koilos +1 [3ED:13] Demonic Tutor +1 [GTC:143] Aurelia, the Warleader +1 [AVR:36] Silverblade Paladin +1 [THS:85] Erebos, God of the Dead +1 [LRW:3] Austere Command +1 [ULG:14] Mother of Runes +1 [ALA:154] Ajani Vengeant +1 [ZEN:131] Hellkite Charger +1 [THS:219] Prowler's Helm +1 [GPT:122] Mortify +1 [DKA:158] Vault of the Archangel +1 [RTR:238] Blood Crypt +1 [ORI:21] Knight of the White Orchid +1 [MBS:104] Darksteel Plate +1 [MRD:199] Lightning Greaves +1 [DGM:135] Wear // Tear +1 [5ED:246] Jokulhaups +1 [BNG:88] Archetype of Aggression +1 [JOU:93] Dictate of the Twin Gods +1 [GTC:177] Merciless Eviction +1 [CNS:35] Scourge of the Throne +SB: 1 [KTK:214] Zurgo Helmsmasher diff --git a/Mage/src/mage/game/command/Commander.java b/Mage/src/mage/game/command/Commander.java index f3265532cfb..58793919e65 100644 --- a/Mage/src/mage/game/command/Commander.java +++ b/Mage/src/mage/game/command/Commander.java @@ -1,32 +1,34 @@ /* -* 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. -*/ + * 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.game.command; +import java.util.List; +import java.util.UUID; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Abilities; @@ -39,24 +41,14 @@ import mage.abilities.costs.mana.ManaCosts; import mage.cards.Card; import mage.constants.CardType; import mage.game.Game; - -import java.util.List; -import java.util.UUID; import mage.util.GameLog; -/** - * - * @author Plopman - */ - - -public class Commander implements CommandObject{ +public class Commander implements CommandObject { private final Card card; private final Abilities abilites = new AbilitiesImpl<>(); - - public Commander(Card card){ + public Commander(Card card) { this.card = card; abilites.add(new CastCommanderAbility(card)); for (Ability ability : card.getAbilities()) { @@ -66,15 +58,15 @@ public class Commander implements CommandObject{ } } } - + private Commander(Commander copy) { this.card = copy.card; } - - public Card getCard(){ + + public Card getCard() { return card; } - + @Override public UUID getSourceId() { return card.getId(); @@ -101,7 +93,7 @@ public class Commander implements CommandObject{ @Override public String getIdName() { - return card.getName() + " ["+card.getId().toString().substring(0,3) +"]"; + return card.getName() + " [" + card.getId().toString().substring(0, 3) + "]"; } @Override @@ -111,7 +103,7 @@ public class Commander implements CommandObject{ @Override public void setName(String name) { - + } @Override @@ -145,7 +137,7 @@ public class Commander implements CommandObject{ return true; } Abilities otherAbilities = game.getState().getAllOtherAbilities(getId()); - return otherAbilities != null && otherAbilities.containsKey(abilityId); + return otherAbilities != null && otherAbilities.containsKey(abilityId); } @Override @@ -201,17 +193,17 @@ public class Commander implements CommandObject{ @Override public int getZoneChangeCounter(Game game) { - throw new UnsupportedOperationException("Unsupported operation"); + return card.getZoneChangeCounter(game); } @Override public void updateZoneChangeCounter(Game game) { - throw new UnsupportedOperationException("Unsupported operation"); + card.updateZoneChangeCounter(game); } @Override public void setZoneChangeCounter(int value, Game game) { - throw new UnsupportedOperationException("Unsupported operation"); + card.setZoneChangeCounter(value, game); } - + } From 4dc70048d5c3e1cfc700c1b40a57d583d2b33105 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:06:31 +0200 Subject: [PATCH 005/375] * AI - FIxed a bug that prevented AI from using modes other than the first of modal spells. --- Mage/src/mage/players/PlayerImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 052ab43222f..c923bc63a27 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2608,8 +2608,10 @@ public abstract class PlayerImpl implements Player, Serializable { } private void addModeOptions(List options, Ability option, Game game) { + // TODO: Support modal spells with more than one selectable mode for (Mode mode : option.getModes().values()) { Ability newOption = option.copy(); + newOption.getModes().getSelectedModes().clear(); newOption.getModes().setMode(mode); if (newOption.getTargets().getUnchosen().size() > 0) { if (newOption.getManaCosts().getVariableCosts().size() > 0) { From 0e3d4b335a66c902430a62c87b7966f9119e8da7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:11:13 +0200 Subject: [PATCH 006/375] Some fixes/improvements to generation of available mana. --- .../mage/test/AI/basic/CastCreaturesTest.java | 87 +++++- .../test/AI/basic/CastDestroySpellsTest.java | 68 +++++ .../org/mage/test/utils/ManaOptionsTest.java | 113 ++++++-- Mage/src/mage/Mana.java | 148 +++++----- .../mage/abilities/ActivatedAbilityImpl.java | 100 ++++--- Mage/src/mage/abilities/SpellAbility.java | 71 +++-- .../abilities/costs/mana/HybridManaCost.java | 10 + .../mage/abilities/costs/mana/ManaCost.java | 66 +++-- .../abilities/costs/mana/ManaCostImpl.java | 72 ++--- .../mage/abilities/costs/mana/ManaCosts.java | 1 + .../abilities/costs/mana/ManaCostsImpl.java | 9 + .../costs/mana/MonoHybridManaCost.java | 10 + .../CommanderColorIdentityManaAbility.java | 12 +- Mage/src/mage/abilities/mana/ManaOptions.java | 261 ++++++++++++------ 14 files changed, 674 insertions(+), 354 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/AI/basic/CastDestroySpellsTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java index f65e7655177..d14393676f2 100644 --- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java @@ -29,7 +29,6 @@ package org.mage.test.AI.basic; import mage.constants.PhaseStep; import mage.constants.Zone; -import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBaseAI; @@ -52,7 +51,7 @@ public class CastCreaturesTest extends CardTestPlayerBaseAI { assertPermanentCount(playerA, "Silvercoat Lion", 1); } - + @Test public void testSimpleCast2() { addCard(Zone.HAND, playerA, "Silvercoat Lion"); @@ -65,9 +64,8 @@ public class CastCreaturesTest extends CardTestPlayerBaseAI { assertPermanentCount(playerA, "Silvercoat Lion", 2); } - + @Test - @Ignore // AI should cast Myr Enforcer -> Check why it does not public void testSimpleCast3() { // Affinity for artifacts (This spell costs less to cast for each artifact you control.) addCard(Zone.HAND, playerA, "Myr Enforcer"); @@ -80,5 +78,84 @@ public class CastCreaturesTest extends CardTestPlayerBaseAI { execute(); assertPermanentCount(playerA, "Myr Enforcer", 1); - } + } + + @Test + public void testSimpleCast4() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); + addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + addCard(Zone.HAND, playerA, "Plains"); + skipInitShuffling(); + + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + + addCard(Zone.HAND, playerA, "Fireshrieker"); + addCard(Zone.HAND, playerA, "Blazing Specter"); // {2}{R}{B} + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Plains", 2); + assertPermanentCount(playerA, "Fireshrieker", 0); + assertPermanentCount(playerA, "Blazing Specter", 1); + } + + @Test + public void testCast4Creature() { + addCard(Zone.LIBRARY, playerA, "Swamp", 1); + addCard(Zone.LIBRARY, playerA, "Mountain", 1); + addCard(Zone.LIBRARY, playerA, "Island", 1); + addCard(Zone.HAND, playerA, "Plains"); + skipInitShuffling(); + + addCard(Zone.HAND, playerA, "Loyal Sentry"); // {W} 1/1 + addCard(Zone.HAND, playerA, "Silvercoat Lion"); // {1}{W} 2/2 + addCard(Zone.HAND, playerA, "Rootwater Commando"); // {2}{U} 2/2 + addCard(Zone.HAND, playerA, "Bog Wraith"); // {3}{B} 3/3 + + setStopAt(7, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Plains", 1); + assertPermanentCount(playerA, "Mountain", 1); + assertPermanentCount(playerA, "Island", 1); + assertPermanentCount(playerA, "Swamp", 1); + + // assertLife(playerB, 11); // 1 + 1+2 + 1+2+2 = + assertPermanentCount(playerA, "Loyal Sentry", 1); + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerA, "Rootwater Commando", 1); + assertPermanentCount(playerA, "Bog Wraith", 1); + + } + + @Test + public void testCast4Creature2() { + addCard(Zone.LIBRARY, playerA, "Swamp", 1); + addCard(Zone.LIBRARY, playerA, "Swamp", 1); + addCard(Zone.LIBRARY, playerA, "Plains", 1); + + addCard(Zone.HAND, playerA, "Island", 1); + addCard(Zone.HAND, playerA, "Plains"); + skipInitShuffling(); + + addCard(Zone.HAND, playerA, "Loyal Sentry"); // {W} 1/1 + addCard(Zone.HAND, playerA, "Steadfast Guard"); // {W}{W} 2/2 + addCard(Zone.HAND, playerA, "Rootwater Commando"); // {2}{U} 2/2 + addCard(Zone.HAND, playerA, "Bog Wraith"); // {3}{B} 3/3 + + setStopAt(7, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Plains", 2); + assertPermanentCount(playerA, "Island", 1); + assertPermanentCount(playerA, "Swamp", 1); + + // assertLife(playerB, 11); // 1 + 1+2 + 1+2+2 = + assertPermanentCount(playerA, "Loyal Sentry", 1); + assertPermanentCount(playerA, "Steadfast Guard", 1); + assertPermanentCount(playerA, "Rootwater Commando", 1); + assertPermanentCount(playerA, "Bog Wraith", 1); + + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastDestroySpellsTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastDestroySpellsTest.java new file mode 100644 index 00000000000..458bd5012f9 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastDestroySpellsTest.java @@ -0,0 +1,68 @@ +/* + * 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 org.mage.test.AI.basic; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBaseAI; + +/** + * + * @author LevelX2 + */ +public class CastDestroySpellsTest extends CardTestPlayerBaseAI { + + /** + * + * + */ + @Test + public void testOrzhovCharm() { + // Choose one - + // Return target creature you control and all Auras you control attached to it to their owner's hand; + // or destroy target creature and you lose life equal to its toughness; + // or return target creature card with converted mana cost 1 or less from your graveyard to the battlefield. + addCard(Zone.HAND, playerA, "Orzhov Charm"); // {W}{B} + + addCard(Zone.BATTLEFIELD, playerA, "Fetid Heath", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + + // Cycling abilities you activate cost you up to {2} less to activate. + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertLife(playerA, 18); + + assertGraveyardCount(playerA, "Orzhov Charm", 1); + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java index b1e78318af3..71a7eed710e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java @@ -35,8 +35,9 @@ import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** - * This test checks if the calculated possible mana options are correct related to the given mana sources available. - * + * This test checks if the calculated possible mana options are correct related + * to the given mana sources available. + * * @author LevelX2 */ public class ManaOptionsTest extends CardTestPlayerBase { @@ -45,12 +46,12 @@ public class ManaOptionsTest extends CardTestPlayerBase { public void testSimpleMana() { addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions)); } @@ -62,12 +63,12 @@ public class ManaOptionsTest extends CardTestPlayerBase { public void testTinderFarm() { addCard(Zone.BATTLEFIELD, playerA, "Tinder Farm", 3); - setStopAt(2, PhaseStep. UPKEEP); + setStopAt(2, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",4, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 4, manaOptions.size()); Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions)); Assert.assertEquals("{R}{G}{G}{W}", getManaOption(1, manaOptions)); Assert.assertEquals("{R}{R}{G}{W}{W}", getManaOption(2, manaOptions)); @@ -82,12 +83,12 @@ public class ManaOptionsTest extends CardTestPlayerBase { public void testAdarkarWastes() { addCard(Zone.BATTLEFIELD, playerA, "Adarkar Wastes", 3); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",4, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 4, manaOptions.size()); Assert.assertEquals("{W}{W}{W}", getManaOption(0, manaOptions)); Assert.assertEquals("{U}{W}{W}", getManaOption(1, manaOptions)); Assert.assertEquals("{U}{U}{W}", getManaOption(2, manaOptions)); @@ -95,7 +96,6 @@ public class ManaOptionsTest extends CardTestPlayerBase { } - // Chromatic Sphere // {1}, {T}, Sacrifice Chromatic Sphere: Add one mana of any color to your mana pool. Draw a card. @Test @@ -103,12 +103,12 @@ public class ManaOptionsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); addCard(Zone.BATTLEFIELD, playerA, "Chromatic Sphere", 2); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); Assert.assertEquals("{Any}{Any}", getManaOption(0, manaOptions)); } @@ -120,12 +120,12 @@ public class ManaOptionsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); addCard(Zone.BATTLEFIELD, playerA, "Orochi Leafcaller", 1); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); Assert.assertEquals("{W}{W}{Any}{Any}", getManaOption(0, manaOptions)); } @@ -138,14 +138,15 @@ public class ManaOptionsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); addCard(Zone.BATTLEFIELD, playerA, "Crystal Quarry", 1); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); Assert.assertEquals("{1}{G}{G}{W}{W}", getManaOption(0, manaOptions)); } + // Crystal Quarry // {T}: {1} Add to your mana pool. // {5}, {T}: Add {W}{U}{B}{R}{G} to your mana pool. @@ -155,12 +156,12 @@ public class ManaOptionsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); addCard(Zone.BATTLEFIELD, playerA, "Crystal Quarry", 1); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",2, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 2, manaOptions.size()); Assert.assertEquals("{1}{G}{G}{G}{W}{W}", getManaOption(0, manaOptions)); Assert.assertEquals("{R}{G}{U}{W}{B}", getManaOption(1, manaOptions)); } @@ -174,15 +175,15 @@ public class ManaOptionsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); addCard(Zone.BATTLEFIELD, playerA, "Nykthos, Shrine to Nyx", 1); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); Assert.assertEquals("{G}{G}{G}{G}{G}", getManaOption(0, manaOptions)); } - + @Test public void testNykthos2() { addCard(Zone.BATTLEFIELD, playerA, "Sedge Scorpion", 4); @@ -190,12 +191,12 @@ public class ManaOptionsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); addCard(Zone.BATTLEFIELD, playerA, "Nykthos, Shrine to Nyx", 1); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",2, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 2, manaOptions.size()); Assert.assertEquals("{G}{G}{G}{G}{G}", getManaOption(0, manaOptions)); Assert.assertEquals("{R}{R}{R}{G}", getManaOption(1, manaOptions)); } @@ -206,36 +207,92 @@ public class ManaOptionsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); addCard(Zone.BATTLEFIELD, playerA, "Nykthos, Shrine to Nyx", 1); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); Assert.assertEquals("{1}{G}{Any}", getManaOption(0, manaOptions)); } @Test public void testMix1() { + // {1}, {T}, Sacrifice Chromatic Star: Add one mana of any color to your mana pool. + // When Chromatic Star is put into a graveyard from the battlefield, draw a card. addCard(Zone.BATTLEFIELD, playerA, "Chromatic Star", 1); + // {1}, {T}, Sacrifice Chromatic Sphere: Add one mana of any color to your mana pool. Draw a card. addCard(Zone.BATTLEFIELD, playerA, "Chromatic Sphere", 1); + // {T}: Add {1} to your mana pool. If you control an Urza's Mine and an Urza's Power-Plant, add {3} to your mana pool instead. addCard(Zone.BATTLEFIELD, playerA, "Urza's Tower", 1); + // {T}: Add {1} to your mana pool. + // {T}: Add {R} or {G} to your mana pool. Each opponent gains 1 life. addCard(Zone.BATTLEFIELD, playerA, "Grove of the Burnwillows", 1); - setStopAt(1, PhaseStep. UPKEEP); + setStopAt(1, PhaseStep.UPKEEP); execute(); ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); - Assert.assertEquals("mana variations don't fit",2, manaOptions.size()); + Assert.assertEquals("mana variations don't fit", 2, manaOptions.size()); Assert.assertEquals("{Any}{Any}", getManaOption(0, manaOptions)); Assert.assertEquals("{Any}{Any}", getManaOption(1, manaOptions)); } - private String getManaOption(int index, ManaOptions manaOptions) { + @Test + public void testFetidHeath() { + addCard(Zone.BATTLEFIELD, playerA, "Fetid Heath", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit", 3, manaOptions.size()); + Assert.assertEquals("{W}{W}", getManaOption(0, manaOptions)); + Assert.assertEquals("{W}{B}", getManaOption(1, manaOptions)); + Assert.assertEquals("{B}{B}", getManaOption(2, manaOptions)); + } + + /** + * Don't use mana sources that only reduce available mana + */ + @Test + public void testCabalCoffers1() { + addCard(Zone.BATTLEFIELD, playerA, "Cabal Coffers", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); + Assert.assertEquals("{W}{B}", getManaOption(0, manaOptions)); + } + + @Test + public void testCabalCoffers2() { + addCard(Zone.BATTLEFIELD, playerA, "Cabal Coffers", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit", 2, manaOptions.size()); + Assert.assertEquals("{W}{B}{B}", getManaOption(0, manaOptions)); + Assert.assertEquals("{B}{B}{B}", getManaOption(1, manaOptions)); + } + + private String getManaOption(int index, ManaOptions manaOptions) { if (manaOptions.size() < index + 1) { return ""; } return manaOptions.get(index).toString(); } -} \ No newline at end of file +} diff --git a/Mage/src/mage/Mana.java b/Mage/src/mage/Mana.java index 5708e081e5b..4985b1d7047 100644 --- a/Mage/src/mage/Mana.java +++ b/Mage/src/mage/Mana.java @@ -1,36 +1,36 @@ /* -* 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. -*/ - + * 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; import java.io.Serializable; import mage.constants.ColoredManaSymbol; import mage.constants.ManaType; +import static mage.constants.ManaType.COLORLESS; import mage.filter.FilterMana; import mage.util.Copyable; import mage.util.ThreadLocalStringBuilder; @@ -57,7 +57,8 @@ public class Mana implements Comparable, Serializable, Copyable { public static final Mana BlackMana = BlackMana(1); public static final Mana ColorlessMana = ColorlessMana(1); - public Mana() {} + public Mana() { + } public Mana(final Mana mana) { this.red = mana.red; @@ -212,11 +213,10 @@ public class Mana implements Comparable, Serializable, Copyable { } } - public int count() { return red + green + blue + white + black + colorless + any; } - + public int countColored() { return red + green + blue + white + black + any; } @@ -283,9 +283,9 @@ public class Mana implements Comparable, Serializable, Copyable { } return sbMana.toString(); } - + private static final transient ThreadLocalStringBuilder threadLocalBuilder = new ThreadLocalStringBuilder(10); - + @Override public Mana copy() { return new Mana(this); @@ -342,38 +342,38 @@ public class Mana implements Comparable, Serializable, Copyable { Mana compare = avail.copy(); compare.subtract(this); if (compare.getRed() < 0 && compare.getAny() > 0) { - int diff = Math.min( compare.getAny(), Math.abs(compare.getRed())); + int diff = Math.min(compare.getAny(), Math.abs(compare.getRed())); compare.setAny(compare.getAny() - diff); compare.setRed(compare.getRed() + diff); } if (compare.getGreen() < 0 && compare.getAny() > 0) { - int diff = Math.min( compare.getAny(), Math.abs(compare.getGreen())); + int diff = Math.min(compare.getAny(), Math.abs(compare.getGreen())); compare.setAny(compare.getAny() - diff); compare.setGreen(compare.getGreen() + diff); } if (compare.getBlue() < 0 && compare.getAny() > 0) { - int diff = Math.min( compare.getAny(), Math.abs(compare.getBlue())); + int diff = Math.min(compare.getAny(), Math.abs(compare.getBlue())); compare.setAny(compare.getAny() - diff); compare.setBlue(compare.getBlue() + diff); } if (compare.getBlack() < 0 && compare.getAny() > 0) { - int diff = Math.min( compare.getAny(), Math.abs(compare.getBlack())); + int diff = Math.min(compare.getAny(), Math.abs(compare.getBlack())); compare.setAny(compare.getAny() - diff); compare.setBlack(compare.getBlack() + diff); } if (compare.getWhite() < 0 && compare.getAny() > 0) { - int diff = Math.min( compare.getAny(), Math.abs(compare.getWhite())); + int diff = Math.min(compare.getAny(), Math.abs(compare.getWhite())); compare.setAny(compare.getAny() - diff); compare.setWhite(compare.getWhite() + diff); } if (compare.getColorless() < 0) { int remaining = 0; - remaining += Math.min(0,compare.getRed()); - remaining += Math.min(0,compare.getWhite()); - remaining += Math.min(0,compare.getGreen()); - remaining += Math.min(0,compare.getBlack()); - remaining += Math.min(0,compare.getBlue()); - remaining += Math.min(0,compare.getAny()); + remaining += Math.min(0, compare.getRed()); + remaining += Math.min(0, compare.getWhite()); + remaining += Math.min(0, compare.getGreen()); + remaining += Math.min(0, compare.getBlack()); + remaining += Math.min(0, compare.getBlue()); + remaining += Math.min(0, compare.getAny()); if (remaining > 0) { int diff = Math.min(remaining, Math.abs(compare.getColorless())); compare.setColorless(compare.getColorless() + diff); @@ -510,7 +510,7 @@ public class Mana implements Comparable, Serializable, Copyable { } public int get(ManaType manaType) { - switch(manaType) { + switch (manaType) { case BLACK: return black; case BLUE: @@ -528,7 +528,7 @@ public class Mana implements Comparable, Serializable, Copyable { } public void set(ManaType manaType, int amount) { - switch(manaType) { + switch (manaType) { case BLACK: black = amount; break; @@ -569,39 +569,38 @@ public class Mana implements Comparable, Serializable, Copyable { } public boolean equalManaValue(Mana mana) { - return this.any == mana.any && - this.red == mana.red && - this.green == mana.green && - this.white == mana.white && - this.blue == mana.blue && - this.black == mana.black && - this.colorless == mana.colorless; + return this.any == mana.any + && this.red == mana.red + && this.green == mana.green + && this.white == mana.white + && this.blue == mana.blue + && this.black == mana.black + && this.colorless == mana.colorless; } /** - * Don't takes any mana into account to be usable in calculating available mana + * Don't takes any mana into account to be usable in calculating available + * mana + * * @param mana - * @return + * @return */ public boolean includesMana(Mana mana) { - return this.green >= mana.green && - this.blue >= mana.blue && - this.white >= mana.white && - this.black >= mana.black && - this.red >= mana.red && - ( - this.colorless >= mana.colorless || - this.countColored() >= mana.countColored() + mana.colorless - ); + return this.green >= mana.green + && this.blue >= mana.blue + && this.white >= mana.white + && this.black >= mana.black + && this.red >= mana.red + && (this.colorless >= mana.colorless + || this.countColored() >= mana.countColored() + mana.colorless); } /** - * Returns the mana that is more colored but does not contain - * one less mana in any color but colorless - * if you call with {1}{W}{R} and {G}{W}{R} you get back {G}{W}{R} - * if you call with {G}{W}{R} and {G}{W}{R} you get back {G}{W}{R} - * if you call with {G}{W}{B} and {G}{W}{R} you get back null + * Returns the mana that is more colored but does not contain one less mana + * in any color but colorless if you call with {1}{W}{R} and {G}{W}{R} you + * get back {G}{W}{R} if you call with {G}{W}{R} and {G}{W}{R} you get back + * {G}{W}{R} if you call with {G}{W}{B} and {G}{W}{R} you get back null * * @param mana1 * @param mana2 @@ -617,13 +616,12 @@ public class Mana implements Comparable, Serializable, Copyable { moreMana = mana1; lessMana = mana2; } - if (lessMana.getWhite() > moreMana.getWhite() || - lessMana.getRed() > moreMana.getRed() || - lessMana.getGreen() > moreMana.getGreen() || - lessMana.getBlue() > moreMana.getBlue() || - lessMana.getBlack() > moreMana.getBlack() || - lessMana.getAny() > moreMana.getAny() - ) { + if (lessMana.getWhite() > moreMana.getWhite() + || lessMana.getRed() > moreMana.getRed() + || lessMana.getGreen() > moreMana.getGreen() + || lessMana.getBlue() > moreMana.getBlue() + || lessMana.getBlack() > moreMana.getBlack() + || lessMana.getAny() > moreMana.getAny()) { return null; } return moreMana; diff --git a/Mage/src/mage/abilities/ActivatedAbilityImpl.java b/Mage/src/mage/abilities/ActivatedAbilityImpl.java index e5e1b819a53..ffdc3d4e019 100644 --- a/Mage/src/mage/abilities/ActivatedAbilityImpl.java +++ b/Mage/src/mage/abilities/ActivatedAbilityImpl.java @@ -1,38 +1,33 @@ /* -* 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. -*/ - + * 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.abilities; import java.util.UUID; - -import mage.constants.AbilityType; -import mage.constants.TimingRule; -import mage.constants.Zone; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; import mage.abilities.costs.mana.ManaCosts; @@ -40,12 +35,14 @@ import mage.abilities.costs.mana.PhyrexianManaCost; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.cards.Card; +import mage.constants.AbilityType; import mage.constants.AsThoughEffectType; import mage.constants.TargetController; +import mage.constants.TimingRule; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; - /** * * @author BetaSteward_at_googlemail.com @@ -62,7 +59,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa this.checkPlayableMode = false; } - public ActivatedAbilityImpl(ActivatedAbilityImpl ability) { + public ActivatedAbilityImpl(final ActivatedAbilityImpl ability) { super(ability); timing = ability.timing; mayActivate = ability.mayActivate; @@ -94,7 +91,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa public ActivatedAbilityImpl(Zone zone, Effects effects, ManaCosts cost) { super(AbilityType.ACTIVATED, zone); if (effects != null) { - for (Effect effect: effects) { + for (Effect effect : effects) { this.addEffect(effect); } } @@ -110,7 +107,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa } if (cost != null) { if (cost instanceof PhyrexianManaCost) { - this.addManaCost((PhyrexianManaCost)cost); + this.addManaCost((PhyrexianManaCost) cost); } else { this.addCost(cost); } @@ -123,7 +120,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa this.addEffect(effect); } if (costs != null) { - for (Cost cost: costs) { + for (Cost cost : costs) { this.addCost(cost); } } @@ -132,7 +129,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa public ActivatedAbilityImpl(Zone zone, Effects effects, Cost cost) { super(AbilityType.ACTIVATED, zone); if (effects != null) { - for (Effect effect: effects) { + for (Effect effect : effects) { this.addEffect(effect); } } @@ -143,13 +140,13 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa public ActivatedAbilityImpl(Zone zone, Effects effects, Costs costs) { super(AbilityType.ACTIVATED, zone); - for (Effect effect: effects) { + for (Effect effect : effects) { if (effect != null) { this.addEffect(effect); } } if (costs != null) { - for (Cost cost: costs) { + for (Cost cost : costs) { this.addCost(cost); } } @@ -161,23 +158,23 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa @Override public boolean canActivate(UUID playerId, Game game) { //20091005 - 602.2 - switch(mayActivate){ + switch (mayActivate) { case ANY: break; - + case NOT_YOU: - if(controlsAbility(playerId, game)){ + if (controlsAbility(playerId, game)) { return false; } break; - + case OPPONENT: - if (! game.getPlayer(controllerId).hasOpponent(playerId, game)){ + if (!game.getPlayer(controllerId).hasOpponent(playerId, game)) { return false; } - break; + break; case YOU: - if(!controlsAbility(playerId, game)){ + if (!controlsAbility(playerId, game)) { return false; } break; @@ -192,8 +189,8 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa return false; } //20091005 - 602.5d/602.5e - if (timing == TimingRule.INSTANT || game.canPlaySorcery(playerId) || - game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.ACTIVATE_AS_INSTANT, this, controllerId, game)) { + if (timing == TimingRule.INSTANT || game.canPlaySorcery(playerId) + || game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.ACTIVATE_AS_INSTANT, this, controllerId, game)) { if (costs.canPay(this, sourceId, controllerId, game) && canChooseTarget(game)) { this.activatorId = playerId; return true; @@ -205,9 +202,8 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa protected boolean controlsAbility(UUID playerId, Game game) { if (this.controllerId != null && this.controllerId.equals(playerId)) { return true; - } - else { - Card card = (Card)game.getObject(this.sourceId); + } else { + Card card = (Card) game.getObject(this.sourceId); if (card != null && game.getState().getZone(this.sourceId) != Zone.BATTLEFIELD) { return card.getOwnerId().equals(playerId); } @@ -240,5 +236,5 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa public boolean isCheckPlayableMode() { return checkPlayableMode; } - + } diff --git a/Mage/src/mage/abilities/SpellAbility.java b/Mage/src/mage/abilities/SpellAbility.java index 2c2d9c0fa2d..1dedf4b81e7 100644 --- a/Mage/src/mage/abilities/SpellAbility.java +++ b/Mage/src/mage/abilities/SpellAbility.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities; import java.util.UUID; @@ -65,17 +64,17 @@ public class SpellAbility extends ActivatedAbilityImpl { this.cardName = cardName; this.spellAbilityType = spellAbilityType; this.addManaCost(cost); - switch(spellAbilityType) { + switch (spellAbilityType) { case SPLIT_FUSED: this.name = "Cast fused " + cardName; break; default: this.name = "Cast " + cardName; } - + } - public SpellAbility(SpellAbility ability) { + public SpellAbility(final SpellAbility ability) { super(ability); this.spellAbilityType = ability.spellAbilityType; this.cardName = ability.cardName; @@ -83,9 +82,9 @@ public class SpellAbility extends ActivatedAbilityImpl { public boolean spellCanBeActivatedRegularlyNow(UUID playerId, Game game) { MageObject object = game.getObject(sourceId); - return timing == TimingRule.INSTANT || - object.hasAbility(FlashAbility.getInstance().getId(), game) || - game.canPlaySorcery(playerId); + return timing == TimingRule.INSTANT + || object.hasAbility(FlashAbility.getInstance().getId(), game) + || game.canPlaySorcery(playerId); } @Override @@ -96,7 +95,7 @@ public class SpellAbility extends ActivatedAbilityImpl { return false; } // fix for Gitaxian Probe and casting opponent's spells - if (!game.getContinuousEffects().asThough(getSourceId(), AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, playerId, game) + if (!game.getContinuousEffects().asThough(getSourceId(), AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, playerId, game) && !controllerId.equals(playerId)) { return false; } @@ -122,13 +121,13 @@ public class SpellAbility extends ActivatedAbilityImpl { if (getSpellAbilityType().equals(SpellAbilityType.SPLIT_FUSED)) { SplitCard splitCard = (SplitCard) game.getCard(getSourceId()); if (splitCard != null) { - return (splitCard.getLeftHalfCard().getSpellAbility().canChooseTarget(game) + return (splitCard.getLeftHalfCard().getSpellAbility().canChooseTarget(game) && splitCard.getRightHalfCard().getSpellAbility().canChooseTarget(game)); } return false; } else { - return canChooseTarget(game); + return canChooseTarget(game); } } } diff --git a/Mage/src/mage/abilities/costs/mana/HybridManaCost.java b/Mage/src/mage/abilities/costs/mana/HybridManaCost.java index 0658d9e68c9..b8f9cdedb93 100644 --- a/Mage/src/mage/abilities/costs/mana/HybridManaCost.java +++ b/Mage/src/mage/abilities/costs/mana/HybridManaCost.java @@ -27,6 +27,8 @@ */ package mage.abilities.costs.mana; +import java.util.ArrayList; +import java.util.List; import mage.Mana; import mage.abilities.Ability; import mage.constants.ColoredManaSymbol; @@ -130,6 +132,14 @@ public class HybridManaCost extends ManaCostImpl { return mana1.equals(coloredManaSymbol) || mana2.equals(coloredManaSymbol); } + @Override + public List getManaOptions() { + List manaList = new ArrayList<>(); + manaList.add(new Mana(mana1)); + manaList.add(new Mana(mana2)); + return manaList; + } + public ColoredManaSymbol getMana1() { return mana1; } diff --git a/Mage/src/mage/abilities/costs/mana/ManaCost.java b/Mage/src/mage/abilities/costs/mana/ManaCost.java index 58d6aa1aa6f..b1616aaa577 100644 --- a/Mage/src/mage/abilities/costs/mana/ManaCost.java +++ b/Mage/src/mage/abilities/costs/mana/ManaCost.java @@ -1,33 +1,33 @@ /* -* 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. -*/ - + * 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.abilities.costs.mana; +import java.util.List; import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.Cost; @@ -40,15 +40,27 @@ import mage.players.ManaPool; public interface ManaCost extends Cost { int convertedManaCost(); + Mana getMana(); + + List getManaOptions(); + Mana getPayment(); + void assignPayment(Game game, Ability ability, ManaPool pool); + void setPayment(Mana mana); + ManaCost getUnpaid(); + ManaOptions getOptions(); + boolean testPay(Mana testMana); + Filter getSourceFilter(); + void setSourceFilter(Filter filter); + boolean containsColor(ColoredManaSymbol coloredManaSymbol); @Override diff --git a/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java b/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java index e22723c32fe..60e9fcb22d1 100644 --- a/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java +++ b/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java @@ -1,47 +1,47 @@ /* -* 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. -*/ - + * 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.abilities.costs.mana; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; -import mage.constants.ColoredManaSymbol; -import mage.constants.ManaType; import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.CostImpl; import mage.abilities.mana.ManaOptions; +import mage.constants.ColoredManaSymbol; +import mage.constants.ManaType; import mage.filter.Filter; import mage.game.Game; import mage.players.ManaPool; import mage.players.Player; import mage.util.ManaUtil; - public abstract class ManaCostImpl extends CostImpl implements ManaCost { protected Mana payment; @@ -74,6 +74,13 @@ public abstract class ManaCostImpl extends CostImpl implements ManaCost { return cost; } + @Override + public List getManaOptions() { + List manaList = new ArrayList<>(); + manaList.add(cost); + return manaList; + } + @Override public ManaOptions getOptions() { return options; @@ -211,11 +218,10 @@ public abstract class ManaCostImpl extends CostImpl implements ManaCost { game.getState().getSpecialActions().removeManaActions(); while (!isPaid()) { ManaCost unpaid = this.getUnpaid(); - String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid); + String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid); if (player.playMana(unpaid, promptText, game)) { assignPayment(game, ability, player.getManaPool()); - } - else { + } else { return false; } game.getState().getSpecialActions().removeManaActions(); diff --git a/Mage/src/mage/abilities/costs/mana/ManaCosts.java b/Mage/src/mage/abilities/costs/mana/ManaCosts.java index e21c8fa2aca..2fe86c5345a 100644 --- a/Mage/src/mage/abilities/costs/mana/ManaCosts.java +++ b/Mage/src/mage/abilities/costs/mana/ManaCosts.java @@ -60,4 +60,5 @@ public interface ManaCosts extends List, ManaCost { @Override ManaCosts copy(); + } diff --git a/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java b/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java index 4b610c2af3f..02e6f4682ba 100644 --- a/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java +++ b/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java @@ -100,6 +100,15 @@ public class ManaCostsImpl extends ArrayList implements M return mana; } + @Override + public List getManaOptions() { + List manaVariants = new ArrayList<>(); + for (ManaCost cost : this) { + manaVariants.addAll(cost.getManaOptions()); + } + return manaVariants; + } + @Override public Mana getPayment() { Mana manaTotal = new Mana(); diff --git a/Mage/src/mage/abilities/costs/mana/MonoHybridManaCost.java b/Mage/src/mage/abilities/costs/mana/MonoHybridManaCost.java index 44c207a159e..1d4a6170140 100644 --- a/Mage/src/mage/abilities/costs/mana/MonoHybridManaCost.java +++ b/Mage/src/mage/abilities/costs/mana/MonoHybridManaCost.java @@ -27,6 +27,8 @@ */ package mage.abilities.costs.mana; +import java.util.ArrayList; +import java.util.List; import mage.Mana; import mage.abilities.Ability; import mage.constants.ColoredManaSymbol; @@ -118,4 +120,12 @@ public class MonoHybridManaCost extends ManaCostImpl { public boolean containsColor(ColoredManaSymbol coloredManaSymbol) { return mana.equals(coloredManaSymbol); } + + @Override + public List getManaOptions() { + List manaList = new ArrayList<>(); + manaList.add(new Mana(mana)); + manaList.add(Mana.ColorlessMana(2)); + return manaList; + } } diff --git a/Mage/src/mage/abilities/mana/CommanderColorIdentityManaAbility.java b/Mage/src/mage/abilities/mana/CommanderColorIdentityManaAbility.java index e3d1110c2d7..b3bb8d035cd 100644 --- a/Mage/src/mage/abilities/mana/CommanderColorIdentityManaAbility.java +++ b/Mage/src/mage/abilities/mana/CommanderColorIdentityManaAbility.java @@ -47,20 +47,19 @@ import mage.util.CardUtil; * * @author LevelX2 */ - public class CommanderColorIdentityManaAbility extends ManaAbility { private FilterMana commanderMana; public CommanderColorIdentityManaAbility() { - super(Zone.BATTLEFIELD, new CommanderIdentityManaEffect(),new TapSourceCost()); + super(Zone.BATTLEFIELD, new CommanderIdentityManaEffect(), new TapSourceCost()); } - + public CommanderColorIdentityManaAbility(Cost cost) { super(Zone.BATTLEFIELD, new CommanderIdentityManaEffect(), cost); commanderMana = null; } - + public CommanderColorIdentityManaAbility(final CommanderColorIdentityManaAbility ability) { super(ability); this.commanderMana = ability.commanderMana; @@ -73,7 +72,7 @@ public class CommanderColorIdentityManaAbility extends ManaAbility { @Override public List getNetMana(Game game) { - if (netMana.isEmpty()) { + if (netMana.isEmpty() && game != null) { Player controller = game.getPlayer(getControllerId()); if (controller != null) { if (commanderMana == null) { @@ -110,7 +109,6 @@ public class CommanderColorIdentityManaAbility extends ManaAbility { return true; } - } class CommanderIdentityManaEffect extends ManaEffect { @@ -190,7 +188,7 @@ class CommanderIdentityManaEffect extends ManaEffect { break; } checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); + controller.getManaPool().addMana(mana, game, source); return true; } } diff --git a/Mage/src/mage/abilities/mana/ManaOptions.java b/Mage/src/mage/abilities/mana/ManaOptions.java index dbadf31cfb7..4965a650b13 100644 --- a/Mage/src/mage/abilities/mana/ManaOptions.java +++ b/Mage/src/mage/abilities/mana/ManaOptions.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.mana; import java.util.ArrayList; @@ -37,17 +36,20 @@ import mage.game.Game; * * @author BetaSteward_at_googlemail.com * - * this class is used to build a list of all possible mana combinations - * it can be used to find all the ways to pay a mana cost - * or all the different mana combinations available to a player + * this class is used to build a list of all possible mana combinations it can + * be used to find all the ways to pay a mana cost or all the different mana + * combinations available to a player * */ public class ManaOptions extends ArrayList { - public ManaOptions () {}; + public ManaOptions() { + } + + ; public ManaOptions(final ManaOptions options) { - for (Mana mana: options) { + for (Mana mana : options) { this.add(mana.copy()); } } @@ -59,37 +61,36 @@ public class ManaOptions extends ArrayList { if (!abilities.isEmpty()) { if (abilities.size() == 1) { //if there is only one mana option available add it to all the existing options - List netManas = abilities.get(0).getNetMana(game); + List netManas = abilities.get(0).getNetMana(game); if (netManas.size() == 1) { addMana(netManas.get(0)); } else { List copy = copy(); this.clear(); - for (Mana netMana: netManas) { - for (Mana mana: copy) { + for (Mana netMana : netManas) { + for (Mana mana : copy) { Mana newMana = new Mana(); newMana.add(mana); newMana.add(netMana); this.add(newMana); - } - } + } + } } - - } - else if (abilities.size() > 1) { + + } else if (abilities.size() > 1) { //perform a union of all existing options and the new options List copy = copy(); this.clear(); - for (ManaAbility ability: abilities) { - for (Mana netMana: ability.getNetMana(game)) { + for (ManaAbility ability : abilities) { + for (Mana netMana : ability.getNetMana(game)) { SkipAddMana: - for (Mana mana: copy) { + for (Mana mana : copy) { Mana newMana = new Mana(); newMana.add(mana); newMana.add(netMana); - for(Mana existingMana: this) { + for (Mana existingMana : this) { if (existingMana.equalManaValue(newMana)) { - continue SkipAddMana; + continue SkipAddMana; } Mana moreValuable = Mana.getMoreValuableMana(newMana, existingMana); if (moreValuable != null) { @@ -114,7 +115,7 @@ public class ManaOptions extends ArrayList { if (abilities.size() == 1) { //if there is only one mana option available add it to all the existing options ManaAbility ability = abilities.get(0); - List netManas = abilities.get(0).getNetMana(game); + List netManas = abilities.get(0).getNetMana(game); // no mana costs if (ability.getManaCosts().isEmpty()) { if (netManas.size() == 1) { @@ -122,15 +123,15 @@ public class ManaOptions extends ArrayList { } else { List copy = copy(); this.clear(); - for (Mana netMana: netManas) { - for (Mana mana: copy) { + for (Mana netMana : netManas) { + for (Mana mana : copy) { Mana newMana = new Mana(); newMana.add(mana); newMana.add(netMana); this.add(newMana); - } - } - } + } + } + } } else { // the ability has mana costs if (netManas.size() == 1) { @@ -138,27 +139,27 @@ public class ManaOptions extends ArrayList { } else { List copy = copy(); this.clear(); - for (Mana netMana: netManas) { - for (Mana mana: copy) { + for (Mana netMana : netManas) { + for (Mana mana : copy) { Mana newMana = new Mana(); newMana.add(mana); newMana.add(netMana); subtractCostAddMana(ability.getManaCosts().getMana(), netMana, ability.getCosts().isEmpty()); - } - } - } + } + } + } } } else if (abilities.size() > 1) { //perform a union of all existing options and the new options List copy = copy(); this.clear(); - for (ManaAbility ability: abilities) { - - List netManas = ability.getNetMana(game); - + for (ManaAbility ability : abilities) { + + List netManas = ability.getNetMana(game); + if (ability.getManaCosts().isEmpty()) { - for (Mana netMana: netManas) { - for (Mana mana: copy) { + for (Mana netMana : netManas) { + for (Mana mana : copy) { Mana newMana = new Mana(); newMana.add(mana); newMana.add(netMana); @@ -166,24 +167,26 @@ public class ManaOptions extends ArrayList { } } } else { - for (Mana netMana: netManas) { - CombineWithExisting: - for (Mana previousMana: copy) { - Mana newMana = new Mana(previousMana); - if (previousMana.includesMana(ability.getManaCosts().getMana())) { // costs can be paid - newMana.subtractCost(ability.getManaCosts().getMana()); - newMana.add(netMana); - // if the new mana is in all colors more than another already existing than replace - for (Mana existingMana: this) { - Mana moreValuable = Mana.getMoreValuableMana(newMana, existingMana); - if (moreValuable != null) { - existingMana.setToMana(moreValuable); - continue CombineWithExisting; - } + for (Mana netMana : netManas) { + for (Mana previousMana : copy) { + CombineWithExisting: + for (Mana manaOption : ability.getManaCosts().getManaOptions()) { + Mana newMana = new Mana(previousMana); + if (previousMana.includesMana(manaOption)) { // costs can be paid + newMana.subtractCost(manaOption); + newMana.add(netMana); + // if the new mana is in all colors more than another already existing than replace + for (Mana existingMana : this) { + Mana moreValuable = Mana.getMoreValuableMana(newMana, existingMana); + if (moreValuable != null) { + existingMana.setToMana(moreValuable); + continue CombineWithExisting; + } + } + // no existing Mana includes this new mana so add + this.add(newMana); } - // no existing Mana includes this new mana so add - this.add(newMana); - } + } } } } @@ -197,7 +200,7 @@ public class ManaOptions extends ArrayList { if (isEmpty()) { this.add(new Mana()); } - for (Mana mana: this) { + for (Mana mana : this) { mana.add(addMana); } } @@ -210,13 +213,12 @@ public class ManaOptions extends ArrayList { if (options.size() == 1) { //if there is only one mana option available add it to all the existing options addMana(options.get(0)); - } - else if (options.size() > 1) { + } else if (options.size() > 1) { //perform a union of all existing options and the new options List copy = copy(); this.clear(); - for (Mana addMana: options) { - for (Mana mana: copy) { + for (Mana addMana : options) { + for (Mana mana : copy) { Mana newMana = new Mana(); newMana.add(mana); newMana.add(addMana); @@ -240,15 +242,92 @@ public class ManaOptions extends ArrayList { // deactivated because it does cause loops TODO: Find reason repeatable = true; // only replace to any with mana costs only will be repeated if able } - for (Mana mana: this) { - while (mana.includesMana(cost)) { - mana.subtractCost(cost); - mana.add(addMana); - if (!repeatable) { - break; + List copy = copy(); + this.clear(); + for (Mana mana : copy) { + Mana oldMan = mana.copy(); + if (mana.includesMana(cost)) { + // colorless costs can be paid with different colored mana, can lead to different color combinations + if (cost.getColorless() > 0 && cost.getColorless() > mana.getColorless()) { + Mana coloredCost = cost.copy(); + coloredCost.setColorless(0); + mana.subtract(coloredCost); + for (Mana payCombination : getPossiblePayCombinations(cost.getColorless(), mana)) { + Mana newMana = mana.copy(); + newMana.subtract(payCombination); + newMana.add(addMana); + if (oldMan.contains(newMana) && oldMan.count() > newMana.count()) { + newMana.setToMana(oldMan); + } + this.add(newMana); + } + } else { + while (mana.includesMana(cost)) { + mana.subtractCost(cost); + mana.add(addMana); + if (!repeatable) { + break; + } + } + // Don't use mana that only reduce the available mana + if (oldMan.contains(mana) && oldMan.count() > mana.count()) { + mana.setToMana(oldMan); + } + this.add(mana); } } } } -} \ No newline at end of file + private List getPossiblePayCombinations(int number, Mana manaAvailable) { + List payCombinations = new ArrayList<>(); + List payCombinationsStrings = new ArrayList<>(); + if (manaAvailable.countColored() > 0) { + + for (int i = 0; i < number; i++) { + List existingManas = new ArrayList<>(); + if (i > 0) { + existingManas.addAll(payCombinations); + payCombinations.clear(); + payCombinationsStrings.clear(); + } else { + existingManas.add(new Mana()); + } + for (Mana existingMana : existingManas) { + Mana manaToPay = manaAvailable.copy(); + manaToPay.subtract(existingMana); + if (manaToPay.getBlack() > 0 && !payCombinationsStrings.contains(existingMana.toString() + Mana.BlackMana.toString())) { + manaToPay.subtract(Mana.BlackMana); + addManaCombination(Mana.BlackMana, existingMana, payCombinations, payCombinationsStrings); + } + if (manaToPay.getBlue() > 0 && !payCombinationsStrings.contains(existingMana.toString() + Mana.BlueMana.toString())) { + manaToPay.subtract(Mana.BlueMana); + addManaCombination(Mana.BlueMana, existingMana, payCombinations, payCombinationsStrings); + } + if (manaToPay.getGreen() > 0 && !payCombinationsStrings.contains(existingMana.toString() + Mana.GreenMana.toString())) { + manaToPay.subtract(Mana.GreenMana); + addManaCombination(Mana.GreenMana, existingMana, payCombinations, payCombinationsStrings); + } + if (manaToPay.getRed() > 0 && !payCombinationsStrings.contains(existingMana.toString() + Mana.RedMana.toString())) { + manaToPay.subtract(Mana.RedMana); + addManaCombination(Mana.RedMana, existingMana, payCombinations, payCombinationsStrings); + } + if (manaToPay.getWhite() > 0 && !payCombinationsStrings.contains(existingMana.toString() + Mana.WhiteMana.toString())) { + manaToPay.subtract(Mana.WhiteMana); + addManaCombination(Mana.WhiteMana, existingMana, payCombinations, payCombinationsStrings); + } + } + } + } else { + payCombinations.add(new Mana(0, 0, 0, 0, 0, number, 0)); + } + return payCombinations; + } + + private void addManaCombination(Mana mana, Mana existingMana, List payCombinations, List payCombinationsStrings) { + Mana newMana = existingMana.copy(); + newMana.add(mana); + payCombinations.add(newMana); + payCombinationsStrings.add(newMana.toString()); + } +} From 6cf0a59644664ded878b0068db59aed6c4c8a18b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:19:43 +0200 Subject: [PATCH 007/375] * Fixed possible null pointer exception in client. --- .../plugins/adapters/MageActionCallback.java | 94 +++++++++++-------- 1 file changed, 53 insertions(+), 41 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java index 2600d496281..c55072a95fa 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java @@ -1,5 +1,28 @@ package mage.client.plugins.adapters; +import java.awt.Component; +import java.awt.Image; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.Popup; +import javax.swing.PopupFactory; +import javax.swing.SwingUtilities; import mage.cards.MageCard; import mage.cards.action.ActionCallback; import mage.cards.action.TransferData; @@ -24,21 +47,10 @@ import org.jdesktop.swingx.JXPanel; import org.mage.card.arcane.CardPanel; import org.mage.plugins.card.images.ImageCache; -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; -import java.awt.image.BufferedImage; -import java.util.*; -import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - /** - * Class that handles the callbacks from the card panels to mage to display big card - * images from the cards the mouse hovers on. Also handles tooltip text window. + * Class that handles the callbacks from the card panels to mage to display big + * card images from the cards the mouse hovers on. Also handles tooltip text + * window. * * @author Nantuko, noxx */ @@ -62,7 +74,9 @@ public class MageActionCallback implements ActionCallback { private TransferData popupData; private JComponent cardInfoPane; private volatile boolean popupTextWindowOpen = false; + enum EnlargedWindowState { + CLOSED, NORMAL, ROTATED } private volatile EnlargedWindowState enlargedWindowState = EnlargedWindowState.CLOSED; @@ -180,15 +194,15 @@ public class MageActionCallback implements ActionCallback { final Component c = MageFrame.getUI().getComponent(MageComponents.DESKTOP_PANE); SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (!popupTextWindowOpen || !enlargedWindowState.equals(EnlargedWindowState.CLOSED)) { - return; - } - popupContainer.setVisible(true); - c.repaint(); - } - } + @Override + public void run() { + if (!popupTextWindowOpen || !enlargedWindowState.equals(EnlargedWindowState.CLOSED)) { + return; + } + popupContainer.setVisible(true); + c.repaint(); + } + } ); } catch (InterruptedException e) { @@ -212,7 +226,7 @@ public class MageActionCallback implements ActionCallback { cardPanels.clear(); Point mouse = new Point(e.getX(), e.getY()); SwingUtilities.convertPointToScreen(mouse, data.component); - initialMousePos = new Point((int)mouse.getX(), (int)mouse.getY()); + initialMousePos = new Point((int) mouse.getX(), (int) mouse.getY()); initialCardPos = data.component.getLocation(); // Closes popup & enlarged view if a card/Permanent is selected hidePopup(); @@ -220,7 +234,7 @@ public class MageActionCallback implements ActionCallback { @Override public void mouseReleased(MouseEvent e, TransferData transferData) { - CardPanel card = ((CardPanel)transferData.component); + CardPanel card = ((CardPanel) transferData.component); if (card.getZone() != null && card.getZone().equalsIgnoreCase("hand")) { int maxXOffset = 0; if (isDragging) { @@ -269,7 +283,7 @@ public class MageActionCallback implements ActionCallback { @Override public void mouseDragged(MouseEvent e, TransferData transferData) { - CardPanel card = ((CardPanel)transferData.component); + CardPanel card = ((CardPanel) transferData.component); if (card.getZone() == null || !card.getZone().equalsIgnoreCase("hand")) { // drag'n'drop is allowed for HAND zone only return; @@ -280,7 +294,7 @@ public class MageActionCallback implements ActionCallback { Point mouse = new Point(e.getX(), e.getY()); SwingUtilities.convertPointToScreen(mouse, transferData.component); int xOffset = card.getXOffset(card.getCardWidth()); - int newX = Math.max(initialCardPos.x + (int)(mouse.getX() - initialMousePos.x) - xOffset, 0); + int newX = Math.max(initialCardPos.x + (int) (mouse.getX() - initialMousePos.x) - xOffset, 0); card.setCardBounds( newX, p.y, @@ -312,13 +326,13 @@ public class MageActionCallback implements ActionCallback { if (!cardPanels.contains(component)) { component.setLocation(component.getLocation().x, component.getLocation().y + GO_DOWN_ON_DRAG_Y_OFFSET); } - cardPanels.add((CardPanel)component); + cardPanels.add((CardPanel) component); } else { if (!startedDragging) { component.setLocation(component.getLocation().x, component.getLocation().y - GO_UP_ON_DRAG_Y_OFFSET); } } - cards.add((CardPanel)component); + cards.add((CardPanel) component); } } sortLayout(cards, card, sortSource); @@ -458,7 +472,8 @@ public class MageActionCallback implements ActionCallback { /** * Show the big card image on mouse position while hovering over a card * - * @param showAlternative defines if the original image (if it's a copied card) or the opposite side of a transformable card will be shown + * @param showAlternative defines if the original image (if it's a copied + * card) or the opposite side of a transformable card will be shown */ public void enlargeCard(EnlargeMode showAlternative) { if (enlargedWindowState.equals(EnlargedWindowState.CLOSED)) { @@ -483,7 +498,7 @@ public class MageActionCallback implements ActionCallback { public void hideEnlargedCard() { if (!enlargedWindowState.equals(EnlargedWindowState.CLOSED)) { - enlargedWindowState = EnlargedWindowState.CLOSED; + enlargedWindowState = EnlargedWindowState.CLOSED; try { Component cardPreviewContainer = MageFrame.getUI().getComponent(MageComponents.CARD_PREVIEW_CONTAINER); cardPreviewContainer.setVisible(false); @@ -496,8 +511,6 @@ public class MageActionCallback implements ActionCallback { } } - - private void displayEnlargedCard(final CardView cardView, final TransferData transferData) { ThreadUtils.threadPool2.submit(new Runnable() { @Override @@ -509,20 +522,18 @@ public class MageActionCallback implements ActionCallback { if (enlargedWindowState.equals(EnlargedWindowState.CLOSED)) { return; } - Component parentComponent = SwingUtilities.getRoot(transferData.component); - Point parentPoint = parentComponent.getLocationOnScreen(); MageComponents mageComponentCardPreviewContainer; MageComponents mageComponentCardPreviewPane; if (cardView.isToRotate()) { - if(enlargedWindowState.equals(EnlargedWindowState.NORMAL)) { + if (enlargedWindowState.equals(EnlargedWindowState.NORMAL)) { hideEnlargedCard(); enlargedWindowState = EnlargedWindowState.ROTATED; } mageComponentCardPreviewContainer = MageComponents.CARD_PREVIEW_CONTAINER_ROTATED; mageComponentCardPreviewPane = MageComponents.CARD_PREVIEW_PANE_ROTATED; } else { - if(enlargedWindowState.equals(EnlargedWindowState.ROTATED)) { + if (enlargedWindowState.equals(EnlargedWindowState.ROTATED)) { hideEnlargedCard(); enlargedWindowState = EnlargedWindowState.NORMAL; } @@ -531,7 +542,9 @@ public class MageActionCallback implements ActionCallback { } final Component popupContainer = MageFrame.getUI().getComponent(mageComponentCardPreviewContainer); Component cardPreviewPane = MageFrame.getUI().getComponent(mageComponentCardPreviewPane); - if (cardPreviewPane != null) { + Component parentComponent = SwingUtilities.getRoot(transferData.component); + if (cardPreviewPane != null && parentComponent != null) { + Point parentPoint = parentComponent.getLocationOnScreen(); transferData.locationOnScreen = transferData.component.getLocationOnScreen(); Point location = new Point((int) transferData.locationOnScreen.getX() + transferData.popupOffsetX - 40, (int) transferData.locationOnScreen.getY() + transferData.popupOffsetY - 40); location = GuiDisplayUtil.keepComponentInsideParent(location, parentPoint, cardPreviewPane, parentComponent); @@ -561,10 +574,9 @@ public class MageActionCallback implements ActionCallback { image = mageCard.getImage(); } // shows the card in the popup Container - BigCard bigCard = (BigCard)cardPreviewPane; + BigCard bigCard = (BigCard) cardPreviewPane; displayCardInfo(mageCard, image, bigCard); - } else { logger.warn("No Card preview Pane in Mage Frame defined. Card: " + cardView.getName()); } @@ -585,7 +597,7 @@ public class MageActionCallback implements ActionCallback { } else { image = ImageHelper.getResizedImage((BufferedImage) image, bigCard.getWidth()); } - bigCard.setCard(mageCard.getOriginal().getId(), enlargeMode, image, mageCard.getOriginal().getRules()); + bigCard.setCard(mageCard.getOriginal().getId(), enlargeMode, image, mageCard.getOriginal().getRules()); // if it's an ability, show only the ability text as overlay if (mageCard.getOriginal().isAbility() && enlargeMode.equals(EnlargeMode.NORMAL)) { bigCard.showTextComponent(); From 6c2bb01544229a3ea9bcdb3013ec4d3864750654 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 12 Jul 2015 10:21:08 +0300 Subject: [PATCH 008/375] Fix Thundersong Trumpeter's ability not preventing attacking --- Mage.Sets/src/mage/sets/ravnica/ThundersongTrumpeter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/ravnica/ThundersongTrumpeter.java b/Mage.Sets/src/mage/sets/ravnica/ThundersongTrumpeter.java index c487030aac2..d252bc818de 100644 --- a/Mage.Sets/src/mage/sets/ravnica/ThundersongTrumpeter.java +++ b/Mage.Sets/src/mage/sets/ravnica/ThundersongTrumpeter.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.abilities.effects.common.combat.CantAttackBlockTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; @@ -54,8 +54,8 @@ public class ThundersongTrumpeter extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - // {tap}: Target creature can't attack or block this turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBlockTargetEffect(Duration.EndOfTurn), new TapSourceCost()); + // {T}: Target creature can't attack or block this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantAttackBlockTargetEffect(Duration.EndOfTurn), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } From 18d1d63cc0684bd7a88ddc8d761832f1df2ac823 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 12 Jul 2015 10:34:36 +0300 Subject: [PATCH 009/375] Fix the tooltip texts of Matca Rioters and Mirari's Wake --- Mage.Sets/src/mage/sets/conflux/MatcaRioters.java | 9 ++++++--- Mage.Sets/src/mage/sets/judgment/MirarisWake.java | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java b/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java index ea61c61bbb7..be5574baeb2 100644 --- a/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java +++ b/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java @@ -29,14 +29,15 @@ package mage.sets.conflux; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.DomainValue; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Rarity; import mage.constants.Zone; /** @@ -55,7 +56,9 @@ public class MatcaRioters extends CardImpl { this.toughness = new MageInt(0); // Domain - Matca Rioters's power and toughness are each equal to the number of basic land types among lands you control. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(new DomainValue(), new DomainValue(), Duration.EndOfGame))); + Effect effect = new BoostSourceEffect(new DomainValue(), new DomainValue(), Duration.EndOfGame); + effect.setText("Domain - {this}'s power and toughness are each equal to the number of basic land types among lands you control."); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } public MatcaRioters(final MatcaRioters card) { diff --git a/Mage.Sets/src/mage/sets/judgment/MirarisWake.java b/Mage.Sets/src/mage/sets/judgment/MirarisWake.java index c0dbc7a9af3..c59f9b7f1bf 100644 --- a/Mage.Sets/src/mage/sets/judgment/MirarisWake.java +++ b/Mage.Sets/src/mage/sets/judgment/MirarisWake.java @@ -54,8 +54,10 @@ public class MirarisWake extends CardImpl { // Creatures you control get +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1,1,Duration.WhileOnBattlefield))); // Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. + AddManaOfAnyTypeProducedEffect effect = new AddManaOfAnyTypeProducedEffect(); + effect.setText("add one mana to your mana pool of any type that land produced"); this.addAbility(new TapForManaAllTriggeredManaAbility( - new AddManaOfAnyTypeProducedEffect(), + effect, new FilterControlledLandPermanent("you tap a land"), SetTargetPointer.PERMANENT)); From 260e64ccb765677c482361de30413d5a1855d5e3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:55:47 +0200 Subject: [PATCH 010/375] * Whip of Erebos - Fixed that the exile effect also exiled the target if it meanwhile went to exile and returned. --- Mage.Sets/src/mage/sets/theros/WhipOfErebos.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java b/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java index 8e4dfbcb939..6b345fdd021 100644 --- a/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java +++ b/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java @@ -73,7 +73,7 @@ public class WhipOfErebos extends CardImpl { // Creatures you control have lifelink. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); - // {2}{B}{B}, {T}: Return target creature card from your graveyard to the battlefield. + // {2}{B}{B}, {T}: Return target creature card from your graveyard to the battlefield. // It gains haste. Exile it at the beginning of the next end step. // If it would leave the battlefield, exile it instead of putting it anywhere else. // Activate this ability only any time you could cast a sorcery. @@ -122,12 +122,12 @@ class WhipOfErebosEffect extends OneShotEffect { game.addEffect(effect, source); // Exile at begin of next end step ExileTargetEffect exileEffect = new ExileTargetEffect(null, null, Zone.BATTLEFIELD); - exileEffect.setTargetPointer(new FixedTarget(card.getId())); + exileEffect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); + game.addDelayedTriggeredAbility(delayedAbility); } return true; } @@ -160,12 +160,12 @@ class WhipOfErebosReplacementEffect extends ReplacementEffectImpl { } return true; } - - @Override + + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.ZONE_CHANGE; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { if (event.getTargetId().equals(source.getFirstTarget()) From 2cc62aada0c2d68925f8b63d992f54f231b8c1ec Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 09:56:49 +0200 Subject: [PATCH 011/375] Some minor tooltip text fixes. --- .../magicorigins/JaceTelepathUnbound.java | 5 +- .../ZoneChangeReplacementTest.java | 150 ++++++++++-------- .../common/DrawDiscardControllerEffect.java | 23 ++- 3 files changed, 100 insertions(+), 78 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java b/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java index 968cc70af62..b59836a49dc 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java +++ b/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java @@ -78,7 +78,9 @@ public class JaceTelepathUnbound extends CardImpl { this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(5)), false)); // +1: Up to one target creature gets -2/-0 until your next turn. - Ability ability = new LoyaltyAbility(new BoostTargetEffect(-2, 0, Duration.UntilYourNextTurn), 1); + Effect effect = new BoostTargetEffect(-2, 0, Duration.UntilYourNextTurn); + effect.setText("Up to one target creature gets -2/-0 until your next turn"); + Ability ability = new LoyaltyAbility(effect, 1); ability.addTarget(new TargetCreaturePermanent(0, 1)); this.addAbility(ability); @@ -205,7 +207,6 @@ class JaceTelepathUnboundReplacementEffect extends ReplacementEffectImpl { class JaceTelepathUnboundEmblem extends Emblem { // You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". - public JaceTelepathUnboundEmblem() { this.setName("Emblem - Jace"); Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java index adf0480d7d6..b2f712686de 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java @@ -25,24 +25,23 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package org.mage.test.cards.replacement; import mage.constants.PhaseStep; import mage.constants.Zone; +import mage.counters.CounterType; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** * Checks if change zone replacement effects work as intended - * + * * @author LevelX2 */ - public class ZoneChangeReplacementTest extends CardTestPlayerBase { - // If Darksteel Colossus would be put into a graveyard from anywhere, - // reveal Darksteel Colossus and shuffle it into its owner's library instead. + // If Darksteel Colossus would be put into a graveyard from anywhere, + // reveal Darksteel Colossus and shuffle it into its owner's library instead. @Test public void testFromLibraryZoneChange() { addCard(Zone.LIBRARY, playerA, "Darksteel Colossus"); @@ -51,7 +50,7 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Tome Scour"); addCard(Zone.BATTLEFIELD, playerA, "Island", 1); skipInitShuffling(); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tome Scour", playerA); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -59,9 +58,9 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Darksteel Colossus", 0); assertGraveyardCount(playerA, 5); // 4 + Tome Scour - + } - + @Test public void testFromHandZoneChange() { addCard(Zone.HAND, playerA, "Progenitus"); @@ -69,8 +68,8 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { // Target player reveals his or her hand. You choose a nonland card from it. That player discards that card. addCard(Zone.HAND, playerA, "Distress"); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Distress", playerA); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Distress", playerA); setChoice(playerA, "Progenitus"); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -78,7 +77,7 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Progenitus", 0); assertGraveyardCount(playerA, 1); // Distress - + assertHandCount(playerA, "Progenitus", 0); } @@ -88,13 +87,13 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { // Diabolic Edict - Instant - {1}{B} // Target player sacrifices a creature. addCard(Zone.HAND, playerA, "Diabolic Edict"); - // Whenever a nontoken creature is put into your graveyard from the battlefield, if Bridge from + // Whenever a nontoken creature is put into your graveyard from the battlefield, if Bridge from // Below is in your graveyard, put a 2/2 black Zombie creature token onto the battlefield. addCard(Zone.GRAVEYARD, playerA, "Bridge from Below"); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Diabolic Edict", playerA); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Diabolic Edict", playerA); setChoice(playerA, "Silvercoat Lion"); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -103,7 +102,7 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Silvercoat Lion", 1); assertGraveyardCount(playerA, 3); // Diabolic Edict + Bridge from Below + Silvercoat Lion assertPermanentCount(playerA, "Zombie", 1); // Silvercoat Lion goes to graveyard so a Zombie tokes is created - + } @Test @@ -112,13 +111,13 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { // Diabolic Edict - Instant - {1}{B} // Target player sacrifices a creature. addCard(Zone.HAND, playerA, "Diabolic Edict"); - // Whenever a nontoken creature is put into your graveyard from the battlefield, if Bridge from + // Whenever a nontoken creature is put into your graveyard from the battlefield, if Bridge from // Below is in your graveyard, put a 2/2 black Zombie creature token onto the battlefield. addCard(Zone.GRAVEYARD, playerA, "Bridge from Below"); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Diabolic Edict", playerA); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Diabolic Edict", playerA); setChoice(playerA, "Progenitus"); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -127,13 +126,11 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Progenitus", 0); assertGraveyardCount(playerA, 2); // Diabolic Edict + Bridge from Below assertPermanentCount(playerA, "Zombie", 0); // Progenitus never touches graveyard - so no Zombie tokes is created - + } - + // Have Progenitus and Humility on the battlefield. Destroy Progenitus. Progenitus should go to the graveyard // since it doesn't have any replacement effect. Currently, it gets shuffled into the library. - - @Test public void testHumilityDeactivatesReplacementEffectAbilities() { // Protection from everything @@ -147,8 +144,8 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Diabolic Edict"); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Diabolic Edict", playerA); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Diabolic Edict", playerA); setChoice(playerA, "Progenitus"); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -157,10 +154,9 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Progenitus", 0); assertGraveyardCount(playerA, "Progenitus", 1); assertGraveyardCount(playerA, 2); // Diabolic Edict + Progenitus - - + } - + @Test public void testHumilityAndKumano() { // Enchantment {2}{W}{W} @@ -178,9 +174,9 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); // 2/2 addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Aggressive Urge", "Kumano's Pupils"); - + attack(2, playerB, "Silvercoat Lion"); block(2, playerA, "Kumano's Pupils", "Silvercoat Lion"); @@ -194,16 +190,14 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Kumano's Pupils", 1); assertPowerToughness(playerA, "Kumano's Pupils", 2, 2); assertPermanentCount(playerB, "Silvercoat Lion", 0); - + assertExileCount("Silvercoat Lion", 0); assertGraveyardCount(playerB, "Silvercoat Lion", 1); - - } + } // A creature gets damage from Kumano's Pupils and is destroyed after. // The creature has to go to exile. - @Test public void testCreatureGetsExiledByKumano() { // 3/3 @@ -237,12 +231,9 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { } - - // A creature gets damage from Kumano's Pupils and returns to hand after. // Then it's cast again. This new permanent instance is destroyed. It may not // got to exile because only previous instance was damgaged by Kumano's Pupils. - @Test public void testPermanentNewInstanceAndKumano() { // 3/3 @@ -262,10 +253,9 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); addCard(Zone.BATTLEFIELD, playerB, "Plains", 4); - attack(2, playerB, "Pillarfield Ox"); block(2, playerA, "Kumano's Pupils", "Pillarfield Ox"); - + castSpell(2, PhaseStep.COMBAT_DAMAGE, playerA, "Unsummon", "Pillarfield Ox"); castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Pillarfield Ox"); castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Terminate", "Pillarfield Ox"); @@ -286,11 +276,11 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertGraveyardCount(playerB, "Pillarfield Ox", 1); } - /** - * Test that a countered spell of a card that goes always to library back - * instead of into the graveyard. - */ + /** + * Test that a countered spell of a card that goes always to library back + * instead of into the graveyard. + */ @Test public void testCounterAndMoveToLibrary() { addCard(Zone.BATTLEFIELD, playerA, "Plains", 7); @@ -298,12 +288,12 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { // {W}{U}{B}{R}{G}: Exile target permanent. // If Legacy Weapon would be put into a graveyard from anywhere, reveal Legacy Weapon and shuffle it into its owner's library instead. addCard(Zone.HAND, playerA, "Legacy Weapon"); - + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); // Counter target spell. At the beginning of your next main phase, add {X} to your mana pool, where X is that spell's converted mana cost. addCard(Zone.HAND, playerB, "Mana Drain"); addCard(Zone.HAND, playerB, "Legacy Weapon"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Legacy Weapon"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Mana Drain", "Legacy Weapon"); @@ -317,34 +307,33 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertHandCount(playerA, "Legacy Weapon", 0); assertPermanentCount(playerA, "Legacy Weapon", 0); assertGraveyardCount(playerA, "Legacy Weapon", 0); - - assertGraveyardCount(playerB, "Mana Drain", 1); - - assertPermanentCount(playerB, "Legacy Weapon", 1); - - } - - /** - * Test that a returned creature of Whip of Erebos - * got exiled if it is destroyed by a spell - */ + assertGraveyardCount(playerB, "Mana Drain", 1); + + assertPermanentCount(playerB, "Legacy Weapon", 1); + + } + + /** + * Test that a returned creature of Whip of Erebos got exiled if it is + * destroyed by a spell + */ @Test public void testWhipOfErebos() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); // Destroy target nonartifact, nonblack creature. It can't be regenerated. - addCard(Zone.HAND, playerA, "Terror"); - - // {2}{B}{B}, {T}: Return target creature card from your graveyard to the battlefield. + addCard(Zone.HAND, playerA, "Terror"); + + // {2}{B}{B}, {T}: Return target creature card from your graveyard to the battlefield. // It gains haste. Exile it at the beginning of the next end step. // If it would leave the battlefield, exile it instead of putting it anywhere else. // Activate this ability only any time you could cast a sorcery. addCard(Zone.BATTLEFIELD, playerB, "Whip of Erebos"); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 4); addCard(Zone.GRAVEYARD, playerB, "Silvercoat Lion"); - + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{2}{B}{B},{T}: Return target creature", "Silvercoat Lion"); - + castSpell(2, PhaseStep.BEGIN_COMBAT, playerA, "Terror", "Silvercoat Lion"); setStopAt(2, PhaseStep.END_COMBAT); execute(); @@ -354,10 +343,43 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Terror", 1); assertExileCount("Silvercoat Lion", 1); - + } - - -} + /** + * Jace, Vryn’s Prodigy – Jace, Telepath Unbound + * + * You can't whip him back with Whip of Erebos , flip him and then keep him. + * I think he is considered a new object after being exiled by his own + * trigger, so whip shouldn't affect him anymore. + */ + @Test + public void testWhipOfErebosTransformPlaneswalker() { + // {2}{B}{B}, {T}: Return target creature card from your graveyard to the battlefield. + // It gains haste. Exile it at the beginning of the next end step. + // If it would leave the battlefield, exile it instead of putting it anywhere else. + // Activate this ability only any time you could cast a sorcery. + addCard(Zone.BATTLEFIELD, playerB, "Whip of Erebos"); + addCard(Zone.BATTLEFIELD, playerB, "Swamp", 4); + addCard(Zone.GRAVEYARD, playerB, "Swamp", 5); + addCard(Zone.GRAVEYARD, playerB, "Jace, Vryn's Prodigy"); + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{2}{B}{B},{T}: Return target creature", "Jace, Vryn's Prodigy"); + + // {T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn's Prodigy, then return him to the battefield transformed under his owner's control. + activateAbility(2, PhaseStep.BEGIN_COMBAT, playerB, "{T}: Draw a card, then discard a card. If there are five or more cards in your graveyard"); + + activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "+1: Up to one target creature gets -2/-0 until your next turn"); + setStopAt(3, PhaseStep.UNTAP); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + assertPermanentCount(playerB, "Jace, Vryn's Prodigy", 0); + assertPermanentCount(playerB, "Jace, Telepath Unbound", 1); + assertCounterCount("Jace, Telepath Unbound", CounterType.LOYALTY, 6); + + } + +} diff --git a/Mage/src/mage/abilities/effects/common/DrawDiscardControllerEffect.java b/Mage/src/mage/abilities/effects/common/DrawDiscardControllerEffect.java index 20f1d46d6ed..811addcd588 100644 --- a/Mage/src/mage/abilities/effects/common/DrawDiscardControllerEffect.java +++ b/Mage/src/mage/abilities/effects/common/DrawDiscardControllerEffect.java @@ -1,16 +1,16 @@ /* * Copyright 2011 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 @@ -20,12 +20,11 @@ * 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.abilities.effects.common; import mage.abilities.Ability; @@ -46,9 +45,9 @@ public class DrawDiscardControllerEffect extends OneShotEffect { private boolean optional; public DrawDiscardControllerEffect() { - this(1,1); + this(1, 1); } - + public DrawDiscardControllerEffect(int cardsToDraw, int cardsToDiscard) { this(cardsToDraw, cardsToDiscard, false); } @@ -59,11 +58,11 @@ public class DrawDiscardControllerEffect extends OneShotEffect { this.cardsToDiscard = cardsToDiscard; this.optional = optional; staticText = new StringBuilder("Draw ") - .append(cardsToDraw == 1?"a": CardUtil.numberToText(cardsToDraw)) - .append(" card").append(cardsToDraw == 1?" ": "s") + .append(cardsToDraw == 1 ? "a" : CardUtil.numberToText(cardsToDraw)) + .append(" card").append(cardsToDraw == 1 ? "" : "s") .append(", then discard ") - .append(cardsToDiscard == 1?"a": CardUtil.numberToText(cardsToDiscard)) - .append(" card").append(cardsToDiscard == 1?"": "s").toString(); + .append(cardsToDiscard == 1 ? "a" : CardUtil.numberToText(cardsToDiscard)) + .append(" card").append(cardsToDiscard == 1 ? "" : "s").toString(); } public DrawDiscardControllerEffect(final DrawDiscardControllerEffect effect) { From d716f3aa9ce867f05efe5ef594d95a45ac708ca0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 10:00:13 +0200 Subject: [PATCH 012/375] * Jace, Telepath Unbound - Fixed that the planeswalker was colorless instead of blue. --- Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java b/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java index b59836a49dc..a90cad9b16b 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java +++ b/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java @@ -72,6 +72,7 @@ public class JaceTelepathUnbound extends CardImpl { this.expansionSetCode = "ORI"; this.subtype.add("Jace"); + this.color.setBlue(true); this.nightCard = true; this.canTransform = true; From 6f2a7f8c73563a194ac9cca5f38cb4987b4b0151 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 10:15:16 +0200 Subject: [PATCH 013/375] * Deck Editor - Fixed that dck laod also worked with set abbreviations with length 5. --- Mage/src/mage/cards/decks/importer/DckDeckImporter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage/src/mage/cards/decks/importer/DckDeckImporter.java b/Mage/src/mage/cards/decks/importer/DckDeckImporter.java index ec57409bed3..f73423228e0 100644 --- a/Mage/src/mage/cards/decks/importer/DckDeckImporter.java +++ b/Mage/src/mage/cards/decks/importer/DckDeckImporter.java @@ -40,7 +40,7 @@ import mage.cards.repository.CardRepository; */ public class DckDeckImporter extends DeckImporter { - private static final Pattern pattern = Pattern.compile("(SB:)?\\s*(\\d*)\\s*\\[([a-zA-Z0-9]{2,4}):(\\d*)\\].*"); + private static final Pattern pattern = Pattern.compile("(SB:)?\\s*(\\d*)\\s*\\[([a-zA-Z0-9]{2,5}):(\\d*)\\].*"); @Override protected void readLine(String line, DeckCardLists deckList) { @@ -59,7 +59,7 @@ public class DckDeckImporter extends DeckImporter { String setCode = m.group(3); int cardNum = Integer.parseInt(m.group(4)); - DeckCardInfo deckCardInfo = null; + DeckCardInfo deckCardInfo = null; CardInfo cardInfo = CardRepository.instance.findCard(setCode, cardNum); if (cardInfo != null) { deckCardInfo = new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode()); From 429dde295dcdbfe7e3a1565bf642fc69e6d3681b Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 12 Jul 2015 11:32:09 +0300 Subject: [PATCH 014/375] Fix Descent of the Dragons and March of Souls: Destroy all affected creatures first, then create the tokens --- .../dragonsoftarkir/DescentOfTheDragons.java | 14 +++++++-- .../mage/sets/planeshift/MarchOfSouls.java | 31 ++++++++++++------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/DescentOfTheDragons.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/DescentOfTheDragons.java index bc33b71c2c0..72670999b84 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/DescentOfTheDragons.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/DescentOfTheDragons.java @@ -27,6 +27,7 @@ */ package mage.sets.dragonsoftarkir; +import java.util.HashMap; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -87,18 +88,27 @@ class DescentOfTheDragonsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { + HashMap playersWithTargets = new HashMap(); for (Target target : source.getTargets()) { for (UUID permanentId : target.getTargets()) { Permanent permanent = game.getPermanent(permanentId); if (permanent != null) { UUID controllerOfTargetId = permanent.getControllerId(); if (permanent.destroy(source.getSourceId(), game, false)) { - DragonToken dragonToken = new DragonToken(); - dragonToken.putOntoBattlefield(1, game, source.getSourceId(), controllerOfTargetId); + if(playersWithTargets.containsKey(controllerOfTargetId)) { + playersWithTargets.put(controllerOfTargetId, playersWithTargets.get(controllerOfTargetId) + 1); + } + else { + playersWithTargets.put(controllerOfTargetId, 1); + } } } } } + DragonToken dragonToken = new DragonToken(); + for(UUID playerId : playersWithTargets.keySet()) { + dragonToken.putOntoBattlefield(playersWithTargets.get(playerId), game, source.getSourceId(), playerId); + } return true; } return false; diff --git a/Mage.Sets/src/mage/sets/planeshift/MarchOfSouls.java b/Mage.Sets/src/mage/sets/planeshift/MarchOfSouls.java index d1d0d83b4ea..dc7495bed21 100644 --- a/Mage.Sets/src/mage/sets/planeshift/MarchOfSouls.java +++ b/Mage.Sets/src/mage/sets/planeshift/MarchOfSouls.java @@ -27,6 +27,7 @@ */ package mage.sets.planeshift; +import java.util.HashMap; import java.util.List; import java.util.UUID; import mage.abilities.Ability; @@ -83,16 +84,24 @@ class MarchOfSoulsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - List creatures = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), - source.getControllerId(), source.getSourceId(), game); - for(Permanent p : creatures) { - UUID controllerId = p.getControllerId(); - if(p.destroy(source.getSourceId(), game, true)) { - SpiritWhiteToken token = new SpiritWhiteToken(); - token.putOntoBattlefield(1, game, source.getSourceId(), controllerId); - } - } - return true; + List creatures = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), + source.getControllerId(), source.getSourceId(), game); + HashMap playersWithCreatures = new HashMap(); + for(Permanent p : creatures) { + UUID controllerId = p.getControllerId(); + if(p.destroy(source.getSourceId(), game, true)) { + if(playersWithCreatures.containsKey(controllerId)) { + playersWithCreatures.put(controllerId, playersWithCreatures.get(controllerId) + 1); + } + else { + playersWithCreatures.put(controllerId, 1); + } + } + } + SpiritWhiteToken token = new SpiritWhiteToken(); + for(UUID playerId : playersWithCreatures.keySet()) { + token.putOntoBattlefield(playersWithCreatures.get(playerId), game, source.getSourceId(), playerId); + } + return true; } - } From 4094fe5ecfb87b045eef3da7e506387911d7a7c0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 11:08:33 +0200 Subject: [PATCH 015/375] * Fixed a problem that triggered abilities of created tokens were not removed properly if the token left has left the battlefield. --- .../magicorigins/PriestOfTheBloodRite.java | 5 +- .../cards/copy/FlameshadowConjuringTest.java | 75 +++++++++++++++++++ Mage/src/mage/players/PlayerImpl.java | 4 + 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java diff --git a/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java b/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java index f57eaaa2614..6eed42819e2 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java +++ b/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java @@ -56,7 +56,7 @@ public class PriestOfTheBloodRite extends CardImpl { // When Priest of the Blood Rite enters the battlefield, put a 5/5 black Demon creature token with flying onto the battlefield. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new DemonToken()))); - + // At the beginning of your upkeep, you lose 2 life. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LoseLifeSourceControllerEffect(2), TargetController.YOU, false)); } @@ -77,6 +77,7 @@ class DemonToken extends Token { super("Demon", "5/5 black Demon creature token with flying"); cardType.add(CardType.CREATURE); subtype.add("Demon"); + setOriginalExpansionSetCode("ORI"); color.setBlack(true); power = new MageInt(5); @@ -84,4 +85,4 @@ class DemonToken extends Token { addAbility(FlyingAbility.getInstance()); } -} \ No newline at end of file +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java new file mode 100644 index 00000000000..423ac6c2084 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java @@ -0,0 +1,75 @@ +/* + * 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 org.mage.test.cards.copy; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class FlameshadowConjuringTest extends CardTestPlayerBase { + + /** + * My opponent ran into an issue with Priest of the Blood Rite being copied + * with Flameshadow Conjuring. His copy was made and removed correctly at + * the end of the turn, but the "lose two life a turn" trigger still + * happened twice. + * + * TODO: Seems like there are too much triggered abilities in + * TriggeredAbilities as the TriggeredAbilities get removed from + * PlayerImpl.removeFromBattlefield() + */ + @Test + public void testCopyAndItsEffectsRemoved() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); + // Whenever a nontoken creature enters the battlefield under your control, you may pay {R}. If you do, put a token onto the battlefield that's a copy of that creature. + // That token gains haste. Exile it at the beginning of the next end step. + addCard(Zone.BATTLEFIELD, playerA, "Flameshadow Conjuring", 1); + + // When Priest of the Blood Rite enters the battlefield, put a 5/5 black Demon creature token with flying onto the battlefield. + // At the beginning of your upkeep, you lose 2 life. + addCard(Zone.HAND, playerA, "Priest of the Blood Rite", 1); // {3}{B}{B} + setChoice(playerB, "Yes"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Priest of the Blood Rite"); + setStopAt(3, PhaseStep.UPKEEP); + execute(); + + assertPermanentCount(playerA, "Priest of the Blood Rite", 1); + assertPermanentCount(playerA, "Demon", 2); + + assertLife(playerB, 20); + assertLife(playerA, 18); + } + +} diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index c923bc63a27..4ad504cd501 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -116,6 +116,7 @@ import mage.game.events.ZoneChangeGroupEvent; import mage.game.match.MatchPlayer; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; +import mage.game.permanent.PermanentToken; import mage.game.stack.Spell; import mage.game.stack.StackAbility; import mage.game.stack.StackObject; @@ -812,6 +813,9 @@ public abstract class PlayerImpl implements Player, Serializable { pairedCard.clearPairedCard(); } } + if (permanent instanceof PermanentToken) { + game.getState().getTriggers().removeAbilitiesOfSource(permanent.getId()); + } return true; } From 977cbe538b21fcc39111f01a7b0a84b1232a24ec Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 12 Jul 2015 12:30:41 +0300 Subject: [PATCH 016/375] Fix Embermaw Hellion and Tok-Tok, Volcano Born not affecting tokens (and some other corner cases, I think) --- .../championsofkamigawa/AkkiLavarunner.java | 19 ++++++++++++++----- .../sets/magicorigins/EmbermawHellion.java | 15 ++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/AkkiLavarunner.java b/Mage.Sets/src/mage/sets/championsofkamigawa/AkkiLavarunner.java index c4afd226be2..8b363c13144 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/AkkiLavarunner.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/AkkiLavarunner.java @@ -2,6 +2,7 @@ package mage.sets.championsofkamigawa; import java.util.UUID; import mage.MageInt; +import mage.MageObject; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; @@ -10,7 +11,6 @@ import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.FlipSourceEffect; import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.ProtectionAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; @@ -21,8 +21,9 @@ import mage.filter.FilterCard; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; -import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; /** @@ -126,11 +127,19 @@ class TokTokVolcanoBornEffect extends ReplacementEffectImpl { public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.DAMAGE_PLAYER; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { - Card card = game.getCard(event.getSourceId()); - if (card != null && card.getColor(game).isRed()) { + MageObject sourceObject; + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); + if(sourcePermanent == null) { + sourceObject = game.getObject(event.getSourceId()); + } + else { + sourceObject = sourcePermanent; + } + + if (sourceObject != null && sourceObject.getColor(game).isRed()) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magicorigins/EmbermawHellion.java b/Mage.Sets/src/mage/sets/magicorigins/EmbermawHellion.java index 5632b9cfcf4..05c357c6bbe 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/EmbermawHellion.java +++ b/Mage.Sets/src/mage/sets/magicorigins/EmbermawHellion.java @@ -29,11 +29,11 @@ package mage.sets.magicorigins; import java.util.UUID; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.keyword.TrampleAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; @@ -44,6 +44,7 @@ import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent.EventType; import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; /** * @@ -101,11 +102,19 @@ class EmbermawHellionEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { if(source.getControllerId().equals(game.getControllerId(event.getSourceId()))) { - Card card = game.getCard(event.getSourceId()); - return card != null && card.getColor(game).isRed() && !card.getId().equals(source.getSourceId()); + MageObject sourceObject; + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); + if(sourcePermanent == null) { + sourceObject = game.getObject(event.getSourceId()); + } + else { + sourceObject = sourcePermanent; + } + return sourceObject != null && sourceObject.getColor(game).isRed() && !sourceObject.getId().equals(source.getSourceId()); } return false; } + @Override public boolean apply(Game game, Ability source) { return true; From ee19ae4096b75f1cd6676bada46474551b7acf62 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 12 Jul 2015 12:43:39 +0300 Subject: [PATCH 017/375] Remove possible newline character from author's name in gen-card.pl --- Utils/gen-card.pl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index 5410dacb5e7..d18b670427a 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -35,6 +35,7 @@ my $author; if (-e $authorFile) { open (DATA, $authorFile); $author = ; + chomp $author; close(DATA); } else { $author = 'anonymous'; @@ -136,7 +137,7 @@ foreach my $setName (keys %{$cards{$cardName}}) { if (!$baseRarity) { $baseRarity = $cards{$cardName}{$setName}[3]; - + $vars{'manaCost'} = fixCost($cards{$cardName}{$setName}[4]); $vars{'power'} = $cards{$cardName}{$setName}[6]; $vars{'toughness'} = $cards{$cardName}{$setName}[7]; @@ -156,7 +157,7 @@ foreach my $setName (keys %{$cards{$cardName}}) { } } $vars{'type'} = join(', ', @types); - + $vars{'abilitiesImports'} = ''; $vars{'abilities'} = ''; @@ -198,7 +199,7 @@ foreach my $setName (keys %{$cards{$cardName}}) { $vars{'abilitiesImports'} .= "\nimport mage.abilities.costs.mana.ManaCostsImpl;"; } - + $vars{'abilitiesImports'} .= "\nimport mage.abilities.keyword." . $kw . "Ability;"; } else { $vars{'abilities'} .= "\n // $kwUnchanged"; @@ -209,7 +210,7 @@ foreach my $setName (keys %{$cards{$cardName}}) { } } } - + if (!$notKeyWord) { $vars{'abilities'} .= "\n // $ability"; if ($simpleOnly eq 'true') { From b8b978b85120f01e4eef0d6e00550e2c1e58a7ab Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 12 Jul 2015 16:40:32 +0300 Subject: [PATCH 018/375] Implement cards: Hobble, Keldon Mantle, and Sisay's Ingenuity --- .../src/mage/sets/planeshift/Hobble.java | 85 ++++++++++++++++++ .../mage/sets/planeshift/KeldonMantle.java | 85 ++++++++++++++++++ .../mage/sets/planeshift/SisaysIngenuity.java | 88 +++++++++++++++++++ 3 files changed, 258 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/planeshift/Hobble.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/KeldonMantle.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/SisaysIngenuity.java diff --git a/Mage.Sets/src/mage/sets/planeshift/Hobble.java b/Mage.Sets/src/mage/sets/planeshift/Hobble.java new file mode 100644 index 00000000000..1bbeccdb18e --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/Hobble.java @@ -0,0 +1,85 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.EnchantedCreatureColorCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.combat.CantAttackAttachedEffect; +import mage.abilities.effects.common.combat.CantBlockAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class Hobble extends CardImpl { + + public Hobble(UUID ownerId) { + super(ownerId, 7, "Hobble", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // When Hobble enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + // Enchanted creature can't attack. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackAttachedEffect(AttachmentType.AURA))); + // Enchanted creature can't block if it's black. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new CantBlockAttachedEffect(AttachmentType.AURA), + new EnchantedCreatureColorCondition(ObjectColor.BLACK), "Enchanted creature can't block if it's black"))); + } + + public Hobble(final Hobble card) { + super(card); + } + + @Override + public Hobble copy() { + return new Hobble(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/KeldonMantle.java b/Mage.Sets/src/mage/sets/planeshift/KeldonMantle.java new file mode 100644 index 00000000000..5493ff2f2b1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/KeldonMantle.java @@ -0,0 +1,85 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.RegenerateAttachedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class KeldonMantle extends CardImpl { + + public KeldonMantle(UUID ownerId) { + super(ownerId, 65, "Keldon Mantle", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // {B}: Regenerate enchanted creature. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateAttachedEffect(AttachmentType.AURA), new ManaCostsImpl("{B}"))); + // {R}: Enchanted creature gets +1/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), + new ManaCostsImpl("{R}"))); + // {G}: Enchanted creature gains trample until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), + AttachmentType.AURA, Duration.EndOfTurn), new ManaCostsImpl("{G}"))); + } + + public KeldonMantle(final KeldonMantle card) { + super(card); + } + + @Override + public KeldonMantle copy() { + return new KeldonMantle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/SisaysIngenuity.java b/Mage.Sets/src/mage/sets/planeshift/SisaysIngenuity.java new file mode 100644 index 00000000000..5d3eb5fb336 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/SisaysIngenuity.java @@ -0,0 +1,88 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BecomesColorTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class SisaysIngenuity extends CardImpl { + + public SisaysIngenuity(UUID ownerId) { + super(ownerId, 33, "Sisay's Ingenuity", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // When Sisay's Ingenuity enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + // Enchanted creature has "{2}{U}: Target creature becomes the color of your choice until end of turn." + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorTargetEffect(Duration.EndOfTurn), + new ManaCostsImpl("{2}{U}")); + ability.addTarget(new TargetCreaturePermanent()); + Effect effect = new GainAbilityAttachedEffect(ability, AttachmentType.AURA); + effect.setText("Enchanted creature has \"{2}{U}: Target creature becomes the color of your choice until end of turn.\""); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + } + + public SisaysIngenuity(final SisaysIngenuity card) { + super(card); + } + + @Override + public SisaysIngenuity copy() { + return new SisaysIngenuity(this); + } +} From e9667b430bb0aaa21aaf60b300794ab125cdff85 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 19:12:21 +0200 Subject: [PATCH 019/375] * Fixed wrong package of Icatian Javelineers2 of Fallen Empire. --- Mage.Sets/src/mage/sets/fallenempires/IcatianJavelineers2.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/fallenempires/IcatianJavelineers2.java b/Mage.Sets/src/mage/sets/fallenempires/IcatianJavelineers2.java index 793fe6afae1..8bad3390ef6 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/IcatianJavelineers2.java +++ b/Mage.Sets/src/mage/sets/fallenempires/IcatianJavelineers2.java @@ -25,10 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.sets.timeshifted; +package mage.sets.fallenempires; import java.util.UUID; -import mage.constants.Rarity; /** * From 55966f3056bf808e8aa14df8a59a6ebdbc805883 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 19:49:53 +0200 Subject: [PATCH 020/375] * Fixes to spend any mana to pay handling- --- .../Mage.Player.Human/src/mage/player/human/HumanPlayer.java | 2 +- Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java | 4 ++-- Mage/src/mage/abilities/costs/mana/ManaCostImpl.java | 2 +- Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java | 2 +- Mage/src/mage/players/Player.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 0b26b8ea235..7e1a819fa46 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -674,7 +674,7 @@ public class HumanPlayer extends PlayerImpl { } @Override - public boolean playMana(ManaCost unpaid, String promptText, Game game) { + public boolean playMana(Ability ability, ManaCost unpaid, String promptText, Game game) { payManaMode = true; boolean result = playManaHandling(unpaid, promptText, game); payManaMode = false; diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index adb8160badd..683c11da3e7 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1826,8 +1826,8 @@ public class TestPlayer implements Player { } @Override - public boolean playMana(ManaCost unpaid, String promptText, Game game) { - return computerPlayer.playMana(unpaid, promptText, game); + public boolean playMana(Ability ability, ManaCost unpaid, String promptText, Game game) { + return computerPlayer.playMana(ability, unpaid, promptText, game); } @Override diff --git a/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java b/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java index 60e9fcb22d1..c33e0f5799b 100644 --- a/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java +++ b/Mage/src/mage/abilities/costs/mana/ManaCostImpl.java @@ -219,7 +219,7 @@ public abstract class ManaCostImpl extends CostImpl implements ManaCost { while (!isPaid()) { ManaCost unpaid = this.getUnpaid(); String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid); - if (player.playMana(unpaid, promptText, game)) { + if (player.playMana(ability, unpaid, promptText, game)) { assignPayment(game, ability, player.getManaPool()); } else { return false; diff --git a/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java b/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java index 02e6f4682ba..c6d7654244a 100644 --- a/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java +++ b/Mage/src/mage/abilities/costs/mana/ManaCostsImpl.java @@ -131,7 +131,7 @@ public class ManaCostsImpl extends ArrayList implements M while (!isPaid()) { ManaCost unpaid = this.getUnpaid(); String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid); - if (player.playMana(unpaid, promptText, game)) { + if (player.playMana(ability, unpaid, promptText, game)) { assignPayment(game, ability, player.getManaPool()); } else { return false; diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index d9b3a914f70..d242c5a49de 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -445,7 +445,7 @@ public interface Player extends MageItem, Copyable { boolean choosePile(Outcome outcome, String message, List pile1, List pile2, Game game); - boolean playMana(ManaCost unpaid, String promptText, Game game); + boolean playMana(Ability ability, ManaCost unpaid, String promptText, Game game); /** * Moves the cards from cards to the bottom of the players library. From c53c09a59b02c9911cc82efe18d853ef4414096d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 19:50:20 +0200 Subject: [PATCH 021/375] * Fixes to handling of triggered abilities of tokens. --- .../cards/triggers/dies/ReefWormTest.java | 14 ++-- .../mage/abilities/TriggeredAbilities.java | 13 ++++ .../common/DiesTriggeredAbility.java | 70 +++++++++++-------- .../mage/game/permanent/PermanentToken.java | 61 ++++++++-------- Mage/src/mage/game/turn/Phase.java | 26 +++---- Mage/src/mage/players/PlayerImpl.java | 4 -- 6 files changed, 102 insertions(+), 86 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/ReefWormTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/ReefWormTest.java index 7c57a3d80fe..def1af26a6c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/ReefWormTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/ReefWormTest.java @@ -34,9 +34,9 @@ import org.mage.test.serverside.base.CardTestPlayerBase; /** * Checks that a dies triggered ability of a Token works + * * @author LevelX2 */ - public class ReefWormTest extends CardTestPlayerBase { @Test @@ -50,16 +50,18 @@ public class ReefWormTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Reef Worm", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Reef Worm"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Fish"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Whale"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Whale"); + castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Lightning Bolt", "Fish"); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Whale"); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Whale"); - setStopAt(1, PhaseStep.BEGIN_COMBAT); + setStopAt(1, PhaseStep.END_TURN); execute(); assertLife(playerA, 20); assertLife(playerB, 20); + assertGraveyardCount(playerA, "Lightning Bolt", 4); + assertPermanentCount(playerB, "Fish", 0); assertPermanentCount(playerB, "Whale", 0); assertPermanentCount(playerB, "Kraken", 1); @@ -68,4 +70,4 @@ public class ReefWormTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Lightning Bolt", 4); } -} \ No newline at end of file +} diff --git a/Mage/src/mage/abilities/TriggeredAbilities.java b/Mage/src/mage/abilities/TriggeredAbilities.java index 430ae354192..5bf7818a30a 100644 --- a/Mage/src/mage/abilities/TriggeredAbilities.java +++ b/Mage/src/mage/abilities/TriggeredAbilities.java @@ -160,6 +160,19 @@ public class TriggeredAbilities extends ConcurrentHashMap keysToRemove = new ArrayList<>(); + for (Entry entry : this.entrySet()) { + if (game.getObject(entry.getValue().getSourceId()) == null) { + keysToRemove.add(entry.getKey()); + } + } + for (String key : keysToRemove) { + remove(key); + } + } + public TriggeredAbilities copy() { return new TriggeredAbilities(this); } diff --git a/Mage/src/mage/abilities/common/DiesTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesTriggeredAbility.java index 412d9518f09..aac46fbe9d8 100644 --- a/Mage/src/mage/abilities/common/DiesTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiesTriggeredAbility.java @@ -1,40 +1,40 @@ /* -* 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. -*/ - + * 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.abilities.common; -import mage.constants.Zone; import mage.MageObject; import mage.abilities.effects.Effect; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; /** * @@ -58,14 +58,22 @@ public class DiesTriggeredAbility extends ZoneChangeTriggeredAbility { public boolean isInUseableZone(Game game, MageObject source, GameEvent event) { // check it was previously on battlefield Permanent before = ((ZoneChangeEvent) event).getTarget(); - if (!this.hasSourceObjectAbility(game, before, event)) { + if (!(before instanceof PermanentToken) && !this.hasSourceObjectAbility(game, before, event)) { return false; - } + } // check now it is in graveyard Zone after = game.getState().getZone(sourceId); return before != null && after != null && Zone.GRAVEYARD.match(after); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + if (super.checkEventType(event, game)) { + return ((ZoneChangeEvent) event).getFromZone().equals(Zone.BATTLEFIELD) && ((ZoneChangeEvent) event).getToZone().equals(Zone.GRAVEYARD); + } + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + @Override public DiesTriggeredAbility copy() { return new DiesTriggeredAbility(this); @@ -80,7 +88,7 @@ public class DiesTriggeredAbility extends ZoneChangeTriggeredAbility { return false; } } - for (Effect effect: getEffects()) { + for (Effect effect : getEffects()) { effect.setValue("diedPermanent", zEvent.getTarget()); } return true; diff --git a/Mage/src/mage/game/permanent/PermanentToken.java b/Mage/src/mage/game/permanent/PermanentToken.java index be5e63776a0..d8e02c5e12f 100644 --- a/Mage/src/mage/game/permanent/PermanentToken.java +++ b/Mage/src/mage/game/permanent/PermanentToken.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.game.permanent; import java.util.UUID; @@ -78,7 +77,7 @@ public class PermanentToken extends PermanentImpl { } this.abilities.setControllerId(this.controllerId); this.manaCost.clear(); - for (ManaCost cost: token.getManaCost()) { + for (ManaCost cost : token.getManaCost()) { this.getManaCost().add(cost.copy()); } this.cardType = token.getCardType(); @@ -95,8 +94,7 @@ public class PermanentToken extends PermanentImpl { game.rememberLKI(objectId, Zone.BATTLEFIELD, this); if (game.getPlayer(controllerId).removeFromBattlefield(this, game)) { game.setZone(objectId, zone); // needed for triggered dies abilities - game.addSimultaneousEvent(new ZoneChangeEvent(this, this.getControllerId(), Zone.BATTLEFIELD, zone)); // causes maybe a problem with Dies trigger of Tokens - // game.getState().removeTriggersOfSourceId(this.getId());// if token is gone endless triggered abilities have to be removed + game.addSimultaneousEvent(new ZoneChangeEvent(this, this.getControllerId(), Zone.BATTLEFIELD, zone)); return true; } } @@ -108,7 +106,7 @@ public class PermanentToken extends PermanentImpl { if (!game.replaceEvent(new ZoneChangeEvent(this, sourceId, this.getControllerId(), Zone.BATTLEFIELD, Zone.EXILED))) { game.rememberLKI(objectId, Zone.BATTLEFIELD, this); if (game.getPlayer(controllerId).removeFromBattlefield(this, game)) { - game.addSimultaneousEvent(new ZoneChangeEvent(this, sourceId, this.getControllerId(), Zone.BATTLEFIELD, Zone.EXILED)); + game.addSimultaneousEvent(new ZoneChangeEvent(this, sourceId, this.getControllerId(), Zone.BATTLEFIELD, Zone.EXILED)); return true; } } @@ -142,5 +140,4 @@ public class PermanentToken extends PermanentImpl { } } - } diff --git a/Mage/src/mage/game/turn/Phase.java b/Mage/src/mage/game/turn/Phase.java index 0fc741fcc4f..511d6450cb3 100644 --- a/Mage/src/mage/game/turn/Phase.java +++ b/Mage/src/mage/game/turn/Phase.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.game.turn; import java.io.Serializable; @@ -57,7 +56,8 @@ public abstract class Phase implements Serializable { public abstract Phase copy(); - public Phase() {} + public Phase() { + } public Phase(final Phase phase) { this.type = phase.type; @@ -69,7 +69,7 @@ public abstract class Phase implements Serializable { this.currentStep = phase.currentStep.copy(); } this.count = phase.count; - for (Step step: phase.steps) { + for (Step step : phase.steps) { this.steps.add(step.copy()); } } @@ -103,7 +103,7 @@ public abstract class Phase implements Serializable { if (beginPhase(game, activePlayerId)) { - for (Step step: steps) { + for (Step step : steps) { if (game.isPaused() || game.gameOver(null)) { return false; } @@ -184,6 +184,7 @@ public abstract class Phase implements Serializable { public void endPhase(Game game, UUID activePlayerId) { game.fireEvent(new GameEvent(postEvent, null, null, activePlayerId)); + game.getState().getTriggers().removeAbilitiesOfNonExistingSources(game); // e.g. tokens that left the battlefield } public void prePriority(Game game, UUID activePlayerId) { @@ -204,9 +205,9 @@ public abstract class Phase implements Serializable { prePriority(game, activePlayerId); if (!game.isPaused() && !game.gameOver(null)) { currentStep.priority(game, activePlayerId, false); - if(game.executingRollback()) { + if (game.executingRollback()) { return; - } + } } if (!game.isPaused() && !game.gameOver(null)) { postPriority(game, activePlayerId); @@ -225,8 +226,7 @@ public abstract class Phase implements Serializable { if (wasPaused) { currentStep.resumeBeginStep(game, activePlayerId); resuming = false; - } - else { + } else { prePriority(game, activePlayerId); } case PRIORITY: diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 4ad504cd501..c923bc63a27 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -116,7 +116,6 @@ import mage.game.events.ZoneChangeGroupEvent; import mage.game.match.MatchPlayer; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; -import mage.game.permanent.PermanentToken; import mage.game.stack.Spell; import mage.game.stack.StackAbility; import mage.game.stack.StackObject; @@ -813,9 +812,6 @@ public abstract class PlayerImpl implements Player, Serializable { pairedCard.clearPairedCard(); } } - if (permanent instanceof PermanentToken) { - game.getState().getTriggers().removeAbilitiesOfSource(permanent.getId()); - } return true; } From fa0a40b0d6b22906079b53436e01752b785aa2d3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 19:51:04 +0200 Subject: [PATCH 022/375] * Some fixes/chnages to AI player. Needs probably some more testing. --- .../src/mage/player/ai/ComputerPlayer6.java | 84 ++++++++++++++----- .../mage/player/ai/GameStateEvaluator2.java | 62 +++++++------- .../src/mage/player/ai/SimulatedPlayer2.java | 56 ++++++------- .../src/mage/player/ai/SimulationNode2.java | 9 +- .../player/ai/ma/ArtificialScoringSystem.java | 61 +++++++------- .../java/mage/player/ai/ComputerPlayer.java | 72 +++++++++++----- .../JaceArchitectOfThought.java | 2 - .../serverside/base/CardTestPlayerBaseAI.java | 13 ++- 8 files changed, 209 insertions(+), 150 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index da899f41f40..66fc062f4d7 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -27,16 +27,43 @@ */ package mage.player.ai; +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Scanner; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; import mage.abilities.SpellAbility; import mage.abilities.common.PassAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.SearchEffect; -import mage.abilities.keyword.*; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.ExaltedAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.keyword.ReachAbility; import mage.cards.Card; import mage.cards.Cards; import mage.choices.Choice; +import mage.constants.AbilityType; import mage.constants.Outcome; import mage.constants.PhaseStep; import mage.constants.RangeOfInfluence; @@ -47,7 +74,25 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.stack.StackAbility; import mage.game.stack.StackObject; -import mage.game.turn.*; +import mage.game.turn.BeginCombatStep; +import mage.game.turn.BeginningPhase; +import mage.game.turn.CleanupStep; +import mage.game.turn.CombatDamageStep; +import mage.game.turn.CombatPhase; +import mage.game.turn.DeclareAttackersStep; +import mage.game.turn.DeclareBlockersStep; +import mage.game.turn.DrawStep; +import mage.game.turn.EndOfCombatStep; +import mage.game.turn.EndPhase; +import mage.game.turn.EndStep; +import mage.game.turn.FirstCombatDamageStep; +import mage.game.turn.Phase; +import mage.game.turn.PostCombatMainPhase; +import mage.game.turn.PostCombatMainStep; +import mage.game.turn.PreCombatMainPhase; +import mage.game.turn.PreCombatMainStep; +import mage.game.turn.UntapStep; +import mage.game.turn.UpkeepStep; import mage.player.ai.ma.optimizers.TreeOptimizer; import mage.player.ai.ma.optimizers.impl.DiscardCardOptimizer; import mage.player.ai.ma.optimizers.impl.EquipOptimizer; @@ -60,11 +105,6 @@ import mage.target.Target; import mage.target.TargetCard; import mage.target.Targets; -import java.io.File; -import java.util.*; -import java.util.concurrent.*; -import mage.constants.AbilityType; - /** * * @author nantuko @@ -89,6 +129,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { protected int lastLoggedTurn = 0; Random random = new Random(); protected static final String BLANKS = "..............................................."; + static { optimizers.add(new LevelUpOptimizer()); optimizers.add(new EquipOptimizer()); @@ -316,7 +357,6 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { * attack with any of them // let's try once again to avoid * possible horizon effect return false; } } */ - logger.info("simulating -- continuing previous action chain"); actions = new LinkedList<>(root.abilities); combat = root.combat; @@ -523,9 +563,10 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { List allActions = currentPlayer.simulatePriority(game); optimize(game, allActions); if (logger.isInfoEnabled() && allActions.size() > 0 && depth == maxDepth) { - logger.info("Sim Prio [" + depth + "] player " + currentPlayer.getName() + " adding " + allActions.size() + " actions:" + allActions); + logger.info("ADDED ACTIONS (" + allActions.size() + ") " + " " + allActions); } int counter = 0; + int bestValSubNodes = Integer.MIN_VALUE; for (Ability action : allActions) { counter++; if (ALLOW_INTERRUPT && Thread.interrupted()) { @@ -553,15 +594,14 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { sim.checkStateAndTriggered(); int val; if (action instanceof PassAbility) { - // Stop to simulate deeper if PassAbility + // Stop to simulate deeper if PassAbility val = GameStateEvaluator2.evaluate(this.getId(), sim); // logger.info("evaluate = " + val ); } else { val = addActions(newNode, depth - 1, alpha, beta); -// logger.info("addAction = " + val ); } - logger.debug("Sim Prio " + BLANKS.substring(0, 2 + (maxDepth-depth) * 3)+ "["+depth+"]#"+counter+" <" + val +"> - ("+action.toString()+") "+newNode.hashCode()+" parent node "+node.hashCode()); - if (logger.isInfoEnabled() && depth == maxDepth) { + logger.debug("Sim Prio " + BLANKS.substring(0, 2 + (maxDepth - depth) * 3) + "[" + depth + "]#" + counter + " <" + val + "> - (" + action.toString() + ") "); + if (logger.isInfoEnabled() && depth >= maxDepth) { StringBuilder sb = new StringBuilder("Sim Prio [").append(depth).append("] #").append(counter) .append(" <").append(val).append("> (").append(action) .append(action.isModal() ? " Mode = " + action.getModes().getMode().toString() : "") @@ -578,6 +618,9 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { } if (currentPlayer.getId().equals(playerId)) { + if (val > bestValSubNodes) { + bestValSubNodes = val; + } if (depth == maxDepth && action instanceof PassAbility) { val = val - PASSIVITY_PENALTY; // passivity penalty } @@ -594,7 +637,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { * choices = node.getChoices(); */ if (depth == maxDepth) { - logger.info(new StringBuilder("Sim Prio [").append(depth).append("] -- Saved best node yet <").append(bestNode.getScore()).append("> ").append(bestNode.getAbilities().toString()).toString()); + logger.info("Sim Prio [" + depth + "] -- Saved best node yet <" + bestNode.getScore() + "> " + bestNode.getAbilities().toString()); node.children.clear(); node.children.add(bestNode); node.setScore(bestNode.getScore()); @@ -652,7 +695,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { } */ //logger.info("returning priority alpha: " + alpha); - return alpha; + return bestValSubNodes; } else { // if (beta == Integer.MAX_VALUE) { // int val = GameStateEvaluator2.evaluate(playerId, game); @@ -861,7 +904,6 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { CombatUtil.sortByPower(attackers, false); //this is where my code goes - CombatInfo combatInfo = CombatUtil.blockWithGoodTrade2(game, attackers, possibleBlockers); Player player = game.getPlayer(this.playerId); @@ -995,7 +1037,6 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { } //CombatUtil.handleExalted(); - //TODO: refactor -- extract to method //List counterAttackList = new ArrayList(); //int counterAttackDamage = 0; @@ -1107,10 +1148,8 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { * (totalFirstStrikeBlockPower < attacker.getToughness().getValue()) * ) { finalAttackers.add(attacker); } } */ - // The AI will now attack more sanely. Simple, but good enough for now. - // The sim minmax does not work at the moment. - + // The sim minmax does not work at the moment. boolean safeToAttack; CombatEvaluator eval = new CombatEvaluator(); @@ -1418,7 +1457,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { if (powerLeftToKill <= 0) { return blockers.iterator().next().getId(); } - for (Permanent blocker: blockers) { + for (Permanent blocker : blockers) { if (attackerDeathtouch || powerLeftToKill >= blocker.getToughness().getValue()) { if (!blocker.getAbilities().containsKey(IndestructibleAbility.getInstance().getId())) { return blocker.getId(); @@ -1435,7 +1474,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { private List getAlreadyBlockingPermanents(List blockerOrder, Game game) { List blockerAlreadySet = new ArrayList<>(); - for (UUID uuid :blockerOrder) { + for (UUID uuid : blockerOrder) { Permanent permanent = game.getPermanent(uuid); if (permanent != null) { blockerAlreadySet.add(permanent); @@ -1455,5 +1494,4 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { return toughnessAlreadyNeeded; } - } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java index 52b99359a6e..0e2c9f409c1 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java @@ -2,7 +2,6 @@ * To change this template, choose Tools | Templates * and open the template in the editor. */ - package mage.player.ai; import java.util.UUID; @@ -60,21 +59,21 @@ public class GameStateEvaluator2 { StringBuilder sbPlayer = new StringBuilder(); StringBuilder sbOpponent = new StringBuilder(); // add values of player - for (Permanent permanent: game.getBattlefield().getAllActivePermanents(playerId)) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { int onePermScore = evaluatePermanent(permanent, game); playerScore += onePermScore; if (logger.isDebugEnabled()) { sbPlayer.append(permanent.getName()).append("[").append(onePermScore).append("] "); } } - if (logger.isDebugEnabled()) { + if (logger.isDebugEnabled()) { sbPlayer.insert(0, playerScore + " - "); sbPlayer.insert(0, "Player..: "); logger.debug(sbPlayer); } // add values of opponent - for (Permanent permanent: game.getBattlefield().getAllActivePermanents(opponent.getId())) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(opponent.getId())) { int onePermScore = evaluatePermanent(permanent, game); opponentScore += onePermScore; if (logger.isDebugEnabled()) { @@ -84,7 +83,7 @@ public class GameStateEvaluator2 { if (logger.isDebugEnabled()) { sbOpponent.insert(0, opponentScore + " - "); sbOpponent.insert(0, "Opponent: "); - + logger.debug(sbOpponent); } permanentScore = playerScore - opponentScore; @@ -97,28 +96,28 @@ public class GameStateEvaluator2 { handScore *= 5; int score = lifeScore + permanentScore + handScore; - logger.debug(score + " total Score (life:" + lifeScore + " permanents:" + permanentScore + " hand:" + handScore +")"); + logger.debug(score + " total Score (life:" + lifeScore + " permanents:" + permanentScore + " hand:" + handScore + ")"); return score; } public static int evaluatePermanent(Permanent permanent, Game game) { /*int value = permanent.isTapped()?4:5; - if (permanent.getCardType().contains(CardType.CREATURE)) { - value += evaluateCreature(permanent, game) * CREATURE_FACTOR; - } - value += permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD).size(); - for (ActivatedAbility ability: permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { - if (!(ability instanceof ManaAbility) && ability.canActivate(ability.getControllerId(), game)) - value += ability.getEffects().size(); - } - value += permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD).size(); - value += permanent.getAbilities().getTriggeredAbilities(Zone.BATTLEFIELD).size(); - value += permanent.getManaCost().convertedManaCost(); - */ + if (permanent.getCardType().contains(CardType.CREATURE)) { + value += evaluateCreature(permanent, game) * CREATURE_FACTOR; + } + value += permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD).size(); + for (ActivatedAbility ability: permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { + if (!(ability instanceof ManaAbility) && ability.canActivate(ability.getControllerId(), game)) + value += ability.getEffects().size(); + } + value += permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD).size(); + value += permanent.getAbilities().getTriggeredAbilities(Zone.BATTLEFIELD).size(); + value += permanent.getManaCost().convertedManaCost(); + */ int value = ArtificialScoringSystem.getFixedPermanentScore(game, permanent) - + ArtificialScoringSystem.getVariablePermanentScore(game, permanent); + + ArtificialScoringSystem.getVariablePermanentScore(game, permanent); //TODO: add a difficulty to calculation to ManaCost - sort permanents by difficulty for casting when evaluating game states return value; @@ -126,21 +125,20 @@ public class GameStateEvaluator2 { public static int evaluateCreature(Permanent creature, Game game) { int value = ArtificialScoringSystem.getFixedPermanentScore(game, creature) - + ArtificialScoringSystem.getVariablePermanentScore(game, creature); + + ArtificialScoringSystem.getVariablePermanentScore(game, creature); /*int value = 0; - value += creature.getPower().getValue(); - value += creature.getToughness().getValue(); -// if (creature.canAttack(game)) -// value += creature.getPower().getValue(); -// if (!creature.isTapped()) -// value += 2; - value += creature.getAbilities().getEvasionAbilities().size(); - value += creature.getAbilities().getProtectionAbilities().size(); - value += creature.getAbilities().containsKey(FirstStrikeAbility.getInstance().getId())?1:0; - value += creature.getAbilities().containsKey(DoubleStrikeAbility.getInstance().getId())?2:0; - value += creature.getAbilities().containsKey(TrampleAbility.getInstance().getId())?1:0;*/ - + value += creature.getPower().getValue(); + value += creature.getToughness().getValue(); + // if (creature.canAttack(game)) + // value += creature.getPower().getValue(); + // if (!creature.isTapped()) + // value += 2; + value += creature.getAbilities().getEvasionAbilities().size(); + value += creature.getAbilities().getProtectionAbilities().size(); + value += creature.getAbilities().containsKey(FirstStrikeAbility.getInstance().getId())?1:0; + value += creature.getAbilities().containsKey(DoubleStrikeAbility.getInstance().getId())?2:0; + value += creature.getAbilities().containsKey(TrampleAbility.getInstance().getId())?1:0;*/ return value; } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java index 40e947230c6..42a7e062dd7 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.player.ai; import java.util.ArrayList; @@ -37,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.PassAbility; @@ -108,11 +108,16 @@ public class SimulatedPlayer2 extends ComputerPlayer { if (logger.isTraceEnabled()) { for (Ability a : allActions) { - logger.trace("ability==" + a); + logger.info("ability==" + a); if (a.getTargets().size() > 0) { - Player player = game.getPlayer(a.getFirstTarget()); - if (player != null) { - logger.trace(" target="+player.getName()); + MageObject mageObject = game.getObject(a.getFirstTarget()); + if (mageObject != null) { + logger.info(" target=" + mageObject.getName()); + } else { + Player player = game.getPlayer(a.getFirstTarget()); + if (player != null) { + logger.info(" target=" + player.getName()); + } } } } @@ -124,21 +129,20 @@ public class SimulatedPlayer2 extends ComputerPlayer { protected void simulateOptions(Game game) { List playables = game.getPlayer(playerId).getPlayable(game, isSimulatedPlayer); playables = filterAbilities(game, playables, suggested); - for (Ability ability: playables) { + for (Ability ability : playables) { if (ability.getAbilityType().equals(AbilityType.MANA)) { continue; } List options = game.getPlayer(playerId).getPlayableOptions(ability, game); - options = filterOptions(game, options, ability, suggested); + options = filterOptions(game, options, ability, suggested); options = optimizeOptions(game, options, ability); if (options.isEmpty()) { - allActions.add(ability); + allActions.add(ability); // simulateAction(game, previousActions, ability); - } - else { + } else { // ExecutorService simulationExecutor = Executors.newFixedThreadPool(4); - for (Ability option: options) { - allActions.add(option); + for (Ability option : options) { + allActions.add(option); // SimulationWorker worker = new SimulationWorker(game, this, previousActions, option); // simulationExecutor.submit(worker); } @@ -157,7 +161,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { if (card != null && numAvailable > 0) { // check if variable mana costs is included and get the multiplier VariableManaCost variableManaCost = null; - for (ManaCost cost: ability.getManaCostsToPay()) { + for (ManaCost cost : ability.getManaCostsToPay()) { if (cost instanceof VariableManaCost && !cost.isPaid()) { variableManaCost = (VariableManaCost) cost; break; // only one VariableManCost per spell (or is it possible to have more?) @@ -171,7 +175,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { int xAmount = mana / multiplier; Ability newAbility = ability.copy(); VariableManaCost varCost = null; - for (ManaCost cost: newAbility.getManaCostsToPay()) { + for (ManaCost cost : newAbility.getManaCostsToPay()) { if (cost instanceof VariableManaCost && !cost.isPaid()) { varCost = (VariableManaCost) cost; break; // only one VariableManCost per spell (or is it possible to have more?) @@ -207,7 +211,6 @@ public class SimulatedPlayer2 extends ComputerPlayer { // allActions.add(new SimulatedAction(sim, actions)); // } // } - /** * if suggested abilities exist, return only those from playables * @@ -253,7 +256,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { Card card = game.getCard(ability.getSourceId()); for (String s : suggested) { String[] groups = s.split(";"); - logger.trace("s="+s+";groups="+groups.length); + logger.trace("s=" + s + ";groups=" + groups.length); if (groups.length == 2) { if (groups[0].equals(card.getName()) && groups[1].startsWith("name=")) { // extract target and compare to suggested @@ -330,7 +333,7 @@ public class SimulatedPlayer2 extends ComputerPlayer { } } } - + return options; } @@ -352,15 +355,14 @@ public class SimulatedPlayer2 extends ComputerPlayer { for (int j = 0; j < attackersList.size(); j++) { if (binary.charAt(j) == '1') { setStoredBookmark(sim.bookmarkState()); // makes it possible to UNDO a declared attacker with costs from e.g. Propaganda - if(!sim.getCombat().declareAttacker(attackersList.get(j).getId(), defenderId, playerId, sim)) { + if (!sim.getCombat().declareAttacker(attackersList.get(j).getId(), defenderId, playerId, sim)) { sim.undo(playerId); - } + } } } if (engagements.put(sim.getCombat().getValue().hashCode(), sim.getCombat()) != null) { logger.debug("simulating -- found redundant attack combination"); - } - else { + } else { logger.debug("simulating -- attack:" + sim.getCombat().getGroups().size()); } } @@ -424,15 +426,14 @@ public class SimulatedPlayer2 extends ComputerPlayer { ability.activate(game, false); game.applyEffects(); game.getPlayers().resetPassed(); - } - else { + } else { SimulationNode2 parent = (SimulationNode2) game.getCustomData(); int depth = parent.getDepth() - 1; if (depth == 0) { return true; } logger.debug("simulating -- triggered ability - adding children:" + options.size()); - for (Ability option: options) { + for (Ability option : options) { addAbilityNode(parent, option, depth, game); } } @@ -446,12 +447,12 @@ public class SimulatedPlayer2 extends ComputerPlayer { sim.applyEffects(); SimulationNode2 newNode = new SimulationNode2(parent, sim, depth, playerId); logger.debug("simulating -- node #:" + SimulationNode2.getCount() + " triggered ability option"); - for (Target target: ability.getTargets()) { - for (UUID targetId: target.getTargets()) { + for (Target target : ability.getTargets()) { + for (UUID targetId : target.getTargets()) { newNode.getTargets().add(targetId); } } - for (Choice choice: ability.getChoices()) { + for (Choice choice : ability.getChoices()) { newNode.getChoices().add(choice.getChoice()); } parent.children.add(newNode); @@ -463,5 +464,4 @@ public class SimulatedPlayer2 extends ComputerPlayer { return false; } - } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode2.java index b5e1fef4400..bbbf1f05c2f 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode2.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode2.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.player.ai; import java.io.Serializable; @@ -49,10 +48,10 @@ public class SimulationNode2 implements Serializable { protected int score; protected List abilities; protected int depth; - protected List children = new ArrayList(); + protected List children = new ArrayList<>(); protected SimulationNode2 parent; - protected List targets = new ArrayList(); - protected List choices = new ArrayList(); + protected List targets = new ArrayList<>(); + protected List choices = new ArrayList<>(); protected UUID playerId; protected Combat combat; @@ -72,7 +71,7 @@ public class SimulationNode2 implements Serializable { public SimulationNode2(SimulationNode2 parent, Game game, Ability ability, int depth, UUID playerId) { this(parent, game, depth, playerId); - this.abilities = new ArrayList(); + this.abilities = new ArrayList<>(); abilities.add(ability); } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java index 4c008d09ff8..abaa31aaf60 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java @@ -1,24 +1,23 @@ package mage.player.ai.ma; +import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.effects.Effect; import mage.abilities.keyword.HasteAbility; import mage.cards.Card; import mage.constants.CardType; +import mage.constants.Outcome; import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; -import java.util.UUID; -import mage.constants.Outcome; -import mage.abilities.effects.Effect; - /** * @author ubeefx, nantuko */ public class ArtificialScoringSystem { - public static final int WIN_GAME_SCORE=100000000; - public static final int LOSE_GAME_SCORE=-WIN_GAME_SCORE; + public static final int WIN_GAME_SCORE = 100000000; + public static final int LOSE_GAME_SCORE = -WIN_GAME_SCORE; private static final int LIFE_SCORES[] = {0, 1000, 2000, 3000, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7400, 7800, 8200, 8600, 9000, 9200, 9400, 9600, 9800, 10000}; private static final int MAX_LIFE = LIFE_SCORES.length - 1; @@ -33,9 +32,9 @@ public class ArtificialScoringSystem { //TODO: check this for "any color" lands //TODO: check this for dual and filter lands /*for (Mana mana : card.getMana()) { - score += 50; - }*/ - score += card.getMana().size()*50; + score += 50; + }*/ + score += card.getMana().size() * 50; return score; } @@ -43,19 +42,19 @@ public class ArtificialScoringSystem { if (card.getCardType().contains(CardType.CREATURE)) { return score + (card.getPower().getValue() + card.getToughness().getValue()) * 10; } else { - return score + (/*card.getRemoval()*50*/ +card.getRarity().getRating() * 30); + return score + (/*card.getRemoval()*50*/+card.getRarity().getRating() * 30); } } public static int getFixedPermanentScore(final Game game, final Permanent permanent) { //TODO: cache it inside Card int score = getCardDefinitionScore(game, permanent); + score += PERMANENT_SCORE; if (permanent.getCardType().contains(CardType.CREATURE)) { // TODO: implement in the mage core //score + =cardDefinition.getActivations().size()*50; //score += cardDefinition.getManaActivations().size()*80; } else { - score += PERMANENT_SCORE; if (permanent.getSubtype().contains("Equipment")) { score += 100; } @@ -101,7 +100,7 @@ public class ArtificialScoringSystem { } } } - score += equipments*50 + enchantments*100; + score += equipments * 50 + enchantments * 100; if (!permanent.canAttack(game)) { score -= 100; @@ -116,9 +115,9 @@ public class ArtificialScoringSystem { private static boolean canTap(Permanent permanent) { return !permanent.isTapped() - &&(!permanent.hasSummoningSickness() - ||!permanent.getCardType().contains(CardType.CREATURE) - ||permanent.getAbilities().contains(HasteAbility.getInstance())); + && (!permanent.hasSummoningSickness() + || !permanent.getCardType().contains(CardType.CREATURE) + || permanent.getAbilities().contains(HasteAbility.getInstance())); } private static int getPositive(int value) { @@ -152,23 +151,23 @@ public class ArtificialScoringSystem { public static int getAttackerScore(final Permanent attacker) { //TODO: implement this /*int score = attacker.getPower().getValue() * 5 + attacker.lethalDamage * 2 - attacker.candidateBlockers.length; - for (final MagicCombatCreature blocker : attacker.candidateBlockers) { + for (final MagicCombatCreature blocker : attacker.candidateBlockers) { - score -= blocker.power; - } - // Dedicated attacker. - if (attacker.hasAbility(MagicAbility.AttacksEachTurnIfAble) || attacker.hasAbility(MagicAbility.CannotBlock)) { - score += 10; - } - // Abilities for attacking. - if (attacker.hasAbility(MagicAbility.Trample) || attacker.hasAbility(MagicAbility.Vigilance)) { - score += 8; - } - // Dangerous to block. - if (!attacker.normalDamage || attacker.hasAbility(MagicAbility.FirstStrike) || attacker.hasAbility(MagicAbility.Indestructible)) { - score += 7; - } - */ + score -= blocker.power; + } + // Dedicated attacker. + if (attacker.hasAbility(MagicAbility.AttacksEachTurnIfAble) || attacker.hasAbility(MagicAbility.CannotBlock)) { + score += 10; + } + // Abilities for attacking. + if (attacker.hasAbility(MagicAbility.Trample) || attacker.hasAbility(MagicAbility.Vigilance)) { + score += 8; + } + // Dangerous to block. + if (!attacker.normalDamage || attacker.hasAbility(MagicAbility.FirstStrike) || attacker.hasAbility(MagicAbility.Indestructible)) { + score += 7; + } + */ int score = 0; return score; } diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 57c42140b9b..28264fff1a5 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -82,6 +82,7 @@ import mage.cards.repository.ExpansionInfo; import mage.cards.repository.ExpansionRepository; import mage.choices.Choice; import mage.choices.ChoiceColor; +import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Outcome; @@ -1116,21 +1117,23 @@ public class ComputerPlayer extends PlayerImpl implements Player { } @Override - public boolean playMana(ManaCost unpaid, String promptText, Game game) { + public boolean playMana(Ability ability, ManaCost unpaid, String promptText, Game game) { payManaMode = true; currentUnpaidMana = unpaid; - boolean result = playManaHandling(unpaid, game); + boolean result = playManaHandling(ability, unpaid, game); currentUnpaidMana = null; payManaMode = false; return result; } - protected boolean playManaHandling(ManaCost unpaid, Game game) { + protected boolean playManaHandling(Ability ability, ManaCost unpaid, Game game) { // log.info("paying for " + unpaid.getText()); + boolean spendAnyMana = game.getContinuousEffects().asThough(ability.getSourceId(), AsThoughEffectType.SPEND_ANY_MANA, ability, ability.getControllerId(), game); ManaCost cost; List producers; if (unpaid instanceof ManaCosts) { - cost = ((ManaCosts) unpaid).get(0); + ManaCosts manaCosts = (ManaCosts) unpaid; + cost = manaCosts.get(manaCosts.size() - 1); producers = getSortedProducers((ManaCosts) unpaid, game); } else { cost = unpaid; @@ -1138,12 +1141,37 @@ public class ComputerPlayer extends PlayerImpl implements Player { producers.addAll(this.getAvailableManaProducersWithCost(game)); } for (Permanent perm : producers) { - // pay all colored costs first - for (ManaAbility ability : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { - if (cost instanceof ColoredManaCost) { - for (Mana netMana : ability.getNetMana(game)) { + // use color producing mana abilities with costs first that produce all color manas that are needed to pay + // otherwise the computer may not be able to pay the cost for that source + ManaAbility: + for (ManaAbility manaAbility : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + int colored = 0; + for (Mana mana : manaAbility.getNetMana(game)) { + if (!unpaid.getMana().includesMana(mana)) { + continue ManaAbility; + } + colored += mana.countColored(); + } + if (colored > 1 && (cost instanceof ColoredManaCost)) { + + for (Mana netMana : manaAbility.getNetMana(game)) { if (cost.testPay(netMana)) { - if (activateAbility(ability, game)) { + if (activateAbility(manaAbility, game)) { + return true; + } + } + } + } + } + } + + for (Permanent perm : producers) { + // pay all colored costs first + for (ManaAbility manaAbility : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + if (cost instanceof ColoredManaCost) { + for (Mana netMana : manaAbility.getNetMana(game)) { + if (cost.testPay(netMana) || spendAnyMana) { + if (activateAbility(manaAbility, game)) { return true; } } @@ -1151,11 +1179,11 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } // then pay hybrid - for (ManaAbility ability : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ManaAbility manaAbility : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof HybridManaCost) { - for (Mana netMana : ability.getNetMana(game)) { - if (cost.testPay(netMana)) { - if (activateAbility(ability, game)) { + for (Mana netMana : manaAbility.getNetMana(game)) { + if (cost.testPay(netMana) || spendAnyMana) { + if (activateAbility(manaAbility, game)) { return true; } } @@ -1163,11 +1191,11 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } // then pay mono hybrid - for (ManaAbility ability : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ManaAbility manaAbility : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof MonoHybridManaCost) { - for (Mana netMana : ability.getNetMana(game)) { - if (cost.testPay(netMana)) { - if (activateAbility(ability, game)) { + for (Mana netMana : manaAbility.getNetMana(game)) { + if (cost.testPay(netMana) || spendAnyMana) { + if (activateAbility(manaAbility, game)) { return true; } } @@ -1175,11 +1203,11 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } // finally pay generic - for (ManaAbility ability : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { + for (ManaAbility manaAbility : perm.getAbilities().getAvailableManaAbilities(Zone.BATTLEFIELD, game)) { if (cost instanceof GenericManaCost) { - for (Mana netMana : ability.getNetMana(game)) { - if (cost.testPay(netMana)) { - if (activateAbility(ability, game)) { + for (Mana netMana : manaAbility.getNetMana(game)) { + if (cost.testPay(netMana) || spendAnyMana) { + if (activateAbility(manaAbility, game)) { return true; } } @@ -1189,7 +1217,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } // pay phyrexian life costs if (cost instanceof PhyrexianManaCost) { - if (cost.pay(null, game, null, playerId, false)) { + if (cost.pay(null, game, null, playerId, false) || spendAnyMana) { return true; } } diff --git a/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java b/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java index fa1d8f6e552..58be732e789 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java @@ -342,14 +342,12 @@ class JaceArchitectOfThoughtEffect3 extends OneShotEffect { while (jaceExileZone.count(filter, game) > 0 && controller.choose(Outcome.PlayForFree, jaceExileZone, target, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - if (controller.cast(card.getSpellAbility(), game, true)) { game.getExile().removeCard(card, game); } } target.clearChosen(); } - return true; } } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBaseAI.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBaseAI.java index 2f50da22db0..910f3de6ec4 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBaseAI.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBaseAI.java @@ -41,11 +41,10 @@ import org.mage.test.serverside.base.impl.CardTestPlayerAPIImpl; * * @author LevelX2 */ - public abstract class CardTestPlayerBaseAI extends CardTestPlayerAPIImpl { - - int skill = 9; - + + int skill = 6; + @Override protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException { Game game = new TwoPlayerDuel(MultiplayerAttackOption.LEFT, RangeOfInfluence.ONE, 0, 20); @@ -53,8 +52,8 @@ public abstract class CardTestPlayerBaseAI extends CardTestPlayerAPIImpl { playerA = createPlayer(game, playerA, "PlayerA"); playerB = createPlayer(game, playerB, "PlayerB"); return game; - } - + } + @Override protected TestPlayer createPlayer(String name) { if (name.equals("PlayerA")) { @@ -65,7 +64,7 @@ public abstract class CardTestPlayerBaseAI extends CardTestPlayerAPIImpl { return super.createPlayer(name); } - public void setAISkill(int skill) { + public void setAISkill(int skill) { this.skill = skill; } } From b2fcb8ea8cbfb322a5c2e39617919dd62b3c9f9f Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 12 Jul 2015 23:16:02 +0200 Subject: [PATCH 023/375] Added some tests. --- .../cards/abilities/keywords/RetraceTest.java | 76 ++++++++++++------- .../continuous/ChiefOfTheFoundryTest.java | 59 ++++++++++++++ 2 files changed, 109 insertions(+), 26 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/continuous/ChiefOfTheFoundryTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java index 8a056cbecfd..190d8e44776 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java @@ -36,19 +36,16 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class RetraceTest extends CardTestPlayerBase { /** - * 702.78. Retrace - * 702.78a Retrace appears on some instants and sorceries. It represents a static ability - * that functions while the card is in a player's graveyard. "Retrace" means "You may cast - * this card from your graveyard by discarding a land card as an additional cost to cast it." - * Casting a spell using its retrace ability follows the rules for paying additional costs - * in rules 601.2b and 601.2e-g. + * 702.78. Retrace 702.78a Retrace appears on some instants and sorceries. + * It represents a static ability that functions while the card is in a + * player's graveyard. "Retrace" means "You may cast this card from your + * graveyard by discarding a land card as an additional cost to cast it." + * Casting a spell using its retrace ability follows the rules for paying + * additional costs in rules 601.2b and 601.2e-g. */ - - @Test public void SimpleRetrace() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); @@ -60,16 +57,16 @@ public class RetraceTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Silvercoat Lion", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime", playerB); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertGraveyardCount(playerA,"Raven's Crime", 1); - assertGraveyardCount(playerA,"Swamp", 1); - - assertGraveyardCount(playerB,"Silvercoat Lion", 1); + assertGraveyardCount(playerA, "Raven's Crime", 1); + assertGraveyardCount(playerA, "Swamp", 1); + + assertGraveyardCount(playerB, "Silvercoat Lion", 1); } - + /** * Test that it does cost {B}{1} + land discard */ @@ -86,14 +83,14 @@ public class RetraceTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Silvercoat Lion", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime", playerB); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertGraveyardCount(playerA,"Raven's Crime", 1); - assertGraveyardCount(playerA,"Swamp", 0); // because not enough mana - - assertGraveyardCount(playerB,"Silvercoat Lion", 0); // because not enough mana + assertGraveyardCount(playerA, "Raven's Crime", 1); + assertGraveyardCount(playerA, "Swamp", 0); // because not enough mana + + assertGraveyardCount(playerB, "Silvercoat Lion", 0); // because not enough mana } /** @@ -112,14 +109,41 @@ public class RetraceTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Silvercoat Lion", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime", playerB); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertGraveyardCount(playerA,"Raven's Crime", 1); - assertGraveyardCount(playerA,"Swamp", 1); - - assertGraveyardCount(playerB,"Silvercoat Lion", 1); + assertGraveyardCount(playerA, "Raven's Crime", 1); + assertGraveyardCount(playerA, "Swamp", 1); + + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + } + + /** + * I noticed the other day that I was not able to cast Worm Harvest from the + * graveyard. I'm not sure if this is an issue with all cards with the + * "retrace" ability but I figured it should be mentioned! + */ + @Test + public void RetraceCastFromGraveyard() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); + + // Target player discards a card. + // Retrace + addCard(Zone.GRAVEYARD, playerA, "Worm Harvest"); + addCard(Zone.GRAVEYARD, playerA, "Swamp", 2); + addCard(Zone.HAND, playerA, "Mountain", 1); + + // Put a 1/1 black and green Worm creature token onto the battlefield for each land card in your graveyard. + // Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Worm Harvest"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Worm", 3); + + assertGraveyardCount(playerA, "Mountain", 1); + } - } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/ChiefOfTheFoundryTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/ChiefOfTheFoundryTest.java new file mode 100644 index 00000000000..823961576c0 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/ChiefOfTheFoundryTest.java @@ -0,0 +1,59 @@ +/* + * 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 org.mage.test.cards.continuous; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.filter.Filter; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class ChiefOfTheFoundryTest extends CardTestPlayerBase { + + /** + * Having two Chief of Foundry's out doesn't make them buff each other. + */ + @Test + public void testBoostOtherFoundry() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6); + addCard(Zone.HAND, playerA, "Chief of the Foundry"); + addCard(Zone.HAND, playerA, "Chief of the Foundry"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chief of the Foundry"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chief of the Foundry"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPowerToughness(playerA, "Chief of the Foundry", 3, 4, Filter.ComparisonScope.All); + } + +} From 0abfbd66e1fb0285f4b52cba7aaa349492d396d9 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 13 Jul 2015 09:13:08 +0300 Subject: [PATCH 024/375] Implement cards: Stand // Deliver and Wax // Wane --- .../src/mage/sets/archenemy/WaxWane.java | 68 ++++++++++++++++++ .../src/mage/sets/invasion/StandDeliver.java | 69 +++++++++++++++++++ Mage.Sets/src/mage/sets/invasion/WaxWane.java | 52 ++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/archenemy/WaxWane.java create mode 100644 Mage.Sets/src/mage/sets/invasion/StandDeliver.java create mode 100644 Mage.Sets/src/mage/sets/invasion/WaxWane.java diff --git a/Mage.Sets/src/mage/sets/archenemy/WaxWane.java b/Mage.Sets/src/mage/sets/archenemy/WaxWane.java new file mode 100644 index 00000000000..6a8c6b9c1f3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/archenemy/WaxWane.java @@ -0,0 +1,68 @@ +/* + * 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.archenemy; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetEnchantmentPermanent; + +/** + * + * @author LoneFox + */ +public class WaxWane extends SplitCard { + + public WaxWane(UUID ownerId) { + super(ownerId, 101, "Wax", "Wane", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{G}", "{W}", false); + this.expansionSetCode = "ARC"; + + // Wax + // Target creature gets +2/+2 until end of turn. + this.getLeftHalfCard().getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); + this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); + // Wane + // Destroy target enchantment. + this.getRightHalfCard().getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getRightHalfCard().getSpellAbility().addTarget(new TargetEnchantmentPermanent()); + } + + public WaxWane(final WaxWane card) { + super(card); + } + + @Override + public WaxWane copy() { + return new WaxWane(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/StandDeliver.java b/Mage.Sets/src/mage/sets/invasion/StandDeliver.java new file mode 100644 index 00000000000..2496b7cd4ef --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/StandDeliver.java @@ -0,0 +1,69 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class StandDeliver extends SplitCard { + + public StandDeliver(UUID ownerId) { + super(ownerId, 292, "Stand", "Deliver", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{W}", "{2}{U}", false); + this.expansionSetCode = "INV"; + + // Stand + // Prevent the next 2 damage that would be dealt to target creature this turn. + this.getLeftHalfCard().getSpellAbility().addEffect(new PreventDamageToTargetEffect(Duration.EndOfTurn, 2)); + this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); + // Deliver + // Return target permanent to its owner's hand. + this.getRightHalfCard().getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getRightHalfCard().getSpellAbility().addTarget(new TargetPermanent()); + } + + public StandDeliver(final StandDeliver card) { + super(card); + } + + @Override + public StandDeliver copy() { + return new StandDeliver(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/WaxWane.java b/Mage.Sets/src/mage/sets/invasion/WaxWane.java new file mode 100644 index 00000000000..d400f69ee06 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/WaxWane.java @@ -0,0 +1,52 @@ +/* + * 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.invasion; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class WaxWane extends mage.sets.archenemy.WaxWane { + + public WaxWane(UUID ownerId) { + super(ownerId); + this.cardNumber = 296; + this.expansionSetCode = "INV"; + } + + public WaxWane(final WaxWane card) { + super(card); + } + + @Override + public WaxWane copy() { + return new WaxWane(this); + } +} From 71a12993befcd7f1da7f38771139874126904fa8 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 13 Jul 2015 11:20:07 +0300 Subject: [PATCH 025/375] Fix misspellings of "Equipped" --- .../combat/AttacksIfAbleAttachedEffect.java | 14 +++++++------- .../combat/BlocksIfAbleAttachedEffect.java | 14 +++++++------- .../combat/CantAttackAttachedEffect.java | 4 ++-- .../combat/CantAttackBlockAttachedEffect.java | 4 ++-- .../CantAttackControllerAttachedEffect.java | 18 +++++++++--------- .../common/combat/CantBlockAttachedEffect.java | 8 ++++---- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java index f435569bed1..2a3d5d3df58 100644 --- a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -47,8 +47,8 @@ public class AttacksIfAbleAttachedEffect extends RequirementEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature attacks each turn if able"; } else { - this.staticText = "Equiped creature attacks each turn if able"; - } + this.staticText = "Equipped creature attacks each turn if able"; + } } public AttacksIfAbleAttachedEffect(final AttacksIfAbleAttachedEffect effect) { diff --git a/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java index d7584c2eb5b..02d817da833 100644 --- a/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -47,8 +47,8 @@ public class BlocksIfAbleAttachedEffect extends RequirementEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature blocks each turn if able"; } else { - this.staticText = "Equiped creature blocks each turn if able"; - } + this.staticText = "Equipped creature blocks each turn if able"; + } } public BlocksIfAbleAttachedEffect(final BlocksIfAbleAttachedEffect effect) { diff --git a/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java index 7293e7b8a23..4c2c2141b0a 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java @@ -47,8 +47,8 @@ public class CantAttackAttachedEffect extends RestrictionEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature can't attack"; } else { - this.staticText = "Equiped creature can't attack"; - } + this.staticText = "Equipped creature can't attack"; + } } public CantAttackAttachedEffect(final CantAttackAttachedEffect effect) { diff --git a/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java index ba1c8e793f0..882fa731292 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java @@ -45,7 +45,7 @@ public class CantAttackBlockAttachedEffect extends RestrictionEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature can't attack or block"; } else { - this.staticText = "Equiped creature can't attack or block"; + this.staticText = "Equipped creature can't attack or block"; } } @@ -67,7 +67,7 @@ public class CantAttackBlockAttachedEffect extends RestrictionEffect { public boolean canAttack(Game game) { return false; } - + @Override public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { return false; diff --git a/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java index 465cac1abfa..693b73307a0 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -38,7 +38,7 @@ import mage.game.permanent.Permanent; /** - * + * * @author LevelX2 */ @@ -49,8 +49,8 @@ public class CantAttackControllerAttachedEffect extends RestrictionEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature can't attack you or a planeswalker you control"; } else { - this.staticText = "Equiped creature can't attack you or a planeswalker you control"; - } + this.staticText = "Equipped creature can't attack you or a planeswalker you control"; + } } public CantAttackControllerAttachedEffect(final CantAttackControllerAttachedEffect effect) { @@ -71,7 +71,7 @@ public class CantAttackControllerAttachedEffect extends RestrictionEffect { return plainswalker == null || !plainswalker.getControllerId().equals(source.getControllerId()); } - + @Override public CantAttackControllerAttachedEffect copy() { return new CantAttackControllerAttachedEffect(this); diff --git a/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java index 06749ce98de..d58293e927c 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java @@ -40,17 +40,17 @@ import mage.game.permanent.Permanent; */ public class CantBlockAttachedEffect extends RestrictionEffect { - public CantBlockAttachedEffect(AttachmentType attachmentType) { + public CantBlockAttachedEffect(AttachmentType attachmentType) { this(attachmentType, Duration.WhileOnBattlefield); } - - public CantBlockAttachedEffect(AttachmentType attachmentType, Duration duration) { + + public CantBlockAttachedEffect(AttachmentType attachmentType, Duration duration) { super(duration); StringBuilder sb = new StringBuilder(); if (attachmentType.equals(AttachmentType.AURA)) { sb.append("Enchanted creature can't block"); } else { - sb.append("Equiped creature can't block"); + sb.append("Equipped creature can't block"); } if (!duration.toString().isEmpty()) { sb.append(" ").append(duration.toString()); From 33838a5f7d22b6452294dbd48cdb3b8faafb239d Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 13 Jul 2015 12:30:37 +0300 Subject: [PATCH 026/375] Implement cards: Desolation Giant, Fervent Charge, Mask of Law and Grace, and Shield of Duty and Reason --- .../mage/sets/apocalypse/DesolationGiant.java | 82 +++++++++++++++++ .../mage/sets/apocalypse/FerventCharge.java | 63 ++++++++++++++ .../apocalypse/ShieldOfDutyAndReason.java | 87 +++++++++++++++++++ .../sets/timeshifted/DesolationGiant.java | 54 ++++++++++++ .../sets/urzasdestiny/MaskOfLawAndGrace.java | 87 +++++++++++++++++++ 5 files changed, 373 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/DesolationGiant.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/FerventCharge.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/ShieldOfDutyAndReason.java create mode 100644 Mage.Sets/src/mage/sets/timeshifted/DesolationGiant.java create mode 100644 Mage.Sets/src/mage/sets/urzasdestiny/MaskOfLawAndGrace.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/DesolationGiant.java b/Mage.Sets/src/mage/sets/apocalypse/DesolationGiant.java new file mode 100644 index 00000000000..ba7062ff42d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/DesolationGiant.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LoneFox + */ +public class DesolationGiant extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("other creatures you control"); + + static { + filter.add(new AnotherPredicate()); + filter2.add(new AnotherPredicate()); + filter2.add(new ControllerPredicate(TargetController.YOU)); + } + + public DesolationGiant(UUID ownerId) { + super(ownerId, 59, "Desolation Giant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + this.expansionSetCode = "APC"; + this.subtype.add("Giant"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Kicker {W}{W} + this.addAbility(new KickerAbility("{W}{W}")); + // When Desolation Giant enters the battlefield, destroy all other creatures you control. If it was kicked, destroy all other creatures instead. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(new DestroyAllEffect(filter), + new DestroyAllEffect(filter2), KickedCondition.getInstance(), "destroy all other creatures you control. If it was kicked, destroy all other creatures instead."))); +} + + public DesolationGiant(final DesolationGiant card) { + super(card); + } + + @Override + public DesolationGiant copy() { + return new DesolationGiant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/FerventCharge.java b/Mage.Sets/src/mage/sets/apocalypse/FerventCharge.java new file mode 100644 index 00000000000..495197d62de --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/FerventCharge.java @@ -0,0 +1,63 @@ +/* + * 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.abilities.common.AttacksCreatureYouControlTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class FerventCharge extends CardImpl { + + public FerventCharge(UUID ownerId) { + super(ownerId, 98, "Fervent Charge", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{B}{R}"); + this.expansionSetCode = "APC"; + + // Whenever a creature you control attacks, it gets +2/+2 until end of turn. + Effect effect = new BoostTargetEffect(2, 2, Duration.EndOfTurn); + effect.setText("it gets +2/+2 until end of turn"); + this.addAbility(new AttacksCreatureYouControlTriggeredAbility(effect, false, true)); + } + + public FerventCharge(final FerventCharge card) { + super(card); + } + + @Override + public FerventCharge copy() { + return new FerventCharge(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/ShieldOfDutyAndReason.java b/Mage.Sets/src/mage/sets/apocalypse/ShieldOfDutyAndReason.java new file mode 100644 index 00000000000..c1f2b60d39b --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/ShieldOfDutyAndReason.java @@ -0,0 +1,87 @@ +/* + * 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.ObjectColor; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class ShieldOfDutyAndReason extends CardImpl { + + private static final FilterCard filter = new FilterCard("green and from blue"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.GREEN), new ColorPredicate(ObjectColor.BLUE))); + } + + public ShieldOfDutyAndReason(UUID ownerId) { + super(ownerId, 16, "Shield of Duty and Reason", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + this.expansionSetCode = "APC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature has protection from green and from blue. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new ProtectionAbility(filter), + AttachmentType.AURA, Duration.WhileOnBattlefield))); + } + + public ShieldOfDutyAndReason(final ShieldOfDutyAndReason card) { + super(card); + } + + @Override + public ShieldOfDutyAndReason copy() { + return new ShieldOfDutyAndReason(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timeshifted/DesolationGiant.java b/Mage.Sets/src/mage/sets/timeshifted/DesolationGiant.java new file mode 100644 index 00000000000..22daab2d556 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/DesolationGiant.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.timeshifted; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class DesolationGiant extends mage.sets.apocalypse.DesolationGiant { + + public DesolationGiant(UUID ownerId) { + super(ownerId); + this.cardNumber = 57; + this.expansionSetCode = "TSB"; + this.rarity = Rarity.SPECIAL; + } + + public DesolationGiant(final DesolationGiant card) { + super(card); + } + + @Override + public DesolationGiant copy() { + return new DesolationGiant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/MaskOfLawAndGrace.java b/Mage.Sets/src/mage/sets/urzasdestiny/MaskOfLawAndGrace.java new file mode 100644 index 00000000000..03e7bdc436f --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzasdestiny/MaskOfLawAndGrace.java @@ -0,0 +1,87 @@ +/* + * 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.urzasdestiny; + +import java.util.UUID; +import mage.ObjectColor; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class MaskOfLawAndGrace extends CardImpl { + + private static final FilterCard filter = new FilterCard("black and from red"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLACK), new ColorPredicate(ObjectColor.RED))); + } + + public MaskOfLawAndGrace(UUID ownerId) { + super(ownerId, 11, "Mask of Law and Grace", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + this.expansionSetCode = "UDS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature has protection from black and from red. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new ProtectionAbility(filter), + AttachmentType.AURA, Duration.WhileOnBattlefield))); + } + + public MaskOfLawAndGrace(final MaskOfLawAndGrace card) { + super(card); + } + + @Override + public MaskOfLawAndGrace copy() { + return new MaskOfLawAndGrace(this); + } +} From f95531622593274436a5b08e3a33540d47b20613 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 13 Jul 2015 13:08:12 +0200 Subject: [PATCH 027/375] * Liliana, Defiant Necromancer - Fixed that the emblem did not trigger (fixes #1110). --- .../LilianaDefiantNecromancer.java | 5 +- .../mage/test/cards/emblems/EmblemsTest.java | 56 ++++++++++++++++--- .../common/DiesCreatureTriggeredAbility.java | 10 +++- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java index 13f59c35e1a..68e4320e8b6 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java +++ b/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java @@ -139,7 +139,8 @@ class LilianaDefiantNecromancerEmblem extends Emblem { // You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step." public LilianaDefiantNecromancerEmblem() { this.setName("Emblem - Liliana"); - this.getAbilities().add(new DiesCreatureTriggeredAbility(new LilianaDefiantNecromancerEmblemEffect(), false, filter, true)); + Ability ability = new DiesCreatureTriggeredAbility(Zone.COMMAND, new LilianaDefiantNecromancerEmblemEffect(), false, filter, true); + this.getAbilities().add(ability); } } @@ -164,7 +165,7 @@ class LilianaDefiantNecromancerEmblemEffect extends OneShotEffect { Card card = game.getCard(getTargetPointer().getFirst(game, source)); if (card != null) { Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); + effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); effect.setText("return that card to the battlefield at the beginning of the next end step"); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(Zone.COMMAND, effect, TargetController.ANY); delayedAbility.setSourceId(source.getSourceId()); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java index 66b7aa73c35..0c211862d2c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java @@ -14,8 +14,8 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class EmblemsTest extends CardTestPlayerBase { /** - * Venser The Sojourner: - * -8: You get an emblem with "Whenever you cast a spell, exile target permanent." + * Venser The Sojourner: -8: You get an emblem with "Whenever you cast a + * spell, exile target permanent." */ @Test public void testVenserTheSojournerEmblem() { @@ -40,8 +40,8 @@ public class EmblemsTest extends CardTestPlayerBase { } /** - * Sorin, Lord of Innistrad: - * -2: You get an emblem with "Creatures you control get +1/+0." + * Sorin, Lord of Innistrad: -2: You get an emblem with "Creatures you + * control get +1/+0." */ @Test public void testSorinLordOfInnistradEmblem() { @@ -67,8 +67,9 @@ public class EmblemsTest extends CardTestPlayerBase { } /** - * Tamiyo, the Moon Sage: - * -8: You get an emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand." + * Tamiyo, the Moon Sage: -8: You get an emblem with "You have no maximum + * hand size" and "Whenever a card is put into your graveyard from anywhere, + * you may return it to your hand." * * Tests "You have no maximum hand size" */ @@ -88,10 +89,12 @@ public class EmblemsTest extends CardTestPlayerBase { } /** - * Tamiyo, the Moon Sage: - * -8: You get an emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand." + * Tamiyo, the Moon Sage: -8: You get an emblem with "You have no maximum + * hand size" and "Whenever a card is put into your graveyard from anywhere, + * you may return it to your hand." * - * Tests "Whenever a card is put into your graveyard from anywhere, you may return it to your hand." + * Tests "Whenever a card is put into your graveyard from anywhere, you may + * return it to your hand." */ @Test public void testTamiyoTheMoonSageSecondEmblem() { @@ -119,4 +122,39 @@ public class EmblemsTest extends CardTestPlayerBase { } Assert.assertTrue("Couldn't find a card in hand: Elite Vanguard", found); } + + /** + * Liliana, Defiant Necromancer: -8: You get an emblem with "Whenever a + * creature you control dies, return it to the battlefield under your + * control at the beginning of the next end step."; + * + * Tests "Whenever a creature you control dies, return it to the battlefield + * under your control at the beginning of the next end step." + */ + @Test + public void testLilianaDefiantNecromancer() { + addCard(Zone.BATTLEFIELD, playerA, "Liliana, Defiant Necromancer"); + addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard"); + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); + addCard(Zone.HAND, playerB, "Lightning Bolt", 2); + + addCounters(1, PhaseStep.UPKEEP, playerA, "Liliana, Defiant Necromancer", CounterType.LOYALTY, 6); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "-8: You get an emblem"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Elite Vanguard"); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion"); + + setStopAt(2, PhaseStep.UPKEEP); + execute(); + + assertEmblemCount(playerA, 1); + + assertPermanentCount(playerA, "Liliana, Defiant Necromancer", 1); + assertPermanentCount(playerA, "Elite Vanguard", 1); + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + + assertHandCount(playerA, 0); + + } } diff --git a/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java index 6b4202de140..fe0a3240d55 100644 --- a/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java @@ -26,7 +26,7 @@ public class DiesCreatureTriggeredAbility extends TriggeredAbilityImpl { this(effect, optional, new FilterCreaturePermanent("another creature")); filter.add(new AnotherPredicate()); } - + public DiesCreatureTriggeredAbility(Effect effect, boolean optional, boolean another, boolean setTargetPointer) { this(effect, optional, new FilterCreaturePermanent("another creature")); filter.add(new AnotherPredicate()); @@ -38,12 +38,16 @@ public class DiesCreatureTriggeredAbility extends TriggeredAbilityImpl { } public DiesCreatureTriggeredAbility(Effect effect, boolean optional, FilterCreaturePermanent filter, boolean setTargetPointer) { - super(Zone.BATTLEFIELD, effect, optional); + this(Zone.BATTLEFIELD, effect, optional, filter, setTargetPointer); + } + + public DiesCreatureTriggeredAbility(Zone zone, Effect effect, boolean optional, FilterCreaturePermanent filter, boolean setTargetPointer) { + super(zone, effect, optional); this.filter = filter; this.setTargetPointer = setTargetPointer; } - public DiesCreatureTriggeredAbility(DiesCreatureTriggeredAbility ability) { + public DiesCreatureTriggeredAbility(final DiesCreatureTriggeredAbility ability) { super(ability); this.filter = ability.filter; this.setTargetPointer = ability.setTargetPointer; From 80d045f6cc3ea76f4e2311e8d51c43678d6fd207 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 13 Jul 2015 15:00:32 +0200 Subject: [PATCH 028/375] * Fixed for some cards that allow to play the top card of a players library that it also was possible to play the top card of other players libraries if the card was revealed (MagusOfTheFuture, Future Sight, Melek Izzet Paragon, Courser o fKruphix, Garruk's Horde, Oracle of Mul-Daya). --- .../src/mage/sets/magic2012/GarruksHorde.java | 12 +++++++----- .../common/continuous/PlayTheTopCardEffect.java | 14 +++++++------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2012/GarruksHorde.java b/Mage.Sets/src/mage/sets/magic2012/GarruksHorde.java index 0d13b2816d5..440a833ad87 100644 --- a/Mage.Sets/src/mage/sets/magic2012/GarruksHorde.java +++ b/Mage.Sets/src/mage/sets/magic2012/GarruksHorde.java @@ -27,19 +27,19 @@ */ package mage.sets.magic2012; -import mage.constants.CardType; -import mage.constants.Rarity; +import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.PlayTheTopCardEffect; import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; -import java.util.UUID; - /** * @author nantuko */ @@ -57,7 +57,9 @@ public class GarruksHorde extends CardImpl { // Play with the top card of your library revealed. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithTheTopCardRevealedEffect())); // You may cast the top card of your library if it's a creature card. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayTheTopCardEffect(new FilterCreatureCard()))); + Effect effect = new PlayTheTopCardEffect(new FilterCreatureCard()); + effect.setText("You may cast the top card of your library if it's a creature card"); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } public GarruksHorde(final GarruksHorde card) { diff --git a/Mage/src/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java b/Mage/src/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java index 0c68c6db678..f75123d0e09 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common.continuous; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.AsThoughEffectImpl; import mage.cards.Card; @@ -37,8 +38,6 @@ import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; -import java.util.UUID; - /** * @author nantuko */ @@ -50,7 +49,7 @@ public class PlayTheTopCardEffect extends AsThoughEffectImpl { this(new FilterCard()); staticText = "You may play the top card of your library"; } - + public PlayTheTopCardEffect(FilterCard filter) { super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit); this.filter = filter; @@ -75,9 +74,10 @@ public class PlayTheTopCardEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { Card cardOnTop = game.getCard(objectId); - if (cardOnTop != null && - affectedControllerId.equals(source.getControllerId()) && - filter.match(cardOnTop, game)) { + if (cardOnTop != null + && affectedControllerId.equals(source.getControllerId()) + && cardOnTop.getOwnerId().equals(source.getControllerId()) + && filter.match(cardOnTop, game)) { Player player = game.getPlayer(cardOnTop.getOwnerId()); if (player != null && cardOnTop.equals(player.getLibrary().getFromTop(game))) { return true; @@ -86,4 +86,4 @@ public class PlayTheTopCardEffect extends AsThoughEffectImpl { return false; } -} \ No newline at end of file +} From 5abb3b406f76521492fbc1e7c94bd6ea115955bb Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 13 Jul 2015 16:45:19 +0300 Subject: [PATCH 029/375] Fix the last ability of Hobble --- Mage.Sets/src/mage/sets/planeshift/Hobble.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/planeshift/Hobble.java b/Mage.Sets/src/mage/sets/planeshift/Hobble.java index 1bbeccdb18e..ed0b5277512 100644 --- a/Mage.Sets/src/mage/sets/planeshift/Hobble.java +++ b/Mage.Sets/src/mage/sets/planeshift/Hobble.java @@ -33,7 +33,8 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.EnchantedCreatureColorCondition; -import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.decorator.ConditionalRestrictionEffect; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.combat.CantAttackAttachedEffect; @@ -70,8 +71,10 @@ public class Hobble extends CardImpl { // Enchanted creature can't attack. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackAttachedEffect(AttachmentType.AURA))); // Enchanted creature can't block if it's black. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new CantBlockAttachedEffect(AttachmentType.AURA), - new EnchantedCreatureColorCondition(ObjectColor.BLACK), "Enchanted creature can't block if it's black"))); + Effect effect = new ConditionalRestrictionEffect(new CantBlockAttachedEffect(AttachmentType.AURA), + new EnchantedCreatureColorCondition(ObjectColor.BLACK)); + effect.setText("Enchanted creature can't block if it's black."); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } public Hobble(final Hobble card) { From b1f5b15f2d5880e378378445f64f51fcba745e87 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 13 Jul 2015 16:01:49 +0200 Subject: [PATCH 030/375] * The Abyss - Fixed non conform target handling. --- Mage.Sets/src/mage/sets/legends/TheAbyss.java | 24 +++---- .../sets/riseoftheeldrazi/NotOfThisWorld.java | 12 ++-- .../counterspell/NotOfThisWorldTest.java | 72 +++++++++++++++++++ 3 files changed, 86 insertions(+), 22 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/NotOfThisWorldTest.java diff --git a/Mage.Sets/src/mage/sets/legends/TheAbyss.java b/Mage.Sets/src/mage/sets/legends/TheAbyss.java index 3664e65ad01..2b8e802fe07 100644 --- a/Mage.Sets/src/mage/sets/legends/TheAbyss.java +++ b/Mage.Sets/src/mage/sets/legends/TheAbyss.java @@ -29,11 +29,9 @@ package mage.sets.legends; import java.util.UUID; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; @@ -45,7 +43,6 @@ import mage.game.events.GameEvent; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -73,15 +70,15 @@ public class TheAbyss extends CardImpl { } class TheAbyssTriggeredAbility extends TriggeredAbilityImpl { - + TheAbyssTriggeredAbility() { super(Zone.BATTLEFIELD, new DestroyTargetEffect(true), false); } - + TheAbyssTriggeredAbility(final TheAbyssTriggeredAbility ability) { super(ability); } - + @Override public TheAbyssTriggeredAbility copy() { return new TheAbyssTriggeredAbility(this); @@ -91,7 +88,7 @@ class TheAbyssTriggeredAbility extends TriggeredAbilityImpl { public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE; } - + @Override public boolean checkTrigger(GameEvent event, Game game) { Player player = game.getPlayer(event.getPlayerId()); @@ -100,18 +97,13 @@ class TheAbyssTriggeredAbility extends TriggeredAbilityImpl { filter.add(Predicates.not(new CardTypePredicate(CardType.ARTIFACT))); filter.add(new ControllerIdPredicate(player.getId())); Target target = new TargetCreaturePermanent(filter); - if (target.canChoose(this.getSourceId(), this.getControllerId(), game) && player.chooseTarget(Outcome.DestroyPermanent, target, this, game)) { - for (Effect effect: this.getEffects()) { - if (effect instanceof DestroyTargetEffect) { - effect.setTargetPointer(new FixedTarget(target.getFirstTarget())); - } - } - return true; - } + this.getTargets().clear(); + this.getTargets().add(target); + return true; } return false; } - + @Override public String getRule() { return "At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of his or her choice. It can't be regenerated."; diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/NotOfThisWorld.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/NotOfThisWorld.java index a3f6f6e6c1d..558d240f739 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/NotOfThisWorld.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/NotOfThisWorld.java @@ -67,7 +67,7 @@ public class NotOfThisWorld extends CardImpl { // Counter target spell or ability that targets a permanent you control. this.getSpellAbility().addTarget( - new TargetSpellTargetingControlledPermanent()); + new TargetStackObjectTargetingControlledPermanent()); this.getSpellAbility().addEffect(new CounterTargetEffect()); // Not of This World costs {7} less to cast if it targets a spell or ability that targets a creature you control with power 7 or greater. this.addAbility(new SimpleStaticAbility(Zone.STACK, new SpellCostReductionSourceEffect(7, NotOfThisWorldCondition.getInstance()))); @@ -83,17 +83,17 @@ public class NotOfThisWorld extends CardImpl { } } -class TargetSpellTargetingControlledPermanent extends TargetObject { +class TargetStackObjectTargetingControlledPermanent extends TargetObject { - public TargetSpellTargetingControlledPermanent() { + public TargetStackObjectTargetingControlledPermanent() { this.minNumberOfTargets = 1; this.maxNumberOfTargets = 1; this.zone = Zone.STACK; this.targetName = "spell or ability that targets a permanent you control"; } - public TargetSpellTargetingControlledPermanent(final TargetSpellTargetingControlledPermanent target) { + public TargetStackObjectTargetingControlledPermanent(final TargetStackObjectTargetingControlledPermanent target) { super(target); } @@ -164,8 +164,8 @@ class TargetSpellTargetingControlledPermanent extends TargetObject { } @Override - public TargetSpellTargetingControlledPermanent copy() { - return new TargetSpellTargetingControlledPermanent(this); + public TargetStackObjectTargetingControlledPermanent copy() { + return new TargetStackObjectTargetingControlledPermanent(this); } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/NotOfThisWorldTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/NotOfThisWorldTest.java new file mode 100644 index 00000000000..41d3992a219 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/NotOfThisWorldTest.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.abilities.oneshot.counterspell; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class NotOfThisWorldTest extends CardTestPlayerBase { + + /** + * Not of This World doesn't work when trying to counter a triggerd ability + * from The Abyss targeting your owned and controlled Ruhan of the Fomori . + * At the time I didn't have any mana open, but Ruhan of the Fomori should + * qualify for the alternative casting cost (7 less) or Not of This World. + */ + @Test + public void testCounterFirstSpell() { + // At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of his or her choice. It can't be regenerated. + addCard(Zone.BATTLEFIELD, playerA, "The Abyss", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Island", 7); + // Counter target spell or ability that targets a permanent you control. + // Not of This World costs {7} less to cast if it targets a spell or ability that targets a creature you control with power 7 or greater. + addCard(Zone.HAND, playerB, "Not of This World"); + + // At the beginning of combat on your turn, choose an opponent at random. Ruhan of the Fomori attacks that player this combat if able. + addCard(Zone.BATTLEFIELD, playerB, "Ruhan of the Fomori", 1); // 7/7 + + addTarget(playerB, "Ruhan of the Fomori"); + castSpell(2, PhaseStep.UPKEEP, playerB, "Not of This World", "stack ability (At the beginning of each player's upkeep"); + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, "Not of This World", 1); + assertPermanentCount(playerB, "Ruhan of the Fomori", 1); + + assertTapped("Island", false); + } + +} From c6dd29ef207d023dc61e884da614101c66031537 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 13 Jul 2015 19:05:05 +0200 Subject: [PATCH 031/375] * Sigil of Valor - Fixed wrong trigger condition. --- Mage.Sets/src/mage/sets/magicorigins/SigilOfValor.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/SigilOfValor.java b/Mage.Sets/src/mage/sets/magicorigins/SigilOfValor.java index 4dc297988ff..bc849bbcf50 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/SigilOfValor.java +++ b/Mage.Sets/src/mage/sets/magicorigins/SigilOfValor.java @@ -101,10 +101,14 @@ class SigilOfValorTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (game.getActivePlayerId().equals(this.controllerId)) { + if (game.getActivePlayerId().equals(getControllerId())) { if (game.getCombat().attacksAlone()) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0))); - return true; + Permanent equipment = game.getPermanent(getSourceId()); + UUID attackerId = game.getCombat().getAttackers().get(0); + if (equipment != null && equipment.getAttachedTo() == attackerId) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(attackerId)); + return true; + } } } return false; From f45301488c17120417f0453f288ed797b13919ca Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 13 Jul 2015 19:05:45 +0200 Subject: [PATCH 032/375] * Blood-Cursed Knight - Fixed tooltip text. --- .../sets/magicorigins/BloodCursedKnight.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/BloodCursedKnight.java b/Mage.Sets/src/mage/sets/magicorigins/BloodCursedKnight.java index fb33c0423cb..c7c9fee158a 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/BloodCursedKnight.java +++ b/Mage.Sets/src/mage/sets/magicorigins/BloodCursedKnight.java @@ -29,6 +29,7 @@ package mage.sets.magicorigins; import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalContinuousEffect; @@ -47,9 +48,9 @@ import mage.filter.common.FilterControlledEnchantmentPermanent; * @author fireshoes */ public class BloodCursedKnight extends CardImpl { - - final static private String rule1 = "{this} gets +1/+1 as long as you control an enchantment"; - final static private String rule2 = "{this} has lifelink as long as you control an enchantment"; + + final static private String rule1 = "As long as you control an enchantment, {this} gets +1/+1"; + final static private String rule2 = "and has lifelink"; public BloodCursedKnight(UUID ownerId) { super(ownerId, 211, "Blood-Cursed Knight", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}{B}"); @@ -60,10 +61,14 @@ public class BloodCursedKnight extends CardImpl { this.toughness = new MageInt(2); // As long as you control an enchantment, Blood-Cursed Knight gets +1/+1 and has lifelink. - ConditionalContinuousEffect effect1 = new ConditionalContinuousEffect(new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), new PermanentsOnTheBattlefieldCondition(new FilterControlledEnchantmentPermanent()), rule1); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect1)); - ConditionalContinuousEffect effect2 = new ConditionalContinuousEffect(new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield), new PermanentsOnTheBattlefieldCondition(new FilterControlledEnchantmentPermanent()), rule2); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect2)); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), + new PermanentsOnTheBattlefieldCondition(new FilterControlledEnchantmentPermanent()), rule1)); + ability.addEffect(new ConditionalContinuousEffect( + new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield), + new PermanentsOnTheBattlefieldCondition(new FilterControlledEnchantmentPermanent()), rule2)); + this.addAbility(ability); } public BloodCursedKnight(final BloodCursedKnight card) { From 7d3d24b9a12552877a34cacd5db5826c31ef590e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 13 Jul 2015 19:26:55 +0200 Subject: [PATCH 033/375] * The Great Aurora - Fixed exception error when spell resolves. --- .../src/mage/sets/magicorigins/TheGreatAurora.java | 8 ++++---- Mage/src/mage/players/PlayerImpl.java | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java b/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java index 4b9654bfcf8..dd5b0b2a6ca 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java +++ b/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java @@ -99,9 +99,9 @@ class TheGreatAuroraEffect extends OneShotEffect { List list = permanentsOwned.get(permanent.getOwnerId()); if (list == null) { list = new ArrayList<>(); + permanentsOwned.put(permanent.getOwnerId(), list); } list.add(permanent); - permanentsOwned.put(permanent.getOwnerId(), list); } // shuffle permanents and hand cards into owner's library @@ -115,13 +115,13 @@ class TheGreatAuroraEffect extends OneShotEffect { List list = permanentsOwned.remove(player.getId()); permanentsCount.put(playerId, handCards + (list != null ? list.size() : 0)); for (Permanent permanent : list) { - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + player.moveCardToLibraryWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD, true, true); } player.getLibrary().shuffle(); } } - // Draw cards + // Draw cards for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { Player player = game.getPlayer(playerId); if (player != null) { @@ -141,7 +141,7 @@ class TheGreatAuroraEffect extends OneShotEffect { for (UUID cardId : target.getTargets()) { Card card = game.getCard(cardId); if (card != null) { - player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId(), true); + player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId(), false); } } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index c923bc63a27..a285cde583f 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2922,6 +2922,16 @@ public abstract class PlayerImpl implements Player, Serializable { result |= putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId()); } return result; + case LIBRARY: + result = false; + boolean withName = true; + if (fromZone.equals(Zone.HAND) || fromZone.equals(Zone.LIBRARY)) { + withName = false; + } + for (Card card : cards) { + result |= moveCardToLibraryWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, true, withName); + } + return result; default: throw new UnsupportedOperationException("to Zone not supported yet"); } From 426ea02cc81663987ae9ea8b3bfcab338ee55efc Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 13 Jul 2015 23:40:13 +0200 Subject: [PATCH 034/375] Fixed thopter token description. --- .../permanent/token/ThopterColorlessToken.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java b/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java index 6426e804355..a75c83ff0ce 100644 --- a/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java +++ b/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.game.permanent.token; import mage.MageInt; @@ -36,7 +35,6 @@ import mage.constants.CardType; * * @author fireshoes */ - public class ThopterColorlessToken extends Token { public ThopterColorlessToken() { @@ -44,15 +42,15 @@ public class ThopterColorlessToken extends Token { } public ThopterColorlessToken(String expansionSetCode) { - super("Thopter", "1/1 colorless Thopter creature token with flying"); + super("Thopter", "1/1 colorless Thopter artifact creature token with flying"); this.setOriginalExpansionSetCode(expansionSetCode); cardType.add(CardType.ARTIFACT); cardType.add(CardType.CREATURE); subtype.add("Thopter"); power = new MageInt(1); toughness = new MageInt(1); - + addAbility(FlyingAbility.getInstance()); } -} \ No newline at end of file +} From cd3a37ac6cb950035896c65948a731603e324c24 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 13 Jul 2015 21:44:40 -0500 Subject: [PATCH 035/375] Updated Tiny Leaders banlist. Updated Duel Commander banlist and tuck rule change. [V15] Added two Akroma reprints. --- .../src/mage/deck/DuelCommander.java | 1 + .../src/mage/deck/TinyLeaders.java | 2 +- .../src/mage/game/CommanderDuelMatch.java | 2 +- .../mage/game/CommanderFreeForAllMatch.java | 120 +++++++++--------- .../sets/ftvangels/AkromaAngelOfFury.java | 54 ++++++++ .../sets/ftvangels/AkromaAngelOfWrath.java | 54 ++++++++ Utils/mtg-cards-data.txt | 4 +- 7 files changed, 174 insertions(+), 63 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfFury.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfWrath.java diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java index 2cad7819012..feb71b5e85a 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java @@ -64,6 +64,7 @@ public class DuelCommander extends Commander { banned.add("Mox Pearl"); banned.add("Mox Ruby"); banned.add("Mox Sapphire"); + banned.add("Mystical Tutor"); // banned effective July 17, 2015 banned.add("Natural Order"); banned.add("Necropotence"); banned.add("Oath of Druids"); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java index 7144e68b5d8..7817d0be700 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java @@ -65,6 +65,7 @@ public class TinyLeaders extends DeckValidator { banned.add("Edric, Spymaster of Trest"); banned.add("Fastbond"); banned.add("Goblin Recruiter"); + banned.add("Grindstone"); // banned effective July 13, 2015 banned.add("Hermit Druid"); banned.add("Imperial Seal"); banned.add("Library of Alexandria"); @@ -81,7 +82,6 @@ public class TinyLeaders extends DeckValidator { banned.add("Mox Ruby"); banned.add("Mox Sapphire"); banned.add("Necropotence"); - banned.add("Painter's Servant"); banned.add("Shahrazad"); banned.add("Skullclamp"); banned.add("Sol Ring"); diff --git a/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuelMatch.java b/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuelMatch.java index b5f40072bc8..c20af5e9bf3 100644 --- a/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuelMatch.java +++ b/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuelMatch.java @@ -48,7 +48,7 @@ public class CommanderDuelMatch extends MatchImpl { // Don't like it to compare but seems like it's complicated to do it in another way if (options.getDeckType().equals("Variant Magic - Duel Commander")) { startLife = 30; - alsoHand = false; + alsoHand = true; // commander going to hand allowed to go to command zone effective July 17, 2015 } CommanderDuel game = new CommanderDuel(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife); game.setStartMessage(this.createGameStartMessage()); diff --git a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/src/mage/game/CommanderFreeForAllMatch.java b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/src/mage/game/CommanderFreeForAllMatch.java index 1b23d078d99..998017e0613 100644 --- a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/src/mage/game/CommanderFreeForAllMatch.java +++ b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/src/mage/game/CommanderFreeForAllMatch.java @@ -1,60 +1,60 @@ -/* - * 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.game; - -import mage.game.match.MatchImpl; -import mage.game.match.MatchOptions; - -/** - * - * @author LevelX2 - */ -public class CommanderFreeForAllMatch extends MatchImpl { - - public CommanderFreeForAllMatch(MatchOptions options) { - super(options); - } - - @Override - public void startGame() throws GameException { - int startLife = 40; - boolean alsoHand = true; - if (options.getDeckType().equals("Variant Magic - Duel Commander")) { - startLife = 30; - alsoHand = false; - } - CommanderFreeForAll game = new CommanderFreeForAll(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife); - game.setStartMessage(this.createGameStartMessage()); - game.setAlsoHand(alsoHand); - game.setAlsoLibrary(true); - initGame(game); - games.add(game); - } - -} +/* + * 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.game; + +import mage.game.match.MatchImpl; +import mage.game.match.MatchOptions; + +/** + * + * @author LevelX2 + */ +public class CommanderFreeForAllMatch extends MatchImpl { + + public CommanderFreeForAllMatch(MatchOptions options) { + super(options); + } + + @Override + public void startGame() throws GameException { + int startLife = 40; + boolean alsoHand = true; + if (options.getDeckType().equals("Variant Magic - Duel Commander")) { + startLife = 30; + alsoHand = true; // commander going to hand allowed to go to command zone effective July 17, 2015 + } + CommanderFreeForAll game = new CommanderFreeForAll(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife); + game.setStartMessage(this.createGameStartMessage()); + game.setAlsoHand(alsoHand); + game.setAlsoLibrary(true); + initGame(game); + games.add(game); + } + +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfFury.java b/Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfFury.java new file mode 100644 index 00000000000..fef9a68257e --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfFury.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.ftvangels; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class AkromaAngelOfFury extends mage.sets.commander.AkromaAngelOfFury { + + public AkromaAngelOfFury(UUID ownerId) { + super(ownerId); + this.cardNumber = 1; + this.expansionSetCode = "V15"; + this.rarity = Rarity.MYTHIC; + } + + public AkromaAngelOfFury(final AkromaAngelOfFury card) { + super(card); + } + + @Override + public AkromaAngelOfFury copy() { + return new AkromaAngelOfFury(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfWrath.java b/Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfWrath.java new file mode 100644 index 00000000000..79849812f93 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/AkromaAngelOfWrath.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.ftvangels; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class AkromaAngelOfWrath extends mage.sets.timeshifted.AkromaAngelOfWrath { + + public AkromaAngelOfWrath(UUID ownerId) { + super(ownerId); + this.cardNumber = 2; + this.expansionSetCode = "V15"; + this.rarity = Rarity.MYTHIC; + } + + public AkromaAngelOfWrath(final AkromaAngelOfWrath card) { + super(card); + } + + @Override + public AkromaAngelOfWrath copy() { + return new AkromaAngelOfWrath(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index b9bf4099936..c93b60b6a73 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -1,4 +1,4 @@ -Ardent Plea|Alara Reborn|1|U|{1}{W}{U}|Enchantment|||Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)$Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)| +Ardent Plea|Alara Reborn|1|U|{1}{W}{U}|Enchantment|||Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)$Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)| Aven Mimeomancer|Alara Reborn|2|R|{1}{W}{U}|Creature - Bird Wizard|3|1|Flying$At the beginning of your upkeep, you may put a feather counter on target creature. If you do, that creature is 3/1 and has flying for as long as it has a feather counter on it.| Ethercaste Knight|Alara Reborn|3|C|{W}{U}|Artifact Creature - Human Knight|1|3|Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)| Ethersworn Shieldmage|Alara Reborn|4|C|{1}{W}{U}|Artifact Creature - Vedalken Wizard|2|2|Flash$When Ethersworn Shieldmage enters the battlefield, prevent all damage that would be dealt to artifact creatures this turn.| @@ -27232,3 +27232,5 @@ Island|Premium Deck Series: Slivers|38|L||Basic Land - Island|||U| Swamp|Premium Deck Series: Slivers|39|L||Basic Land - Swamp|||B| Mountain|Premium Deck Series: Slivers|40|L||Basic Land - Mountain|||R| Forest|Premium Deck Series: Slivers|41|L||Basic Land - Forest|||G| +Akroma, Angel of Fury|From the Vault: Angels|1|M|{5}{R}{R}{R}|Legendary Creature - Angel|6|6|Akroma, Angel of Fury can't be countered.$Flying, trample, protection from white and from blue${R}: Akroma, Angel of Fury gets +1/+0 until end of turn.$Morph {3}{R}{R}{R} You may cast this card face downn as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)| +Akroma, Angel of Wrath|From the Vault: Angels|2|M|{5}{W}{W}{W}|Legendary Creature - Angel|6|6|Flying, first strike, vigilance, trample, haste, protection from black and from red| \ No newline at end of file From 51ad95ffd2f0c52ea7cf62fe649278bc11d3c264 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 14 Jul 2015 09:31:11 +0200 Subject: [PATCH 036/375] * Fixed that the transform planeswalker did not return from exile under owners control but under previous controller's control. --- .../ExileAndReturnTransformedSourceEffect.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java b/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java index 6b57e657d3c..6fe7a0a697c 100644 --- a/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java @@ -63,13 +63,16 @@ public class ExileAndReturnTransformedSourceEffect extends OneShotEffect { if (sourceObject != null && controller != null) { Card card = (Card) sourceObject; if (controller.moveCards(card, Zone.BATTLEFIELD, Zone.EXILED, source, game)) { - game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + source.getSourceId(), Boolean.TRUE); - controller.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId()); - if (additionalEffect != null) { - if (additionalEffect instanceof ContinuousEffect) { - game.addEffect((ContinuousEffect) additionalEffect, source); - } else { - additionalEffect.apply(game, source); + Player owner = game.getPlayer(card.getOwnerId()); + if (owner != null) { + game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + source.getSourceId(), Boolean.TRUE); + owner.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId()); + if (additionalEffect != null) { + if (additionalEffect instanceof ContinuousEffect) { + game.addEffect((ContinuousEffect) additionalEffect, source); + } else { + additionalEffect.apply(game, source); + } } } } From 7f8822ae1994bfcfcccd68800c912f51c1c18695 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 14 Jul 2015 16:25:06 +0200 Subject: [PATCH 037/375] Added a test for Crypt Ghast --- .../sets/alarareborn/TraceOfAbundance.java | 6 +- .../mage/sets/scarsofmirrodin/MimicVat.java | 12 +- .../mage/test/cards/mana/CryptGhastTest.java | 103 ++++++++++++++++++ .../org/mage/test/utils/ManaOptionsTest.java | 19 ++++ Mage/src/mage/game/turn/Phase.java | 2 +- 5 files changed, 130 insertions(+), 12 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/mana/CryptGhastTest.java diff --git a/Mage.Sets/src/mage/sets/alarareborn/TraceOfAbundance.java b/Mage.Sets/src/mage/sets/alarareborn/TraceOfAbundance.java index 388649436cd..15a6d36f72d 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/TraceOfAbundance.java +++ b/Mage.Sets/src/mage/sets/alarareborn/TraceOfAbundance.java @@ -55,7 +55,7 @@ import mage.target.common.TargetLandPermanent; * @author jeffwadsworth */ public class TraceOfAbundance extends CardImpl { - + private String rule = "Enchanted land has shroud"; public TraceOfAbundance(UUID ownerId) { @@ -63,10 +63,6 @@ public class TraceOfAbundance extends CardImpl { this.expansionSetCode = "ARB"; this.subtype.add("Aura"); - - - - // Enchant land TargetPermanent auraTarget = new TargetLandPermanent(); this.getSpellAbility().addTarget(auraTarget); diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java index b194cda67d5..2a24c0196ea 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java @@ -117,11 +117,11 @@ class MimicVatTriggeredAbility extends TriggeredAbilityImpl { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; Permanent permanent = zEvent.getTarget(); - if (permanent != null && - zEvent.getToZone() == Zone.GRAVEYARD && - zEvent.getFromZone() == Zone.BATTLEFIELD && - !(permanent instanceof PermanentToken) && - permanent.getCardType().contains(CardType.CREATURE)) { + if (permanent != null + && zEvent.getToZone() == Zone.GRAVEYARD + && zEvent.getFromZone() == Zone.BATTLEFIELD + && !(permanent instanceof PermanentToken) + && permanent.getCardType().contains(CardType.CREATURE)) { getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); return true; @@ -131,7 +131,7 @@ class MimicVatTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with {this} to its owner's graveyard"; + return "Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with {this} to its owner's graveyard."; } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/CryptGhastTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/CryptGhastTest.java new file mode 100644 index 00000000000..623c3b44258 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/CryptGhastTest.java @@ -0,0 +1,103 @@ +/* + * 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 org.mage.test.cards.mana; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class CryptGhastTest extends CardTestPlayerBase { + + @Test + public void TestNormal() { + //Extort (Whenever you cast a spell, you may pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) + // Whenever you tap a Swamp for mana, add {B} to your mana pool (in addition to the mana the land produces). + addCard(Zone.BATTLEFIELD, playerA, "Crypt Ghast", 1); + addCard(Zone.HAND, playerA, "Erebos's Titan", 1); + + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); + // Swamp Mountain + addCard(Zone.BATTLEFIELD, playerA, "Badlands", 1); + + activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {R} to your mana pool"); + activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {B} to your mana pool"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Erebos's Titan"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Erebos's Titan", 1); + + } + + /** + * Crypt Ghast was still effective (doubling swamp {B} Mana and providiong + * the option to extort) as if it was on the battlefield after being killed + * with Nin, the Pain Artist controlled by me and then exiled into a Mimic + * Vat controlled by Crypt Ghast's controller. + */ + @Test + public void TestExiled() { + //Extort (Whenever you cast a spell, you may pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) + // Whenever you tap a Swamp for mana, add {B} to your mana pool (in addition to the mana the land produces). + addCard(Zone.BATTLEFIELD, playerA, "Crypt Ghast", 1); + // Imprint - Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with Mimic Vat to its owner's graveyard. + // {3},{T}: Put a token onto the battlefield that's a copy of the exiled card. It gains haste. Exile it at the beginning of the next end step. + addCard(Zone.BATTLEFIELD, playerA, "Mimic Vat", 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); + // Swamp Mountain + addCard(Zone.BATTLEFIELD, playerA, "Badlands", 1); + addCard(Zone.HAND, playerA, "Erebos's Titan", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); + // {X}{U}{R},{T}: Nin, the Pain Artist deals X damage to target creature. That creature's controller draws X cards. + addCard(Zone.BATTLEFIELD, playerB, "Nin, the Pain Artist", 1); + + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{X}{U}{R},{T}: {this} deals X damage to target creature", "Crypt Ghast"); + setChoice(playerB, "X=2"); + + // Crypt Ghast may no longer give additional mana + activateManaAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {R} to your mana pool"); + activateManaAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {B} to your mana pool"); + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Erebos's Titan"); + + setStopAt(3, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Erebos's Titan", 0); + assertTapped("Nin, the Pain Artist", true); + assertExileCount("Crypt Ghast", 1); + + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java index 71a7eed710e..b4b40dd99e2 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java @@ -31,6 +31,7 @@ import mage.abilities.mana.ManaOptions; import mage.constants.PhaseStep; import mage.constants.Zone; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -289,6 +290,24 @@ public class ManaOptionsTest extends CardTestPlayerBase { Assert.assertEquals("{B}{B}{B}", getManaOption(1, manaOptions)); } + @Test + @Ignore // TriggeredManaAbilities not supported yet for getAvailableMana + public void testCryptGhast() { + //Extort (Whenever you cast a spell, you may pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) + // Whenever you tap a Swamp for mana, add {B} to your mana pool (in addition to the mana the land produces). + addCard(Zone.BATTLEFIELD, playerA, "Crypt Ghast", 1); + + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); + Assert.assertEquals("{B}{B}", getManaOption(0, manaOptions)); + } + private String getManaOption(int index, ManaOptions manaOptions) { if (manaOptions.size() < index + 1) { return ""; diff --git a/Mage/src/mage/game/turn/Phase.java b/Mage/src/mage/game/turn/Phase.java index 511d6450cb3..eac4f2308bb 100644 --- a/Mage/src/mage/game/turn/Phase.java +++ b/Mage/src/mage/game/turn/Phase.java @@ -134,7 +134,7 @@ public abstract class Phase implements Serializable { private boolean checkStopOnStepOption(Game game) { if (game.getOptions().stopOnTurn != null && game.getOptions().stopAtStep == getStep().getType()) { - if (game.getOptions().stopOnTurn.equals(game.getState().getTurnNum())) { + if (game.getOptions().stopOnTurn <= game.getState().getTurnNum()) { game.pause(); return true; } From 9b07377bdfa2a799a59d534a29d9b653432f69f0 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 14 Jul 2015 19:36:41 +0300 Subject: [PATCH 038/375] Fix ExchangeControlTargetEffect breakage --- .../ExchangeControlTargetEffect.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java index a795f208948..729dbfe325f 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java @@ -25,9 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - + package mage.abilities.effects.common.continuous; - + import java.util.*; import mage.constants.Duration; import mage.constants.Layer; @@ -38,57 +38,57 @@ import mage.abilities.Mode; import mage.abilities.effects.ContinuousEffectImpl; import mage.game.Game; import mage.game.permanent.Permanent; - + /** * @author magenoxx_at_googlemail.com */ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { - + private String rule; private boolean withSource; private boolean withSecondTarget; private Map zoneChangeCounter = new HashMap<>(); private Map lockedControllers = new HashMap<>(); - + public ExchangeControlTargetEffect(Duration duration, String rule) { this(duration, rule, false); } - + public ExchangeControlTargetEffect(Duration duration, String rule, boolean withSource) { this(duration, rule, withSource, false); } - + public ExchangeControlTargetEffect(Duration duration, String rule, boolean withSource, boolean withSecondTarget) { super(duration, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); this.withSource = withSource; this.withSecondTarget = withSecondTarget; this.rule = rule; } - + public ExchangeControlTargetEffect(final ExchangeControlTargetEffect effect) { super(effect); this.rule = effect.rule; this.withSource = effect.withSource; this.withSecondTarget = effect.withSecondTarget; - this.lockedControllers = effect.lockedControllers; - this.zoneChangeCounter = effect.zoneChangeCounter; + this.lockedControllers = new HashMap(effect.lockedControllers); + this.zoneChangeCounter = new HashMap(effect.zoneChangeCounter); } - + @Override public ExchangeControlTargetEffect copy() { return new ExchangeControlTargetEffect(this); } - + @Override public boolean isInactive(Ability source, Game game) { return isDiscarded(); } - + @Override public void init(Ability source, Game game) { Permanent permanent1 = null; Permanent permanent2 = null; - + if (withSource) { permanent1 = game.getPermanent(targetPointer.getFirst(game, source)); permanent2 = game.getPermanent(source.getSourceId()); @@ -115,13 +115,13 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { this.lockedControllers.put(permanent1.getId(), permanent2.getControllerId()); this.zoneChangeCounter.put(permanent1.getId(), permanent1.getZoneChangeCounter(game)); this.lockedControllers.put(permanent2.getId(), permanent1.getControllerId()); - this.zoneChangeCounter.put(permanent2.getId(), permanent2.getZoneChangeCounter(game)); + this.zoneChangeCounter.put(permanent2.getId(), permanent2.getZoneChangeCounter(game)); } else { // discard if there are less than 2 permanents discard(); } } - + @Override public boolean apply(Game game, Ability source) { Set toDelete = new HashSet<>(); @@ -137,7 +137,7 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { } if (!toDelete.isEmpty()) { for(UUID uuid: toDelete) { - zoneChangeCounter.remove(uuid); + zoneChangeCounter.remove(uuid); } if (zoneChangeCounter.isEmpty()) { discard(); @@ -146,7 +146,7 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { } return true; } - + @Override public String getText(Mode mode) { return this.rule; From 1562921777e3f295f099c84e68c619cc3946cab0 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 14 Jul 2015 19:37:27 +0300 Subject: [PATCH 039/375] Implement cards: Crosis the Purger, Phyrexian Infiltrator, Vile Consumption, and Vodalian Hypnotist --- .../mage/sets/invasion/CrosisThePurger.java | 127 ++++++++++++++++++ .../sets/invasion/PhyrexianInfiltrator.java | 72 ++++++++++ .../mage/sets/invasion/VileConsumption.java | 72 ++++++++++ .../mage/sets/invasion/VodalianHypnotist.java | 73 ++++++++++ .../sets/pdsgraveborn/CrosisThePurger.java | 53 ++++++++ Utils/mtg-cards-data.txt | 2 +- 6 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/sets/invasion/CrosisThePurger.java create mode 100644 Mage.Sets/src/mage/sets/invasion/PhyrexianInfiltrator.java create mode 100644 Mage.Sets/src/mage/sets/invasion/VileConsumption.java create mode 100644 Mage.Sets/src/mage/sets/invasion/VodalianHypnotist.java create mode 100644 Mage.Sets/src/mage/sets/pdsgraveborn/CrosisThePurger.java diff --git a/Mage.Sets/src/mage/sets/invasion/CrosisThePurger.java b/Mage.Sets/src/mage/sets/invasion/CrosisThePurger.java new file mode 100644 index 00000000000..2f40090c3d0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/CrosisThePurger.java @@ -0,0 +1,127 @@ +/* + * 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.invasion; + + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LoneFox + + */ +public class CrosisThePurger extends CardImpl { + + public CrosisThePurger(UUID ownerId) { + super(ownerId, 242, "Crosis, the Purger", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}{B}{R}"); + this.expansionSetCode = "INV"; + this.supertype.add("Legendary"); + this.subtype.add("Dragon"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DoIfCostPaid(new CrosisThePurgerEffect(), + new ManaCostsImpl("{2}{B}")), false, true)); + } + + public CrosisThePurger(final CrosisThePurger card) { + super(card); + } + + @Override + public CrosisThePurger copy() { + return new CrosisThePurger(this); + } +} + +class CrosisThePurgerEffect extends OneShotEffect { + + CrosisThePurgerEffect() { + super(Outcome.Discard); + this.staticText = "choose a color, then that player reveals his or her hand and discards all cards of that color."; + } + + CrosisThePurgerEffect(final CrosisThePurgerEffect effect) { + super(effect); + } + + @Override + public CrosisThePurgerEffect copy() { + return new CrosisThePurgerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if(player != null) { + ChoiceColor choice = new ChoiceColor(); + player.choose(outcome, choice, game); + if(choice.getColor() != null) { + game.informPlayers(new StringBuilder(player.getLogName()).append(" chooses ").append(choice.getColor()).toString()); + Player damagedPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + damagedPlayer.revealCards("hand of " + damagedPlayer.getName(), damagedPlayer.getHand(), game); + FilterCard filter = new FilterCard(); + filter.add(new ColorPredicate(choice.getColor())); + List toDiscard = new ArrayList<>(); + for(UUID cardId : damagedPlayer.getHand()) { + Card card = game.getCard(cardId); + if(filter.match(card, game)) { + toDiscard.add(card); + } + } + for(Card card: toDiscard) { + damagedPlayer.discard(card, source, game); + } + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/PhyrexianInfiltrator.java b/Mage.Sets/src/mage/sets/invasion/PhyrexianInfiltrator.java new file mode 100644 index 00000000000..788b052ddf1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/PhyrexianInfiltrator.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class PhyrexianInfiltrator extends CardImpl { + + public PhyrexianInfiltrator(UUID ownerId) { + super(ownerId, 116, "Phyrexian Infiltrator", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "INV"; + this.subtype.add("Minion"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {2}{U}{U}: Exchange control of Phyrexian Infiltrator and target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExchangeControlTargetEffect(Duration.EndOfGame, + "Exchange control of {this} and target creature", true), new ManaCostsImpl("{2}{U}{U}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + } + + public PhyrexianInfiltrator(final PhyrexianInfiltrator card) { + super(card); + } + + @Override + public PhyrexianInfiltrator copy() { + return new PhyrexianInfiltrator(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/VileConsumption.java b/Mage.Sets/src/mage/sets/invasion/VileConsumption.java new file mode 100644 index 00000000000..17af127878c --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/VileConsumption.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class VileConsumption extends CardImpl { + + public VileConsumption(UUID ownerId) { + super(ownerId, 285, "Vile Consumption", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{B}"); + this.expansionSetCode = "INV"; + + // All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay 1 life." + Effect effect = new SacrificeSourceUnlessPaysEffect(new PayLifeCost(1)); + effect.setText("sacrifice this creature unless you pay 1 life"); + Effect effect2 = new GainAbilityAllEffect(new BeginningOfUpkeepTriggeredAbility(effect, TargetController.YOU, false), + Duration.WhileOnBattlefield, new FilterCreaturePermanent("all creatures")); + effect2.setText("All creatures have \"At the beginning of your upkeep, sacrifice this creature unless you pay 1 life.\""); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect2)); + } + + public VileConsumption(final VileConsumption card) { + super(card); + } + + @Override + public VileConsumption copy() { + return new VileConsumption(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/VodalianHypnotist.java b/Mage.Sets/src/mage/sets/invasion/VodalianHypnotist.java new file mode 100644 index 00000000000..40f09955e6c --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/VodalianHypnotist.java @@ -0,0 +1,73 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPlayer; + +/** + * + * @author LoneFox + */ +public class VodalianHypnotist extends CardImpl { + + public VodalianHypnotist(UUID ownerId) { + super(ownerId, 84, "Vodalian Hypnotist", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "INV"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {2}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new DiscardTargetEffect(1), + new ManaCostsImpl("{2}{B}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public VodalianHypnotist(final VodalianHypnotist card) { + super(card); + } + + @Override + public VodalianHypnotist copy() { + return new VodalianHypnotist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/pdsgraveborn/CrosisThePurger.java b/Mage.Sets/src/mage/sets/pdsgraveborn/CrosisThePurger.java new file mode 100644 index 00000000000..ad66b29cc28 --- /dev/null +++ b/Mage.Sets/src/mage/sets/pdsgraveborn/CrosisThePurger.java @@ -0,0 +1,53 @@ +/* + * 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.pdsgraveborn; + +import java.util.UUID; + +/** + * + * @author LoneFox + + */ +public class CrosisThePurger extends mage.sets.invasion.CrosisThePurger { + + public CrosisThePurger(UUID ownerId) { + super(ownerId); + this.cardNumber = 5; + this.expansionSetCode = "PD3"; + } + + public CrosisThePurger(final CrosisThePurger card) { + super(card); + } + + @Override + public CrosisThePurger copy() { + return new CrosisThePurger(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index b9bf4099936..b3490107b66 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -7509,7 +7509,7 @@ Charging Troll|Invasion|239|U|{2}{G}{W}|Creature - Troll|3|3|Vigilance${G}: Rege Pledge of Loyalty|Invasion|24|U|{1}{W}|Enchantment - Aura|||Enchant creature$Enchanted creature has protection from the colors of permanents you control. This effect doesn't remove Pledge of Loyalty.| Cinder Shade|Invasion|240|U|{1}{B}{R}|Creature - Shade|1|1|{B}: Cinder Shade gets +1/+1 until end of turn.${R}, Sacrifice Cinder Shade: Cinder Shade deals damage equal to its power to target creature.| Coalition Victory|Invasion|241|R|{3}{W}{U}{B}{R}{G}|Sorcery|||You win the game if you control a land of each basic land type and a creature of each color.| -Crosis, the Purger|Invasion|242|R|{3}{U}|Legendary Creature - Dragon|6|6|Flying$Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color.| +Crosis, the Purger|Invasion|242|R|{3}{U}{B}{R}|Legendary Creature - Dragon|6|6|Flying$Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color.| Darigaaz, the Igniter|Invasion|243|R|{3}{B}{R}{G}|Legendary Creature - Dragon|6|6|Flying$Whenever Darigaaz, the Igniter deals combat damage to a player, you may pay {2}{R}. If you do, choose a color, then that player reveals his or her hand and Darigaaz deals damage to the player equal to the number of cards of that color revealed this way.| Dromar, the Banisher|Invasion|244|R|{3}{W}{U}{B}|Legendary Creature - Dragon|6|6|Flying$Whenever Dromar, the Banisher deals combat damage to a player, you may pay {2}{U}. If you do, choose a color, then return all creatures of that color to their owners' hands.| Dueling Grounds|Invasion|245|R|{1}{G}{W}|Enchantment|||No more than one creature can attack each turn.$No more than one creature can block each turn.| From 752b2cdf08eb17caa60314ec1eaf43248a47daf6 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 14 Jul 2015 19:38:20 +0300 Subject: [PATCH 040/375] Fix the tooltip text of Necromantic Summons --- .../src/mage/sets/magicorigins/NecromanticSummons.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java b/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java index b8bcb491aa1..1c4a58253cb 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java +++ b/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java @@ -57,10 +57,10 @@ public class NecromanticSummons extends CardImpl { // Put target creature card from a graveyard onto the battlefield under your control. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard"))); - + // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it. Effect effect = new ConditionalOneShotEffect(new NecromanticSummoningEffect(), - SpellMasteryCondition.getInstance(), "
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B} to your mana pool"); + SpellMasteryCondition.getInstance(), "
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it"); this.getSpellAbility().addEffect(effect); } @@ -99,4 +99,4 @@ class NecromanticSummoningEffect extends OneShotEffect { } return false; } -} \ No newline at end of file +} From 60c7a2b34b5dd9a64bd415b65424a559294cf52b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 14 Jul 2015 23:56:44 +0200 Subject: [PATCH 041/375] * Stack - Fixed that name of face down cards were unintended shown while moving effect is on the stack (Necropotence). --- .../src/mage/view/StackAbilityView.java | 75 ++++++++++--------- .../sets/dragonsmaze/BreakingEntering.java | 22 ++---- .../src/mage/sets/iceage/Necropotence.java | 27 +++---- 3 files changed, 60 insertions(+), 64 deletions(-) diff --git a/Mage.Common/src/mage/view/StackAbilityView.java b/Mage.Common/src/mage/view/StackAbilityView.java index 8cb82fa2ffe..a55b78c9c8f 100644 --- a/Mage.Common/src/mage/view/StackAbilityView.java +++ b/Mage.Common/src/mage/view/StackAbilityView.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.view; import java.util.ArrayList; @@ -34,6 +33,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Modes; import mage.abilities.effects.Effect; +import mage.cards.Card; import mage.constants.AbilityType; import mage.constants.CardType; import mage.constants.MageObjectType; @@ -47,15 +47,15 @@ import mage.target.targetpointer.TargetPointer; * @author BetaSteward_at_googlemail.com */ public class StackAbilityView extends CardView { + private static final long serialVersionUID = 1L; private final CardView sourceCard; - private final AbilityType abilityType; public StackAbilityView(Game game, StackAbility ability, String sourceName, CardView sourceCard) { this.id = ability.getId(); this.mageObjectType = MageObjectType.ABILITY_STACK; - this.abilityType = ability.getStackAbility().getAbilityType(); + this.abilityType = ability.getStackAbility().getAbilityType(); this.sourceCard = sourceCard; this.sourceCard.setMageObjectType(mageObjectType); this.name = "Ability"; @@ -72,11 +72,11 @@ public class StackAbilityView extends CardView { this.color = ability.getColor(game); this.manaCost = ability.getManaCost().getSymbols(); this.power = ability.getPower().toString(); - this.toughness = ability.getToughness().toString(); + this.toughness = ability.getToughness().toString(); String nameToShow; if (sourceCard.isFaceDown()) { CardView tmpSourceCard = this.getSourceCard(); - tmpSourceCard.displayName = "Face Down"; + tmpSourceCard.displayName = "Face Down"; tmpSourceCard.superTypes.clear(); tmpSourceCard.subTypes.clear(); tmpSourceCard.cardTypes.clear(); @@ -85,7 +85,7 @@ public class StackAbilityView extends CardView { tmpSourceCard.power = "2"; tmpSourceCard.toughness = "2"; nameToShow = "creature without name"; - } else { + } else { nameToShow = sourceName; } this.rules = new ArrayList<>(); @@ -97,7 +97,7 @@ public class StackAbilityView extends CardView { private void updateTargets(Game game, StackAbility ability) { List names = new ArrayList<>(); - for(UUID modeId : ability.getModes().getSelectedModes()) { + for (UUID modeId : ability.getModes().getSelectedModes()) { ability.getModes().setActiveMode(modeId); if (ability.getTargets().size() > 0) { setTargets(ability.getTargets()); @@ -115,6 +115,9 @@ public class StackAbilityView extends CardView { for (UUID uuid : targetList) { MageObject mageObject = game.getObject(uuid); if (mageObject != null) { + if ((mageObject instanceof Card) && ((Card) mageObject).isFaceDown(game)) { + continue; + } names.add(mageObject.getName()); } } @@ -128,9 +131,9 @@ public class StackAbilityView extends CardView { // show for modal ability, which mode was choosen if (ability.isModal()) { Modes modes = ability.getModes(); - for(UUID modeId : modes.getSelectedModes()) { + for (UUID modeId : modes.getSelectedModes()) { modes.setActiveMode(modeId); - this.rules.add("Chosen mode: " + ability.getEffects().getText(modes.get(modeId))+""); + this.rules.add("Chosen mode: " + ability.getEffects().getText(modes.get(modeId)) + ""); } } } @@ -143,5 +146,5 @@ public class StackAbilityView extends CardView { public AbilityType getAbilityType() { return abilityType; } - + } diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/BreakingEntering.java b/Mage.Sets/src/mage/sets/dragonsmaze/BreakingEntering.java index 49ed215dd95..0900fe7685f 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/BreakingEntering.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/BreakingEntering.java @@ -25,15 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.dragonsmaze; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; @@ -42,7 +36,11 @@ import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.Card; import mage.cards.SplitCard; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.players.Player; @@ -51,12 +49,6 @@ import mage.target.TargetPlayer; import mage.target.common.TargetCardInGraveyard; import mage.target.targetpointer.FixedTarget; -/** - * - * @author LevelX2 - */ - - public class BreakingEntering extends SplitCard { public BreakingEntering(UUID ownerId) { @@ -106,18 +98,18 @@ class EnteringReturnFromGraveyardToBattlefieldEffect extends OneShotEffect { if (player != null) { Target target = new TargetCardInGraveyard(new FilterCreatureCard()); target.setNotTarget(true); - if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && - player.chooseTarget(outcome, target, source, game)) { + if (target.canChoose(source.getSourceId(), source.getControllerId(), game) + && player.chooseTarget(outcome, target, source, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { if (card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId())) { ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(card.getId())); game.addEffect(effect, source); - return true; } } } + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/iceage/Necropotence.java b/Mage.Sets/src/mage/sets/iceage/Necropotence.java index 60044a1b7bd..0b1bb6d547e 100644 --- a/Mage.Sets/src/mage/sets/iceage/Necropotence.java +++ b/Mage.Sets/src/mage/sets/iceage/Necropotence.java @@ -64,14 +64,14 @@ public class Necropotence extends CardImpl { this.expansionSetCode = "ICE"; // Skip your draw step. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SkipDrawStepEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SkipDrawStepEffect())); // Whenever you discard a card, exile that card from your graveyard. Effect effect = new ExileTargetEffect(null, "", Zone.GRAVEYARD); effect.setText("exile that card from your graveyard"); this.addAbility(new NecropotenceTriggeredAbility(effect)); // Pay 1 life: Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new NecropotenceEffect(), new PayLifeCost(1))); - + } public Necropotence(final Necropotence card) { @@ -85,8 +85,9 @@ public class Necropotence extends CardImpl { } class NecropotenceTriggeredAbility extends TriggeredAbilityImpl { + NecropotenceTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect , false); + super(Zone.BATTLEFIELD, effect, false); } NecropotenceTriggeredAbility(final NecropotenceTriggeredAbility ability) { @@ -105,10 +106,10 @@ class NecropotenceTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (getControllerId().equals(event.getPlayerId())) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId())); - return true; - } + if (getControllerId().equals(event.getPlayerId())) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId())); + return true; + } return false; } @@ -119,21 +120,21 @@ class NecropotenceTriggeredAbility extends TriggeredAbilityImpl { } class NecropotenceEffect extends OneShotEffect { - + public NecropotenceEffect() { super(Outcome.Benefit); this.staticText = "Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step"; } - + public NecropotenceEffect(final NecropotenceEffect effect) { super(effect); } - + @Override public NecropotenceEffect copy() { return new NecropotenceEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -144,12 +145,12 @@ class NecropotenceEffect extends OneShotEffect { card.setFaceDown(true, game); Effect returnToHandeffect = new ReturnToHandTargetEffect(false); returnToHandeffect.setText("put that face down card into your hand"); - returnToHandeffect.setTargetPointer(new FixedTarget(card.getId())); + returnToHandeffect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToHandeffect, TargetController.YOU); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); + game.addDelayedTriggeredAbility(delayedAbility); return true; } return false; From 9c6b3530019f82cfb85b86ad2410aae20e5c22f3 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 14 Jul 2015 20:48:34 -0500 Subject: [PATCH 042/375] Implemented Storm Herd, Magus of the Mirror, Stitch Together, Stasis Cell, Necromantic Thirst, Vedalken Plotter, Respite, Sulfurous Blast, Steam Blast, Stronghold Discipline, Rumbling Slum --- .../mage/sets/commander/StitchTogether.java | 71 ++++++ .../src/mage/sets/commander/StormHerd.java | 52 +++++ .../mage/sets/commander/SulfurousBlast.java | 52 +++++ .../mage/sets/commander/VedalkenPlotter.java | 52 +++++ .../mage/sets/conspiracy/BarbedShocker.java | 208 +++++++++--------- .../sets/conspiracy/MagusOfTheMirror.java | 127 +++++++++++ .../sets/conspiracy/NecromanticThirst.java | 52 +++++ .../src/mage/sets/conspiracy/Respite.java | 52 +++++ .../src/mage/sets/conspiracy/StasisCell.java | 52 +++++ .../sets/conspiracy/StrongholdDiscipline.java | 98 +++++++++ .../src/mage/sets/guildpact/RumblingSlum.java | 68 ++++++ .../src/mage/sets/guildpact/StormHerd.java | 75 +++++++ .../mage/sets/guildpact/VedalkenPlotter.java | 86 ++++++++ .../mage/sets/innistrad/Claustrophobia.java | 153 ++++++------- .../mage/sets/judgment/StitchTogether.java | 52 +++++ .../sets/nemesis/StrongholdDiscipline.java | 52 +++++ .../mage/sets/planechase/RumblingSlum.java | 52 +++++ .../mage/sets/ravnica/NecromanticThirst.java | 79 +++++++ .../mage/sets/ravnica/NetherbornPhalanx.java | 108 +++++++++ .../src/mage/sets/ravnica/StasisCell.java | 81 +++++++ .../mage/sets/tempest/EvincarsJustice.java | 3 +- Mage.Sets/src/mage/sets/tempest/Respite.java | 64 ++++++ .../tenthedition/StrongholdDiscipline.java | 54 +++++ .../sets/timespiral/MagusOfTheMirror.java | 52 +++++ .../mage/sets/timespiral/SulfurousBlast.java | 64 ++++++ .../src/mage/sets/urzassaga/SteamBlast.java | 58 +++++ 26 files changed, 1735 insertions(+), 182 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/commander/StitchTogether.java create mode 100644 Mage.Sets/src/mage/sets/commander/StormHerd.java create mode 100644 Mage.Sets/src/mage/sets/commander/SulfurousBlast.java create mode 100644 Mage.Sets/src/mage/sets/commander/VedalkenPlotter.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/MagusOfTheMirror.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/NecromanticThirst.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/Respite.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/StasisCell.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/StrongholdDiscipline.java create mode 100644 Mage.Sets/src/mage/sets/guildpact/RumblingSlum.java create mode 100644 Mage.Sets/src/mage/sets/guildpact/StormHerd.java create mode 100644 Mage.Sets/src/mage/sets/guildpact/VedalkenPlotter.java create mode 100644 Mage.Sets/src/mage/sets/judgment/StitchTogether.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/StrongholdDiscipline.java create mode 100644 Mage.Sets/src/mage/sets/planechase/RumblingSlum.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/NecromanticThirst.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/NetherbornPhalanx.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/StasisCell.java create mode 100644 Mage.Sets/src/mage/sets/tempest/Respite.java create mode 100644 Mage.Sets/src/mage/sets/tenthedition/StrongholdDiscipline.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/MagusOfTheMirror.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/SulfurousBlast.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/SteamBlast.java diff --git a/Mage.Sets/src/mage/sets/commander/StitchTogether.java b/Mage.Sets/src/mage/sets/commander/StitchTogether.java new file mode 100644 index 00000000000..f99b726da56 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/StitchTogether.java @@ -0,0 +1,71 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class StitchTogether extends CardImpl { + + public StitchTogether(UUID ownerId) { + super(ownerId, 102, "Stitch Together", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{B}{B}"); + this.expansionSetCode = "CMD"; + + // Return target creature card from your graveyard to your hand. + // Threshold - Return that card from your graveyard to the battlefield instead if seven or more cards are in your graveyard. + Effect effect = new ConditionalOneShotEffect( + new ReturnFromGraveyardToBattlefieldTargetEffect(), + new ReturnFromGraveyardToHandTargetEffect(), + new CardsInControllerGraveCondition(7), + "Return target creature card from your graveyard to your hand.

Threshold - Return that card from your graveyard to the battlefield instead if seven or more cards are in your graveyard."); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); + } + + public StitchTogether(final StitchTogether card) { + super(card); + } + + @Override + public StitchTogether copy() { + return new StitchTogether(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/StormHerd.java b/Mage.Sets/src/mage/sets/commander/StormHerd.java new file mode 100644 index 00000000000..ba28212f94a --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/StormHerd.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class StormHerd extends mage.sets.guildpact.StormHerd { + + public StormHerd(UUID ownerId) { + super(ownerId); + this.cardNumber = 34; + this.expansionSetCode = "CMD"; + } + + public StormHerd(final StormHerd card) { + super(card); + } + + @Override + public StormHerd copy() { + return new StormHerd(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/SulfurousBlast.java b/Mage.Sets/src/mage/sets/commander/SulfurousBlast.java new file mode 100644 index 00000000000..8b40eebcc84 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/SulfurousBlast.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class SulfurousBlast extends mage.sets.timespiral.SulfurousBlast { + + public SulfurousBlast(UUID ownerId) { + super(ownerId); + this.cardNumber = 137; + this.expansionSetCode = "CMD"; + } + + public SulfurousBlast(final SulfurousBlast card) { + super(card); + } + + @Override + public SulfurousBlast copy() { + return new SulfurousBlast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/VedalkenPlotter.java b/Mage.Sets/src/mage/sets/commander/VedalkenPlotter.java new file mode 100644 index 00000000000..2a38229d15f --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/VedalkenPlotter.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class VedalkenPlotter extends mage.sets.guildpact.VedalkenPlotter { + + public VedalkenPlotter(UUID ownerId) { + super(ownerId); + this.cardNumber = 66; + this.expansionSetCode = "CMD"; + } + + public VedalkenPlotter(final VedalkenPlotter card) { + super(card); + } + + @Override + public VedalkenPlotter copy() { + return new VedalkenPlotter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/BarbedShocker.java b/Mage.Sets/src/mage/sets/conspiracy/BarbedShocker.java index 0fb985c6562..70612d8ca05 100644 --- a/Mage.Sets/src/mage/sets/conspiracy/BarbedShocker.java +++ b/Mage.Sets/src/mage/sets/conspiracy/BarbedShocker.java @@ -1,106 +1,104 @@ -/* - * 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.conspiracy; - -import java.util.Set; -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.keyword.TrampleAbility; -import mage.abilities.keyword.HasteAbility; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.TargetController; -import mage.game.Game; -import mage.players.Player; - -/** - * - * @author markedagain - */ -public class BarbedShocker extends CardImpl { - - public BarbedShocker(UUID ownerId) { - super(ownerId, 136, "Barbed Shocker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); - this.expansionSetCode = "CNS"; - this.subtype.add("Insect"); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - - // Trample - this.addAbility(TrampleAbility.getInstance()); - // Haste - this.addAbility(HasteAbility.getInstance()); - // Whenever Barbed Shocker deals damage to a player, that player discards all the cards in his or her hand, then draws that many cards. - this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new BarbedShockerEffect(), false, true)); - } - - public BarbedShocker(final BarbedShocker card) { - super(card); - } - - @Override - public BarbedShocker copy() { - return new BarbedShocker(this); - } -} -class BarbedShockerEffect extends OneShotEffect { - - public BarbedShockerEffect() { - super(Outcome.Discard); - this.staticText = " that player discards all the cards in his or her hand, then draws that many cards"; - } - - public BarbedShockerEffect(final BarbedShockerEffect effect) { - super(effect); - } - - @Override - public BarbedShockerEffect copy() { - return new BarbedShockerEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); - if (targetPlayer != null) { - int count = targetPlayer.getHand().size(); - for (Card card : targetPlayer.getHand().getCards(game)) { - targetPlayer.discard(card, source, game); - } - targetPlayer.drawCards(count, game); - return false; - } - return true; - } +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author markedagain + */ +public class BarbedShocker extends CardImpl { + + public BarbedShocker(UUID ownerId) { + super(ownerId, 136, "Barbed Shocker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "CNS"; + this.subtype.add("Insect"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + // Haste + this.addAbility(HasteAbility.getInstance()); + // Whenever Barbed Shocker deals damage to a player, that player discards all the cards in his or her hand, then draws that many cards. + this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new BarbedShockerEffect(), false, true)); + } + + public BarbedShocker(final BarbedShocker card) { + super(card); + } + + @Override + public BarbedShocker copy() { + return new BarbedShocker(this); + } +} +class BarbedShockerEffect extends OneShotEffect { + + public BarbedShockerEffect() { + super(Outcome.Discard); + this.staticText = " that player discards all the cards in his or her hand, then draws that many cards"; + } + + public BarbedShockerEffect(final BarbedShockerEffect effect) { + super(effect); + } + + @Override + public BarbedShockerEffect copy() { + return new BarbedShockerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); + if (targetPlayer != null) { + int count = targetPlayer.getHand().size(); + for (Card card : targetPlayer.getHand().getCards(game)) { + targetPlayer.discard(card, source, game); + } + targetPlayer.drawCards(count, game); + return false; + } + return true; + } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/conspiracy/MagusOfTheMirror.java b/Mage.Sets/src/mage/sets/conspiracy/MagusOfTheMirror.java new file mode 100644 index 00000000000..b91f0b27660 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/MagusOfTheMirror.java @@ -0,0 +1,127 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class MagusOfTheMirror extends CardImpl { + + public MagusOfTheMirror(UUID ownerId) { + super(ownerId, 117, "Magus of the Mirror", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); + this.expansionSetCode = "CNS"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(4); + this.toughness = new MageInt(2); + + // {tap}, Sacrifice Magus of the Mirror: Exchange life totals with target opponent. Activate this ability only during your upkeep. + Ability ability = new ConditionalActivatedAbility( + Zone.BATTLEFIELD, + new MagusOfTheMirrorEffect(), + new TapSourceCost(), + new IsStepCondition(PhaseStep.UPKEEP), + null); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public MagusOfTheMirror(final MagusOfTheMirror card) { + super(card); + } + + @Override + public MagusOfTheMirror copy() { + return new MagusOfTheMirror(this); + } +} + +class MagusOfTheMirrorEffect extends OneShotEffect { + + public MagusOfTheMirrorEffect() { + super(Outcome.Neutral); + this.staticText = "Exchange life totals with target opponent"; + } + + public MagusOfTheMirrorEffect(final MagusOfTheMirrorEffect effect) { + super(effect); + } + + @Override + public MagusOfTheMirrorEffect copy() { + return new MagusOfTheMirrorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player opponent = game.getPlayer(source.getFirstTarget()); + if (controller != null && opponent != null) { + int lifeController = controller.getLife(); + int lifeOpponent = opponent.getLife(); + + if (lifeController == lifeOpponent) + return false; + + if (!controller.isLifeTotalCanChange() || !opponent.isLifeTotalCanChange()) + return false; + + // 20110930 - 118.7, 118.8 + if (lifeController < lifeOpponent && (!controller.isCanGainLife() || !opponent.isCanLoseLife())) + return false; + + if (lifeController > lifeOpponent && (!controller.isCanLoseLife() || !opponent.isCanGainLife())) + return false; + + controller.setLife(lifeOpponent, game); + opponent.setLife(lifeController, game); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/conspiracy/NecromanticThirst.java b/Mage.Sets/src/mage/sets/conspiracy/NecromanticThirst.java new file mode 100644 index 00000000000..da05bf72cd8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/NecromanticThirst.java @@ -0,0 +1,52 @@ +/* + * 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.conspiracy; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class NecromanticThirst extends mage.sets.ravnica.NecromanticThirst { + + public NecromanticThirst(UUID ownerId) { + super(ownerId); + this.cardNumber = 119; + this.expansionSetCode = "CNS"; + } + + public NecromanticThirst(final NecromanticThirst card) { + super(card); + } + + @Override + public NecromanticThirst copy() { + return new NecromanticThirst(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/Respite.java b/Mage.Sets/src/mage/sets/conspiracy/Respite.java new file mode 100644 index 00000000000..cf9230da3d6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/Respite.java @@ -0,0 +1,52 @@ +/* + * 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.conspiracy; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Respite extends mage.sets.tempest.Respite { + + public Respite(UUID ownerId) { + super(ownerId); + this.cardNumber = 176; + this.expansionSetCode = "CNS"; + } + + public Respite(final Respite card) { + super(card); + } + + @Override + public Respite copy() { + return new Respite(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/StasisCell.java b/Mage.Sets/src/mage/sets/conspiracy/StasisCell.java new file mode 100644 index 00000000000..dd59b89b4e6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/StasisCell.java @@ -0,0 +1,52 @@ +/* + * 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.conspiracy; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class StasisCell extends mage.sets.ravnica.StasisCell { + + public StasisCell(UUID ownerId) { + super(ownerId); + this.cardNumber = 107; + this.expansionSetCode = "CNS"; + } + + public StasisCell(final StasisCell card) { + super(card); + } + + @Override + public StasisCell copy() { + return new StasisCell(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/StrongholdDiscipline.java b/Mage.Sets/src/mage/sets/conspiracy/StrongholdDiscipline.java new file mode 100644 index 00000000000..f6d258cf6e9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/StrongholdDiscipline.java @@ -0,0 +1,98 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class StrongholdDiscipline extends CardImpl { + + public StrongholdDiscipline(UUID ownerId) { + super(ownerId, 126, "Stronghold Discipline", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{B}{B}"); + this.expansionSetCode = "CNS"; + + // Each player loses 1 life for each creature he or she controls. + this.getSpellAbility().addEffect(new StrongholdDisciplineEffect()); + } + + public StrongholdDiscipline(final StrongholdDiscipline card) { + super(card); + } + + @Override + public StrongholdDiscipline copy() { + return new StrongholdDiscipline(this); + } +} + +class StrongholdDisciplineEffect extends OneShotEffect { + + StrongholdDisciplineEffect() { + super(Outcome.Sacrifice); + this.staticText = "Each player loses 1 life for each creature he or she controls"; + } + + StrongholdDisciplineEffect(final StrongholdDisciplineEffect effect) { + super(effect); + } + + @Override + public StrongholdDisciplineEffect copy() { + return new StrongholdDisciplineEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (UUID playerId : controller.getInRange()) { + final int count = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), playerId, game).size(); + if (count > 0) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.loseLife(count, game); + } + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/guildpact/RumblingSlum.java b/Mage.Sets/src/mage/sets/guildpact/RumblingSlum.java new file mode 100644 index 00000000000..4b5834b987a --- /dev/null +++ b/Mage.Sets/src/mage/sets/guildpact/RumblingSlum.java @@ -0,0 +1,68 @@ +/* + * 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.guildpact; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class RumblingSlum extends CardImpl { + + public RumblingSlum(UUID ownerId) { + super(ownerId, 126, "Rumbling Slum", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{R}{G}{G}"); + this.expansionSetCode = "GPT"; + this.subtype.add("Elemental"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // At the beginning of your upkeep, Rumbling Slum deals 1 damage to each player. + Effect effect = new DamagePlayersEffect(1, TargetController.ANY); + effect.setText("{this} deals 1 damage to each player"); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, false)); + } + + public RumblingSlum(final RumblingSlum card) { + super(card); + } + + @Override + public RumblingSlum copy() { + return new RumblingSlum(this); + } +} diff --git a/Mage.Sets/src/mage/sets/guildpact/StormHerd.java b/Mage.Sets/src/mage/sets/guildpact/StormHerd.java new file mode 100644 index 00000000000..0e623afe8bf --- /dev/null +++ b/Mage.Sets/src/mage/sets/guildpact/StormHerd.java @@ -0,0 +1,75 @@ +/* + * 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.guildpact; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.dynamicvalue.common.ControllerLifeCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.game.permanent.token.Token; + +/** + * + * @author fireshoes + */ +public class StormHerd extends CardImpl { + + public StormHerd(UUID ownerId) { + super(ownerId, 19, "Storm Herd", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{8}{W}{W}"); + this.expansionSetCode = "GPT"; + + // Put X 1/1 white Pegasus creature tokens with flying onto the battlefield, where X is your life total. + this.getSpellAbility().addEffect(new CreateTokenEffect(new PegasusToken(), new ControllerLifeCount())); + } + + public StormHerd(final StormHerd card) { + super(card); + } + + @Override + public StormHerd copy() { + return new StormHerd(this); + } +} + +class PegasusToken extends Token { + + public PegasusToken() { + super("Pegasus", "1/1 white Pegasus creature tokens with flying"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add("Pegasus"); + power = new MageInt(1); + toughness = new MageInt(1); + addAbility(FlyingAbility.getInstance()); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/guildpact/VedalkenPlotter.java b/Mage.Sets/src/mage/sets/guildpact/VedalkenPlotter.java new file mode 100644 index 00000000000..6661a3cc3d1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/guildpact/VedalkenPlotter.java @@ -0,0 +1,86 @@ +/* + * 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.guildpact; + +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.ExchangeControlTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class VedalkenPlotter extends CardImpl { + + private static final String rule = "exchange control of target land you control and target land an opponent controls"; + + private static final FilterLandPermanent filter = new FilterLandPermanent("land an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public VedalkenPlotter(UUID ownerId) { + super(ownerId, 41, "Vedalken Plotter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "GPT"; + this.subtype.add("Vedalken"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Vedalken Plotter enters the battlefield, exchange control of target land you control and target land an opponent controls. + Effect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, rule, false, true); + effect.setText("exchange control of target land you control and target land an opponent controls"); + Ability ability = new EntersBattlefieldTriggeredAbility(effect, false, true); + ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public VedalkenPlotter(final VedalkenPlotter card) { + super(card); + } + + @Override + public VedalkenPlotter copy() { + return new VedalkenPlotter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/innistrad/Claustrophobia.java b/Mage.Sets/src/mage/sets/innistrad/Claustrophobia.java index 8bec3eda852..2261417a9a7 100644 --- a/Mage.Sets/src/mage/sets/innistrad/Claustrophobia.java +++ b/Mage.Sets/src/mage/sets/innistrad/Claustrophobia.java @@ -1,76 +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.innistrad; - -import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; -import mage.abilities.effects.common.TapEnchantedEffect; -import mage.abilities.keyword.EnchantAbility; -import mage.cards.CardImpl; -import mage.target.TargetPermanent; -import mage.target.common.TargetCreaturePermanent; - -/** - * @author Loki - */ -public class Claustrophobia extends CardImpl { - - public Claustrophobia(UUID ownerId) { - super(ownerId, 48, "Claustrophobia", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{U}"); - this.expansionSetCode = "ISD"; - this.subtype.add("Aura"); - - - // Enchant creature - TargetPermanent auraTarget = new TargetCreaturePermanent(); - this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); - this.addAbility(new EnchantAbility(auraTarget.getTargetName())); - // When Claustrophobia enters the battlefield, tap enchanted creature. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect())); - // Enchanted creature doesn't untap during its controller's untap step. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect())); - } - - public Claustrophobia(final Claustrophobia card) { - super(card); - } - - @Override - public Claustrophobia copy() { - return new Claustrophobia(this); - } -} +/* + * 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.innistrad; + +import java.util.UUID; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * @author Loki + */ +public class Claustrophobia extends CardImpl { + + public Claustrophobia(UUID ownerId) { + super(ownerId, 48, "Claustrophobia", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{U}"); + this.expansionSetCode = "ISD"; + this.subtype.add("Aura"); + + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // When Claustrophobia enters the battlefield, tap enchanted creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect())); + + // Enchanted creature doesn't untap during its controller's untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect())); + } + + public Claustrophobia(final Claustrophobia card) { + super(card); + } + + @Override + public Claustrophobia copy() { + return new Claustrophobia(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/StitchTogether.java b/Mage.Sets/src/mage/sets/judgment/StitchTogether.java new file mode 100644 index 00000000000..a1a294f5612 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/StitchTogether.java @@ -0,0 +1,52 @@ +/* + * 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.judgment; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class StitchTogether extends mage.sets.commander.StitchTogether { + + public StitchTogether(UUID ownerId) { + super(ownerId); + this.cardNumber = 72; + this.expansionSetCode = "JUD"; + } + + public StitchTogether(final StitchTogether card) { + super(card); + } + + @Override + public StitchTogether copy() { + return new StitchTogether(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/StrongholdDiscipline.java b/Mage.Sets/src/mage/sets/nemesis/StrongholdDiscipline.java new file mode 100644 index 00000000000..d58af0a0106 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/StrongholdDiscipline.java @@ -0,0 +1,52 @@ +/* + * 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.nemesis; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class StrongholdDiscipline extends mage.sets.conspiracy.StrongholdDiscipline { + + public StrongholdDiscipline(UUID ownerId) { + super(ownerId); + this.cardNumber = 73; + this.expansionSetCode = "NMS"; + } + + public StrongholdDiscipline(final StrongholdDiscipline card) { + super(card); + } + + @Override + public StrongholdDiscipline copy() { + return new StrongholdDiscipline(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planechase/RumblingSlum.java b/Mage.Sets/src/mage/sets/planechase/RumblingSlum.java new file mode 100644 index 00000000000..1ce5901500a --- /dev/null +++ b/Mage.Sets/src/mage/sets/planechase/RumblingSlum.java @@ -0,0 +1,52 @@ +/* + * 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.planechase; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class RumblingSlum extends mage.sets.guildpact.RumblingSlum { + + public RumblingSlum(UUID ownerId) { + super(ownerId); + this.cardNumber = 93; + this.expansionSetCode = "HOP"; + } + + public RumblingSlum(final RumblingSlum card) { + super(card); + } + + @Override + public RumblingSlum copy() { + return new RumblingSlum(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/NecromanticThirst.java b/Mage.Sets/src/mage/sets/ravnica/NecromanticThirst.java new file mode 100644 index 00000000000..b2995b69c61 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/NecromanticThirst.java @@ -0,0 +1,79 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreatureCard; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class NecromanticThirst extends CardImpl { + + public NecromanticThirst(UUID ownerId) { + super(ownerId, 97, "Necromantic Thirst", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // Whenever enchanted creature deals combat damage to a player, you may return target creature card from your graveyard to your hand. + Ability ability = new DealsDamageToAPlayerAttachedTriggeredAbility( + new ReturnFromGraveyardToHandTargetEffect(), + "enchanted creature", true, false, true, TargetController.ANY); + ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); + this.addAbility(ability); + } + + public NecromanticThirst(final NecromanticThirst card) { + super(card); + } + + @Override + public NecromanticThirst copy() { + return new NecromanticThirst(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/NetherbornPhalanx.java b/Mage.Sets/src/mage/sets/ravnica/NetherbornPhalanx.java new file mode 100644 index 00000000000..8cd4a85155f --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/NetherbornPhalanx.java @@ -0,0 +1,108 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.TransmuteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class NetherbornPhalanx extends CardImpl { + + public NetherbornPhalanx(UUID ownerId) { + super(ownerId, 99, "Netherborn Phalanx", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{B}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Horror"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // When Netherborn Phalanx enters the battlefield, each opponent loses 1 life for each creature he or she controls. + Ability ability = new EntersBattlefieldTriggeredAbility(new NetherbornPhalanxEffect()); + this.addAbility(ability); + + // Transmute {1}{B}{B} + this.addAbility(new TransmuteAbility("{1}{B}{B}")); + } + + public NetherbornPhalanx(final NetherbornPhalanx card) { + super(card); + } + + @Override + public NetherbornPhalanx copy() { + return new NetherbornPhalanx(this); + } +} + +class NetherbornPhalanxEffect extends OneShotEffect { + + NetherbornPhalanxEffect() { + super(Outcome.Sacrifice); + this.staticText = "Each opponent loses 1 life for each creature he or she controls"; + } + + NetherbornPhalanxEffect(final NetherbornPhalanxEffect effect) { + super(effect); + } + + @Override + public NetherbornPhalanxEffect copy() { + return new NetherbornPhalanxEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + for (UUID playerId : game.getOpponents(source.getControllerId())) { + final int count = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), playerId, game).size(); + if (count > 0) { + Player opponent = game.getPlayer(playerId); + if (opponent != null) { + opponent.loseLife(count, game); + return true; + } + } + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ravnica/StasisCell.java b/Mage.Sets/src/mage/sets/ravnica/StasisCell.java new file mode 100644 index 00000000000..42ca36d6bbb --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/StasisCell.java @@ -0,0 +1,81 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ + +public class StasisCell extends CardImpl { + + public StasisCell(UUID ownerId) { + super(ownerId, 66, "Stasis Cell", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // Enchanted creature doesn't untap during its controller's untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect())); + + // {3}{U}: Attach Stasis Cell to target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AttachEffect(Outcome.Detriment, "Attach {this} to target creature"), new ManaCostsImpl("{3}{U}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public StasisCell(final StasisCell card) { + super(card); + } + + @Override + public StasisCell copy() { + return new StasisCell(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/EvincarsJustice.java b/Mage.Sets/src/mage/sets/tempest/EvincarsJustice.java index 8cf233d45c4..15f9c4f91f7 100644 --- a/Mage.Sets/src/mage/sets/tempest/EvincarsJustice.java +++ b/Mage.Sets/src/mage/sets/tempest/EvincarsJustice.java @@ -46,8 +46,9 @@ public class EvincarsJustice extends CardImpl { // Buyback {3} this.addAbility(new BuybackAbility("{3}")); + // Evincar's Justice deals 2 damage to each creature and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(2)); + this.getSpellAbility().addEffect(new DamageEverythingEffect(2)); } public EvincarsJustice(final EvincarsJustice card) { diff --git a/Mage.Sets/src/mage/sets/tempest/Respite.java b/Mage.Sets/src/mage/sets/tempest/Respite.java new file mode 100644 index 00000000000..dd97200d06e --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/Respite.java @@ -0,0 +1,64 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.AttackingCreatureCount; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.PreventAllDamageByAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Respite extends CardImpl { + + public Respite(UUID ownerId) { + super(ownerId, 143, "Respite", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{G}"); + this.expansionSetCode = "TMP"; + + // Prevent all combat damage that would be dealt this turn. + this.getSpellAbility().addEffect(new PreventAllDamageByAllEffect(Duration.EndOfTurn, true)); + + // You gain 1 life for each attacking creature. + this.getSpellAbility().addEffect(new GainLifeEffect(new AttackingCreatureCount())); + } + + public Respite(final Respite card) { + super(card); + } + + @Override + public Respite copy() { + return new Respite(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tenthedition/StrongholdDiscipline.java b/Mage.Sets/src/mage/sets/tenthedition/StrongholdDiscipline.java new file mode 100644 index 00000000000..fc1ad76ba57 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tenthedition/StrongholdDiscipline.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.tenthedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class StrongholdDiscipline extends mage.sets.conspiracy.StrongholdDiscipline { + + public StrongholdDiscipline(UUID ownerId) { + super(ownerId); + this.cardNumber = 181; + this.expansionSetCode = "10E"; + this.rarity = Rarity.UNCOMMON; + } + + public StrongholdDiscipline(final StrongholdDiscipline card) { + super(card); + } + + @Override + public StrongholdDiscipline copy() { + return new StrongholdDiscipline(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/MagusOfTheMirror.java b/Mage.Sets/src/mage/sets/timespiral/MagusOfTheMirror.java new file mode 100644 index 00000000000..135184f14fb --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/MagusOfTheMirror.java @@ -0,0 +1,52 @@ +/* + * 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.timespiral; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class MagusOfTheMirror extends mage.sets.conspiracy.MagusOfTheMirror { + + public MagusOfTheMirror(UUID ownerId) { + super(ownerId); + this.cardNumber = 116; + this.expansionSetCode = "TSP"; + } + + public MagusOfTheMirror(final MagusOfTheMirror card) { + super(card); + } + + @Override + public MagusOfTheMirror copy() { + return new MagusOfTheMirror(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/SulfurousBlast.java b/Mage.Sets/src/mage/sets/timespiral/SulfurousBlast.java new file mode 100644 index 00000000000..e6e173673b4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/SulfurousBlast.java @@ -0,0 +1,64 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.abilities.condition.common.MyMainPhaseCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class SulfurousBlast extends CardImpl { + + public SulfurousBlast(UUID ownerId) { + super(ownerId, 180, "Sulfurous Blast", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{R}{R}"); + this.expansionSetCode = "TSP"; + + // Sulfurous Blast deals 2 damage to each creature and each player. If you cast this spell during your main phase, Sulfurous Blast deals 3 damage to each creature and each player instead. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new DamageEverythingEffect(3), + new DamageEverythingEffect(2), + MyMainPhaseCondition.getInstance(), + "Sulfurous Blast deals 2 damage to each creature and each player. If you cast this spell during your main phase, Sulfurous Blast deals 3 damage to each creature and each player instead")); + } + + public SulfurousBlast(final SulfurousBlast card) { + super(card); + } + + @Override + public SulfurousBlast copy() { + return new SulfurousBlast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/SteamBlast.java b/Mage.Sets/src/mage/sets/urzassaga/SteamBlast.java new file mode 100644 index 00000000000..8c57dec06da --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/SteamBlast.java @@ -0,0 +1,58 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class SteamBlast extends CardImpl { + + public SteamBlast(UUID ownerId) { + super(ownerId, 219, "Steam Blast", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{R}"); + this.expansionSetCode = "USG"; + + // Steam Blast deals 2 damage to each creature and each player. + this.getSpellAbility().addEffect(new DamageEverythingEffect(2)); + } + + public SteamBlast(final SteamBlast card) { + super(card); + } + + @Override + public SteamBlast copy() { + return new SteamBlast(this); + } +} From f89c0539fdf8a6bd80d4a5ef4d418916b93533aa Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 14 Jul 2015 23:44:45 -0500 Subject: [PATCH 043/375] Implemented Valor Made Real, Feast or Famine, Footbottom Feast, Unnerve, Pyrohemia, Wrap in Vigor, Monk Realist, Howling Wolf, Ghoul's Feast, Predator's Howl, Flamewright --- .../mage/sets/alliances/FeastOrFamine.java | 52 ++++++++ .../mage/sets/commander/FootbottomFeast.java | 65 ++++++++++ .../src/mage/sets/commander/MonkRealist.java | 52 ++++++++ .../src/mage/sets/commander/Pyrohemia.java | 52 ++++++++ .../src/mage/sets/commander/Unnerve.java | 52 ++++++++ .../src/mage/sets/conspiracy/Flamewright.java | 111 ++++++++++++++++++ .../src/mage/sets/conspiracy/HowlingWolf.java | 52 ++++++++ .../mage/sets/conspiracy/PredatorsHowl.java | 68 +++++++++++ .../mage/sets/conspiracy/ValorMadeReal.java | 66 +++++++++++ .../src/mage/sets/conspiracy/WrapInVigor.java | 59 ++++++++++ .../mage/sets/dissension/ValorMadeReal.java | 52 ++++++++ .../mage/sets/futuresight/WrapInVigor.java | 52 ++++++++ .../sets/izzetvsgolgari/FeastOrFamine.java | 80 +++++++++++++ .../mage/sets/izzetvsgolgari/GhoulsFeast.java | 66 +++++++++++ .../src/mage/sets/lorwyn/FootbottomFeast.java | 52 ++++++++ .../sets/mastersedition/FeastOrFamine.java | 52 ++++++++ .../sets/mercadianmasques/GhoulsFeast.java | 52 ++++++++ .../sets/mercadianmasques/HowlingWolf.java | 73 ++++++++++++ .../src/mage/sets/planarchaos/Pyrohemia.java | 73 ++++++++++++ .../src/mage/sets/urzassaga/Expunge.java | 9 +- .../src/mage/sets/urzassaga/MonkRealist.java | 79 +++++++++++++ .../src/mage/sets/urzassaga/Unnerve.java | 60 ++++++++++ 22 files changed, 1325 insertions(+), 4 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/alliances/FeastOrFamine.java create mode 100644 Mage.Sets/src/mage/sets/commander/FootbottomFeast.java create mode 100644 Mage.Sets/src/mage/sets/commander/MonkRealist.java create mode 100644 Mage.Sets/src/mage/sets/commander/Pyrohemia.java create mode 100644 Mage.Sets/src/mage/sets/commander/Unnerve.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/Flamewright.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/HowlingWolf.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/PredatorsHowl.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/ValorMadeReal.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/WrapInVigor.java create mode 100644 Mage.Sets/src/mage/sets/dissension/ValorMadeReal.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/WrapInVigor.java create mode 100644 Mage.Sets/src/mage/sets/izzetvsgolgari/FeastOrFamine.java create mode 100644 Mage.Sets/src/mage/sets/izzetvsgolgari/GhoulsFeast.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/FootbottomFeast.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/FeastOrFamine.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/GhoulsFeast.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/HowlingWolf.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/Pyrohemia.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/MonkRealist.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/Unnerve.java diff --git a/Mage.Sets/src/mage/sets/alliances/FeastOrFamine.java b/Mage.Sets/src/mage/sets/alliances/FeastOrFamine.java new file mode 100644 index 00000000000..338c1d5b0b4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/FeastOrFamine.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class FeastOrFamine extends mage.sets.izzetvsgolgari.FeastOrFamine { + + public FeastOrFamine(UUID ownerId) { + super(ownerId); + this.cardNumber = 8; + this.expansionSetCode = "ALL"; + } + + public FeastOrFamine(final FeastOrFamine card) { + super(card); + } + + @Override + public FeastOrFamine copy() { + return new FeastOrFamine(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/FootbottomFeast.java b/Mage.Sets/src/mage/sets/commander/FootbottomFeast.java new file mode 100644 index 00000000000..4e9e0d6db75 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/FootbottomFeast.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.commander; + +import java.util.UUID; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class FootbottomFeast extends CardImpl { + + public FootbottomFeast(UUID ownerId) { + super(ownerId, 84, "Footbottom Feast", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{B}"); + this.expansionSetCode = "CMD"; + + // Put any number of target creature cards from your graveyard on top of your library. + this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard"))); + + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public FootbottomFeast(final FootbottomFeast card) { + super(card); + } + + @Override + public FootbottomFeast copy() { + return new FootbottomFeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/MonkRealist.java b/Mage.Sets/src/mage/sets/commander/MonkRealist.java new file mode 100644 index 00000000000..25d5c90680f --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/MonkRealist.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class MonkRealist extends mage.sets.urzassaga.MonkRealist { + + public MonkRealist(UUID ownerId) { + super(ownerId); + this.cardNumber = 20; + this.expansionSetCode = "CMD"; + } + + public MonkRealist(final MonkRealist card) { + super(card); + } + + @Override + public MonkRealist copy() { + return new MonkRealist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/Pyrohemia.java b/Mage.Sets/src/mage/sets/commander/Pyrohemia.java new file mode 100644 index 00000000000..7512a9fe6f0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/Pyrohemia.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Pyrohemia extends mage.sets.planarchaos.Pyrohemia { + + public Pyrohemia(UUID ownerId) { + super(ownerId); + this.cardNumber = 132; + this.expansionSetCode = "CMD"; + } + + public Pyrohemia(final Pyrohemia card) { + super(card); + } + + @Override + public Pyrohemia copy() { + return new Pyrohemia(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/Unnerve.java b/Mage.Sets/src/mage/sets/commander/Unnerve.java new file mode 100644 index 00000000000..f06939f9d4d --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/Unnerve.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Unnerve extends mage.sets.urzassaga.Unnerve { + + public Unnerve(UUID ownerId) { + super(ownerId); + this.cardNumber = 105; + this.expansionSetCode = "CMD"; + } + + public Unnerve(final Unnerve card) { + super(card); + } + + @Override + public Unnerve copy() { + return new Unnerve(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/Flamewright.java b/Mage.Sets/src/mage/sets/conspiracy/Flamewright.java new file mode 100644 index 00000000000..493ff58eafa --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/Flamewright.java @@ -0,0 +1,111 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.permanent.token.Token; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class Flamewright extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("creature with defender"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + filter.add(new AbilityPredicate(DefenderAbility.class)); + } + + public Flamewright(UUID ownerId) { + super(ownerId, 46, "Flamewright", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}{W}"); + this.expansionSetCode = "CNS"; + this.subtype.add("Human"); + this.subtype.add("Artificer"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}, {tap}: Put a 1/1 colorless Construct artifact creature token with defender onto the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new ConstructToken()), new ManaCostsImpl("{1}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // {tap}, Sacrifice a creature with defender: Flamewright deals 1 damage to target creature or player. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public Flamewright(final Flamewright card) { + super(card); + } + + @Override + public Flamewright copy() { + return new Flamewright(this); + } +} + +class ConstructToken extends Token { + + public ConstructToken() { + this("CNS"); + } + + public ConstructToken(String setCode) { + super("Construct", "1/1 colorless Construct artifact creature token with defender"); + this.setOriginalExpansionSetCode(setCode); + cardType.add(CardType.ARTIFACT); + cardType.add(CardType.CREATURE); + subtype.add("Construct"); + power = new MageInt(1); + toughness = new MageInt(1); + + addAbility(DefenderAbility.getInstance()); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/conspiracy/HowlingWolf.java b/Mage.Sets/src/mage/sets/conspiracy/HowlingWolf.java new file mode 100644 index 00000000000..dac9d6b1f4c --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/HowlingWolf.java @@ -0,0 +1,52 @@ +/* + * 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.conspiracy; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class HowlingWolf extends mage.sets.mercadianmasques.HowlingWolf { + + public HowlingWolf(UUID ownerId) { + super(ownerId); + this.cardNumber = 167; + this.expansionSetCode = "CNS"; + } + + public HowlingWolf(final HowlingWolf card) { + super(card); + } + + @Override + public HowlingWolf copy() { + return new HowlingWolf(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/PredatorsHowl.java b/Mage.Sets/src/mage/sets/conspiracy/PredatorsHowl.java new file mode 100644 index 00000000000..294ccde6cd9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/PredatorsHowl.java @@ -0,0 +1,68 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.abilities.condition.common.MorbidCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.game.permanent.token.WolfToken; + +/** + * + * @author fireshoes + */ +public class PredatorsHowl extends CardImpl { + + public PredatorsHowl(UUID ownerId) { + super(ownerId, 37, "Predator's Howl", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{G}"); + this.expansionSetCode = "CNS"; + + // Put a 2/2 green Wolf creature token onto the battlefield. + // Morbid - Put three 2/2 green Wolf creature tokens onto the battlefield instead if a creature died this turn. + Effect effect = new ConditionalOneShotEffect( + new CreateTokenEffect(new WolfToken(), 3), + new CreateTokenEffect(new WolfToken(), 1), + new MorbidCondition(), + "Put a 2/2 green Wolf creature token onto the battlefield.

Morbid - Put three 2/2 green Wolf creature tokens onto the battlefield instead if a creature died this turn."); + this.getSpellAbility().addEffect(effect); + } + + public PredatorsHowl(final PredatorsHowl card) { + super(card); + } + + @Override + public PredatorsHowl copy() { + return new PredatorsHowl(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/ValorMadeReal.java b/Mage.Sets/src/mage/sets/conspiracy/ValorMadeReal.java new file mode 100644 index 00000000000..4a957e9ea8a --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/ValorMadeReal.java @@ -0,0 +1,66 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class ValorMadeReal extends CardImpl { + + public ValorMadeReal(UUID ownerId) { + super(ownerId, 86, "Valor Made Real", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}"); + this.expansionSetCode = "CNS"; + + // Target creature can block any number of creatures this turn. + Ability gainedAbility = new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(0)); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(gainedAbility, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public ValorMadeReal(final ValorMadeReal card) { + super(card); + } + + @Override + public ValorMadeReal copy() { + return new ValorMadeReal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/WrapInVigor.java b/Mage.Sets/src/mage/sets/conspiracy/WrapInVigor.java new file mode 100644 index 00000000000..01c709cb5ae --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/WrapInVigor.java @@ -0,0 +1,59 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.abilities.effects.common.RegenerateAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class WrapInVigor extends CardImpl { + + public WrapInVigor(UUID ownerId) { + super(ownerId, 183, "Wrap in Vigor", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{G}"); + this.expansionSetCode = "CNS"; + + // Regenerate each creature you control. + this.getSpellAbility().addEffect(new RegenerateAllEffect(new FilterControlledCreaturePermanent())); + } + + public WrapInVigor(final WrapInVigor card) { + super(card); + } + + @Override + public WrapInVigor copy() { + return new WrapInVigor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/dissension/ValorMadeReal.java b/Mage.Sets/src/mage/sets/dissension/ValorMadeReal.java new file mode 100644 index 00000000000..18b8e5b6024 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dissension/ValorMadeReal.java @@ -0,0 +1,52 @@ +/* + * 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.dissension; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class ValorMadeReal extends mage.sets.conspiracy.ValorMadeReal { + + public ValorMadeReal(UUID ownerId) { + super(ownerId); + this.cardNumber = 20; + this.expansionSetCode = "DIS"; + } + + public ValorMadeReal(final ValorMadeReal card) { + super(card); + } + + @Override + public ValorMadeReal copy() { + return new ValorMadeReal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/WrapInVigor.java b/Mage.Sets/src/mage/sets/futuresight/WrapInVigor.java new file mode 100644 index 00000000000..73e50b46d3f --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/WrapInVigor.java @@ -0,0 +1,52 @@ +/* + * 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.futuresight; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class WrapInVigor extends mage.sets.conspiracy.WrapInVigor { + + public WrapInVigor(UUID ownerId) { + super(ownerId); + this.cardNumber = 141; + this.expansionSetCode = "FUT"; + } + + public WrapInVigor(final WrapInVigor card) { + super(card); + } + + @Override + public WrapInVigor copy() { + return new WrapInVigor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/izzetvsgolgari/FeastOrFamine.java b/Mage.Sets/src/mage/sets/izzetvsgolgari/FeastOrFamine.java new file mode 100644 index 00000000000..b94cd837924 --- /dev/null +++ b/Mage.Sets/src/mage/sets/izzetvsgolgari/FeastOrFamine.java @@ -0,0 +1,80 @@ +/* + * 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.izzetvsgolgari; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Mode; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.permanent.token.ZombieToken; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class FeastOrFamine extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonartifact, nonblack creature"); + + static { + filter.add(Predicates.not(new CardTypePredicate(CardType.ARTIFACT))); + filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK))); + } + + public FeastOrFamine(UUID ownerId) { + super(ownerId, 72, "Feast or Famine", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{B}"); + this.expansionSetCode = "DDJ"; + + // Choose one - Put a 2/2 black Zombie creature token onto the battlefield; + this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken())); + + // or destroy target nonartifact, nonblack creature and it can't be regenerated. + Mode mode = new Mode(); + mode.getEffects().add(new DestroyTargetEffect(true)); + mode.getTargets().add(new TargetCreaturePermanent(filter)); + this.getSpellAbility().addMode(mode); + } + + public FeastOrFamine(final FeastOrFamine card) { + super(card); + } + + @Override + public FeastOrFamine copy() { + return new FeastOrFamine(this); + } +} diff --git a/Mage.Sets/src/mage/sets/izzetvsgolgari/GhoulsFeast.java b/Mage.Sets/src/mage/sets/izzetvsgolgari/GhoulsFeast.java new file mode 100644 index 00000000000..97f1d248683 --- /dev/null +++ b/Mage.Sets/src/mage/sets/izzetvsgolgari/GhoulsFeast.java @@ -0,0 +1,66 @@ +/* + * 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.izzetvsgolgari; + +import java.util.UUID; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class GhoulsFeast extends CardImpl { + + public GhoulsFeast(UUID ownerId) { + super(ownerId, 67, "Ghoul's Feast", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "DDJ"; + + // Target creature gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard. + DynamicValue xValue = new CardsInControllerGraveyardCount(new FilterCreatureCard("creature card")); + this.getSpellAbility().addEffect(new BoostTargetEffect(xValue, new StaticValue(0), Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public GhoulsFeast(final GhoulsFeast card) { + super(card); + } + + @Override + public GhoulsFeast copy() { + return new GhoulsFeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/FootbottomFeast.java b/Mage.Sets/src/mage/sets/lorwyn/FootbottomFeast.java new file mode 100644 index 00000000000..f411ff2a2fb --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/FootbottomFeast.java @@ -0,0 +1,52 @@ +/* + * 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.lorwyn; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class FootbottomFeast extends mage.sets.commander.FootbottomFeast { + + public FootbottomFeast(UUID ownerId) { + super(ownerId); + this.cardNumber = 115; + this.expansionSetCode = "LRW"; + } + + public FootbottomFeast(final FootbottomFeast card) { + super(card); + } + + @Override + public FootbottomFeast copy() { + return new FootbottomFeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/FeastOrFamine.java b/Mage.Sets/src/mage/sets/mastersedition/FeastOrFamine.java new file mode 100644 index 00000000000..3111226a3e8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/FeastOrFamine.java @@ -0,0 +1,52 @@ +/* + * 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.mastersedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class FeastOrFamine extends mage.sets.izzetvsgolgari.FeastOrFamine { + + public FeastOrFamine(UUID ownerId) { + super(ownerId); + this.cardNumber = 70; + this.expansionSetCode = "MED"; + } + + public FeastOrFamine(final FeastOrFamine card) { + super(card); + } + + @Override + public FeastOrFamine copy() { + return new FeastOrFamine(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/GhoulsFeast.java b/Mage.Sets/src/mage/sets/mercadianmasques/GhoulsFeast.java new file mode 100644 index 00000000000..1e1bd80f0dd --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/GhoulsFeast.java @@ -0,0 +1,52 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class GhoulsFeast extends mage.sets.izzetvsgolgari.GhoulsFeast { + + public GhoulsFeast(UUID ownerId) { + super(ownerId); + this.cardNumber = 137; + this.expansionSetCode = "MMQ"; + } + + public GhoulsFeast(final GhoulsFeast card) { + super(card); + } + + @Override + public GhoulsFeast copy() { + return new GhoulsFeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/HowlingWolf.java b/Mage.Sets/src/mage/sets/mercadianmasques/HowlingWolf.java new file mode 100644 index 00000000000..ff491524b39 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/HowlingWolf.java @@ -0,0 +1,73 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author fireshoes + */ +public class HowlingWolf extends CardImpl { + + private static final FilterCard filter = new FilterCard("cards named Howling Wolf"); + + static { + filter.add(new NamePredicate("Howling Wolf")); + } + + public HowlingWolf(UUID ownerId) { + super(ownerId, 252, "Howling Wolf", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Wolf"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Howling Wolf enters the battlefield, you may search your library for up to three cards named Howling Wolf, reveal them, and put them into your hand. If you do, shuffle your library. + TargetCardInLibrary target = new TargetCardInLibrary(0, 3, filter); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(target, true, true), true)); + } + + public HowlingWolf(final HowlingWolf card) { + super(card); + } + + @Override + public HowlingWolf copy() { + return new HowlingWolf(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/Pyrohemia.java b/Mage.Sets/src/mage/sets/planarchaos/Pyrohemia.java new file mode 100644 index 00000000000..1c79bd7b92d --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/Pyrohemia.java @@ -0,0 +1,73 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.OnEventTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.NoCreatureCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class Pyrohemia extends CardImpl { + + private static final String ruleText = "At the beginning of the end step, if no creatures are on the battlefield, sacrifice Pyrohemia."; + + public Pyrohemia(UUID ownerId) { + super(ownerId, 119, "Pyrohemia", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}"); + this.expansionSetCode = "PLC"; + + // At the beginning of the end step, if no creatures are on the battlefield, sacrifice Pyrohemia. + TriggeredAbility triggered = new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new SacrificeSourceEffect()); + this.addAbility(new ConditionalTriggeredAbility(triggered, new NoCreatureCondition(), ruleText)); + + // {R}: Pyrohemia deals 1 damage to each creature and each player. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageEverythingEffect(1), new ManaCostsImpl("{R}"))); + } + + public Pyrohemia(final Pyrohemia card) { + super(card); + } + + @Override + public Pyrohemia copy() { + return new Pyrohemia(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/Expunge.java b/Mage.Sets/src/mage/sets/urzassaga/Expunge.java index 52b7b53a83d..c0083185cbf 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Expunge.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Expunge.java @@ -28,13 +28,13 @@ package mage.sets.urzassaga; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.ObjectColor; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.CyclingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -62,8 +62,9 @@ public class Expunge extends CardImpl { // Destroy target nonartifact, nonblack creature. It can't be regenerated. this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); - // Cycling {2} ({2}, Discard this card: Draw a card.) - this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + + // Cycling {2} ({2}, Discard this card: Draw a card.) + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); } diff --git a/Mage.Sets/src/mage/sets/urzassaga/MonkRealist.java b/Mage.Sets/src/mage/sets/urzassaga/MonkRealist.java new file mode 100644 index 00000000000..2014b074bc1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/MonkRealist.java @@ -0,0 +1,79 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.Target; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class MonkRealist extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("enchantment"); + + static { + filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); + } + + public MonkRealist(UUID ownerId) { + super(ownerId, 21, "Monk Realist", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "USG"; + this.subtype.add("Human"); + this.subtype.add("Monk"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Monk Realist enters the battlefield, destroy target enchantment. + Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), false); + Target target = new TargetPermanent(filter); + ability.addTarget(target); + this.addAbility(ability); + } + + public MonkRealist(final MonkRealist card) { + super(card); + } + + @Override + public MonkRealist copy() { + return new MonkRealist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/Unnerve.java b/Mage.Sets/src/mage/sets/urzassaga/Unnerve.java new file mode 100644 index 00000000000..a6251fa60b6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/Unnerve.java @@ -0,0 +1,60 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author fireshoes + */ +public class Unnerve extends CardImpl { + + public Unnerve(UUID ownerId) { + super(ownerId, 162, "Unnerve", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{3}{B}"); + this.expansionSetCode = "USG"; + + // Each opponent discards two cards. + this.getSpellAbility().addEffect(new DiscardEachPlayerEffect(new StaticValue(2), false, TargetController.OPPONENT)); + } + + public Unnerve(final Unnerve card) { + super(card); + } + + @Override + public Unnerve copy() { + return new Unnerve(this); + } +} From 74397dbaed5ad97d174b92c64cecd675b67d75b7 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 15 Jul 2015 08:04:36 +0300 Subject: [PATCH 044/375] Fix PermanentsTargetOpponentControlsCount --- .../common/PermanentsTargetOpponentControlsCount.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java index f1f7ef9b874..20ac6b22b9a 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java @@ -26,7 +26,7 @@ public class PermanentsTargetOpponentControlsCount implements DynamicValue { } public PermanentsTargetOpponentControlsCount(FilterPermanent filter, Integer multiplier) { - this.filter = filter; + this.filter = filter.copy(); this.multiplier = multiplier; } From 650ba2cba7f4e6a77be48ad7eb3db541ef09af90 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 15 Jul 2015 08:04:58 +0300 Subject: [PATCH 045/375] Implement cards: Aurora Griffin, Escape Routes, Honorable Scout, and Phyrexian Bloodstock --- .../mage/sets/planeshift/AuroraGriffin.java | 75 +++++++++++++++++ .../mage/sets/planeshift/EscapeRoutes.java | 78 ++++++++++++++++++ .../mage/sets/planeshift/HonorableScout.java | 80 +++++++++++++++++++ .../sets/planeshift/PhyrexianBloodstock.java | 76 ++++++++++++++++++ 4 files changed, 309 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/planeshift/AuroraGriffin.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/EscapeRoutes.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/HonorableScout.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/PhyrexianBloodstock.java diff --git a/Mage.Sets/src/mage/sets/planeshift/AuroraGriffin.java b/Mage.Sets/src/mage/sets/planeshift/AuroraGriffin.java new file mode 100644 index 00000000000..251546109d7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/AuroraGriffin.java @@ -0,0 +1,75 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesColorTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; + +/** + * + * @author LoneFox + */ +public class AuroraGriffin extends CardImpl { + + public AuroraGriffin(UUID ownerId) { + super(ownerId, 2, "Aurora Griffin", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Griffin"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // {W}: Target permanent becomes white until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorTargetEffect(ObjectColor.WHITE, + Duration.EndOfTurn), new ManaCostsImpl("{W}")); + ability.addTarget(new TargetPermanent()); + this.addAbility(ability); + } + + public AuroraGriffin(final AuroraGriffin card) { + super(card); + } + + @Override + public AuroraGriffin copy() { + return new AuroraGriffin(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/EscapeRoutes.java b/Mage.Sets/src/mage/sets/planeshift/EscapeRoutes.java new file mode 100644 index 00000000000..e39db8fd8e7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/EscapeRoutes.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.planeshift; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class EscapeRoutes extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("white or black creature you control"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.WHITE), new ColorPredicate(ObjectColor.BLACK))); + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public EscapeRoutes(UUID ownerId) { + super(ownerId, 25, "Escape Routes", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + this.expansionSetCode = "PLS"; + + // {2}{U}: Return target white or black creature you control to its owner's hand. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl("{2}{U}")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public EscapeRoutes(final EscapeRoutes card) { + super(card); + } + + @Override + public EscapeRoutes copy() { + return new EscapeRoutes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/HonorableScout.java b/Mage.Sets/src/mage/sets/planeshift/HonorableScout.java new file mode 100644 index 00000000000..97d924c4c29 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/HonorableScout.java @@ -0,0 +1,80 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.PermanentsTargetOpponentControlsCount; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetOpponent; + +/** + * + * @author LoneFox + */ +public class HonorableScout extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("black and/or red creature"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLACK), new ColorPredicate(ObjectColor.RED))); + } + + public HonorableScout(UUID ownerId) { + super(ownerId, 8, "Honorable Scout", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.subtype.add("Scout"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Honorable Scout enters the battlefield, you gain 2 life for each black and/or red creature target opponent controls. + Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(new PermanentsTargetOpponentControlsCount(filter, 2))); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public HonorableScout(final HonorableScout card) { + super(card); + } + + @Override + public HonorableScout copy() { + return new HonorableScout(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/PhyrexianBloodstock.java b/Mage.Sets/src/mage/sets/planeshift/PhyrexianBloodstock.java new file mode 100644 index 00000000000..71027519ae0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/PhyrexianBloodstock.java @@ -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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class PhyrexianBloodstock extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("white creature"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public PhyrexianBloodstock(UUID ownerId) { + super(ownerId, 50, "Phyrexian Bloodstock", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{B}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Zombie"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When Phyrexian Bloodstock leaves the battlefield, destroy target white creature. It can't be regenerated. + Ability ability = new LeavesBattlefieldTriggeredAbility(new DestroyTargetEffect(true), false); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public PhyrexianBloodstock(final PhyrexianBloodstock card) { + super(card); + } + + @Override + public PhyrexianBloodstock copy() { + return new PhyrexianBloodstock(this); + } +} From c7a349f65f96052897702bf308cc46dc6c45a426 Mon Sep 17 00:00:00 2001 From: brodee Date: Tue, 14 Jul 2015 22:34:58 -0700 Subject: [PATCH 046/375] random draft bug fix: packs are forced to be 15 cards; weirdness occurs if the packs are uneven sizes including the draft ending early. Random draft ui improvements: only the sets that will be used are displayed in the lobby, and the number of characters is large but still greatly reduced. the pack selector ui will prevent you from chosing fewer than 2 packs. --- .../client/dialog/NewTournamentDialog.form | 8 ++--- .../client/dialog/NewTournamentDialog.java | 33 ++++++++++++++----- .../dialog/RandomPacksSelectorDialog.form | 4 +++ .../dialog/RandomPacksSelectorDialog.java | 21 ++++++++++-- .../server/tournament/TournamentFactory.java | 7 ++++ Mage/src/mage/cards/ExpansionSet.java | 20 +++++++++++ .../mage/game/draft/RandomBoosterDraft.java | 19 +---------- 7 files changed, 77 insertions(+), 35 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form index beb4c5799db..92ca80af088 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form @@ -169,7 +169,7 @@ - + @@ -521,10 +521,8 @@ - - - - + + diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java index 59eacfaa88b..101b3f708d0 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -34,8 +34,10 @@ package mage.client.dialog; +import java.awt.Component; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.UUID; import javax.swing.ComboBoxModel; @@ -122,8 +124,8 @@ public class NewTournamentDialog extends MageDialog { cbAllowSpectators.setSelected(true); setTournamentSettingsFromPrefs(); this.setModal(true); - this.setLocation(150, 100); - } + this.setLocation(150, 100); + } this.setVisible(true); } @@ -341,7 +343,7 @@ public class NewTournamentDialog extends MageDialog { pnlRandomPacks.setBorder(javax.swing.BorderFactory.createEtchedBorder()); pnlRandomPacks.setToolTipText(""); - pnlRandomPacks.setLayout(new java.awt.GridLayout(0, 1, 2, 0)); + pnlRandomPacks.setLayout(new javax.swing.BoxLayout(pnlRandomPacks, javax.swing.BoxLayout.Y_AXIS)); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); @@ -468,7 +470,7 @@ public class NewTournamentDialog extends MageDialog { .addGroup(layout.createSequentialGroup() .addComponent(pnlPacks, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pnlRandomPacks, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(pnlRandomPacks, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -477,7 +479,7 @@ public class NewTournamentDialog extends MageDialog { .addComponent(lblNumRounds)) .addComponent(lblNbrPlayers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spnNumPlayers) - .addComponent(pnlDraftOptions, javax.swing.GroupLayout.DEFAULT_SIZE, 0, Short.MAX_VALUE)) + .addComponent(pnlDraftOptions, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblPlayer1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -533,7 +535,18 @@ public class NewTournamentDialog extends MageDialog { tOptions.getLimitedOptions().setDraftCubeName(this.cbDraftCube.getSelectedItem().toString()); } else if (tournamentType.isRandom()) { tOptions.getLimitedOptions().getSetCodes().clear(); - tOptions.getLimitedOptions().getSetCodes().addAll(randomPackSelector.getSelectedPacks()); + ArrayList selected = randomPackSelector.getSelectedPacks(); + int maxPacks = 3 * (players.size() + 1); + if (selected.size() > maxPacks ){ + StringBuilder infoString = new StringBuilder("More sets were selected than needed. "); + infoString.append(maxPacks); + infoString.append(" sets will be randomly chosen."); + JOptionPane.showMessageDialog(MageFrame.getDesktop(), infoString, "Information", JOptionPane.INFORMATION_MESSAGE); + Collections.shuffle(selected); + tOptions.getLimitedOptions().getSetCodes().addAll(selected.subList(0, maxPacks)); + }else{ + tOptions.getLimitedOptions().getSetCodes().addAll(selected); + } } else { for (JComboBox pack: packs) { tOptions.getLimitedOptions().getSetCodes().add(((ExpansionInfo) pack.getSelectedItem()).getCode()); @@ -717,6 +730,7 @@ public class NewTournamentDialog extends MageDialog { if (pnlRandomPacks.getComponentCount() == 0) { if (randomPackSelector == null) { randomPackSelector = new RandomPacksSelectorDialog(); + randomPackSelector.setLocationRelativeTo(this); } txtRandomPacks = new JTextArea(); txtRandomPacks.setEnabled(false); @@ -736,9 +750,10 @@ public class NewTournamentDialog extends MageDialog { } txtRandomPacks.setText(packList.toString()); } - + txtRandomPacks.setAlignmentX(Component.LEFT_ALIGNMENT); pnlRandomPacks.add(txtRandomPacks); JButton btnSelectRandomPacks = new JButton(); + btnSelectRandomPacks.setAlignmentX(Component.LEFT_ALIGNMENT); btnSelectRandomPacks.setText("Select packs to be included in the pool"); btnSelectRandomPacks.setToolTipText(RandomPacksSelectorDialog.randomDraftDescription); btnSelectRandomPacks.addActionListener(new java.awt.event.ActionListener() { @@ -749,11 +764,11 @@ public class NewTournamentDialog extends MageDialog { } }); pnlRandomPacks.add(btnSelectRandomPacks); - } + } this.pack(); this.revalidate(); this.repaint(); - } + } private void showRandomPackSelectorDialog() { randomPackSelector.showDialog(); diff --git a/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.form b/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.form index d486cab0471..7644055a2ac 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.form @@ -2,6 +2,7 @@
+ @@ -16,6 +17,9 @@ + + + diff --git a/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.java b/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.java index 5b9b3cc0d09..083f9a42dd0 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/RandomPacksSelectorDialog.java @@ -8,6 +8,7 @@ package mage.client.dialog; import java.awt.Component; import java.util.ArrayList; import javax.swing.JCheckBox; +import javax.swing.JOptionPane; import mage.cards.repository.ExpansionInfo; import mage.cards.repository.ExpansionRepository; @@ -101,11 +102,17 @@ public class RandomPacksSelectorDialog extends javax.swing.JDialog { pnlApply = new javax.swing.JPanel(); btnApply = new javax.swing.JButton(); + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); setTitle("Random Booster Draft Packs Selector"); setModal(true); setModalExclusionType(java.awt.Dialog.ModalExclusionType.APPLICATION_EXCLUDE); setPreferredSize(new java.awt.Dimension(600, 450)); setResizable(false); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); pnlPacks.setLayout(new java.awt.GridLayout(11, 12)); @@ -174,13 +181,21 @@ public class RandomPacksSelectorDialog extends javax.swing.JDialog { }//GEN-LAST:event_btnNoneActionPerformed private void btnApplyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnApplyActionPerformed + this.doApply(); + }//GEN-LAST:event_btnApplyActionPerformed + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + this.doApply(); + }//GEN-LAST:event_formWindowClosing + + public void doApply() { if (getSelectedPacks().size() < 2) { - // at least 2 packs must be selected. + JOptionPane.showMessageDialog(this, "At least 2 sets must be selected", "Error", JOptionPane.ERROR_MESSAGE); } else { this.setVisible(false); } - }//GEN-LAST:event_btnApplyActionPerformed - + } + private void setAllCheckBoxes(boolean value) { for (Component pack : pnlPacks.getComponents()) { JCheckBox thePack = (JCheckBox) pack; diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java index 114331fb785..9575acc3bb8 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentFactory.java @@ -80,6 +80,13 @@ public class TournamentFactory { if (tournament.getTournamentType().isCubeBooster()) { tournament.getOptions().getLimitedOptions().setDraftCube(CubeFactory.getInstance().createDraftCube(tournament.getOptions().getLimitedOptions().getDraftCubeName())); tournament.setBoosterInfo(tournament.getOptions().getLimitedOptions().getDraftCubeName()); + } else if (tournament.getTournamentType().isRandom()) { + StringBuilder rv = new StringBuilder( "Random Draft using sets: "); + for (Map.Entry entry: setInfo.entrySet()){ + rv.append(entry.getKey()); + rv.append(";"); + } + tournament.setBoosterInfo(rv.toString()); } else { StringBuilder sb = new StringBuilder(); for (Map.Entry entry:setInfo.entrySet()) { diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index 5a808a456c5..17aee8cbb9b 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -112,6 +112,26 @@ public abstract class ExpansionSet implements Serializable { return name; } + public List create15CardBooster() { + // Forces 15 card booster packs. + // if the packs are too small, it adds commons to fill it out. + // if the packs are too big, it removes the first cards. + // since it adds lands then commons before uncommons + // and rares this should be the least disruptive. + + List theBooster = this.createBooster(); + List commons = getCardsByRarity(Rarity.COMMON); + while (15 > theBooster.size()) { + addToBooster(theBooster, commons); + } + + while (theBooster.size() > 15) { + theBooster.remove(0); + } + + return theBooster; + } + public List createBooster() { List booster = new ArrayList<>(); if (!hasBoosters) { diff --git a/Mage/src/mage/game/draft/RandomBoosterDraft.java b/Mage/src/mage/game/draft/RandomBoosterDraft.java index ebd0a8a9ef3..cc7604b4478 100644 --- a/Mage/src/mage/game/draft/RandomBoosterDraft.java +++ b/Mage/src/mage/game/draft/RandomBoosterDraft.java @@ -50,28 +50,11 @@ public class RandomBoosterDraft extends BoosterDraft { resetBoosters(); } - @Override - public void start() { - while (!isAbort() && boosterNum < numberBoosters) { - openBooster(); - while (!isAbort() && pickCards()) { - if (boosterNum % 2 == 1) { - passLeft(); - } else { - passRight(); - } - fireUpdatePlayersEvent(); - } - } - resetBufferedCards(); - this.fireEndDraftEvent(); - } - @Override protected void openBooster() { if (boosterNum < numberBoosters) { for (DraftPlayer player: players.values()) { - player.setBooster(getNextBooster().createBooster()); + player.setBooster(getNextBooster().create15CardBooster()); } } boosterNum++; From 4eb52fdc917d90b669281746efaca06bc847b5c7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 15 Jul 2015 08:27:44 +0200 Subject: [PATCH 047/375] Xmage 1.4.2v3 --- Mage.Common/src/mage/utils/MageVersion.java | 2 +- Mage/src/mage/cards/repository/CardRepository.java | 2 +- Utils/release/getting_implemented_cards.txt | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java index bab39e24858..4800c7c1d4d 100644 --- a/Mage.Common/src/mage/utils/MageVersion.java +++ b/Mage.Common/src/mage/utils/MageVersion.java @@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable { public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; public final static int MAGE_VERSION_PATCH = 2; - public final static String MAGE_VERSION_MINOR_PATCH = "v2"; + public final static String MAGE_VERSION_MINOR_PATCH = "v3"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 3fa5172d4f5..7c073ea5aab 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -60,7 +60,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 41; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 26; + private static final long CARD_CONTENT_VERSION = 29; private final Random random = new Random(); private Dao cardDao; diff --git a/Utils/release/getting_implemented_cards.txt b/Utils/release/getting_implemented_cards.txt index 86a8ba4c884..c23eb917f1e 100644 --- a/Utils/release/getting_implemented_cards.txt +++ b/Utils/release/getting_implemented_cards.txt @@ -149,9 +149,11 @@ git log cd0cba6ec7d8799bb85247b7b4f5d545e170b093..HEAD --diff-filter=A --name-st since 1.4.2.v1 git log 0b26aaff6ec033a538179bf607b1c7a7736aedb2..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt -since 1.4.2.v1 +since 1.4.2.v2 git log 8d5137e40ebe1c029e737ef475935ff7cc40bb64..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt +since 1.4.2.v3 +git log 60c7a2b34b5dd9a64bd415b65424a559294cf52b..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt 3. Copy added_cards.txt to trunk\Utils folder 4. Run script: From a53f9a3735a32dec7e547c5d0f6362f2fecaf7c8 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 15 Jul 2015 11:02:55 +0300 Subject: [PATCH 048/375] Implement cards: Exotic Disease, Mire Kavu, Pygmy Kavu, and Quirion Explorer --- .../mage/sets/planeshift/ExoticDisease.java | 69 +++++++++++++++++ .../src/mage/sets/planeshift/MireKavu.java | 72 ++++++++++++++++++ .../src/mage/sets/planeshift/PygmyKavu.java | 76 +++++++++++++++++++ .../mage/sets/planeshift/QuirionExplorer.java | 64 ++++++++++++++++ 4 files changed, 281 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/planeshift/ExoticDisease.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/MireKavu.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/PygmyKavu.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/QuirionExplorer.java diff --git a/Mage.Sets/src/mage/sets/planeshift/ExoticDisease.java b/Mage.Sets/src/mage/sets/planeshift/ExoticDisease.java new file mode 100644 index 00000000000..3b453b32b4d --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/ExoticDisease.java @@ -0,0 +1,69 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.DomainValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetPlayer; + +/** + * + * @author LoneFox + */ +public class ExoticDisease extends CardImpl { + + public ExoticDisease(UUID ownerId) { + super(ownerId, 43, "Exotic Disease", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{4}{B}"); + this.expansionSetCode = "PLS"; + + // Domain - Target player loses X life and you gain X life, where X is the number of basic land types among lands you control. + DomainValue dv = new DomainValue(); + Effect effect = new LoseLifeTargetEffect(dv); + effect.setText("Domain - Target player loses X life"); + this.getSpellAbility().addEffect(effect); + effect = new GainLifeEffect(dv); + effect.setText("and you gain X life, where X is the number of basic land types among lands you control"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public ExoticDisease(final ExoticDisease card) { + super(card); + } + + @Override + public ExoticDisease copy() { + return new ExoticDisease(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/MireKavu.java b/Mage.Sets/src/mage/sets/planeshift/MireKavu.java new file mode 100644 index 00000000000..4833b72e1f8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/MireKavu.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostSourceWhileControlsEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author LoneFox + */ +public class MireKavu extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Swamp"); + + static { + filter.add(new SubtypePredicate("Swamp")); + } + + public MireKavu(UUID ownerId) { + super(ownerId, 67, "Mire Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Kavu"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Mire Kavu gets +1/+1 as long as you control a Swamp. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceWhileControlsEffect(filter, 1, 1))); + } + + public MireKavu(final MireKavu card) { + super(card); + } + + @Override + public MireKavu copy() { + return new MireKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/PygmyKavu.java b/Mage.Sets/src/mage/sets/planeshift/PygmyKavu.java new file mode 100644 index 00000000000..4cba0900000 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/PygmyKavu.java @@ -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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LoneFox + */ +public class PygmyKavu extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("black creature your opponents control"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLACK)); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public PygmyKavu(UUID ownerId) { + super(ownerId, 88, "Pygmy Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Kavu"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // When Pygmy Kavu enters the battlefield, draw a card for each black creature your opponents control. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(new PermanentsOnBattlefieldCount(filter)))); + } + + public PygmyKavu(final PygmyKavu card) { + super(card); + } + + @Override + public PygmyKavu copy() { + return new PygmyKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/QuirionExplorer.java b/Mage.Sets/src/mage/sets/planeshift/QuirionExplorer.java new file mode 100644 index 00000000000..bccab7725ad --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/QuirionExplorer.java @@ -0,0 +1,64 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.mana.AnyColorOpponentLandsProduceManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class QuirionExplorer extends CardImpl { + + public QuirionExplorer(UUID ownerId) { + super(ownerId, 90, "Quirion Explorer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Elf"); + this.subtype.add("Druid"); + this.subtype.add("Scout"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. + this.addAbility(new AnyColorOpponentLandsProduceManaAbility()); + } + + public QuirionExplorer(final QuirionExplorer card) { + super(card); + } + + @Override + public QuirionExplorer copy() { + return new QuirionExplorer(this); + } +} From 3bac7b550c62fd91a5d97804550cbc78402935fc Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 15 Jul 2015 16:54:31 +0200 Subject: [PATCH 049/375] Added a test for storm with flashback. --- .../cards/abilities/keywords/StormTest.java | 90 +++++++++++++------ 1 file changed, 61 insertions(+), 29 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java index 6caa1dcf763..de7dbf4862a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package org.mage.test.cards.abilities.keywords; import mage.constants.PhaseStep; @@ -41,23 +40,20 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class StormTest extends CardTestPlayerBase { /** - * 702.39. Storm - * 702.39a Storm is a triggered ability that functions on the stack. “Storm” means “When you cast this - * spell, put a copy of it onto the stack for each other spell that was cast before it this turn. If the + * 702.39. Storm 702.39a Storm is a triggered ability that functions on the + * stack. “Storm” means “When you cast this spell, put a copy of it onto the + * stack for each other spell that was cast before it this turn. If the * spell has any targets, you may choose new targets for any of the copies.” - * 702.39b If a spell has multiple instances of storm, each triggers separately. - * + * 702.39b If a spell has multiple instances of storm, each triggers + * separately. + * */ - /** - * Grapeshot - * Sorcery, 1R (2) - * Grapeshot deals 1 damage to target creature or player. - * Storm (When you cast this spell, copy it for each spell cast before it - * this turn. You may choose new targets for the copies.) - * + * Grapeshot Sorcery, 1R (2) Grapeshot deals 1 damage to target creature or + * player. Storm (When you cast this spell, copy it for each spell cast + * before it this turn. You may choose new targets for the copies.) + * */ - @Test public void testStorm1x() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); @@ -105,7 +101,7 @@ public class StormTest extends CardTestPlayerBase { assertLife(playerB, 7); } - + @Test public void testStorm4x() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6); @@ -123,7 +119,7 @@ public class StormTest extends CardTestPlayerBase { assertLife(playerB, 3); } - + @Test public void testNoStorm() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); @@ -136,13 +132,13 @@ public class StormTest extends CardTestPlayerBase { assertLife(playerB, 19); } - + /** - * If a spell with storm gets countered, the strom trigger is also stifled, which isn't how its supposed to work. - * For example a Chalic of the Void set to 1 counters Flusterstorm and also counters the storm trigger, which shouldn't happen + * If a spell with storm gets countered, the strom trigger is also stifled, + * which isn't how its supposed to work. For example a Chalic of the Void + * set to 1 counters Flusterstorm and also counters the storm trigger, which + * shouldn't happen */ - - @Test public void testStormSpellCountered() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); @@ -155,20 +151,21 @@ public class StormTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Island", 2); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB); - + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Grapeshot", playerB); castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Counterspell", "Grapeshot"); - + setStopAt(1, PhaseStep.END_TURN); execute(); assertLife(playerB, 16); // 3 (Lightning Bolt) + 1 from Storm copied Grapeshot } - + /** - * I provide a game log fo the issue with storm mentioned earlier. I guess Pyromancer Ascension is a culprit. - * - * + * I provide a game log fo the issue with storm mentioned earlier. I guess + * Pyromancer Ascension is a culprit. + * + * */ @Test public void testStormAndPyromancerAscension() { @@ -178,7 +175,7 @@ public class StormTest extends CardTestPlayerBase { // Whenever you cast an instant or sorcery spell while Pyromancer Ascension has two or more quest counters on it, you may copy that spell. You may choose new targets for the copy. addCard(Zone.BATTLEFIELD, playerA, "Pyromancer Ascension", 1); // Grapeshot deals 1 damage to target creature or player. - Sorcery {1}{R} - // Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) + // Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) addCard(Zone.LIBRARY, playerA, "Grapeshot", 2); skipInitShuffling(); // Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. @@ -198,5 +195,40 @@ public class StormTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Grapeshot", 1); assertCounterCount("Pyromancer Ascension", CounterType.QUEST, 2); assertLife(playerB, 8); // 6 from the Shocks + 5 from Grapeshot + 1 from Pyromancer Ascencsion copy - } + } + + /** + * I provide a game log fo the issue with storm mentioned earlier. I guess + * Pyromancer Ascension is a culprit. + * + * + */ + @Test + public void testStormAndFlshback() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 8); + addCard(Zone.BATTLEFIELD, playerA, "Island", 1); + // Geistflame deals 1 damage to target creature or player. + // Flashback {3}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) + addCard(Zone.HAND, playerA, "Geistflame", 2); // {R} + addCard(Zone.LIBRARY, playerA, "Grapeshot", 2); + skipInitShuffling(); + // Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. + addCard(Zone.HAND, playerA, "Sleight of Hand"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sleight of Hand"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Geistflame", playerB); + activateAbility(1, PhaseStep.BEGIN_COMBAT, playerA, "Flashback {3}{R}"); + addTarget(playerA, playerB); + castSpell(1, PhaseStep.END_COMBAT, playerA, "Geistflame", playerB); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Grapeshot", playerB); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertExileCount("Geistflame", 1); + assertGraveyardCount(playerA, "Geistflame", 1); + assertGraveyardCount(playerA, "Grapeshot", 1); + assertLife(playerB, 12); // 3 from the Geistflame + 5 from Grapeshot + } + } From cd354bacc3259c49e9a2d3703989f5a4c0ab9e5e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 15 Jul 2015 17:24:18 +0200 Subject: [PATCH 050/375] Added a test. --- .../abilities/keywords/DeathtouchTest.java | 83 ++++++++++++++----- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java index 72766b529a5..1f9a2f19cfb 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java @@ -37,32 +37,31 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * @author LevelX2 */ public class DeathtouchTest extends CardTestPlayerBase { - + @Test public void simpleDeathtouchDuringCombat() { addCard(Zone.BATTLEFIELD, playerA, "Archangel of Thune"); // Creature - Rat 1/1 // Deathtouch addCard(Zone.BATTLEFIELD, playerB, "Typhoid Rats"); - - + attack(2, playerB, "Typhoid Rats"); block(2, playerA, "Archangel of Thune", "Typhoid Rats"); - + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); execute(); - + assertLife(playerA, 23); assertLife(playerB, 20); - + assertGraveyardCount(playerA, "Archangel of Thune", 1); assertGraveyardCount(playerB, "Typhoid Rats", 1); } - + /** - * Checks if a creature getting damage from Marath abilitity dies - * from Deathtouch, if Marath is equiped with Deathtouch giving Equipment - * and Marath dies from removing the +1/+1 counters. + * Checks if a creature getting damage from Marath abilitity dies from + * Deathtouch, if Marath is equiped with Deathtouch giving Equipment and + * Marath dies from removing the +1/+1 counters. */ @Test public void testMarathWillOfTheWild() { @@ -73,21 +72,20 @@ public class DeathtouchTest extends CardTestPlayerBase { // Equipped creature has deathtouch and lifelink. addCard(Zone.BATTLEFIELD, playerA, "Basilisk Collar"); /* - {R}{G}{W} Legendary Creature - Elemental Beast - Marath, Will of the Wild enters the battlefield with a number of +1/+1 counters on - it equal to the amount of mana spent to cast it. - {X}, Remove X +1/+1 counters from Marath: Choose one - - * Put X +1/+1 counters on target creature - * Marath deals X damage to target creature or player - * Put an X/X green Elemental creature token onto the battlefield. X can't be 0 - */ + {R}{G}{W} Legendary Creature - Elemental Beast + Marath, Will of the Wild enters the battlefield with a number of +1/+1 counters on + it equal to the amount of mana spent to cast it. + {X}, Remove X +1/+1 counters from Marath: Choose one - + * Put X +1/+1 counters on target creature + * Marath deals X damage to target creature or player + * Put an X/X green Elemental creature token onto the battlefield. X can't be 0 + */ addCard(Zone.HAND, playerA, "Marath, Will of the Wild", 1); - + addCard(Zone.BATTLEFIELD, playerB, "Archangel of Thune"); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN , playerA, "Marath, Will of the Wild"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Marath, Will of the Wild"); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {2}", "Marath, Will of the Wild"); activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{X},Remove X +1/+1 counters from Marath", "Archangel of Thune"); @@ -104,6 +102,45 @@ public class DeathtouchTest extends CardTestPlayerBase { assertLife(playerB, 20); } - + @Test + public void testMarathWillOfTheWildEleshNorn() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, "Plains"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10); + + // Equipped creature has deathtouch and lifelink. + addCard(Zone.BATTLEFIELD, playerA, "Basilisk Collar"); + /* + {R}{G}{W} Legendary Creature - Elemental Beast + Marath, Will of the Wild enters the battlefield with a number of +1/+1 counters on + it equal to the amount of mana spent to cast it. + {X}, Remove X +1/+1 counters from Marath: Choose one - + * Put X +1/+1 counters on target creature + * Marath deals X damage to target creature or player + * Put an X/X green Elemental creature token onto the battlefield. X can't be 0 + */ + addCard(Zone.HAND, playerA, "Marath, Will of the Wild", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Elesh Norn, Grand Cenobite"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Marath, Will of the Wild"); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {2}", "Marath, Will of the Wild"); + + activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{X},Remove X +1/+1 counters from Marath", "Elesh Norn, Grand Cenobite"); + setModeChoice(playerA, "2"); // Marath deals X damage to target creature or player + setChoice(playerA, "X=1"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Marath, Will of the Wild", 0); // died because he's 0/0 + assertPermanentCount(playerB, "Elesh Norn, Grand Cenobite", 0); // died from deathtouch + + assertLife(playerA, 21); // +1 from lifelink doing 1 damage with Marath to Elesh Norn + assertLife(playerB, 20); + + } } From f7684daaa3bf9392ed6ec24746eeab34cfa245fd Mon Sep 17 00:00:00 2001 From: fireshoes Date: Wed, 15 Jul 2015 10:47:35 -0500 Subject: [PATCH 051/375] Implemented Barbed Lightning, Savage Offensive, Incite War, Journey of Discovery, Roar of the Kha, Solar Tide, Temporal Cascade, Wail of the Nim --- .../mage/sets/darksteel/BarbedLightning.java | 72 +++++++++ .../mage/sets/invasion/SavageOffensive.java | 83 +++++++++++ .../src/mage/sets/mirrodin/InciteWar.java | 119 +++++++++++++++ .../sets/mirrodin/JourneyOfDiscovery.java | 72 +++++++++ .../src/mage/sets/mirrodin/RoarOfTheKha.java | 73 +++++++++ .../src/mage/sets/mirrodin/SolarTide.java | 82 ++++++++++ .../mage/sets/mirrodin/TemporalCascade.java | 140 ++++++++++++++++++ .../src/mage/sets/mirrodin/WailOfTheNim.java | 70 +++++++++ 8 files changed, 711 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/darksteel/BarbedLightning.java create mode 100644 Mage.Sets/src/mage/sets/invasion/SavageOffensive.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/InciteWar.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/SolarTide.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java diff --git a/Mage.Sets/src/mage/sets/darksteel/BarbedLightning.java b/Mage.Sets/src/mage/sets/darksteel/BarbedLightning.java new file mode 100644 index 00000000000..0bd4af01e2b --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/BarbedLightning.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.darksteel; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.EntwineAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class BarbedLightning extends CardImpl { + + public BarbedLightning(UUID ownerId) { + super(ownerId, 55, "Barbed Lightning", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}"); + this.expansionSetCode = "DST"; + + // Choose one - Barbed Lightning deals 3 damage to target creature; + this.getSpellAbility().addEffect(new DamageTargetEffect(3)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // or Barbed Lightning deals 3 damage to target player. + Mode mode = new Mode(); + mode.getEffects().add(new DamageTargetEffect(3)); + mode.getTargets().add(new TargetPlayer()); + this.getSpellAbility().getModes().addMode(mode); + + // Entwine {2} + this.addAbility(new EntwineAbility("{2}")); + } + + public BarbedLightning(final BarbedLightning card) { + super(card); + } + + @Override + public BarbedLightning copy() { + return new BarbedLightning(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/SavageOffensive.java b/Mage.Sets/src/mage/sets/invasion/SavageOffensive.java new file mode 100644 index 00000000000..405ed30e595 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/SavageOffensive.java @@ -0,0 +1,83 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.AddContinuousEffectToGame; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author fireshoes + */ +public class SavageOffensive extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public SavageOffensive(UUID ownerId) { + super(ownerId, 162, "Savage Offensive", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{R}"); + this.expansionSetCode = "INV"; + + // Kicker {G} + this.addAbility(new KickerAbility("{G}")); + + // Creatures you control gain first strike until end of turn. + this.getSpellAbility().addEffect(new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter)); + + // If Savage Offensive was kicked, they get +1/+1 until end of turn. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new AddContinuousEffectToGame(new BoostControlledEffect(1, 1, Duration.EndOfTurn)), + KickedCondition.getInstance(), + "If {this} was kicked, they get +1/+1 until end of turn.")); + } + + public SavageOffensive(final SavageOffensive card) { + super(card); + } + + @Override + public SavageOffensive copy() { + return new SavageOffensive(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java b/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java new file mode 100644 index 00000000000..aecd8e02906 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java @@ -0,0 +1,119 @@ +/* + * 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.mirrodin; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.RequirementEffect; +import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.EntwineAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class InciteWar extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public InciteWar(UUID ownerId) { + super(ownerId, 96, "Incite War", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}"); + this.expansionSetCode = "MRD"; + + // Choose one - Creatures target player controls attack this turn if able; + this.getSpellAbility().addEffect(new InciteWarMustAttackEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // or creatures you control gain first strike until end of turn. + Mode mode = new Mode(); + mode.getEffects().add(new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter)); + this.getSpellAbility().getModes().addMode(mode); + + // Entwine {2} + this.addAbility(new EntwineAbility("{2}")); + } + + public InciteWar(final InciteWar card) { + super(card); + } + + @Override + public InciteWar copy() { + return new InciteWar(this); + } +} + +class InciteWarMustAttackEffect extends OneShotEffect { + + public InciteWarMustAttackEffect() { + super(Outcome.Detriment); + staticText = "Creatures target player control attack this turn if able"; + } + + public InciteWarMustAttackEffect(final InciteWarMustAttackEffect effect) { + super(effect); + } + + @Override + public InciteWarMustAttackEffect copy() { + return new InciteWarMustAttackEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (player != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate(player.getId())); + RequirementEffect effect = new AttacksIfAbleAllEffect(filter, Duration.EndOfTurn); + game.addEffect(effect, source); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java b/Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java new file mode 100644 index 00000000000..9c0820954d9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirrodin; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.continuous.PlayAdditionalLandsControllerEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.EntwineAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterBasicLandCard; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author fireshoes + */ +public class JourneyOfDiscovery extends CardImpl { + + public JourneyOfDiscovery(UUID ownerId) { + super(ownerId, 123, "Journey of Discovery", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}"); + this.expansionSetCode = "MRD"; + + // Choose one - Search your library for up to two basic land cards, reveal them, put them into your hand, then shuffle your library; + this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 2, new FilterBasicLandCard()))); + + // or you may play up to two additional lands this turn. + Mode mode = new Mode(); + mode.getEffects().add(new PlayAdditionalLandsControllerEffect(2, Duration.EndOfTurn)); + this.getSpellAbility().getModes().addMode(mode); + + // Entwine {2}{G} + this.addAbility(new EntwineAbility("{2}{G}")); + } + + public JourneyOfDiscovery(final JourneyOfDiscovery card) { + super(card); + } + + @Override + public JourneyOfDiscovery copy() { + return new JourneyOfDiscovery(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java b/Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java new file mode 100644 index 00000000000..d4a2813bbf6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java @@ -0,0 +1,73 @@ +/* + * 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.mirrodin; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.UntapAllControllerEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.keyword.EntwineAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class RoarOfTheKha extends CardImpl { + + private static final String rule = "untap all creatures you control"; + + public RoarOfTheKha(UUID ownerId) { + super(ownerId, 18, "Roar of the Kha", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "MRD"; + + // Choose one - Creatures you control get +1/+1 until end of turn; + this.getSpellAbility().addEffect(new BoostControlledEffect(1, 1, Duration.EndOfTurn)); + + // or untap all creatures you control. + Mode mode = new Mode(); + mode.getEffects().add(new UntapAllControllerEffect(new FilterControlledCreaturePermanent(), rule)); + this.getSpellAbility().getModes().addMode(mode); + + // Entwine {1}{W} + this.addAbility(new EntwineAbility("{1}{W}")); + } + + public RoarOfTheKha(final RoarOfTheKha card) { + super(card); + } + + @Override + public RoarOfTheKha copy() { + return new RoarOfTheKha(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/SolarTide.java b/Mage.Sets/src/mage/sets/mirrodin/SolarTide.java new file mode 100644 index 00000000000..6164aff6d2c --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/SolarTide.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirrodin; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.keyword.EntwineAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class SolarTide extends CardImpl { + + private static final FilterCreaturePermanent filter1 = new FilterCreaturePermanent("creatures with power 2 or less"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creatures with power 3 or greater"); + + static { + filter1.add(new PowerPredicate(Filter.ComparisonType.LessThan, 3)); + filter2.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 2)); + } + + public SolarTide(UUID ownerId) { + super(ownerId, 24, "Solar Tide", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{W}{W}"); + this.expansionSetCode = "MRD"; + + // Choose one - Destroy all creatures with power 2 or less; + this.getSpellAbility().addEffect(new DestroyAllEffect(filter1)); + + // or destroy all creatures with power 3 or greater. + Mode mode = new Mode(); + mode.getEffects().add(new DestroyAllEffect(filter2)); + this.getSpellAbility().getModes().addMode(mode); + + // Entwine-Sacrifice two lands. + this.addAbility(new EntwineAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("two lands"), true)))); + } + + public SolarTide(final SolarTide card) { + super(card); + } + + @Override + public SolarTide copy() { + return new SolarTide(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.java b/Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.java new file mode 100644 index 00000000000..8665d7274d6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.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.mirrodin; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.EntwineAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class TemporalCascade extends CardImpl { + + public TemporalCascade(UUID ownerId) { + super(ownerId, 52, "Temporal Cascade", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{5}{U}{U}"); + this.expansionSetCode = "MRD"; + + // Choose one - Each player shuffles his or her hand and graveyard into his or her library; + this.getSpellAbility().addEffect(new TemporalCascadeShuffleEffect()); + + // or each player draws seven cards. + Mode mode = new Mode(); + mode.getEffects().add(new TemporalCascadeDrawEffect()); + this.getSpellAbility().getModes().addMode(mode); + + // Entwine {2} + this.addAbility(new EntwineAbility("{2}")); + } + + public TemporalCascade(final TemporalCascade card) { + super(card); + } + + @Override + public TemporalCascade copy() { + return new TemporalCascade(this); + } +} + +class TemporalCascadeShuffleEffect extends OneShotEffect { + + public TemporalCascadeShuffleEffect() { + super(Outcome.Neutral); + staticText = "Each player shuffles his or her hand and graveyard into his or her library"; + } + + public TemporalCascadeShuffleEffect(final TemporalCascadeShuffleEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player sourcePlayer = game.getPlayer(source.getControllerId()); + for (UUID playerId: sourcePlayer.getInRange()) { + Player player = game.getPlayer(playerId); + if (player != null) { + for (Card card: player.getHand().getCards(game)) { + card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + } + for (Card card: player.getGraveyard().getCards(game)) { + card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + } + player.shuffleLibrary(game); + + } + } + return true; + } + + @Override + public TemporalCascadeShuffleEffect copy() { + return new TemporalCascadeShuffleEffect(this); + } +} + +class TemporalCascadeDrawEffect extends OneShotEffect { + + public TemporalCascadeDrawEffect() { + super(Outcome.Neutral); + staticText = "Each player draws seven cards"; + } + + public TemporalCascadeDrawEffect(final TemporalCascadeDrawEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player sourcePlayer = game.getPlayer(source.getControllerId()); + game.getState().handleSimultaneousEvent(game); // needed here so state based triggered effects + for (UUID playerId: sourcePlayer.getInRange()) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.drawCards(7, game); + } + } + return true; + } + + @Override + public TemporalCascadeDrawEffect copy() { + return new TemporalCascadeDrawEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java b/Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java new file mode 100644 index 00000000000..cbe3b765bd8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java @@ -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.mirrodin; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.abilities.effects.common.RegenerateAllEffect; +import mage.abilities.keyword.EntwineAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class WailOfTheNim extends CardImpl { + + public WailOfTheNim(UUID ownerId) { + super(ownerId, 81, "Wail of the Nim", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{B}"); + this.expansionSetCode = "MRD"; + + // Choose one - Regenerate each creature you control; + this.getSpellAbility().addEffect(new RegenerateAllEffect(new FilterControlledCreaturePermanent())); + + // or Wail of the Nim deals 1 damage to each creature and each player. + Mode mode = new Mode(); + mode.getEffects().add(new DamageEverythingEffect(1)); + this.getSpellAbility().getModes().addMode(mode); + + // Entwine {B} + this.addAbility(new EntwineAbility("{B}")); + } + + public WailOfTheNim(final WailOfTheNim card) { + super(card); + } + + @Override + public WailOfTheNim copy() { + return new WailOfTheNim(this); + } +} From 1567c4efe9594845fa47e68c1c8e78793ff19087 Mon Sep 17 00:00:00 2001 From: glerman Date: Sun, 21 Jun 2015 10:10:08 +0300 Subject: [PATCH 052/375] Adding Chronozoa card impl --- Mage.Server/config/init.txt.example | 20 ----- .../src/mage/sets/planarchaos/Chronozoa.java | 83 +++++++++++++++++++ .../mage/sets/returntoravnica/PackRat.java | 44 +--------- .../mage/sets/planarchaos/ChronozoaTest.java | 17 ++++ .../LastTimeCounterRemovedCondition.java | 27 ++++++ .../abilities/effects/CopyCardAffect.java | 51 ++++++++++++ 6 files changed, 180 insertions(+), 62 deletions(-) delete mode 100644 Mage.Server/config/init.txt.example create mode 100644 Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java create mode 100644 Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java create mode 100644 Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java create mode 100644 Mage/src/mage/abilities/effects/CopyCardAffect.java diff --git a/Mage.Server/config/init.txt.example b/Mage.Server/config/init.txt.example deleted file mode 100644 index 8203963155a..00000000000 --- a/Mage.Server/config/init.txt.example +++ /dev/null @@ -1,20 +0,0 @@ -# -# Rename this file to init.txt if you want to start using it -# - -# You may add any card to any zone here -# -# Format: ::: -# -# zone ::= hand | battlefield | graveyard | library -# nickname - Player's name you connect to the game with -# -# -battlefield:player:Forest:3 -graveyard:player:Plains:1 -battlefield:player:Snapsail Glider:1 -battlefield:computer:Island:2 -battlefield:player:Plains:3 -hand:player:Whispersilk Cloak:1 -hand:computer:Lightning Bolt:1 -library:player:Shock:2 diff --git a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java new file mode 100644 index 00000000000..9824913de3a --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java @@ -0,0 +1,83 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.common.LastTimeCounterRemovedCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.CopyCardAffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.CounterType; + +/** + * + * @author Gal Lerman + + */ +public class Chronozoa extends CardImpl { + + private static final int timeCounters = 3; + private static final int numCopies = 2; + + public Chronozoa(UUID ownerId) { + super(ownerId, 37, "Chronozoa", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Illusion"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Vanishing 3 + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(timeCounters)))); + this.addAbility(new VanishingUpkeepAbility(timeCounters)); + this.addAbility(new VanishingSacrificeAbility()); + // When Chronozoa is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it. + this.addAbility(new ConditionalTriggeredAbility(new DiesCreatureTriggeredAbility(new CopyCardAffect(this, numCopies), false), + new LastTimeCounterRemovedCondition(), + "When Chronozoa is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it.")); + } + + public Chronozoa(final Chronozoa card) { + super(card); + } + + @Override + public Chronozoa copy() { + return new Chronozoa(this); + } +} diff --git a/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java b/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java index 451cc8df37c..e5f6e9953da 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java @@ -29,6 +29,7 @@ package mage.sets.returntoravnica; import java.util.UUID; +import mage.abilities.effects.CopyCardAffect; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; @@ -39,18 +40,11 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.Duration; -import mage.constants.Outcome; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.permanent.token.EmptyToken; -import mage.util.CardUtil; /** * @@ -89,7 +83,7 @@ public class PackRat extends CardImpl { // Pack Rat's power and toughness are each equal to the number of Rats you control. this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new PermanentsOnBattlefieldCount(filter), Duration.EndOfGame))); // {2}{B}, Discard a card: Put a token onto the battlefield that's a copy of Pack Rat. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PackRatEffect(this), new ManaCostsImpl("{2}{B}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyCardAffect(this, 1), new ManaCostsImpl("{2}{B}")); ability.addCost(new DiscardCardCost()); this.addAbility(ability); } @@ -104,37 +98,3 @@ public class PackRat extends CardImpl { } } -class PackRatEffect extends OneShotEffect { - - private Card card; - - public PackRatEffect(Card card) { - super(Outcome.PutCreatureInPlay); - this.card = card; - staticText = "Put a token onto the battlefield that's a copy of {this}"; - } - - public PackRatEffect(final PackRatEffect effect) { - super(effect); - this.card = effect.card; - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); - } - if (permanent != null) { - EmptyToken newToken = new EmptyToken(); - CardUtil.copyTo(newToken).from(permanent); - return newToken.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - } - return false; - } - - @Override - public PackRatEffect copy() { - return new PackRatEffect(this); - } -} diff --git a/Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java b/Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java new file mode 100644 index 00000000000..e938700073f --- /dev/null +++ b/Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java @@ -0,0 +1,17 @@ +package mage.sets.planarchaos; + +import mage.abilities.condition.common.LastTimeCounterRemovedCondition; +import org.junit.Test; + +import java.util.UUID; + +public class ChronozoaTest { + + @Test + public void test() throws Exception { + final Chronozoa chronozoa = new Chronozoa(UUID.randomUUID()); + + final LastTimeCounterRemovedCondition cond = new LastTimeCounterRemovedCondition(); + + } +} diff --git a/Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java b/Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java new file mode 100644 index 00000000000..b214b86a8e5 --- /dev/null +++ b/Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java @@ -0,0 +1,27 @@ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * Created by glerman on 20/6/15. + */ +public class LastTimeCounterRemovedCondition implements Condition{ + + + private static final LastTimeCounterRemovedCondition fInstance = new LastTimeCounterRemovedCondition(); + + public static LastTimeCounterRemovedCondition getInstance() { + return fInstance; + } + + @Override + public boolean apply(Game game, Ability source) { + final Permanent p = game.getPermanent(source.getSourceId()); + final int timeCounters = p.getCounters().getCount(CounterType.TIME); + return timeCounters == 0; + } +} diff --git a/Mage/src/mage/abilities/effects/CopyCardAffect.java b/Mage/src/mage/abilities/effects/CopyCardAffect.java new file mode 100644 index 00000000000..9ac38a405f2 --- /dev/null +++ b/Mage/src/mage/abilities/effects/CopyCardAffect.java @@ -0,0 +1,51 @@ +package mage.abilities.effects; + +import mage.abilities.Ability; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.EmptyToken; +import mage.util.CardUtil; + +/** + * Created by glerman on 20/6/15. + */ +public class CopyCardAffect extends OneShotEffect { + + private final Card card; + private final int copies; + + public CopyCardAffect(Card card, int copies) { + super(Outcome.PutCreatureInPlay); + this.card = card; + this.copies = copies; + staticText = "Put a token onto the battlefield that's a copy of {this}"; + } + + public CopyCardAffect(final CopyCardAffect effect) { + super(effect); + this.card = effect.card; + this.copies = effect.copies; + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent == null) { + permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); + } + if (permanent != null) { + EmptyToken newToken = new EmptyToken(); + CardUtil.copyTo(newToken).from(permanent); + return newToken.putOntoBattlefield(copies, game, source.getSourceId(), source.getControllerId()); + } + return false; + } + + @Override + public CopyCardAffect copy() { + return new CopyCardAffect(this); + } +} From 15e3101bf479b9412af9e951dd0a1e7521b30476 Mon Sep 17 00:00:00 2001 From: glerman Date: Sun, 21 Jun 2015 12:26:39 +0300 Subject: [PATCH 053/375] fixed typo --- Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java | 4 ++-- Mage.Sets/src/mage/sets/returntoravnica/PackRat.java | 4 ++-- .../{CopyCardAffect.java => CopyCardEffect.java} | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) rename Mage/src/mage/abilities/effects/{CopyCardAffect.java => CopyCardEffect.java} (84%) diff --git a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java index 9824913de3a..e8f7e5bfd2d 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java +++ b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java @@ -33,7 +33,7 @@ import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.LastTimeCounterRemovedCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.CopyCardAffect; +import mage.abilities.effects.CopyCardEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.VanishingSacrificeAbility; @@ -67,7 +67,7 @@ public class Chronozoa extends CardImpl { this.addAbility(new VanishingUpkeepAbility(timeCounters)); this.addAbility(new VanishingSacrificeAbility()); // When Chronozoa is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it. - this.addAbility(new ConditionalTriggeredAbility(new DiesCreatureTriggeredAbility(new CopyCardAffect(this, numCopies), false), + this.addAbility(new ConditionalTriggeredAbility(new DiesCreatureTriggeredAbility(new CopyCardEffect(this, numCopies), false), new LastTimeCounterRemovedCondition(), "When Chronozoa is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it.")); } diff --git a/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java b/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java index e5f6e9953da..266521195b0 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/PackRat.java @@ -29,7 +29,7 @@ package mage.sets.returntoravnica; import java.util.UUID; -import mage.abilities.effects.CopyCardAffect; +import mage.abilities.effects.CopyCardEffect; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; @@ -83,7 +83,7 @@ public class PackRat extends CardImpl { // Pack Rat's power and toughness are each equal to the number of Rats you control. this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new PermanentsOnBattlefieldCount(filter), Duration.EndOfGame))); // {2}{B}, Discard a card: Put a token onto the battlefield that's a copy of Pack Rat. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyCardAffect(this, 1), new ManaCostsImpl("{2}{B}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyCardEffect(this, 1), new ManaCostsImpl("{2}{B}")); ability.addCost(new DiscardCardCost()); this.addAbility(ability); } diff --git a/Mage/src/mage/abilities/effects/CopyCardAffect.java b/Mage/src/mage/abilities/effects/CopyCardEffect.java similarity index 84% rename from Mage/src/mage/abilities/effects/CopyCardAffect.java rename to Mage/src/mage/abilities/effects/CopyCardEffect.java index 9ac38a405f2..3435e707673 100644 --- a/Mage/src/mage/abilities/effects/CopyCardAffect.java +++ b/Mage/src/mage/abilities/effects/CopyCardEffect.java @@ -12,19 +12,19 @@ import mage.util.CardUtil; /** * Created by glerman on 20/6/15. */ -public class CopyCardAffect extends OneShotEffect { +public class CopyCardEffect extends OneShotEffect { private final Card card; private final int copies; - public CopyCardAffect(Card card, int copies) { + public CopyCardEffect(Card card, int copies) { super(Outcome.PutCreatureInPlay); this.card = card; this.copies = copies; staticText = "Put a token onto the battlefield that's a copy of {this}"; } - public CopyCardAffect(final CopyCardAffect effect) { + public CopyCardEffect(final CopyCardEffect effect) { super(effect); this.card = effect.card; this.copies = effect.copies; @@ -45,7 +45,7 @@ public class CopyCardAffect extends OneShotEffect { } @Override - public CopyCardAffect copy() { - return new CopyCardAffect(this); + public CopyCardEffect copy() { + return new CopyCardEffect(this); } } From 9b44c9a0879b09e35c4d4e3c2aa97cee436b9cd0 Mon Sep 17 00:00:00 2001 From: glerman Date: Wed, 24 Jun 2015 12:20:38 +0300 Subject: [PATCH 054/375] fixed the LastTimeCounterRemovedCondition, moved the Chronozoa test to fit the package convention, added a test case --- .../src/mage/sets/planarchaos/Chronozoa.java | 1 + .../mage/sets/planarchaos/ChronozoaTest.java | 17 ---- .../mage/test/cards/single/ChronozoaTest.java | 79 +++++++++++++++++++ .../LastTimeCounterRemovedCondition.java | 14 +++- 4 files changed, 91 insertions(+), 20 deletions(-) delete mode 100644 Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java diff --git a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java index e8f7e5bfd2d..008b1dd77b0 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java +++ b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java @@ -28,6 +28,7 @@ package mage.sets.planarchaos; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldAbility; diff --git a/Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java b/Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java deleted file mode 100644 index e938700073f..00000000000 --- a/Mage.Tests/src/test/java/mage/sets/planarchaos/ChronozoaTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package mage.sets.planarchaos; - -import mage.abilities.condition.common.LastTimeCounterRemovedCondition; -import org.junit.Test; - -import java.util.UUID; - -public class ChronozoaTest { - - @Test - public void test() throws Exception { - final Chronozoa chronozoa = new Chronozoa(UUID.randomUUID()); - - final LastTimeCounterRemovedCondition cond = new LastTimeCounterRemovedCondition(); - - } -} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java new file mode 100644 index 00000000000..a2b4514994a --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java @@ -0,0 +1,79 @@ +package org.mage.test.cards.single; + +import java.util.List; + +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.Counter; +import mage.counters.CounterType; +import mage.counters.Counters; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; + +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * Created by glerman on 22/6/15. + */ +public class ChronozoaTest extends CardTestPlayerBase { + + /** + * Test that time counters are removed before the draw phase + */ + @Test + public void testVanishing() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + // Flying + // Vanishing 3 + // When Chronozoa dies, if it had no time counters on it, put two tokens that are copies of it onto the battlefield. + addCard(Zone.HAND, playerA, "Chronozoa"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); + + setStopAt(5, PhaseStep.DRAW); + execute(); + + // Make sure one time counter was removed at beginning of playerA turn num 3 + assertCounterCount("Chronozoa", CounterType.TIME, 1); + } + + /** + * Test that the tokens are put to battlefield if the last time counter is removed + */ + @Test + public void testDuplicationEffect() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + // Flying + // Vanishing 3 + // When Chronozoa dies, if it had no time counters on it, put two tokens that are copies of it onto the battlefield. + addCard(Zone.HAND, playerA, "Chronozoa"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); + + setStopAt(9, PhaseStep.PRECOMBAT_MAIN); + execute(); + + // The original Chronozoa card should be in graveyard + assertGraveyardCount(playerA, 1); + + final List creatures = currentGame.getBattlefield().getAllActivePermanents(CardType.CREATURE); + Assert.assertEquals(2, creatures.size()); + + for (final Permanent creature : creatures) { + // Make sure the creatures are Chronozoa tokens + Assert.assertEquals("Chronozoa", creature.getName()); + Assert.assertEquals("Chronozoa has to be a token", true, creature instanceof PermanentToken); + + // Make sure each token has 2 time counters + final Counters counters = creature.getCounters(); + Assert.assertEquals(1, counters.size()); + for(final Counter counter : counters.values()) { + Assert.assertEquals(CounterType.TIME.getName(), counter.getName()); + Assert.assertEquals(2, counter.getCount()); + } + } + } +} diff --git a/Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java b/Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java index b214b86a8e5..0c47125c9ca 100644 --- a/Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java +++ b/Mage/src/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java @@ -2,6 +2,7 @@ package mage.abilities.condition.common; import mage.abilities.Ability; import mage.abilities.condition.Condition; +import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; @@ -20,8 +21,15 @@ public class LastTimeCounterRemovedCondition implements Condition{ @Override public boolean apply(Game game, Ability source) { - final Permanent p = game.getPermanent(source.getSourceId()); - final int timeCounters = p.getCounters().getCount(CounterType.TIME); - return timeCounters == 0; + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent == null) { + permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); + } + if (permanent != null) { + final int timeCounters = permanent.getCounters().getCount(CounterType.TIME); + return timeCounters == 0; + } else { + return false; + } } } From 5ebfacecb573bb05c2ae0fe79e2c8d0b29eef4ec Mon Sep 17 00:00:00 2001 From: glerman Date: Wed, 24 Jun 2015 14:28:41 +0300 Subject: [PATCH 055/375] added test case of Chronozoa being destroyed with time counters on it (end case) --- .../mage/test/cards/single/ChronozoaTest.java | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java index a2b4514994a..7125bdce733 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/ChronozoaTest.java @@ -19,6 +19,9 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * Created by glerman on 22/6/15. */ public class ChronozoaTest extends CardTestPlayerBase { + // Flying + // Vanishing 3 + // When Chronozoa dies, if it had no time counters on it, put two tokens that are copies of it onto the battlefield. /** * Test that time counters are removed before the draw phase @@ -26,9 +29,6 @@ public class ChronozoaTest extends CardTestPlayerBase { @Test public void testVanishing() { addCard(Zone.BATTLEFIELD, playerA, "Island", 4); - // Flying - // Vanishing 3 - // When Chronozoa dies, if it had no time counters on it, put two tokens that are copies of it onto the battlefield. addCard(Zone.HAND, playerA, "Chronozoa"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); @@ -46,9 +46,6 @@ public class ChronozoaTest extends CardTestPlayerBase { @Test public void testDuplicationEffect() { addCard(Zone.BATTLEFIELD, playerA, "Island", 4); - // Flying - // Vanishing 3 - // When Chronozoa dies, if it had no time counters on it, put two tokens that are copies of it onto the battlefield. addCard(Zone.HAND, playerA, "Chronozoa"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); @@ -76,4 +73,29 @@ public class ChronozoaTest extends CardTestPlayerBase { } } } + + @Test + public void testChronozoaDestroyedWithTimeCounters() throws Exception { + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + addCard(Zone.HAND, playerA, "Chronozoa"); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); + addCard(Zone.HAND, playerB, "Lightning Bolt"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); + // Destroy Chronozoa the same phase it should duplicate -> due to stack Chronozoa is destroyed before duplication + castSpell(7, PhaseStep.UPKEEP, playerB, "Lightning Bolt", "Chronozoa"); + + setStopAt(7, PhaseStep.PRECOMBAT_MAIN); + execute(); + + // Chronozoa in gy + assertGraveyardCount(playerA, 1); + // Lightning Bolt in gt + assertGraveyardCount(playerB, 1); + + // Chronozoa shouldn't duplicate + final List creatures = currentGame.getBattlefield().getAllActivePermanents(CardType.CREATURE); + Assert.assertTrue(creatures.isEmpty()); + + } } From 0a293063cf88e41e647060c0bfe261f0856d2db5 Mon Sep 17 00:00:00 2001 From: glerman Date: Wed, 24 Jun 2015 19:48:28 +0300 Subject: [PATCH 056/375] added test for NornsAnnex still in progress, dur to friends bug --- .../test/cards/single/NornsAnnexTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/NornsAnnexTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/NornsAnnexTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/NornsAnnexTest.java new file mode 100644 index 00000000000..2336b6aa895 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/NornsAnnexTest.java @@ -0,0 +1,27 @@ +package org.mage.test.cards.single; + +import mage.constants.PhaseStep; +import mage.constants.Zone; + +import org.junit.Ignore; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * Created by glerman on 23/6/15. + */ +@Ignore +public class NornsAnnexTest extends CardTestPlayerBase{ + @Test + @Ignore + public void testNornsAnnex() { + addCard(Zone.BATTLEFIELD, playerA, "Norn's Annex"); + addCard(Zone.BATTLEFIELD, playerB, "Brindle Boar"); + attack(2, playerB, "Brindle Boar", playerA); + setStopAt(2, PhaseStep.END_TURN); + execute(); + + + + } +} From 049f76ffe6d326cd284e440501afe64e72931dee Mon Sep 17 00:00:00 2001 From: glerman Date: Mon, 29 Jun 2015 01:23:12 +0300 Subject: [PATCH 057/375] added DustOfMoments and it's ability --- .../mage/sets/futuresight/DustOfMoments.java | 79 +++++++++++ ...AddRemoveAllTimeSuspentCountersEffect.java | 125 ++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java create mode 100644 Mage/src/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java diff --git a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java new file mode 100644 index 00000000000..507a0d7e665 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java @@ -0,0 +1,79 @@ +/* + * 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.futuresight; + +import java.util.UUID; + +import mage.abilities.Mode; +import mage.abilities.effects.common.counter.AddRemoveAllTimeSuspentCountersEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.Counter; +import mage.counters.CounterType; +import mage.filter.Filter; +import mage.filter.FilterCard; +import mage.filter.predicate.permanent.CounterPredicate; + +/** + * + * @author Gal Lerman + + */ +public class DustOfMoments extends CardImpl { + + private static final Filter filter = new FilterCard("Has Time Counter Filter"); + + static { + filter.add(new CounterPredicate(CounterType.TIME)); + } + + public DustOfMoments(UUID ownerId) { + super(ownerId, 5, "Dust of Moments", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); + this.expansionSetCode = "FUT"; + + // Choose one + // Remove two time counters from each permanent and each suspended card + final Counter counter = new Counter(CounterType.TIME.getName(), 2); + this.getSpellAbility().addEffect(new AddRemoveAllTimeSuspentCountersEffect(counter, filter, true)); + // Or put two time counters on each permanent with a time counter on it and each suspended card + Mode mode = new Mode(); + mode.getEffects().add(new AddRemoveAllTimeSuspentCountersEffect(counter, filter, false)); + this.getSpellAbility().getModes().addMode(mode); + } + + public DustOfMoments(final DustOfMoments card) { + super(card); + } + + @Override + public DustOfMoments copy() { + return new DustOfMoments(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java b/Mage/src/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java new file mode 100644 index 00000000000..6c1e8525bcb --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/counter/AddRemoveAllTimeSuspentCountersEffect.java @@ -0,0 +1,125 @@ +/* + * 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.abilities.effects.common.counter; + +import java.util.ArrayList; +import java.util.List; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.counters.Counter; +import mage.filter.Filter; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author Gal Lerman + */ +public class AddRemoveAllTimeSuspentCountersEffect extends OneShotEffect { + + private final Counter counter; + private final Filter filter; + private final boolean removeCounter; + private final String actionStr; + + public AddRemoveAllTimeSuspentCountersEffect(Counter counter, Filter filter, boolean removeCounter) { + super(Outcome.Benefit); + this.counter = counter; + this.filter = filter; + this.removeCounter= removeCounter; + actionStr = removeCounter ? " removes " : " puts "; + setText(); + } + + public AddRemoveAllTimeSuspentCountersEffect(final AddRemoveAllTimeSuspentCountersEffect effect) { + super(effect); + this.counter = effect.counter.copy(); + this.filter = effect.filter.copy(); + this.removeCounter = effect.removeCounter; + this.actionStr = effect.actionStr; + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + if (counter != null) { + List permanents = new ArrayList(game.getBattlefield().getAllActivePermanents()); + execute(game, controller, sourceObject, permanents, removeCounter); + final List exiledCards = game.getExile().getAllCards(game); + execute(game, controller, sourceObject, exiledCards, removeCounter); + } + return true; + } + return false; + } + + private void execute(final Game game, final Player controller, final MageObject sourceObject, final List cards, final boolean removeCounter) { + for (Card card : cards) { + if (filter.match(card, game)) { + final String counterName = counter.getName(); + if (removeCounter) { + final Counter existingCounterOfSameType = card.getCounters(game).get(counterName); + final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount()); + final Counter modifiedCounter = new Counter(counterName, countersToRemove); + card.removeCounters(modifiedCounter, game); + } else { + card.addCounters(counter, game); + } + if (!game.isSimulation()) + game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") + .append(controller.getLogName()).append(actionStr) + .append(counter.getCount()).append(" ").append(counterName.toLowerCase()) + .append(" counter on ").append(card.getName()).toString()); + } + } + } + + private void setText() { + StringBuilder sb = new StringBuilder(); + final String actionsStr2 = removeCounter ? "remove " : " put "; + sb.append(actionsStr2); + if (counter.getCount() > 1) { + sb.append(Integer.toString(counter.getCount())).append(" ").append(counter.getName().toLowerCase()).append(" counters on each "); + } else { + sb.append("a ").append(counter.getName().toLowerCase()).append(" counter on each "); + } + sb.append(filter.getMessage()); + staticText = sb.toString(); + } + + @Override + public AddRemoveAllTimeSuspentCountersEffect copy() { + return new AddRemoveAllTimeSuspentCountersEffect(this); + } +} From 9e4a7aad8ac1506a277d0b69503e13f81a695741 Mon Sep 17 00:00:00 2001 From: glerman Date: Mon, 29 Jun 2015 01:24:21 +0300 Subject: [PATCH 058/375] added empty test for DustOfMoments --- .../org/mage/test/cards/single/DustOfMomentsTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java new file mode 100644 index 00000000000..44e03630cac --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java @@ -0,0 +1,9 @@ +package org.mage.test.cards.single; + +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * Created by glerman on 29/6/15. + */ +public class DustOfMomentsTest extends CardTestPlayerBase{ +} From 45e269de770e9ab9cbfdbc78ad3f3fdaf6c9ea7e Mon Sep 17 00:00:00 2001 From: glerman Date: Mon, 29 Jun 2015 02:09:56 +0300 Subject: [PATCH 059/375] added empty test for DustOfMoments --- .../mage/sets/futuresight/DustOfMoments.java | 6 ++- .../test/cards/single/DustOfMomentsTest.java | 44 ++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java index 507a0d7e665..941cf8398b0 100644 --- a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java +++ b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java @@ -58,14 +58,16 @@ public class DustOfMoments extends CardImpl { super(ownerId, 5, "Dust of Moments", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); this.expansionSetCode = "FUT"; - // Choose one - // Remove two time counters from each permanent and each suspended card + // Choose one - Remove two time counters from each permanent and each suspended card final Counter counter = new Counter(CounterType.TIME.getName(), 2); this.getSpellAbility().addEffect(new AddRemoveAllTimeSuspentCountersEffect(counter, filter, true)); + // Or put two time counters on each permanent with a time counter on it and each suspended card Mode mode = new Mode(); mode.getEffects().add(new AddRemoveAllTimeSuspentCountersEffect(counter, filter, false)); this.getSpellAbility().getModes().addMode(mode); + this.getSpellAbility().getModes().setMaxModes(1); + this.getSpellAbility().getModes().setMinModes(1); } public DustOfMoments(final DustOfMoments card) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java index 44e03630cac..f2fb41c9d8a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java @@ -1,9 +1,51 @@ package org.mage.test.cards.single; +import java.util.List; + +import mage.cards.Card; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.permanent.Permanent; + +import org.junit.Assert; +import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** * Created by glerman on 29/6/15. */ -public class DustOfMomentsTest extends CardTestPlayerBase{ +public class DustOfMomentsTest extends CardTestPlayerBase { + + @Test + public void test() throws Exception { + addCard(Zone.BATTLEFIELD, playerA, "Island", 7); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + addCard(Zone.HAND, playerA, "Chronozoa"); + addCard(Zone.HAND, playerA, "Deep-Sea Kraken"); + addCard(Zone.HAND, playerA, "Dust of Moments"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Deep-Sea Kraken"); + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dust Of Moments"); + + setModeChoice(playerA, "1"); + + setStopAt(3, PhaseStep.PRECOMBAT_MAIN); + execute(); + + final List activeCreatures = currentGame.getBattlefield().getAllActivePermanents(CardType.CREATURE); + Assert.assertEquals(2, activeCreatures.size()); + + for (final Permanent creature : activeCreatures) { + Assert.assertEquals("Chronozoa", creature.getName()); + } + final List exiledCards = currentGame.getExile().getAllCards(currentGame); + Assert.assertEquals(1, exiledCards.size()); + + final Card kraken = exiledCards.get(0); + final int krakenCounters = kraken.getCounters(currentGame).getCount(CounterType.TIME); + Assert.assertEquals(6, krakenCounters); + } } From afe9c27aa539ea0bf3b7466c4ee4720e56fbc85f Mon Sep 17 00:00:00 2001 From: glerman Date: Fri, 3 Jul 2015 02:10:06 +0300 Subject: [PATCH 060/375] finally made DustOfMoments to work, CounterPredicate didn't see counters for Chronozoa (permanent). why the hell is PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same card --- .../mage/sets/futuresight/DustOfMoments.java | 195 ++++++++++++++++-- .../test/cards/single/DustOfMomentsTest.java | 12 +- .../permanent/CardCounterPredicate.java | 36 ++++ 3 files changed, 225 insertions(+), 18 deletions(-) create mode 100644 Mage/src/mage/filter/predicate/permanent/CardCounterPredicate.java diff --git a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java index 941cf8398b0..99284d91a50 100644 --- a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java +++ b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java @@ -27,19 +27,28 @@ */ package mage.sets.futuresight; +import java.util.List; import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.effects.common.counter.AddRemoveAllTimeSuspentCountersEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; +import mage.constants.Outcome; import mage.constants.Rarity; import mage.counters.Counter; import mage.counters.CounterType; import mage.filter.Filter; import mage.filter.FilterCard; +import mage.filter.predicate.permanent.CardCounterPredicate; import mage.filter.predicate.permanent.CounterPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; /** * @@ -48,26 +57,17 @@ import mage.filter.predicate.permanent.CounterPredicate; */ public class DustOfMoments extends CardImpl { - private static final Filter filter = new FilterCard("Has Time Counter Filter"); - - static { - filter.add(new CounterPredicate(CounterType.TIME)); - } - public DustOfMoments(UUID ownerId) { super(ownerId, 5, "Dust of Moments", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); this.expansionSetCode = "FUT"; - // Choose one - Remove two time counters from each permanent and each suspended card - final Counter counter = new Counter(CounterType.TIME.getName(), 2); - this.getSpellAbility().addEffect(new AddRemoveAllTimeSuspentCountersEffect(counter, filter, true)); + // Choose one - Remove two time counters from each permanent and each suspended card with time counter + this.getSpellAbility().addEffect(new RemoveCountersEffect()); - // Or put two time counters on each permanent with a time counter on it and each suspended card + // Or put two time counters on each permanent with a time counter on it and each suspended card with time counter Mode mode = new Mode(); - mode.getEffects().add(new AddRemoveAllTimeSuspentCountersEffect(counter, filter, false)); - this.getSpellAbility().getModes().addMode(mode); - this.getSpellAbility().getModes().setMaxModes(1); - this.getSpellAbility().getModes().setMinModes(1); + mode.getEffects().add(new AddCountersEffect()); + this.getSpellAbility().addMode(mode); } public DustOfMoments(final DustOfMoments card) { @@ -78,4 +78,169 @@ public class DustOfMoments extends CardImpl { public DustOfMoments copy() { return new DustOfMoments(this); } + + + + public abstract static class DustOfMomentsEffect extends OneShotEffect { + + private final Counter counter; + private final Filter permFilter; + private final Filter exiledFilter; + + public DustOfMomentsEffect() { + super(Outcome.Benefit); + this.counter = new Counter(CounterType.TIME.getName(), 2); + this.permFilter = new FilterCard("permanent and each suspended card with time counter"); + permFilter.add(new CounterPredicate(CounterType.TIME)); + + this.exiledFilter = new FilterCard("permanent and each suspended card with time counter"); + exiledFilter.add(new CardCounterPredicate(CounterType.TIME)); + setText(); + } + + public DustOfMomentsEffect(final DustOfMomentsEffect effect) { + super(effect); + this.counter = effect.counter.copy(); + this.permFilter = effect.permFilter.copy(); + this.exiledFilter = effect.exiledFilter.copy(); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + updatePermanents(game, controller, sourceObject); + updateSuspended(game, controller, sourceObject); + return true; + } + return false; + } + + private void updateSuspended(final Game game, final Player controller, final MageObject sourceObject) { + final List exiledCards = game.getExile().getAllCards(game); + execute(game, controller, sourceObject, exiledCards); + } + + private void updatePermanents(final Game game, final Player controller, final MageObject sourceObject) { + List permanents = game.getBattlefield().getAllActivePermanents(); + executeP(game, controller, sourceObject, permanents); + } + + private void executeP(final Game game, final Player controller, final MageObject sourceObject, final List cards) { + if (cards == null || cards.isEmpty()) { + return; + } + for (Permanent card : cards) { + if (permFilter.match(card, game)) { + final String counterName = counter.getName(); + if (shouldRemoveCounters()) { + final Counter existingCounterOfSameType = card.getCounters().get(counterName); + final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount()); + final Counter modifiedCounter = new Counter(counterName, countersToRemove); + card.removeCounters(modifiedCounter, game); + } else { + card.addCounters(counter, game); + } + if (!game.isSimulation()) + game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") + .append(controller.getLogName()).append(getActionStr()).append("s") + .append(counter.getCount()).append(" ").append(counterName.toLowerCase()) + .append(" counter on ").append(card.getName()).toString()); + } + } + } + + private void execute(final Game game, final Player controller, final MageObject sourceObject, final List cards) { + if (cards == null || cards.isEmpty()) { + return; + } + for (Card card : cards) { + if (exiledFilter.match(card, game)) { + final String counterName = counter.getName(); + if (shouldRemoveCounters()) { + final Counter existingCounterOfSameType = card.getCounters(game).get(counterName); + final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount()); + final Counter modifiedCounter = new Counter(counterName, countersToRemove); + card.removeCounters(modifiedCounter, game); + } else { + card.addCounters(counter, game); + } + if (!game.isSimulation()) + game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") + .append(controller.getLogName()).append(getActionStr()).append("s") + .append(counter.getCount()).append(" ").append(counterName.toLowerCase()) + .append(" counter on ").append(card.getName()).toString()); + } + } + } + + protected abstract boolean shouldRemoveCounters(); + + protected abstract String getActionStr(); + + private void setText() { + StringBuilder sb = new StringBuilder(); + sb.append(getActionStr()); + if (counter.getCount() > 1) { + sb.append(Integer.toString(counter.getCount())).append(" ").append(counter.getName().toLowerCase()).append(" counters on each "); + } else { + sb.append("a ").append(counter.getName().toLowerCase()).append(" counter on each "); + } + sb.append(permFilter.getMessage()); + staticText = sb.toString(); + } + } + + public static class AddCountersEffect extends DustOfMomentsEffect { + + public AddCountersEffect() { + super(); + } + + public AddCountersEffect(final DustOfMomentsEffect effect) { + super(effect); + } + + @Override + protected boolean shouldRemoveCounters() { + return false; + } + + @Override + protected String getActionStr() { + return "add"; + } + + @Override + public Effect copy() { + return new AddCountersEffect(this); + } + } + + public static class RemoveCountersEffect extends DustOfMomentsEffect { + + public RemoveCountersEffect() { + super(); + } + + public RemoveCountersEffect(final DustOfMomentsEffect effect) { + super(effect); + } + + @Override + protected boolean shouldRemoveCounters() { + return true; + } + + @Override + protected String getActionStr() { + return "remove"; + } + + @Override + public Effect copy() { + return new RemoveCountersEffect(this); + } + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java index f2fb41c9d8a..7859f6945e7 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java @@ -18,6 +18,8 @@ import org.mage.test.serverside.base.CardTestPlayerBase; */ public class DustOfMomentsTest extends CardTestPlayerBase { + //TODO: why the hell is PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same card??? + @Test public void test() throws Exception { addCard(Zone.BATTLEFIELD, playerA, "Island", 7); @@ -27,20 +29,24 @@ public class DustOfMomentsTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Dust of Moments"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Deep-Sea Kraken"); - castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dust Of Moments"); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Suspend"); // Casts Deep-Sea Kraken as Suspend + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dust of Moments"); setModeChoice(playerA, "1"); - setStopAt(3, PhaseStep.PRECOMBAT_MAIN); + setStopAt(3, PhaseStep.END_TURN); execute(); +// Chronozoa should have duplicated final List activeCreatures = currentGame.getBattlefield().getAllActivePermanents(CardType.CREATURE); Assert.assertEquals(2, activeCreatures.size()); for (final Permanent creature : activeCreatures) { Assert.assertEquals("Chronozoa", creature.getName()); + Assert.assertEquals(3, creature.getCounters().getCount(CounterType.TIME)); } + + // Check time counters on kraken final List exiledCards = currentGame.getExile().getAllCards(currentGame); Assert.assertEquals(1, exiledCards.size()); diff --git a/Mage/src/mage/filter/predicate/permanent/CardCounterPredicate.java b/Mage/src/mage/filter/predicate/permanent/CardCounterPredicate.java new file mode 100644 index 00000000000..04fa0123400 --- /dev/null +++ b/Mage/src/mage/filter/predicate/permanent/CardCounterPredicate.java @@ -0,0 +1,36 @@ +package mage.filter.predicate.permanent; + +import mage.cards.Card; +import mage.counters.CounterType; +import mage.filter.predicate.Predicate; +import mage.game.Game; + +/** + * Created by glerman on 3/7/15. + */ +public class CardCounterPredicate implements Predicate{ + + private final CounterType counter; + + /** + * + * @param counter if null any counter selects the permanent + */ + public CardCounterPredicate(CounterType counter) { + this.counter = counter; + } + + @Override + public boolean apply(Card input, Game game) { + if (counter == null) { + return !input.getCounters(game).keySet().isEmpty(); + } else { + return input.getCounters(game).containsKey(counter); + } + } + + @Override + public String toString() { + return "CounterType(" + counter.getName() + ')'; + } +} From 6aa23b0b2ef420ae8a565d8b84c1f872795c11dd Mon Sep 17 00:00:00 2001 From: glerman Date: Fri, 3 Jul 2015 02:27:49 +0300 Subject: [PATCH 061/375] added DustOfMoments counter addition test --- .../test/cards/single/DustOfMomentsTest.java | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java index 7859f6945e7..d12b8e600e0 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java @@ -2,7 +2,6 @@ package org.mage.test.cards.single; import java.util.List; -import mage.cards.Card; import mage.constants.CardType; import mage.constants.PhaseStep; import mage.constants.Zone; @@ -21,7 +20,36 @@ public class DustOfMomentsTest extends CardTestPlayerBase { //TODO: why the hell is PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same card??? @Test - public void test() throws Exception { + public void testRemoveCounters() throws Exception { + initGame(); + setModeChoice(playerA, "1"); // Chose the remove 2 time counters option + setStopAt(3, PhaseStep.END_TURN); + execute(); + + // Chronozoa should have duplicated + final List activeCreatures = currentGame.getBattlefield().getAllActivePermanents(CardType.CREATURE); + Assert.assertEquals(2, activeCreatures.size()); + + for (final Permanent creature : activeCreatures) { + Assert.assertEquals("Chronozoa", creature.getName()); + Assert.assertEquals(3, creature.getCounters().getCount(CounterType.TIME)); + } + // Check time counters on kraken + assertCounterOnExiledCardCount("Deep-Sea Kraken", CounterType.TIME, 6); + } + + @Test + public void testAddCounters() throws Exception { + initGame(); + setModeChoice(playerA, "2"); // Chose the add 2 time counters option + setStopAt(3, PhaseStep.END_TURN); + execute(); + + assertCounterCount("Chronozoa", CounterType.TIME, 4); + assertCounterOnExiledCardCount("Deep-Sea Kraken", CounterType.TIME, 10); + } + + private void initGame() { addCard(Zone.BATTLEFIELD, playerA, "Island", 7); addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); addCard(Zone.HAND, playerA, "Chronozoa"); @@ -31,27 +59,5 @@ public class DustOfMomentsTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chronozoa"); activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Suspend"); // Casts Deep-Sea Kraken as Suspend castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dust of Moments"); - - setModeChoice(playerA, "1"); - - setStopAt(3, PhaseStep.END_TURN); - execute(); - -// Chronozoa should have duplicated - final List activeCreatures = currentGame.getBattlefield().getAllActivePermanents(CardType.CREATURE); - Assert.assertEquals(2, activeCreatures.size()); - - for (final Permanent creature : activeCreatures) { - Assert.assertEquals("Chronozoa", creature.getName()); - Assert.assertEquals(3, creature.getCounters().getCount(CounterType.TIME)); - } - - // Check time counters on kraken - final List exiledCards = currentGame.getExile().getAllCards(currentGame); - Assert.assertEquals(1, exiledCards.size()); - - final Card kraken = exiledCards.get(0); - final int krakenCounters = kraken.getCounters(currentGame).getCount(CounterType.TIME); - Assert.assertEquals(6, krakenCounters); } } From 27a9e80de153f23a8b0f4460504c2b6e71edad86 Mon Sep 17 00:00:00 2001 From: glerman Date: Fri, 3 Jul 2015 02:28:48 +0300 Subject: [PATCH 062/375] added a script to clean cards.h2* from Server, Client and Test envs --- clean_dbs.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 clean_dbs.sh diff --git a/clean_dbs.sh b/clean_dbs.sh new file mode 100644 index 00000000000..c091f9f7613 --- /dev/null +++ b/clean_dbs.sh @@ -0,0 +1,2 @@ +# Cleans the DB from Server, Client and Test modules +find . -type f | grep -i cards.h2*.db | xargs rm -v \ No newline at end of file From 638174add2a5837a50ffdbaa318622a84dcb8cab Mon Sep 17 00:00:00 2001 From: glerman Date: Fri, 3 Jul 2015 02:44:24 +0300 Subject: [PATCH 063/375] fixed tooltip a little --- Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java index 99284d91a50..5a543e83fea 100644 --- a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java +++ b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java @@ -61,10 +61,10 @@ public class DustOfMoments extends CardImpl { super(ownerId, 5, "Dust of Moments", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); this.expansionSetCode = "FUT"; - // Choose one - Remove two time counters from each permanent and each suspended card with time counter + // Choose one - Remove two time counters from each permanent and each suspended card this.getSpellAbility().addEffect(new RemoveCountersEffect()); - // Or put two time counters on each permanent with a time counter on it and each suspended card with time counter + // Or put two time counters on each permanent with a time counter on it and each suspended card Mode mode = new Mode(); mode.getEffects().add(new AddCountersEffect()); this.getSpellAbility().addMode(mode); @@ -90,10 +90,10 @@ public class DustOfMoments extends CardImpl { public DustOfMomentsEffect() { super(Outcome.Benefit); this.counter = new Counter(CounterType.TIME.getName(), 2); - this.permFilter = new FilterCard("permanent and each suspended card with time counter"); + this.permFilter = new FilterCard("permanent and each suspended card"); permFilter.add(new CounterPredicate(CounterType.TIME)); - this.exiledFilter = new FilterCard("permanent and each suspended card with time counter"); + this.exiledFilter = new FilterCard("permanent and each suspended card"); exiledFilter.add(new CardCounterPredicate(CounterType.TIME)); setText(); } @@ -168,7 +168,7 @@ public class DustOfMoments extends CardImpl { } if (!game.isSimulation()) game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") - .append(controller.getLogName()).append(getActionStr()).append("s") + .append(controller.getLogName()).append(getActionStr()).append("s ") .append(counter.getCount()).append(" ").append(counterName.toLowerCase()) .append(" counter on ").append(card.getName()).toString()); } From cb892303273f5802aad3371614982da8f6a35b9a Mon Sep 17 00:00:00 2001 From: glerman Date: Fri, 3 Jul 2015 17:35:28 +0300 Subject: [PATCH 064/375] added todos --- .../test/java/org/mage/test/cards/single/DustOfMomentsTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java index d12b8e600e0..b89d8f45c26 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java @@ -18,6 +18,8 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class DustOfMomentsTest extends CardTestPlayerBase { //TODO: why the hell is PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same card??? + //TODO: fix tooltip + //TODO: refactor effect code @Test public void testRemoveCounters() throws Exception { From 584e7fb394e96a12f16db56403891845e9a02be7 Mon Sep 17 00:00:00 2001 From: Gal Lerman Date: Mon, 6 Jul 2015 23:49:03 +0300 Subject: [PATCH 065/375] edited TODOs and comment header in clean_dbs.sh --- Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java | 5 ++++- .../java/org/mage/test/cards/single/DustOfMomentsTest.java | 4 ---- clean_dbs.sh | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java index 5a543e83fea..1736ded2689 100644 --- a/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java +++ b/Mage.Sets/src/mage/sets/futuresight/DustOfMoments.java @@ -80,7 +80,10 @@ public class DustOfMoments extends CardImpl { } - + //TODO: PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same Card + //TODO: This means I can't use a Card generic for Permanents and Exiled cards and use Card.getCounters(game) + //TODO: This is the reason i've copy pasted some logic in DustOfMomentsEffect + //TODO: After this issue is fixed/explained i'll refactor the code public abstract static class DustOfMomentsEffect extends OneShotEffect { private final Counter counter; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java index b89d8f45c26..bd0af195e47 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/DustOfMomentsTest.java @@ -17,10 +17,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase; */ public class DustOfMomentsTest extends CardTestPlayerBase { - //TODO: why the hell is PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same card??? - //TODO: fix tooltip - //TODO: refactor effect code - @Test public void testRemoveCounters() throws Exception { initGame(); diff --git a/clean_dbs.sh b/clean_dbs.sh index c091f9f7613..9ccf51fd6d2 100644 --- a/clean_dbs.sh +++ b/clean_dbs.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Cleans the DB from Server, Client and Test modules find . -type f | grep -i cards.h2*.db | xargs rm -v \ No newline at end of file From e772c768cd0859228ec38cf7874a86efc83266c4 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 15 Jul 2015 23:20:36 +0200 Subject: [PATCH 066/375] Fixed possible null pointer exception of Bitter Feud. --- .../mage/sets/commander2014/BitterFeud.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java b/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java index 91083dff8e9..7ba41f23715 100644 --- a/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java +++ b/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java @@ -60,12 +60,11 @@ public class BitterFeud extends CardImpl { super(ownerId, 32, "Bitter Feud", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); this.expansionSetCode = "C14"; - // As Bitter Feud enters the battlefield, choose two players. this.addAbility(new AsEntersBattlefieldAbility(new BitterFeudEntersBattlefieldEffect())); // If a source controlled by one of the chosen players would deal damage to the other chosen player or a permanent that player controls, that source deals double that damage to that player or permanent instead. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BitterFeudEffect() )); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BitterFeudEffect())); } public BitterFeud(final BitterFeud card) { @@ -94,16 +93,18 @@ class BitterFeudEntersBattlefieldEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Permanent permanent = game.getPermanent(source.getSourceId()); if (controller != null && permanent != null) { - TargetPlayer target = new TargetPlayer(2,2, true); + TargetPlayer target = new TargetPlayer(2, 2, true); controller.chooseTarget(outcome, target, source, game); Player player1 = game.getPlayer(target.getFirstTarget()); - Player player2 = game.getPlayer(target.getTargets().get(1)); - if (player1 != null && player2 != null) { - game.getState().setValue(source.getSourceId() + "_player1", player1); - game.getState().setValue(source.getSourceId() + "_player2", player2); - game.informPlayers(permanent.getLogName() + ": " + controller.getLogName() + " has chosen " + player1.getLogName() + " and " + player2.getLogName()); - permanent.addInfo("chosen players", "Chosen players: " + player1.getName() +", " + player2.getName() + "", game); - return true; + if (target.getTargets().size() > 1) { + Player player2 = game.getPlayer(target.getTargets().get(1)); + if (player1 != null && player2 != null) { + game.getState().setValue(source.getSourceId() + "_player1", player1); + game.getState().setValue(source.getSourceId() + "_player2", player2); + game.informPlayers(permanent.getLogName() + ": " + controller.getLogName() + " has chosen " + player1.getLogName() + " and " + player2.getLogName()); + permanent.addInfo("chosen players", "Chosen players: " + player1.getName() + ", " + player2.getName() + "", game); + return true; + } } } return false; @@ -135,9 +136,9 @@ class BitterFeudEffect extends ReplacementEffectImpl { return new BitterFeudEffect(this); } - @Override + @Override public boolean checksEventType(GameEvent event, Game game) { - switch(event.getType()) { + switch (event.getType()) { case DAMAGE_CREATURE: case DAMAGE_PLAYER: case DAMAGE_PLANESWALKER: @@ -146,7 +147,7 @@ class BitterFeudEffect extends ReplacementEffectImpl { return false; } } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { player1 = (Player) game.getState().getValue(source.getSourceId() + "_player1"); @@ -178,9 +179,9 @@ class BitterFeudEffect extends ReplacementEffectImpl { } else if (damageSource instanceof Card) { sourcePlayerId = ((Card) damageSource).getOwnerId(); } - if (sourcePlayerId != null && - (player1.getId().equals(sourcePlayerId) || player2.getId().equals(sourcePlayerId)) && - !sourcePlayerId.equals(targetPlayerId)) { + if (sourcePlayerId != null + && (player1.getId().equals(sourcePlayerId) || player2.getId().equals(sourcePlayerId)) + && !sourcePlayerId.equals(targetPlayerId)) { return true; } } From fa58de0772b7d1081c17141e07dd188a49dbb8e5 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Thu, 16 Jul 2015 01:15:24 -0400 Subject: [PATCH 067/375] Added Channel. --- .../src/mage/sets/fourthedition/Channel.java | 52 +++++++ .../src/mage/sets/ftvexiled/Channel.java | 54 +++++++ .../src/mage/sets/limitedalpha/Channel.java | 52 +++++++ .../src/mage/sets/limitedbeta/Channel.java | 52 +++++++ .../mage/sets/masterseditioniv/Channel.java | 54 +++++++ .../src/mage/sets/revisededition/Channel.java | 145 ++++++++++++++++++ .../mage/sets/unlimitededition/Channel.java | 52 +++++++ .../src/mage/sets/vintagemasters/Channel.java | 54 +++++++ 8 files changed, 515 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/fourthedition/Channel.java create mode 100644 Mage.Sets/src/mage/sets/ftvexiled/Channel.java create mode 100644 Mage.Sets/src/mage/sets/limitedalpha/Channel.java create mode 100644 Mage.Sets/src/mage/sets/limitedbeta/Channel.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/Channel.java create mode 100644 Mage.Sets/src/mage/sets/revisededition/Channel.java create mode 100644 Mage.Sets/src/mage/sets/unlimitededition/Channel.java create mode 100644 Mage.Sets/src/mage/sets/vintagemasters/Channel.java diff --git a/Mage.Sets/src/mage/sets/fourthedition/Channel.java b/Mage.Sets/src/mage/sets/fourthedition/Channel.java new file mode 100644 index 00000000000..1eba2a06f51 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/Channel.java @@ -0,0 +1,52 @@ +/* + * 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.fourthedition; + +import java.util.UUID; + +/** + * + * @author emerald000 + */ +public class Channel extends mage.sets.revisededition.Channel { + + public Channel(UUID ownerId) { + super(ownerId); + this.cardNumber = 120; + this.expansionSetCode = "4ED"; + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvexiled/Channel.java b/Mage.Sets/src/mage/sets/ftvexiled/Channel.java new file mode 100644 index 00000000000..09edbf46012 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvexiled/Channel.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.ftvexiled; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author emerald000 + */ +public class Channel extends mage.sets.revisededition.Channel { + + public Channel(UUID ownerId) { + super(ownerId); + this.cardNumber = 3; + this.expansionSetCode = "FVE"; + this.rarity = Rarity.MYTHIC; + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Channel.java b/Mage.Sets/src/mage/sets/limitedalpha/Channel.java new file mode 100644 index 00000000000..a69890bb8e7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/limitedalpha/Channel.java @@ -0,0 +1,52 @@ +/* + * 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.limitedalpha; + +import java.util.UUID; + +/** + * + * @author emerald000 + */ +public class Channel extends mage.sets.revisededition.Channel { + + public Channel(UUID ownerId) { + super(ownerId); + this.cardNumber = 97; + this.expansionSetCode = "LEA"; + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/limitedbeta/Channel.java b/Mage.Sets/src/mage/sets/limitedbeta/Channel.java new file mode 100644 index 00000000000..b461cfea6fe --- /dev/null +++ b/Mage.Sets/src/mage/sets/limitedbeta/Channel.java @@ -0,0 +1,52 @@ +/* + * 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.limitedbeta; + +import java.util.UUID; + +/** + * + * @author emerald000 + */ +public class Channel extends mage.sets.revisededition.Channel { + + public Channel(UUID ownerId) { + super(ownerId); + this.cardNumber = 97; + this.expansionSetCode = "LEB"; + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/Channel.java b/Mage.Sets/src/mage/sets/masterseditioniv/Channel.java new file mode 100644 index 00000000000..fbc0c4dbe74 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/Channel.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.masterseditioniv; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author emerald000 + */ +public class Channel extends mage.sets.revisededition.Channel { + + public Channel(UUID ownerId) { + super(ownerId); + this.cardNumber = 145; + this.expansionSetCode = "ME4"; + this.rarity = Rarity.RARE; + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/revisededition/Channel.java b/Mage.Sets/src/mage/sets/revisededition/Channel.java new file mode 100644 index 00000000000..0eb11c09a12 --- /dev/null +++ b/Mage.Sets/src/mage/sets/revisededition/Channel.java @@ -0,0 +1,145 @@ +/* + * 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.revisededition; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.SpecialAction; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.CreateSpecialActionEffect; +import mage.abilities.effects.common.RemoveSpecialActionEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author emerald000 + */ +public class Channel extends CardImpl { + + public Channel(UUID ownerId) { + super(ownerId, 95, "Channel", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{G}{G}"); + this.expansionSetCode = "3ED"; + + // Until end of turn, any time you could activate a mana ability, you may pay 1 life. If you do, add {1} to your mana pool. + this.getSpellAbility().addEffect(new ChannelEffect()); + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} + +class ChannelEffect extends OneShotEffect { + + ChannelEffect() { + super(Outcome.PutManaInPool); + this.staticText = "Until end of turn, any time you could activate a mana ability, you may pay 1 life. If you do, add {1} to your mana pool"; + } + + ChannelEffect(final ChannelEffect effect) { + super(effect); + } + + @Override + public ChannelEffect copy() { + return new ChannelEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + SpecialAction specialAction = new ChannelSpecialAction(); + new CreateSpecialActionEffect(specialAction).apply(game, source); + + // Create a hidden delayed triggered ability to remove the special action at end of turn. + new CreateDelayedTriggeredAbilityEffect(new ChannelDelayedTriggeredAbility(specialAction.getId()), false).apply(game, source); + return true; + } +} + +class ChannelSpecialAction extends SpecialAction { + + ChannelSpecialAction() { + super(); + this.addCost(new PayLifeCost(1)); + this.addEffect(new BasicManaEffect(Mana.ColorlessMana)); + } + + ChannelSpecialAction(final ChannelSpecialAction ability) { + super(ability); + } + + @Override + public ChannelSpecialAction copy() { + return new ChannelSpecialAction(this); + } +} + +class ChannelDelayedTriggeredAbility extends DelayedTriggeredAbility { + + ChannelDelayedTriggeredAbility(UUID specialActionId) { + super(new RemoveSpecialActionEffect(specialActionId), Duration.OneUse); + this.usesStack = false; + this.setRuleVisible(false); + } + + ChannelDelayedTriggeredAbility(ChannelDelayedTriggeredAbility ability) { + super(ability); + } + + @Override + public ChannelDelayedTriggeredAbility copy() { + return new ChannelDelayedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.CLEANUP_STEP_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/unlimitededition/Channel.java b/Mage.Sets/src/mage/sets/unlimitededition/Channel.java new file mode 100644 index 00000000000..6258241b39c --- /dev/null +++ b/Mage.Sets/src/mage/sets/unlimitededition/Channel.java @@ -0,0 +1,52 @@ +/* + * 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.unlimitededition; + +import java.util.UUID; + +/** + * + * @author emerald000 + */ +public class Channel extends mage.sets.revisededition.Channel { + + public Channel(UUID ownerId) { + super(ownerId); + this.cardNumber = 97; + this.expansionSetCode = "2ED"; + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/vintagemasters/Channel.java b/Mage.Sets/src/mage/sets/vintagemasters/Channel.java new file mode 100644 index 00000000000..e0b0cc26a92 --- /dev/null +++ b/Mage.Sets/src/mage/sets/vintagemasters/Channel.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.vintagemasters; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author emerald000 + */ +public class Channel extends mage.sets.revisededition.Channel { + + public Channel(UUID ownerId) { + super(ownerId); + this.cardNumber = 200; + this.expansionSetCode = "VMA"; + this.rarity = Rarity.MYTHIC; + } + + public Channel(final Channel card) { + super(card); + } + + @Override + public Channel copy() { + return new Channel(this); + } +} From 0a5c152db24711e3f382d7334c9a1fa6e91362a4 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 16 Jul 2015 08:57:14 +0300 Subject: [PATCH 068/375] Implement cards: Death Bomb, Ertai's Trickery, Shriek of Death, and Skyshroud Blessing --- .../src/mage/sets/planeshift/DeathBomb.java | 76 ++++++++++++++++ .../mage/sets/planeshift/ErtaisTrickery.java | 91 +++++++++++++++++++ .../mage/sets/planeshift/ShriekOfDread.java | 62 +++++++++++++ .../sets/planeshift/SkyshroudBlessing.java | 65 +++++++++++++ 4 files changed, 294 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/planeshift/DeathBomb.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/ErtaisTrickery.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/ShriekOfDread.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/SkyshroudBlessing.java diff --git a/Mage.Sets/src/mage/sets/planeshift/DeathBomb.java b/Mage.Sets/src/mage/sets/planeshift/DeathBomb.java new file mode 100644 index 00000000000..8266d993c30 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/DeathBomb.java @@ -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.planeshift; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.LoseLifeTargetControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class DeathBomb extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonblack creature"); + static { + filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK))); + } + + public DeathBomb(UUID ownerId) { + super(ownerId, 41, "Death Bomb", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{B}"); + this.expansionSetCode = "PLS"; + + // As an additional cost to cast Death Bomb, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1, new FilterControlledCreaturePermanent("a creature"), true))); + // Destroy target nonblack creature. It can't be regenerated. Its controller loses 2 life. + this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); + this.getSpellAbility().addEffect(new LoseLifeTargetControllerEffect(2)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public DeathBomb(final DeathBomb card) { + super(card); + } + + @Override + public DeathBomb copy() { + return new DeathBomb(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/ErtaisTrickery.java b/Mage.Sets/src/mage/sets/planeshift/ErtaisTrickery.java new file mode 100644 index 00000000000..7018891526b --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/ErtaisTrickery.java @@ -0,0 +1,91 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.target.TargetSpell; + +/** + * + * @author LoneFox + */ +public class ErtaisTrickery extends CardImpl { + + public ErtaisTrickery(UUID ownerId) { + super(ownerId, 24, "Ertai's Trickery", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{U}"); + this.expansionSetCode = "PLS"; + + // Counter target spell if it was kicked. + this.getSpellAbility().addEffect(new ErtaisTrickeryEffect()); + this.getSpellAbility().addTarget(new TargetSpell()); + } + + public ErtaisTrickery(final ErtaisTrickery card) { + super(card); + } + + @Override + public ErtaisTrickery copy() { + return new ErtaisTrickery(this); + } +} + +class ErtaisTrickeryEffect extends CounterTargetEffect { + + public ErtaisTrickeryEffect() { + super(); + staticText = "Counter target spell if it was kicked."; + } + + public ErtaisTrickeryEffect(final CounterTargetEffect effect) { + super(effect); + } + + @Override + public ErtaisTrickeryEffect copy() { + return new ErtaisTrickeryEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell targetSpell = game.getStack().getSpell(source.getFirstTarget()); + if(targetSpell != null && KickedCondition.getInstance().apply(game, targetSpell.getSpellAbility())) { + return super.apply(game, source); + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/sets/planeshift/ShriekOfDread.java b/Mage.Sets/src/mage/sets/planeshift/ShriekOfDread.java new file mode 100644 index 00000000000..769e10d3d32 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/ShriekOfDread.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.planeshift; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FearAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class ShriekOfDread extends CardImpl { + + public ShriekOfDread(UUID ownerId) { + super(ownerId, 53, "Shriek of Dread", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "PLS"; + + // Target creature gains fear until end of turn. + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public ShriekOfDread(final ShriekOfDread card) { + super(card); + } + + @Override + public ShriekOfDread copy() { + return new ShriekOfDread(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/SkyshroudBlessing.java b/Mage.Sets/src/mage/sets/planeshift/SkyshroudBlessing.java new file mode 100644 index 00000000000..decb8652a7b --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/SkyshroudBlessing.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.planeshift; + +import java.util.UUID; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author LoneFox + */ +public class SkyshroudBlessing extends CardImpl { + + public SkyshroudBlessing(UUID ownerId) { + super(ownerId, 92, "Skyshroud Blessing", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{G}"); + this.expansionSetCode = "PLS"; + + // Lands gain shroud until end of turn. + this.getSpellAbility().addEffect(new GainAbilityAllEffect(ShroudAbility.getInstance(), + Duration.EndOfTurn, new FilterLandPermanent("all lands"))); + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public SkyshroudBlessing(final SkyshroudBlessing card) { + super(card); + } + + @Override + public SkyshroudBlessing copy() { + return new SkyshroudBlessing(this); + } +} From 3149cd810fa0cc253d79d8b4ffa9e50961dac9dd Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 16 Jul 2015 09:30:02 +0300 Subject: [PATCH 069/375] Implement cards: Kavu Recluse, Reef Shaman, Sea Snidd, and Slimy Kavu --- .../src/mage/sets/apocalypse/ReefShaman.java | 72 +++++++++++++++++++ .../src/mage/sets/invasion/SlimyKavu.java | 70 ++++++++++++++++++ .../src/mage/sets/planeshift/KavuRecluse.java | 70 ++++++++++++++++++ .../src/mage/sets/planeshift/SeaSnidd.java | 71 ++++++++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/ReefShaman.java create mode 100644 Mage.Sets/src/mage/sets/invasion/SlimyKavu.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/KavuRecluse.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/SeaSnidd.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/ReefShaman.java b/Mage.Sets/src/mage/sets/apocalypse/ReefShaman.java new file mode 100644 index 00000000000..a66ce005308 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/ReefShaman.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LoneFox + */ +public class ReefShaman extends CardImpl { + + public ReefShaman(UUID ownerId) { + super(ownerId, 29, "Reef Shaman", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{U}"); + this.expansionSetCode = "APC"; + this.subtype.add("Merfolk"); + this.subtype.add("Shaman"); + this.power = new MageInt(0); + this.toughness = new MageInt(2); + + // {T}: Target land becomes the basic land type of your choice until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn), new TapSourceCost()); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public ReefShaman(final ReefShaman card) { + super(card); + } + + @Override + public ReefShaman copy() { + return new ReefShaman(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/SlimyKavu.java b/Mage.Sets/src/mage/sets/invasion/SlimyKavu.java new file mode 100644 index 00000000000..2f32f766387 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/SlimyKavu.java @@ -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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LoneFox + */ +public class SlimyKavu extends CardImpl { + + public SlimyKavu(UUID ownerId) { + super(ownerId, 170, "Slimy Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Kavu"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {T}: Target land becomes a Swamp until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Swamp"), new TapSourceCost()); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public SlimyKavu(final SlimyKavu card) { + super(card); + } + + @Override + public SlimyKavu copy() { + return new SlimyKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/KavuRecluse.java b/Mage.Sets/src/mage/sets/planeshift/KavuRecluse.java new file mode 100644 index 00000000000..b90364edac5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/KavuRecluse.java @@ -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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LoneFox + */ +public class KavuRecluse extends CardImpl { + + public KavuRecluse(UUID ownerId) { + super(ownerId, 64, "Kavu Recluse", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Kavu"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {T}: Target land becomes a Forest until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Forest"), new TapSourceCost()); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public KavuRecluse(final KavuRecluse card) { + super(card); + } + + @Override + public KavuRecluse copy() { + return new KavuRecluse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/SeaSnidd.java b/Mage.Sets/src/mage/sets/planeshift/SeaSnidd.java new file mode 100644 index 00000000000..f6eb16aabcc --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/SeaSnidd.java @@ -0,0 +1,71 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LoneFox + */ +public class SeaSnidd extends CardImpl { + + public SeaSnidd(UUID ownerId) { + super(ownerId, 31, "Sea Snidd", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Beast"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {T}: Target land becomes the basic land type of your choice until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn), new TapSourceCost()); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public SeaSnidd(final SeaSnidd card) { + super(card); + } + + @Override + public SeaSnidd copy() { + return new SeaSnidd(this); + } +} From 68d5f7bb9f8f91b3b8da1fd3d26d9c02a1e3e8a1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 16 Jul 2015 11:05:32 +0200 Subject: [PATCH 070/375] * StormAbility - Fixed that the storm amount was not calculated correctly if a game state was restored (fixes #1051). --- .../cards/abilities/keywords/StormTest.java | 64 +++++++- .../abilities/keyword/ForecastAbility.java | 1 + Mage/src/mage/game/Game.java | 5 + .../common/CastSpellLastTurnWatcher.java | 148 +++++++++--------- 4 files changed, 143 insertions(+), 75 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java index de7dbf4862a..fbefd4b0063 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/StormTest.java @@ -204,7 +204,7 @@ public class StormTest extends CardTestPlayerBase { * */ @Test - public void testStormAndFlshback() { + public void testStormAndFlashback() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 8); addCard(Zone.BATTLEFIELD, playerA, "Island", 1); // Geistflame deals 1 damage to target creature or player. @@ -231,4 +231,66 @@ public class StormTest extends CardTestPlayerBase { assertLife(playerB, 12); // 3 from the Geistflame + 5 from Grapeshot } + /* + * I cast Wheel of Fortune. (1st) + * I cast Mox Emerald. (2nd) + * I cast Turnabout. (3rd) + * I cast Yawgmoth's Will. (4th) + * I cast Palinchron from graveyard. (5th) + * I cast Mind's Desire from graveyard. Storm makes 2 + * copies (instead of 5). (6th) I cast Turnabout from graveyard. (7th) I + * cast Golgari Signet from exile. (8th) I cast Empty the Warrens. Storm + * makes 5 copies (instead of 8). (9th) + * + */ + @Test + public void testStormYawgmothsWill() { + + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); + addCard(Zone.BATTLEFIELD, playerA, "Island", 10); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); + // Each player discards his or her hand, + // then draws seven cards. + addCard(Zone.HAND, playerA, "Wheel of Fortune", 1); // {2}{R} + addCard(Zone.LIBRARY, playerA, "Mox Emerald", 1); + // Choose artifact, creature, or land. Tap all untapped permanents of the chosen type target player controls, or untap all tapped permanents of that type that player controls. + addCard(Zone.LIBRARY, playerA, "Turnabout", 1); // {2}{U}{U} + + // Until end of turn, you may play cards from your graveyard. + // If a card would be put into your graveyard from anywhere this turn, exile that card instead. + addCard(Zone.LIBRARY, playerA, "Yawgmoth's Will", 1); // {2}{B} + skipInitShuffling(); + + // Flying + // When Palinchron enters the battlefield, untap up to seven lands. + // {2}{U}{U}: Return Palinchron to its owner's hand. + addCard(Zone.HAND, playerA, "Palinchron", 1); // {5}{U}{U} + // Shuffle your library. Then exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. + // Storm + addCard(Zone.HAND, playerA, "Mind's Desire", 1); // {4}{U}{U} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wheel of Fortune"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mox Emerald"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Turnabout"); + setChoice(playerA, "Land"); + setChoice(playerA, "Untap"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yawgmoth's Will"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Palinchron"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind's Desire"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Wheel of Fortune", 1); + assertPermanentCount(playerA, "Mox Emerald", 1); + assertGraveyardCount(playerA, "Turnabout", 1); + assertPermanentCount(playerA, "Palinchron", 1); + + assertExileCount("Yawgmoth's Will", 1); + assertExileCount("Mind's Desire", 1); + + assertExileCount(playerA, 8); // 6 from Mind's Desire and the Desire and the Yawgmoth's Will + + } + } diff --git a/Mage/src/mage/abilities/keyword/ForecastAbility.java b/Mage/src/mage/abilities/keyword/ForecastAbility.java index eba53827b62..43ba532aae3 100644 --- a/Mage/src/mage/abilities/keyword/ForecastAbility.java +++ b/Mage/src/mage/abilities/keyword/ForecastAbility.java @@ -70,6 +70,7 @@ public class ForecastAbility extends LimitedTimesPerTurnActivatedAbility { @Override public boolean canActivate(UUID playerId, Game game) { // May be activated only during the upkeep step of the card's owner + // Because it can only be activated from a players hand it should be ok to check here with controllerId instead of card.getOwnerId(). if (!game.getActivePlayerId().equals(controllerId) || !PhaseStep.UPKEEP.equals(game.getStep().getType())) { return false; } diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index 4e49903dc59..ff69876d5b6 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -154,6 +154,11 @@ public interface Game extends MageItem, Serializable { boolean canPlaySorcery(UUID playerId); + /** + * Id of the player the current turn it is. + * + * @return + */ UUID getActivePlayerId(); UUID getPriorityPlayerId(); diff --git a/Mage/src/mage/watchers/common/CastSpellLastTurnWatcher.java b/Mage/src/mage/watchers/common/CastSpellLastTurnWatcher.java index 1b22784e905..d78f382b523 100644 --- a/Mage/src/mage/watchers/common/CastSpellLastTurnWatcher.java +++ b/Mage/src/mage/watchers/common/CastSpellLastTurnWatcher.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.watchers.common; import java.util.ArrayList; @@ -41,9 +40,9 @@ import mage.game.events.GameEvent; import mage.watchers.Watcher; /** -* -* @author nantuko, BetaSteward_at_googlemail.com -*/ + * + * @author nantuko, BetaSteward_at_googlemail.com + */ public class CastSpellLastTurnWatcher extends Watcher { private final Map amountOfSpellsCastOnPrevTurn = new HashMap<>(); @@ -51,83 +50,84 @@ public class CastSpellLastTurnWatcher extends Watcher { private final List spellsCastThisTurnInOrder = new ArrayList<>(); public CastSpellLastTurnWatcher() { - super("CastSpellLastTurnWatcher", WatcherScope.GAME); + super("CastSpellLastTurnWatcher", WatcherScope.GAME); } public CastSpellLastTurnWatcher(final CastSpellLastTurnWatcher watcher) { - super(watcher); - for (Entry entry: watcher.amountOfSpellsCastOnCurrentTurn.entrySet()) { - amountOfSpellsCastOnCurrentTurn.put(entry.getKey(), entry.getValue()); - } - for (Entry entry: watcher.amountOfSpellsCastOnPrevTurn.entrySet()) { - amountOfSpellsCastOnPrevTurn.put(entry.getKey(), entry.getValue()); - } + super(watcher); + for (Entry entry : watcher.amountOfSpellsCastOnCurrentTurn.entrySet()) { + amountOfSpellsCastOnCurrentTurn.put(entry.getKey(), entry.getValue()); + } + for (Entry entry : watcher.amountOfSpellsCastOnPrevTurn.entrySet()) { + amountOfSpellsCastOnPrevTurn.put(entry.getKey(), entry.getValue()); + } + this.spellsCastThisTurnInOrder.addAll(watcher.spellsCastThisTurnInOrder); } @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.SPELL_CAST) { - spellsCastThisTurnInOrder.add(new MageObjectReference(event.getTargetId(), game)); - UUID playerId = event.getPlayerId(); - if (playerId != null) { - Integer amount = amountOfSpellsCastOnCurrentTurn.get(playerId); - if (amount == null) { - amount = 1; - } else { - amount = amount+1; - } - amountOfSpellsCastOnCurrentTurn.put(playerId, amount); - } - } + if (event.getType() == GameEvent.EventType.SPELL_CAST) { + spellsCastThisTurnInOrder.add(new MageObjectReference(event.getTargetId(), game)); + UUID playerId = event.getPlayerId(); + if (playerId != null) { + Integer amount = amountOfSpellsCastOnCurrentTurn.get(playerId); + if (amount == null) { + amount = 1; + } else { + amount = amount + 1; + } + amountOfSpellsCastOnCurrentTurn.put(playerId, amount); + } + } } @Override public void reset() { - amountOfSpellsCastOnPrevTurn.clear(); - amountOfSpellsCastOnPrevTurn.putAll(amountOfSpellsCastOnCurrentTurn); - amountOfSpellsCastOnCurrentTurn.clear(); - spellsCastThisTurnInOrder.clear(); + amountOfSpellsCastOnPrevTurn.clear(); + amountOfSpellsCastOnPrevTurn.putAll(amountOfSpellsCastOnCurrentTurn); + amountOfSpellsCastOnCurrentTurn.clear(); + spellsCastThisTurnInOrder.clear(); } public Map getAmountOfSpellsCastOnPrevTurn() { - return amountOfSpellsCastOnPrevTurn; + return amountOfSpellsCastOnPrevTurn; } public Map getAmountOfSpellsCastOnCurrentTurn() { - return amountOfSpellsCastOnCurrentTurn; + return amountOfSpellsCastOnCurrentTurn; } - + public int getAmountOfSpellsAllPlayersCastOnCurrentTurn() { int totalAmount = 0; - for(Integer amount: amountOfSpellsCastOnCurrentTurn.values()) { + for (Integer amount : amountOfSpellsCastOnCurrentTurn.values()) { totalAmount += amount; } return totalAmount; } public int getAmountOfSpellsPlayerCastOnCurrentTurn(UUID playerId) { - Integer value = amountOfSpellsCastOnCurrentTurn.get(playerId); - if (value != null) { - return value; - } else { - return 0; - } + Integer value = amountOfSpellsCastOnCurrentTurn.get(playerId); + if (value != null) { + return value; + } else { + return 0; + } } public int getSpellOrder(MageObjectReference spell, Game game) { - int index = 0; - for (MageObjectReference mor : spellsCastThisTurnInOrder) { - index++; - if (mor.equals(spell)) { - return index; - } - } - return 0; + int index = 0; + for (MageObjectReference mor : spellsCastThisTurnInOrder) { + index++; + if (mor.equals(spell)) { + return index; + } + } + return 0; } @Override public CastSpellLastTurnWatcher copy() { - return new CastSpellLastTurnWatcher(this); + return new CastSpellLastTurnWatcher(this); } } From 7ce030101c64a115df79dc419fc330a5aad55447 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Thu, 16 Jul 2015 06:29:02 -0400 Subject: [PATCH 071/375] Added Mishra, Artificer Prodigy. --- .../timespiral/MishraArtificerProdigy.java | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java diff --git a/Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java b/Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java new file mode 100644 index 00000000000..28488d56754 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java @@ -0,0 +1,189 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.common.TargetCardInHand; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author emerald000 + */ +public class MishraArtificerProdigy extends CardImpl { + + public MishraArtificerProdigy(UUID ownerId) { + super(ownerId, 243, "Mishra, Artificer Prodigy", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}{B}{R}"); + this.expansionSetCode = "TSP"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Artificer"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Whenever you cast an artifact spell, you may search your graveyard, hand, and/or library for a card with the same name as that spell and put it onto the battlefield. If you search your library this way, shuffle it. + this.addAbility(new MishraArtificerProdigyTriggeredAbility()); + } + + public MishraArtificerProdigy(final MishraArtificerProdigy card) { + super(card); + } + + @Override + public MishraArtificerProdigy copy() { + return new MishraArtificerProdigy(this); + } +} + +class MishraArtificerProdigyTriggeredAbility extends TriggeredAbilityImpl { + + MishraArtificerProdigyTriggeredAbility() { + super(Zone.BATTLEFIELD, new MishraArtificerProdigyEffect(), true); + } + + MishraArtificerProdigyTriggeredAbility(final MishraArtificerProdigyTriggeredAbility ability) { + super(ability); + } + + @Override + public MishraArtificerProdigyTriggeredAbility copy() { + return new MishraArtificerProdigyTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(this.getControllerId())) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null && spell.getCardType().contains(CardType.ARTIFACT)) { + ((MishraArtificerProdigyEffect) this.getEffects().get(0)).setName(spell.getName()); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever you cast an artifact spell, you may search your graveyard, hand, and/or library for a card with the same name as that spell and put it onto the battlefield. If you search your library this way, shuffle it."; + } +} + +class MishraArtificerProdigyEffect extends OneShotEffect { + + private String cardName; + + MishraArtificerProdigyEffect() { + super(Outcome.PutCardInPlay); + this.staticText = "Search your graveyard, hand, and/or library for a card named " + cardName + " and put it onto the battlefield. If you search your library this way, shuffle it."; + } + + MishraArtificerProdigyEffect(final MishraArtificerProdigyEffect effect) { + super(effect); + this.cardName = effect.cardName; + } + + @Override + public MishraArtificerProdigyEffect copy() { + return new MishraArtificerProdigyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + FilterCard filter = new FilterCard("card named " + this.cardName); + filter.add(new NamePredicate(cardName)); + Card card = null; + Zone zone = null; + // Graveyard + if (controller.chooseUse(Outcome.Neutral, "Search your graveyard?", source, game)) { + TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(0, 1, filter); + if (controller.choose(Outcome.PutCardInPlay, controller.getGraveyard(), target, game)) { + card = game.getCard(target.getFirstTarget()); + if (card != null) { + zone = Zone.GRAVEYARD; + } + } + } + // Hand + if (card == null && controller.chooseUse(Outcome.Neutral, "Search your hand?", source, game)) { + TargetCardInHand target = new TargetCardInHand(0, 1, filter); + if (controller.choose(Outcome.PutCardInPlay, controller.getHand(), target, game)) { + card = game.getCard(target.getFirstTarget()); + if (card != null) { + zone = Zone.HAND; + } + } + } + // Library + if (card == null && controller.chooseUse(Outcome.Neutral, "Search your library?", source, game)) { + TargetCardInLibrary target = new TargetCardInLibrary(0, 1, filter); + if (controller.searchLibrary(target, game)) { + card = game.getCard(target.getFirstTarget()); + if (card != null) { + zone = Zone.LIBRARY; + } + } + controller.shuffleLibrary(game); + } + // Put on battlefield + if (card != null) { + controller.moveCards(card, zone, Zone.BATTLEFIELD, source, game); + } + return true; + } + return false; + } + + public void setName(String cardName) { + this.cardName = cardName; + } +} From 0c0fe9984ed0900e1e45ad38a7522b50beb9a319 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 16 Jul 2015 13:10:11 +0200 Subject: [PATCH 072/375] Some fixes/improvements to AI target handling and tests. --- .../src/mage/player/ai/SimulatedPlayer2.java | 8 +- .../java/mage/player/ai/ComputerPlayer.java | 19 +++- .../mage/sets/dissension/NovijenSages.java | 8 +- .../test/AI/basic/TargetsAreChosenTest.java | 102 ++++++++++++++++++ .../mage/test/cards/watchers/BoseijuTest.java | 39 +++---- .../costs/common/RemoveCounterCost.java | 31 +++--- Mage/src/mage/target/TargetImpl.java | 102 ++++++++++-------- 7 files changed, 217 insertions(+), 92 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java index 42a7e062dd7..75d69b98518 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java @@ -302,10 +302,10 @@ public class SimulatedPlayer2 extends ComputerPlayer { } if (bad) { - // remove its own creatures, player itself for bad effects + // remove its own creatures, player itself for bad effects with one target while (iterator.hasNext()) { Ability ability1 = iterator.next(); - if (ability1.getTargets().size() == 1) { + if (ability1.getTargets().size() == 1 && ability1.getTargets().get(0).getTargets().size() == 1) { Permanent permanent = game.getPermanent(ability1.getFirstTarget()); if (permanent != null && !game.getOpponents(playerId).contains(permanent.getControllerId())) { iterator.remove(); @@ -318,10 +318,10 @@ public class SimulatedPlayer2 extends ComputerPlayer { } } if (good) { - // remove opponent creatures and opponent for only good effects + // remove opponent creatures and opponent for only good effects with one target while (iterator.hasNext()) { Ability ability1 = iterator.next(); - if (ability1.getTargets().size() == 1) { + if (ability1.getTargets().size() == 1 && ability1.getTargets().get(0).getTargets().size() == 1) { Permanent permanent = game.getPermanent(ability1.getFirstTarget()); if (permanent != null && game.getOpponents(playerId).contains(permanent.getControllerId())) { iterator.remove(); diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 28264fff1a5..952fe020cff 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -161,7 +161,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { private transient final static Logger log = Logger.getLogger(ComputerPlayer.class); protected int PASSIVITY_PENALTY = 5; // Penalty value for doing nothing if some actions are availble - protected boolean ALLOW_INTERRUPT = true; // change this for test purposes to switch off interrupts while debugging + protected boolean ALLOW_INTERRUPT = false; // change this for test / debugging purposes to false to switch off interrupts while debugging private transient Map unplayable = new TreeMap<>(); private transient List playableNonInstant = new ArrayList<>(); @@ -301,12 +301,25 @@ public class ComputerPlayer extends PlayerImpl implements Player { } for (Permanent permanent : targets) { if (((TargetPermanent) target).canTarget(abilityControllerId, permanent.getId(), null, game) && !target.getTargets().contains(permanent.getId())) { + // stop to add targets if not needed and outcome is no advantage for AI player + if (target.getNumberOfTargets() == target.getTargets().size()) { + if (outcome.isGood() && hasOpponent(permanent.getControllerId(), game)) { + return true; + } + if (!outcome.isGood() && !hasOpponent(permanent.getControllerId(), game)) { + return true; + } + } + // add the target target.add(permanent.getId(), game); - return true; + if (target.doneChosing()) { + return true; + } } } - return false; + return target.isChosen(); } + if (target instanceof TargetCardInHand) { List cards = new ArrayList<>(); for (UUID cardId : ((TargetCardInHand) target).possibleTargets(sourceId, this.getId(), game)) { diff --git a/Mage.Sets/src/mage/sets/dissension/NovijenSages.java b/Mage.Sets/src/mage/sets/dissension/NovijenSages.java index 67fb5ceb705..3b0c226850b 100644 --- a/Mage.Sets/src/mage/sets/dissension/NovijenSages.java +++ b/Mage.Sets/src/mage/sets/dissension/NovijenSages.java @@ -49,12 +49,12 @@ import mage.target.TargetPermanent; * @author JotaPeRL */ public class NovijenSages extends CardImpl { - + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creatures you control with a +1/+1 counter on it"); static { filter.add(new CounterPredicate(CounterType.P1P1)); - } + } public NovijenSages(UUID ownerId) { super(ownerId, 27, "Novijen Sages", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{U}{U}"); @@ -67,10 +67,10 @@ public class NovijenSages extends CardImpl { // Graft 4 this.addAbility(new GraftAbility(this, 4)); - + // {1}, Remove two +1/+1 counters from among creatures you control: Draw a card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(1)); - ability.addCost(new RemoveCounterCost(new TargetPermanent(1, Integer.MAX_VALUE, filter, true), CounterType.P1P1, 2)); + ability.addCost(new RemoveCounterCost(new TargetPermanent(1, 2, filter, true), CounterType.P1P1, 2)); this.addAbility(ability); } diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java new file mode 100644 index 00000000000..7b65f262232 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java @@ -0,0 +1,102 @@ +/* + * 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 org.mage.test.AI.basic; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBaseAI; + +/** + * + * @author LevelX2 + */ +public class TargetsAreChosenTest extends CardTestPlayerBaseAI { + + /** + * Check that the AI selects a target from the own artifacts and also an + * artifact from the opponent artficats + */ + @Test + public void testRackAndRuin() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); + // Destroy two target artifacts. + addCard(Zone.HAND, playerA, "Rack and Ruin"); // {2}{R} + + addCard(Zone.BATTLEFIELD, playerA, "Mox Emerald", 2); + addCard(Zone.BATTLEFIELD, playerB, "Juggernaut"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Rack and Ruin", 1); + assertGraveyardCount(playerA, "Mox Emerald", 1); + assertGraveyardCount(playerB, "Juggernaut", 1); + } + + /** + * Check that the AI does not cast Rack and Ruin if it would destroy the + * owly creature on the battlefield owned by the AI + */ + @Test + public void testRackAndRuin2() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); + // Destroy two target artifacts. + addCard(Zone.HAND, playerA, "Rack and Ruin"); // {2}{R} + + addCard(Zone.BATTLEFIELD, playerB, "Mox Emerald"); + addCard(Zone.BATTLEFIELD, playerA, "Juggernaut"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Rack and Ruin", 0); + } + + /** + * Check that the AI does cast Rack and Ruin if it would destroy two targets + * of the opponent + */ + @Test + public void testRackAndRuin3() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); + // Destroy two target artifacts. + addCard(Zone.HAND, playerA, "Rack and Ruin"); // {2}{R} + + addCard(Zone.BATTLEFIELD, playerB, "Mox Emerald", 2); + addCard(Zone.BATTLEFIELD, playerA, "Juggernaut"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Rack and Ruin", 1); + assertGraveyardCount(playerB, "Mox Emerald", 2); + + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/watchers/BoseijuTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/watchers/BoseijuTest.java index 63340f54f37..e19a37ef2e4 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/watchers/BoseijuTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/watchers/BoseijuTest.java @@ -14,30 +14,33 @@ public class BoseijuTest extends CardTestPlayerBase { * Boseiju, Who Shelters All * Legendary Land * Boseiju, Who Shelters All enters the battlefield tapped. - * {T}, Pay 2 life: Add {1} to your mana pool. If that mana is spent on an + * {T}, Pay 2 life: Add {1} to your mana pool. If that mana is spent on an * instant or sorcery spell, that spell can't be countered by spells or abilities. * - */ - + */ + // test that instants and soceries can't be countered when Boseiju mana is used @Test public void testCantCounter() { - addCard(Zone.BATTLEFIELD, playerA, "Island", 6); + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); addCard(Zone.BATTLEFIELD, playerA, "Boseiju, Who Shelters All"); - addCard(Zone.HAND, playerA, "Brilliant Plan"); - addCard(Zone.HAND, playerA, "Counterspell"); - + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + // Draw three cards. + addCard(Zone.HAND, playerA, "Brilliant Plan"); // {4}{U} + + addCard(Zone.HAND, playerB, "Counterspell"); // {U}{U} + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brilliant Plan"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Counterspell", "Brilliant Plan"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Counterspell", "Brilliant Plan"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - + this.assertHandCount(playerA, 3); - this.assertGraveyardCount(playerA, "Counterspell", 1); - + this.assertGraveyardCount(playerB, "Counterspell", 1); + } - + // test that instants and soceries can be countered when Boseiju mana is not used @Test public void testCanCounter() { @@ -45,16 +48,16 @@ public class BoseijuTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Boseiju, Who Shelters All"); addCard(Zone.HAND, playerA, "Mental Note"); addCard(Zone.HAND, playerA, "Counterspell"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mental Note"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Counterspell", "Mental Note"); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - + this.assertHandCount(playerA, 0); this.assertGraveyardCount(playerA, 2); - + } - + } diff --git a/Mage/src/mage/abilities/costs/common/RemoveCounterCost.java b/Mage/src/mage/abilities/costs/common/RemoveCounterCost.java index 28526853e3b..85f7676eb46 100644 --- a/Mage/src/mage/abilities/costs/common/RemoveCounterCost.java +++ b/Mage/src/mage/abilities/costs/common/RemoveCounterCost.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,16 +20,14 @@ * 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.abilities.costs.common; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.UUID; import mage.abilities.Ability; @@ -55,7 +53,7 @@ public class RemoveCounterCost extends CostImpl { private String name; private CounterType counterTypeToRemove; private int countersToRemove; - + public RemoveCounterCost(TargetPermanent target) { this(target, null); } @@ -88,7 +86,7 @@ public class RemoveCounterCost extends CostImpl { if (controller != null) { target.clearChosen(); if (target.choose(Outcome.UnboostCreature, controllerId, sourceId, game)) { - for (UUID targetId: (List)target.getTargets()) { + for (UUID targetId : target.getTargets()) { Permanent permanent = game.getPermanent(targetId); if (permanent != null) { if (permanent.getCounters().size() > 0 && (counterTypeToRemove == null || permanent.getCounters().containsKey(counterTypeToRemove))) { @@ -123,18 +121,19 @@ public class RemoveCounterCost extends CostImpl { int numberOfCountersSelected = 1; if (countersLeft > 1 && countersOnPermanent > 1) { numberOfCountersSelected = controller.getAmount(1, Math.min(countersLeft, countersOnPermanent), - new StringBuilder("Remove how many counters from ").append(permanent.getIdName()).toString(), game); + new StringBuilder("Remove how many counters from ").append(permanent.getIdName()).toString(), game); } permanent.removeCounters(counterName, numberOfCountersSelected, game); - if (permanent.getCounters().getCount(counterName) == 0 ){ + if (permanent.getCounters().getCount(counterName) == 0) { permanent.getCounters().removeCounter(counterName); } countersRemoved += numberOfCountersSelected; - if (!game.isSimulation()) + if (!game.isSimulation()) { game.informPlayers(new StringBuilder(controller.getLogName()) - .append(" removes ").append(numberOfCountersSelected == 1 ? "a":numberOfCountersSelected).append(" ") - .append(counterName).append(numberOfCountersSelected == 1 ? " counter from ":" counters from ") - .append(permanent.getName()).toString()); + .append(" removes ").append(numberOfCountersSelected == 1 ? "a" : numberOfCountersSelected).append(" ") + .append(counterName).append(numberOfCountersSelected == 1 ? " counter from " : " counters from ") + .append(permanent.getName()).toString()); + } if (countersRemoved == countersToRemove) { this.paid = true; break; @@ -160,7 +159,7 @@ public class RemoveCounterCost extends CostImpl { if (counterTypeToRemove != null) { sb.append(counterTypeToRemove.getName()); } - sb.append(countersToRemove == 1 ? " counter from ":" counters from ").append(target.getMaxNumberOfTargets() == 1 ? "a ":"").append(target.getTargetName()); + sb.append(countersToRemove == 1 ? " counter from " : " counters from ").append(target.getMaxNumberOfTargets() == 1 ? "a " : "").append(target.getTargetName()); return sb.toString(); } diff --git a/Mage/src/mage/target/TargetImpl.java b/Mage/src/mage/target/TargetImpl.java index ab3eb6ef68e..3776a61446d 100644 --- a/Mage/src/mage/target/TargetImpl.java +++ b/Mage/src/mage/target/TargetImpl.java @@ -1,46 +1,53 @@ /* -* 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. -*/ - + * 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.target; -import mage.constants.Outcome; -import mage.constants.Zone; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.cards.Card; +import mage.constants.AbilityType; +import mage.constants.Outcome; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.players.Player; -import java.util.*; -import mage.MageObject; -import mage.constants.AbilityType; - /** * * @author BetaSteward_at_googlemail.com @@ -104,7 +111,7 @@ public abstract class TargetImpl implements Target { public void setMinNumberOfTargets(int minNumberOftargets) { this.minNumberOfTargets = minNumberOftargets; } - + @Override public void setMaxNumberOfTargets(int maxNumberOftargets) { this.maxNumberOfTargets = maxNumberOftargets; @@ -116,7 +123,7 @@ public abstract class TargetImpl implements Target { if (targetController != null) { // Hint for the selecting player that the targets must be valid from the point of the ability controller // e.g. select opponent text may be misleading otherwise - suffix = " (target controlling!)"; + suffix = " (target controlling!)"; } if (getMaxNumberOfTargets() != 1) { StringBuilder sb = new StringBuilder(); @@ -158,7 +165,7 @@ public abstract class TargetImpl implements Target { public Zone getZone() { return zone; } - + @Override public boolean isRequired(UUID sourceId, Game game) { MageObject object = game.getObject(sourceId); @@ -168,12 +175,12 @@ public abstract class TargetImpl implements Target { return isRequired(); } } - + @Override public boolean isRequired() { return required; } - + @Override public boolean isRequired(Ability ability) { return ability == null || ability.isActivated() || !(ability.getAbilityType().equals(AbilityType.SPELL) || ability.getAbilityType().equals(AbilityType.ACTIVATED)); @@ -217,6 +224,7 @@ public abstract class TargetImpl implements Target { if (!targets.containsKey(id)) { targets.put(id, 0); rememberZoneChangeCounter(id, game); + chosen = targets.size() >= getNumberOfTargets(); } } } @@ -254,7 +262,7 @@ public abstract class TargetImpl implements Target { } } } - + @Override public void updateTarget(UUID id, Game game) { rememberZoneChangeCounter(id, game); @@ -315,7 +323,7 @@ public abstract class TargetImpl implements Target { int i = 0; int rnd = new Random().nextInt(possibleTargets.size()); Iterator it = possibleTargets.iterator(); - while( i < rnd) { + while (i < rnd) { it.next(); i++; } @@ -336,9 +344,9 @@ public abstract class TargetImpl implements Target { @Override public boolean isLegal(Ability source, Game game) { //20101001 - 608.2b - Set illegalTargets = new HashSet<>(); + Set illegalTargets = new HashSet<>(); // int replacedTargets = 0; - for (UUID targetId: targets.keySet()) { + for (UUID targetId : targets.keySet()) { Card card = game.getCard(targetId); if (card != null) { if (zoneChangeCounters.containsKey(targetId) && zoneChangeCounters.get(targetId) != card.getZoneChangeCounter(game)) { @@ -356,7 +364,7 @@ public abstract class TargetImpl implements Target { } } // remove illegal targets, needed to handle if only a subset of targets was illegal - for (UUID targetId: illegalTargets) { + for (UUID targetId : illegalTargets) { targets.remove(targetId); } // if (replacedTargets > 0 && replacedTargets == targets.size()) { @@ -381,7 +389,7 @@ public abstract class TargetImpl implements Target { target.addTarget(targetId, source, game, true); if (!target.isChosen()) { Iterator it2 = possibleTargets.iterator(); - while (it2.hasNext()&& !target.isChosen()) { + while (it2.hasNext() && !target.isChosen()) { UUID nextTargetId = it2.next(); target.addTarget(nextTargetId, source, game, true); } @@ -389,7 +397,7 @@ public abstract class TargetImpl implements Target { if (target.isChosen()) { options.add(target); } - } + } return options; } @@ -458,6 +466,6 @@ public abstract class TargetImpl implements Target { } else { return game.getPlayer(playerId); } - } - + } + } From 96036ce97bfb204a487b8c9f788a83d48d3bb091 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 16 Jul 2015 13:51:14 +0200 Subject: [PATCH 073/375] Added a test (#1076). --- .../cards/triggers/dies/PutIntoGraveTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/PutIntoGraveTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/PutIntoGraveTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/PutIntoGraveTest.java new file mode 100644 index 00000000000..50b07342741 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/PutIntoGraveTest.java @@ -0,0 +1,68 @@ +/* + * 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 org.mage.test.cards.triggers.dies; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class PutIntoGraveTest extends CardTestPlayerBase { + + /** + * When I go to Nature's Claim my Chromatic Star, I dont end up drawing a + * card. + */ + @Test + public void testDiesTriggeredAbility() { + addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); + // Destroy target artifact or enchantment. Its controller gains 4 life. + addCard(Zone.HAND, playerA, "Nature's Claim", 1); + + // {1}, {T}, Sacrifice Chromatic Star: Add one mana of any color to your mana pool. + // When Chromatic Star is put into a graveyard from the battlefield, draw a card. + addCard(Zone.BATTLEFIELD, playerA, "Chromatic Star", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Nature's Claim", "Chromatic Star"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertLife(playerA, 24); + + assertGraveyardCount(playerA, "Nature's Claim", 1); + assertGraveyardCount(playerA, "Chromatic Star", 1); + + assertHandCount(playerA, 1); + } + +} From be9ed165f5658ed25cd96b3686ea52eae007dfc2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 16 Jul 2015 15:45:47 +0200 Subject: [PATCH 074/375] Fixed that after using the roll back function the wrong player can be used as next player (fixes #1032). --- Mage/src/mage/game/GameImpl.java | 15 +++++++++------ Mage/src/mage/game/GameState.java | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 9eb9c84baa4..7327c57c8be 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -204,6 +204,7 @@ public abstract class GameImpl implements Game, Serializable { private int priorityTime; private final int startLife; + protected PlayerList playerList; public GameImpl(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans, int startLife) { this.id = UUID.randomUUID(); @@ -613,6 +614,7 @@ public abstract class GameImpl implements Game, Serializable { GameState restore = gameStates.rollback(stateNum); if (restore != null) { state.restore(restore); + playerList.setCurrent(state.getActivePlayerId()); } } } @@ -667,8 +669,8 @@ public abstract class GameImpl implements Game, Serializable { @Override public void resume() { - PlayerList players = state.getPlayerList(state.getActivePlayerId()); - Player player = getPlayer(players.get()); + playerList = state.getPlayerList(state.getActivePlayerId()); + Player player = getPlayer(playerList.get()); boolean wasPaused = state.isPaused(); state.resume(); if (!gameOver(null)) { @@ -679,7 +681,7 @@ public abstract class GameImpl implements Game, Serializable { state.getTurn().resumePlay(this, wasPaused); if (!isPaused() && !gameOver(null)) { endOfTurn(); - player = players.getNext(this); + player = playerList.getNext(this); state.setTurnNum(state.getTurnNum() + 1); } } @@ -688,8 +690,8 @@ public abstract class GameImpl implements Game, Serializable { protected void play(UUID nextPlayerId) { if (!isPaused() && !gameOver(null)) { - PlayerList players = state.getPlayerList(nextPlayerId); - Player playerByOrder = getPlayer(players.get()); + playerList = state.getPlayerList(nextPlayerId); + Player playerByOrder = getPlayer(playerList.get()); while (!isPaused() && !gameOver(null)) { playExtraTurns(); GameEvent event = new GameEvent(GameEvent.EventType.PLAY_TURN, null, null, playerByOrder.getId()); @@ -700,7 +702,7 @@ public abstract class GameImpl implements Game, Serializable { state.setTurnNum(state.getTurnNum() + 1); } playExtraTurns(); - playerByOrder = players.getNext(this); + playerByOrder = playerList.getNext(this); } } if (gameOver(null) && !isSimulation()) { @@ -2653,6 +2655,7 @@ public abstract class GameImpl implements Game, Serializable { } } state.restoreForRollBack(restore); + playerList.setCurrent(state.getActivePlayerId()); // because restore uses the objects without copy each copy the state again gameStatesRollBack.put(getTurnNum(), state.copy()); executingRollback = true; diff --git a/Mage/src/mage/game/GameState.java b/Mage/src/mage/game/GameState.java index 6c1aacb48dd..b7b9c1850b7 100644 --- a/Mage/src/mage/game/GameState.java +++ b/Mage/src/mage/game/GameState.java @@ -198,6 +198,7 @@ public class GameState implements Serializable, Copyable { public void restore(GameState state) { this.activePlayerId = state.activePlayerId; + this.playerList.setCurrent(state.activePlayerId); this.priorityPlayerId = state.priorityPlayerId; this.stack = state.stack; this.command = state.command; From 0db7c5cff4e18cae0778596c72a224e88c7ae637 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 16 Jul 2015 16:54:32 +0200 Subject: [PATCH 075/375] * Fixed a bug of the rollback turns feature locking sometimes the UI. --- .../AI/basic/PreventRepeatedActionsTest.java | 69 +++++++++++++++++++ Mage/src/mage/game/GameImpl.java | 10 +-- 2 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java new file mode 100644 index 00000000000..56b924d8e9b --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java @@ -0,0 +1,69 @@ +/* + * 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 org.mage.test.AI.basic; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.game.permanent.Permanent; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBaseAI; + +/** + * + * @author LevelX2 + */ +public class PreventRepeatedActionsTest extends CardTestPlayerBaseAI { + + /** + * Check that an equipment is not switched again an again between creatures + * + */ + @Test + public void testEquipOnlyOnce() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6); + + // Equipped creature gets +1/+1. + // Equip {1}({1}: Attach to target creature you control. Equip only as a sorcery.) + addCard(Zone.BATTLEFIELD, playerA, "Fireshrieker", 1); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 2); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + int tappedLands = 0; + for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(new FilterLandPermanent(), playerA.getId(), currentGame)) { + if (permanent.isTapped()) { + tappedLands++; + } + } + Assert.assertEquals("AI should only used Equipment once", 2, tappedLands); + } + +} diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 7327c57c8be..07fb43d5805 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -2649,16 +2649,16 @@ public abstract class GameImpl implements Game, Serializable { GameState restore = gameStatesRollBack.get(turnToGoTo); if (restore != null) { informPlayers(GameLog.getPlayerRequestColoredText("Player request: Rolling back to start of turn " + restore.getTurnNum())); - for (Player playerObject : getPlayers().values()) { - if (playerObject.isHuman() && playerObject.isInGame()) { - playerObject.abort(); - } - } state.restoreForRollBack(restore); playerList.setCurrent(state.getActivePlayerId()); // because restore uses the objects without copy each copy the state again gameStatesRollBack.put(getTurnNum(), state.copy()); executingRollback = true; + for (Player playerObject : getPlayers().values()) { + if (playerObject.isHuman() && playerObject.isInGame()) { + playerObject.abort(); + } + } fireUpdatePlayersEvent(); } } From 30ae59cc18fa96d5f46cb7096b9c4bbc83849743 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 16 Jul 2015 21:09:46 +0300 Subject: [PATCH 076/375] Implement cards: Metathran Transport, Pyre Zombie, Wandering Stream, and Wings of Hope --- .../sets/invasion/MetathranTransport.java | 87 +++++++++++++++++++ .../src/mage/sets/invasion/PyreZombie.java | 79 +++++++++++++++++ .../mage/sets/invasion/WanderingStream.java | 63 ++++++++++++++ .../src/mage/sets/invasion/WingsOfHope.java | 82 +++++++++++++++++ 4 files changed, 311 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/invasion/MetathranTransport.java create mode 100644 Mage.Sets/src/mage/sets/invasion/PyreZombie.java create mode 100644 Mage.Sets/src/mage/sets/invasion/WanderingStream.java create mode 100644 Mage.Sets/src/mage/sets/invasion/WingsOfHope.java diff --git a/Mage.Sets/src/mage/sets/invasion/MetathranTransport.java b/Mage.Sets/src/mage/sets/invasion/MetathranTransport.java new file mode 100644 index 00000000000..e650e7f25aa --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/MetathranTransport.java @@ -0,0 +1,87 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; +import mage.abilities.effects.common.continuous.BecomesColorTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class MetathranTransport extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blue creatures"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLUE)); + } + + public MetathranTransport(UUID ownerId) { + super(ownerId, 62, "Metathran Transport", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); + this.expansionSetCode = "INV"; + this.subtype.add("Metathran"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Metathran Transport can't be blocked by blue creatures. + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + // {U}: Target creature becomes blue until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorTargetEffect(ObjectColor.BLUE, + Duration.EndOfTurn), new ManaCostsImpl("{U}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public MetathranTransport(final MetathranTransport card) { + super(card); + } + + @Override + public MetathranTransport copy() { + return new MetathranTransport(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/PyreZombie.java b/Mage.Sets/src/mage/sets/invasion/PyreZombie.java new file mode 100644 index 00000000000..b9a1ace8379 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/PyreZombie.java @@ -0,0 +1,79 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LoneFox + */ +public class PyreZombie extends CardImpl { + + public PyreZombie(UUID ownerId) { + super(ownerId, 261, "Pyre Zombie", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{B}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Zombie"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // At the beginning of your upkeep, if Pyre Zombie is in your graveyard, you may pay {1}{B}{B}. If you do, return Pyre Zombie to your hand. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.GRAVEYARD, + new DoIfCostPaid(new ReturnToHandSourceEffect(), new ManaCostsImpl("{1}{B}{B}")), + TargetController.YOU, false)); + // {1}{R}{R}, Sacrifice Pyre Zombie: Pyre Zombie deals 2 damage to target creature or player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{1}{R}{R}")); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public PyreZombie(final PyreZombie card) { + super(card); + } + + @Override + public PyreZombie copy() { + return new PyreZombie(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/WanderingStream.java b/Mage.Sets/src/mage/sets/invasion/WanderingStream.java new file mode 100644 index 00000000000..e2808415610 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/WanderingStream.java @@ -0,0 +1,63 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.dynamicvalue.MultipliedValue; +import mage.abilities.dynamicvalue.common.DomainValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class WanderingStream extends CardImpl { + + public WanderingStream(UUID ownerId) { + super(ownerId, 224, "Wandering Stream", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}"); + this.expansionSetCode = "INV"; + + // Domain - You gain 2 life for each basic land type among lands you control. + Effect effect = new GainLifeEffect(new MultipliedValue(new DomainValue(), 2)); + effect.setText("Domain - You gain 2 life for each basic land type among lands you control"); + this.getSpellAbility().addEffect(effect); + } + + public WanderingStream(final WanderingStream card) { + super(card); + } + + @Override + public WanderingStream copy() { + return new WanderingStream(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/WingsOfHope.java b/Mage.Sets/src/mage/sets/invasion/WingsOfHope.java new file mode 100644 index 00000000000..5475eba52ef --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/WingsOfHope.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class WingsOfHope extends CardImpl { + + public WingsOfHope(UUID ownerId) { + super(ownerId, 289, "Wings of Hope", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}{U}"); + this.expansionSetCode = "INV"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature gets +1/+3 and has flying. + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 3, Duration.WhileOnBattlefield)); + Effect effect = new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has flying"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public WingsOfHope(final WingsOfHope card) { + super(card); + } + + @Override + public WingsOfHope copy() { + return new WingsOfHope(this); + } +} From 3e78e406a707ea4605dc09713f5cee5915eb8397 Mon Sep 17 00:00:00 2001 From: Gal Lerman Date: Thu, 16 Jul 2015 21:14:14 +0300 Subject: [PATCH 077/375] changed chronozoa to {this} in text --- Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java index 008b1dd77b0..a97add2ef48 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java +++ b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java @@ -70,7 +70,7 @@ public class Chronozoa extends CardImpl { // When Chronozoa is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it. this.addAbility(new ConditionalTriggeredAbility(new DiesCreatureTriggeredAbility(new CopyCardEffect(this, numCopies), false), new LastTimeCounterRemovedCondition(), - "When Chronozoa is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it.")); + "When {this} is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it.")); } public Chronozoa(final Chronozoa card) { From cc6fb2270ea6627c3bc6aeb7d0658b4abc4a6672 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Thu, 16 Jul 2015 14:54:49 -0500 Subject: [PATCH 078/375] Updated formatting and/or spelling for cards in various cubes --- .../src/mage/tournament/cubes/BensCube.java | 1525 ++++++++------- .../src/mage/tournament/cubes/MTGCube.java | 1090 +++++------ .../tournament/cubes/MTGOLegacyCube2015.java | 10 +- .../tournament/cubes/MTGOMarchCube2014.java | 1525 ++++++++------- .../mage/tournament/cubes/MonoBlueCube.java | 813 ++++---- .../tournament/cubes/PeasantsToolboxCube.java | 1687 ++++++++--------- 6 files changed, 3323 insertions(+), 3327 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java index fd2982783ac..6d6bab90f12 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java @@ -1,763 +1,762 @@ -/* - * 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.tournament.cubes; - -import mage.game.draft.DraftCube; -import mage.game.draft.DraftCube.CardIdentity; - -/** - * - * @author LevelX2 - */ -public class BensCube extends DraftCube { - - public BensCube() { - super("Ben's Cube (720 cards)"); // http://cubetutor.com/viewcube/1 - cubeCards.add(new CardIdentity("Elite Vanguard", "")); - cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); - cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", "")); - cubeCards.add(new CardIdentity("Mother of Runes", "")); - cubeCards.add(new CardIdentity("Soldier of the Pantheon", "")); - cubeCards.add(new CardIdentity("Steppe Lynx", "")); - cubeCards.add(new CardIdentity("Student of Warfare", "")); - cubeCards.add(new CardIdentity("Weathered Wayfarer", "")); - cubeCards.add(new CardIdentity("Accorder Paladin", "")); - cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails", "")); - cubeCards.add(new CardIdentity("Imposing Sovereign", "")); - cubeCards.add(new CardIdentity("Kami of Ancient Law", "")); - cubeCards.add(new CardIdentity("Knight of Glory", "")); - cubeCards.add(new CardIdentity("Knight of Meadowgrain", "")); - cubeCards.add(new CardIdentity("Kor Skyfisher", "")); - cubeCards.add(new CardIdentity("Loyal Cathar", "")); - cubeCards.add(new CardIdentity("Soltari Monk", "")); - cubeCards.add(new CardIdentity("Soltari Priest", "")); - cubeCards.add(new CardIdentity("Stoneforge Mystic", "")); - cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", "")); - cubeCards.add(new CardIdentity("Wall of Omens", "")); - cubeCards.add(new CardIdentity("Aven Mindcensor", "")); - cubeCards.add(new CardIdentity("Blade Splicer", "")); - cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", "")); - cubeCards.add(new CardIdentity("Fiend Hunter", "")); - cubeCards.add(new CardIdentity("Flickerwisp", "")); - cubeCards.add(new CardIdentity("Kor Sanctifiers", "")); - cubeCards.add(new CardIdentity("Loyal Retainers", "")); - cubeCards.add(new CardIdentity("Mentor of the Meek", "")); - cubeCards.add(new CardIdentity("Mirran Crusader", "")); - cubeCards.add(new CardIdentity("Mirror Entity", "")); - cubeCards.add(new CardIdentity("Silverblade Paladin", "")); - cubeCards.add(new CardIdentity("Soltari Champion", "")); - cubeCards.add(new CardIdentity("Stonecloaker", "")); - cubeCards.add(new CardIdentity("Academy Rector", "")); - cubeCards.add(new CardIdentity("Emeria Angel", "")); - cubeCards.add(new CardIdentity("Hero of Bladehold", "")); - cubeCards.add(new CardIdentity("Hokori, Dust Drinker", "")); - cubeCards.add(new CardIdentity("Ranger of Eos", "")); - cubeCards.add(new CardIdentity("Restoration Angel", "")); - cubeCards.add(new CardIdentity("Sublime Archangel", "")); - cubeCards.add(new CardIdentity("Wall of Reverence", "")); - cubeCards.add(new CardIdentity("Archangel of Thune", "")); - cubeCards.add(new CardIdentity("Baneslayer Angel", "")); - cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); - cubeCards.add(new CardIdentity("Karmic Guide", "")); - cubeCards.add(new CardIdentity("Reveillark", "")); - cubeCards.add(new CardIdentity("Mikaeus, the Lunarch", "")); - cubeCards.add(new CardIdentity("Sun Titan", "")); - cubeCards.add(new CardIdentity("Yosei, the Morning Star", "")); - cubeCards.add(new CardIdentity("Angel of Serenity", "")); - cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", "")); - cubeCards.add(new CardIdentity("Eternal Dragon", "")); - cubeCards.add(new CardIdentity("Akroma, Angel of Wrath", "")); - cubeCards.add(new CardIdentity("Avacyn, Angel of Hope", "")); - cubeCards.add(new CardIdentity("Iona, Shield of Emeria", "")); - cubeCards.add(new CardIdentity("Ajani, Caller of the Pride", "")); - cubeCards.add(new CardIdentity("Ajani Goldmane", "")); - cubeCards.add(new CardIdentity("Elspeth, Knight-Errant", "")); - cubeCards.add(new CardIdentity("Gideon Jura", "")); - cubeCards.add(new CardIdentity("Elspeth, Sun's Champion", "")); - cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); - cubeCards.add(new CardIdentity("Cloudshift", "")); - cubeCards.add(new CardIdentity("Condemn", "")); - cubeCards.add(new CardIdentity("Enlightened Tutor", "")); - cubeCards.add(new CardIdentity("Mana Tithe", "")); - cubeCards.add(new CardIdentity("Path to Exile", "")); - cubeCards.add(new CardIdentity("Swords to Plowshares", "")); - cubeCards.add(new CardIdentity("Disenchant", "")); - cubeCards.add(new CardIdentity("Momentary Blink", "")); - cubeCards.add(new CardIdentity("Balance", "")); - cubeCards.add(new CardIdentity("Lingering Souls", "")); - cubeCards.add(new CardIdentity("Spectral Procession", "")); - cubeCards.add(new CardIdentity("Armageddon", "")); - cubeCards.add(new CardIdentity("Cataclysm", "")); - cubeCards.add(new CardIdentity("Day of Judgment", "")); - cubeCards.add(new CardIdentity("Ravages of War", "")); - cubeCards.add(new CardIdentity("Wrath of God", "")); - cubeCards.add(new CardIdentity("Hallowed Burial", "")); - cubeCards.add(new CardIdentity("Increasing Devotion", "")); - cubeCards.add(new CardIdentity("Rout", "")); - cubeCards.add(new CardIdentity("Akroma's Vengeance", "")); - cubeCards.add(new CardIdentity("Terminus", "")); - cubeCards.add(new CardIdentity("Martial Coup", "")); - cubeCards.add(new CardIdentity("Entreat the Angels", "")); - cubeCards.add(new CardIdentity("Decree of Justice", "")); - cubeCards.add(new CardIdentity("Land Tax", "")); - cubeCards.add(new CardIdentity("Honor of the Pure", "")); - cubeCards.add(new CardIdentity("Journey to Nowhere", "")); - cubeCards.add(new CardIdentity("Luminarch Ascension", "")); - cubeCards.add(new CardIdentity("Temporal Isolation", "")); - cubeCards.add(new CardIdentity("Oblivion Ring", "")); - cubeCards.add(new CardIdentity("Angelic Destiny", "")); - cubeCards.add(new CardIdentity("Faith's Fetters", "")); - cubeCards.add(new CardIdentity("Parallax Wave", "")); - cubeCards.add(new CardIdentity("Worship", "")); - cubeCards.add(new CardIdentity("Spear of Heliod", "")); - cubeCards.add(new CardIdentity("Spirit of the Labyrinth", "")); - cubeCards.add(new CardIdentity("Karakas", "")); - cubeCards.add(new CardIdentity("Kjeldoran Outpost", "")); - cubeCards.add(new CardIdentity("Windbrisk Heights", "")); - cubeCards.add(new CardIdentity("Cursecatcher", "")); - cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); - cubeCards.add(new CardIdentity("Augur of Bolas", "")); - cubeCards.add(new CardIdentity("Fathom Seer", "")); - cubeCards.add(new CardIdentity("Gilded Drake", "")); - cubeCards.add(new CardIdentity("Looter il-Kor", "")); - cubeCards.add(new CardIdentity("Omenspeaker", "")); - cubeCards.add(new CardIdentity("Phantasmal Image", "")); - cubeCards.add(new CardIdentity("Snapcaster Mage", "")); - cubeCards.add(new CardIdentity("Waterfront Bouncer", "")); - cubeCards.add(new CardIdentity("AEther Adept", "")); - cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", "")); - cubeCards.add(new CardIdentity("Man-o'-War", "")); - cubeCards.add(new CardIdentity("Sea Gate Oracle", "")); - cubeCards.add(new CardIdentity("Serendib Efreet", "")); - cubeCards.add(new CardIdentity("Trinket Mage", "")); - cubeCards.add(new CardIdentity("Vendilion Clique", "")); - cubeCards.add(new CardIdentity("Wake Thrasher", "")); - cubeCards.add(new CardIdentity("Glen Elendra Archmage", "")); - cubeCards.add(new CardIdentity("Sower of Temptation", "")); - cubeCards.add(new CardIdentity("Talrand, Sky Summoner", "")); - cubeCards.add(new CardIdentity("Tradewind Rider", "")); - cubeCards.add(new CardIdentity("Venser, Shaper Savant", "")); - cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", "")); - cubeCards.add(new CardIdentity("Mulldrifter", "")); - cubeCards.add(new CardIdentity("Prognostic Sphinx", "")); - cubeCards.add(new CardIdentity("Riftwing Cloudskate", "")); - cubeCards.add(new CardIdentity("Vesuvan Shapeshifter", "")); - cubeCards.add(new CardIdentity("AEtherling", "")); - cubeCards.add(new CardIdentity("Brine Elemental", "")); - cubeCards.add(new CardIdentity("Consecrated Sphinx", "")); - cubeCards.add(new CardIdentity("Frost Titan", "")); - cubeCards.add(new CardIdentity("Keiga, the Tide Star", "")); - cubeCards.add(new CardIdentity("Palinchron", "")); - cubeCards.add(new CardIdentity("Jace Beleren", "")); - cubeCards.add(new CardIdentity("Jace, Architect of Thought", "")); - cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", "")); - cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage", "")); - cubeCards.add(new CardIdentity("Phyrexian Metamorph", "")); - cubeCards.add(new CardIdentity("Ancestral Recall", "")); - cubeCards.add(new CardIdentity("Brainstorm", "")); - cubeCards.add(new CardIdentity("Mystical Tutor", "")); - cubeCards.add(new CardIdentity("Opt", "")); - cubeCards.add(new CardIdentity("Brain Freeze", "")); - cubeCards.add(new CardIdentity("Counterspell", "")); - cubeCards.add(new CardIdentity("Cyclonic Rift", "")); - cubeCards.add(new CardIdentity("Daze", "")); - cubeCards.add(new CardIdentity("Essence Scatter", "")); - cubeCards.add(new CardIdentity("Impulse", "")); - cubeCards.add(new CardIdentity("Into the Roil", "")); - cubeCards.add(new CardIdentity("Mana Drain", "")); - cubeCards.add(new CardIdentity("Mana Leak", "")); - cubeCards.add(new CardIdentity("Memory Lapse", "")); - cubeCards.add(new CardIdentity("Miscalculation", "")); - cubeCards.add(new CardIdentity("Negate", "")); - cubeCards.add(new CardIdentity("Remand", "")); - cubeCards.add(new CardIdentity("Capsize", "")); - cubeCards.add(new CardIdentity("Dissipate", "")); - cubeCards.add(new CardIdentity("Forbid", "")); - cubeCards.add(new CardIdentity("Forbidden Alchemy", "")); - cubeCards.add(new CardIdentity("Frantic Search", "")); - cubeCards.add(new CardIdentity("Intuition", "")); - cubeCards.add(new CardIdentity("Psionic Blast", "")); - cubeCards.add(new CardIdentity("Thirst for Knowledge", "")); - cubeCards.add(new CardIdentity("Careful Consideration", "")); - cubeCards.add(new CardIdentity("Cryptic Command", "")); - cubeCards.add(new CardIdentity("Fact or Fiction", "")); - cubeCards.add(new CardIdentity("Gifts Given", "")); - cubeCards.add(new CardIdentity("Gifts Ungiven", "")); - cubeCards.add(new CardIdentity("Turnabout", "")); - cubeCards.add(new CardIdentity("Desertion", "")); - cubeCards.add(new CardIdentity("Force of Will", "")); - cubeCards.add(new CardIdentity("Gush", "")); - cubeCards.add(new CardIdentity("Pact of Negation", "")); - cubeCards.add(new CardIdentity("Opportunity", "")); - cubeCards.add(new CardIdentity("Repeal", "")); - cubeCards.add(new CardIdentity("Ancestral Vision", "")); - cubeCards.add(new CardIdentity("Gitaxian Probe", "")); - cubeCards.add(new CardIdentity("Ponder", "")); - cubeCards.add(new CardIdentity("Preordain", "")); - cubeCards.add(new CardIdentity("Ideas Unbound", "")); - cubeCards.add(new CardIdentity("Time Walk", "")); - cubeCards.add(new CardIdentity("Compulsive Research", "")); - cubeCards.add(new CardIdentity("Show and Tell", "")); - cubeCards.add(new CardIdentity("Timetwister", "")); - cubeCards.add(new CardIdentity("Tinker", "")); - cubeCards.add(new CardIdentity("Deep Analysis", "")); - cubeCards.add(new CardIdentity("Bribery", "")); - cubeCards.add(new CardIdentity("Time Warp", "")); - cubeCards.add(new CardIdentity("Mind's Desire", "")); - cubeCards.add(new CardIdentity("Time Spiral", "")); - cubeCards.add(new CardIdentity("Upheaval", "")); - cubeCards.add(new CardIdentity("Legacy's Allure", "")); - cubeCards.add(new CardIdentity("Narcolepsy", "")); - cubeCards.add(new CardIdentity("Control Magic", "")); - cubeCards.add(new CardIdentity("Opposition", "")); - cubeCards.add(new CardIdentity("Future Sight", "")); - cubeCards.add(new CardIdentity("Treachery", "")); - cubeCards.add(new CardIdentity("Omniscience", "")); - cubeCards.add(new CardIdentity("Academy Ruins", "")); - cubeCards.add(new CardIdentity("Shelldock Isle", "")); - cubeCards.add(new CardIdentity("Carnophage", "")); - cubeCards.add(new CardIdentity("Diregraf Ghoul", "")); - cubeCards.add(new CardIdentity("Gravecrawler", "")); - cubeCards.add(new CardIdentity("Guul Draz Assassin", "")); - cubeCards.add(new CardIdentity("Tormented Hero", "")); - cubeCards.add(new CardIdentity("Vampire Lacerator", "")); - cubeCards.add(new CardIdentity("Blood Scrivener", "")); - cubeCards.add(new CardIdentity("Bloodghast", "")); - cubeCards.add(new CardIdentity("Dark Confidant", "")); - cubeCards.add(new CardIdentity("Dauthi Horror", "")); - cubeCards.add(new CardIdentity("Gatekeeper of Malakir", "")); - cubeCards.add(new CardIdentity("Knight of Infamy", "")); - cubeCards.add(new CardIdentity("Mesmeric Fiend", "")); - cubeCards.add(new CardIdentity("Nantuko Shade", "")); - cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); - cubeCards.add(new CardIdentity("Nezumi Shortfang", "")); - cubeCards.add(new CardIdentity("Nightscape Familiar", "")); - cubeCards.add(new CardIdentity("Oona's Prowler", "")); - cubeCards.add(new CardIdentity("Pack Rat", "")); - cubeCards.add(new CardIdentity("Vampire Hexmage", "")); - cubeCards.add(new CardIdentity("Bone Shredder", "")); - cubeCards.add(new CardIdentity("Geralf's Messenger", "")); - cubeCards.add(new CardIdentity("Hypnotic Specter", "")); - cubeCards.add(new CardIdentity("Phyrexian Rager", "")); - cubeCards.add(new CardIdentity("Vampire Nighthawk", "")); - cubeCards.add(new CardIdentity("Abyssal Persecutor", "")); - cubeCards.add(new CardIdentity("Bloodline Keeper", "")); - cubeCards.add(new CardIdentity("Braids, Cabal Minion", "")); - cubeCards.add(new CardIdentity("Crypt Ghast", "")); - cubeCards.add(new CardIdentity("Desecration Demon", "")); - cubeCards.add(new CardIdentity("Disciple of Bolas", "")); - cubeCards.add(new CardIdentity("Graveborn Muse", "")); - cubeCards.add(new CardIdentity("Nekrataal", "")); - cubeCards.add(new CardIdentity("Phyrexian Obliterator", "")); - cubeCards.add(new CardIdentity("Skinrender", "")); - cubeCards.add(new CardIdentity("Bloodgift Demon", "")); - cubeCards.add(new CardIdentity("Puppeteer Clique", "")); - cubeCards.add(new CardIdentity("Shriekmaw", "")); - cubeCards.add(new CardIdentity("Skithiryx, the Blight Dragon", "")); - cubeCards.add(new CardIdentity("Grave Titan", "")); - cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni", "")); - cubeCards.add(new CardIdentity("Kokusho, the Evening Star", "")); - cubeCards.add(new CardIdentity("Sheoldred, Whispering One", "")); - cubeCards.add(new CardIdentity("Griselbrand", "")); - cubeCards.add(new CardIdentity("Tombstalker", "")); - cubeCards.add(new CardIdentity("Liliana of the Veil", "")); - cubeCards.add(new CardIdentity("Liliana Vess", "")); - cubeCards.add(new CardIdentity("Sorin Markov", "")); - cubeCards.add(new CardIdentity("Booster Tutor", "")); - cubeCards.add(new CardIdentity("Dark Ritual", "")); - cubeCards.add(new CardIdentity("Disfigure", "")); - cubeCards.add(new CardIdentity("Entomb", "")); - cubeCards.add(new CardIdentity("Vampiric Tutor", "")); - cubeCards.add(new CardIdentity("Doom Blade", "")); - cubeCards.add(new CardIdentity("Go for the Throat", "")); - cubeCards.add(new CardIdentity("Tainted Pact", "")); - cubeCards.add(new CardIdentity("Terror", "")); - cubeCards.add(new CardIdentity("Ultimate Price", "")); - cubeCards.add(new CardIdentity("Corpse Dance", "")); - cubeCards.add(new CardIdentity("Dismember", "")); - cubeCards.add(new CardIdentity("Hero's Downfall", "")); - cubeCards.add(new CardIdentity("Slaughter Pact", "")); - cubeCards.add(new CardIdentity("Makeshift Mannequin", "")); - cubeCards.add(new CardIdentity("Snuff Out", "")); - cubeCards.add(new CardIdentity("Duress", "")); - cubeCards.add(new CardIdentity("Innocent Blood", "")); - cubeCards.add(new CardIdentity("Inquisition of Kozilek", "")); - cubeCards.add(new CardIdentity("Reanimate", "")); - cubeCards.add(new CardIdentity("Thoughtseize", "")); - cubeCards.add(new CardIdentity("Chainer's Edict", "")); - cubeCards.add(new CardIdentity("Demonic Tutor", "")); - cubeCards.add(new CardIdentity("Exhume", "")); - cubeCards.add(new CardIdentity("Hymn to Tourach", "")); - cubeCards.add(new CardIdentity("Night's Whisper", "")); - cubeCards.add(new CardIdentity("Sign in Blood", "")); - cubeCards.add(new CardIdentity("Sinkhole", "")); - cubeCards.add(new CardIdentity("Buried Alive", "")); - cubeCards.add(new CardIdentity("Yawgmoth's Will", "")); - cubeCards.add(new CardIdentity("Ambition's Cost", "")); - cubeCards.add(new CardIdentity("Consuming Vapors", "")); - cubeCards.add(new CardIdentity("Damnation", "")); - cubeCards.add(new CardIdentity("Tendrils of Agony", "")); - cubeCards.add(new CardIdentity("Living Death", "")); - cubeCards.add(new CardIdentity("Black Sun's Zenith", "")); - cubeCards.add(new CardIdentity("Mind Shatter", "")); - cubeCards.add(new CardIdentity("Profane Command", "")); - cubeCards.add(new CardIdentity("Animate Dead", "")); - cubeCards.add(new CardIdentity("Bitterblossom", "")); - cubeCards.add(new CardIdentity("Necromancy", "")); - cubeCards.add(new CardIdentity("Necropotence", "")); - cubeCards.add(new CardIdentity("Phyrexian Arena", "")); - cubeCards.add(new CardIdentity("Recurring Nightmare", "")); - cubeCards.add(new CardIdentity("Diabolic Servitude", "")); - cubeCards.add(new CardIdentity("Nether Void", "")); - cubeCards.add(new CardIdentity("The Abyss", "")); - cubeCards.add(new CardIdentity("Yawgmoth's Bargain", "")); - cubeCards.add(new CardIdentity("Gnarled Scarhide", "")); - cubeCards.add(new CardIdentity("Herald of Torment", "")); - cubeCards.add(new CardIdentity("Master of the Feast", "")); - cubeCards.add(new CardIdentity("Cabal Coffers", "")); - cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth", "")); - cubeCards.add(new CardIdentity("Volrath's Stronghold", "")); - cubeCards.add(new CardIdentity("Firedrinker Satyr", "")); - cubeCards.add(new CardIdentity("Frenzied Goblin", "")); - cubeCards.add(new CardIdentity("Goblin Bushwhacker", "")); - cubeCards.add(new CardIdentity("Goblin Guide", "")); - cubeCards.add(new CardIdentity("Goblin Welder", "")); - cubeCards.add(new CardIdentity("Greater Gargadon", "")); - cubeCards.add(new CardIdentity("Grim Lavamancer", "")); - cubeCards.add(new CardIdentity("Jackal Pup", "")); - cubeCards.add(new CardIdentity("Reckless Waif", "")); - cubeCards.add(new CardIdentity("Spikeshot Elder", "")); - cubeCards.add(new CardIdentity("Stromkirk Noble", "")); - cubeCards.add(new CardIdentity("Vexing Devil", "")); - cubeCards.add(new CardIdentity("Ash Zealot", "")); - cubeCards.add(new CardIdentity("Ember Hauler", "")); - cubeCards.add(new CardIdentity("Firefist Striker", "")); - cubeCards.add(new CardIdentity("Goblin Wardriver", "")); - cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); - cubeCards.add(new CardIdentity("Hellspark Elemental", "")); - cubeCards.add(new CardIdentity("Kargan Dragonlord", "")); - cubeCards.add(new CardIdentity("Keldon Marauders", "")); - cubeCards.add(new CardIdentity("Lightning Mauler", "")); - cubeCards.add(new CardIdentity("Mogg Flunkies", "")); - cubeCards.add(new CardIdentity("Mogg War Marshal", "")); - cubeCards.add(new CardIdentity("Plated Geopede", "")); - cubeCards.add(new CardIdentity("Slith Firewalker", "")); - cubeCards.add(new CardIdentity("Stormblood Berserker", "")); - cubeCards.add(new CardIdentity("Torch Fiend", "")); - cubeCards.add(new CardIdentity("Young Pyromancer", "")); - cubeCards.add(new CardIdentity("Ball Lightning", "")); - cubeCards.add(new CardIdentity("Chandra's Phoenix", "")); - cubeCards.add(new CardIdentity("Countryside Crusher", "")); - cubeCards.add(new CardIdentity("Goblin Ruinblaster", "")); - cubeCards.add(new CardIdentity("Hell's Thunder", "")); - cubeCards.add(new CardIdentity("Imperial Recruiter", "")); - cubeCards.add(new CardIdentity("Squee, Goblin Nabob", "")); - cubeCards.add(new CardIdentity("Thunderscape Battlemage", "")); - cubeCards.add(new CardIdentity("Zo-Zu the Punisher", "")); - cubeCards.add(new CardIdentity("Avalanche Riders", "")); - cubeCards.add(new CardIdentity("Blistering Firecat", "")); - cubeCards.add(new CardIdentity("Flametongue Kavu", "")); - cubeCards.add(new CardIdentity("Hellrider", "")); - cubeCards.add(new CardIdentity("Hero of Oxid Ridge", "")); - cubeCards.add(new CardIdentity("Keldon Champion", "")); - cubeCards.add(new CardIdentity("Ravenous Baboons", "")); - cubeCards.add(new CardIdentity("Skizzik", "")); - cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker", "")); - cubeCards.add(new CardIdentity("Siege-Gang Commander", "")); - cubeCards.add(new CardIdentity("Thundermaw Hellkite", "")); - cubeCards.add(new CardIdentity("Urabrask the Hidden", "")); - cubeCards.add(new CardIdentity("Zealous Conscripts", "")); - cubeCards.add(new CardIdentity("Inferno Titan", "")); - cubeCards.add(new CardIdentity("Bogardan Hellkite", "")); - cubeCards.add(new CardIdentity("Chandra, the Firebrand", "")); - cubeCards.add(new CardIdentity("Koth of the Hammer", "")); - cubeCards.add(new CardIdentity("Chandra Nalaar", "")); - cubeCards.add(new CardIdentity("Burst Lightning", "")); - cubeCards.add(new CardIdentity("Lightning Bolt", "")); - cubeCards.add(new CardIdentity("Ancient Grudge", "")); - cubeCards.add(new CardIdentity("Incinerate", "")); - cubeCards.add(new CardIdentity("Lightning Strike", "")); - cubeCards.add(new CardIdentity("Magma Jet", "")); - cubeCards.add(new CardIdentity("Searing Blaze", "")); - cubeCards.add(new CardIdentity("Searing Spear", "")); - cubeCards.add(new CardIdentity("Brimstone Volley", "")); - cubeCards.add(new CardIdentity("Chaos Warp", "")); - cubeCards.add(new CardIdentity("Char", "")); - cubeCards.add(new CardIdentity("Staggershock", "")); - cubeCards.add(new CardIdentity("Volcanic Fallout", "")); - cubeCards.add(new CardIdentity("Beacon of Destruction", "")); - cubeCards.add(new CardIdentity("Fireblast", "")); - cubeCards.add(new CardIdentity("Pyrokinesis", "")); - cubeCards.add(new CardIdentity("Chain Lightning", "")); - cubeCards.add(new CardIdentity("Faithless Looting", "")); - cubeCards.add(new CardIdentity("Firebolt", "")); - cubeCards.add(new CardIdentity("Gamble", "")); - cubeCards.add(new CardIdentity("Reckless Charge", "")); - cubeCards.add(new CardIdentity("Arc Trail", "")); - cubeCards.add(new CardIdentity("Pyroclasm", "")); - cubeCards.add(new CardIdentity("Anger of the Gods", "")); - cubeCards.add(new CardIdentity("Arc Lightning", "")); - cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); - cubeCards.add(new CardIdentity("Molten Rain", "")); - cubeCards.add(new CardIdentity("Pillage", "")); - cubeCards.add(new CardIdentity("Rift Bolt", "")); - cubeCards.add(new CardIdentity("Slagstorm", "")); - cubeCards.add(new CardIdentity("Stone Rain", "")); - cubeCards.add(new CardIdentity("Wheel of Fortune", "")); - cubeCards.add(new CardIdentity("Aftershock", "")); - cubeCards.add(new CardIdentity("Empty the Warrens", "")); - cubeCards.add(new CardIdentity("Banefire", "")); - cubeCards.add(new CardIdentity("Devil's Play", "")); - cubeCards.add(new CardIdentity("Earthquake", "")); - cubeCards.add(new CardIdentity("Jokulhaups", "")); - cubeCards.add(new CardIdentity("Rolling Earthquake", "")); - cubeCards.add(new CardIdentity("Wildfire", "")); - cubeCards.add(new CardIdentity("Bonfire of the Damned", "")); - cubeCards.add(new CardIdentity("Sulfuric Vortex", "")); - cubeCards.add(new CardIdentity("Sneak Attack", "")); - cubeCards.add(new CardIdentity("Purphoros, God of the Forge", "")); - cubeCards.add(new CardIdentity("Ghitu Encampment", "")); - cubeCards.add(new CardIdentity("Teetering Peaks", "")); - cubeCards.add(new CardIdentity("Avacyn's Pilgrim", "")); - cubeCards.add(new CardIdentity("Birds of Paradise", "")); - cubeCards.add(new CardIdentity("Elves of Deep Shadow", "")); - cubeCards.add(new CardIdentity("Elvish Mystic", "")); - cubeCards.add(new CardIdentity("Experiment One", "")); - cubeCards.add(new CardIdentity("Fyndhorn Elves", "")); - cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); - cubeCards.add(new CardIdentity("Llanowar Elves", "")); - cubeCards.add(new CardIdentity("Noble Hierarch", "")); - cubeCards.add(new CardIdentity("Ulvenwald Tracker", "")); - cubeCards.add(new CardIdentity("Devoted Druid", "")); - cubeCards.add(new CardIdentity("Fauna Shaman", "")); - cubeCards.add(new CardIdentity("Lotus Cobra", "")); - cubeCards.add(new CardIdentity("Mayor of Avabruck", "")); - cubeCards.add(new CardIdentity("Overgrown Battlement", "")); - cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", "")); - cubeCards.add(new CardIdentity("Sakura-Tribe Elder", "")); - cubeCards.add(new CardIdentity("Scavenging Ooze", "")); - cubeCards.add(new CardIdentity("Scorned Villager", "")); - cubeCards.add(new CardIdentity("Strangleroot Geist", "")); - cubeCards.add(new CardIdentity("Sylvan Caryatid", "")); - cubeCards.add(new CardIdentity("Tarmogoyf", "")); - cubeCards.add(new CardIdentity("Wall of Blossoms", "")); - cubeCards.add(new CardIdentity("Wall of Roots", "")); - cubeCards.add(new CardIdentity("Werebear", "")); - cubeCards.add(new CardIdentity("Eternal Witness", "")); - cubeCards.add(new CardIdentity("Ohran Viper", "")); - cubeCards.add(new CardIdentity("Wolfir Avenger", "")); - cubeCards.add(new CardIdentity("Wood Elves", "")); - cubeCards.add(new CardIdentity("Yavimaya Elder", "")); - cubeCards.add(new CardIdentity("Blastoderm", "")); - cubeCards.add(new CardIdentity("Chameleon Colossus", "")); - cubeCards.add(new CardIdentity("Master of the Wild Hunt", "")); - cubeCards.add(new CardIdentity("Mold Shambler", "")); - cubeCards.add(new CardIdentity("Nantuko Vigilante", "")); - cubeCards.add(new CardIdentity("Obstinate Baloth", "")); - cubeCards.add(new CardIdentity("Oracle of Mul Daya", "")); - cubeCards.add(new CardIdentity("Polukranos, World Eater", "")); - cubeCards.add(new CardIdentity("Thelonite Hermit", "")); - cubeCards.add(new CardIdentity("Thrun, the Last Troll", "")); - cubeCards.add(new CardIdentity("Vengevine", "")); - cubeCards.add(new CardIdentity("Wickerbough Elder", "")); - cubeCards.add(new CardIdentity("Yeva, Nature's Herald", "")); - cubeCards.add(new CardIdentity("Acidic Slime", "")); - cubeCards.add(new CardIdentity("Deranged Hermit", "")); - cubeCards.add(new CardIdentity("Genesis", "")); - cubeCards.add(new CardIdentity("Indrik Stomphowler", "")); - cubeCards.add(new CardIdentity("Thornling", "")); - cubeCards.add(new CardIdentity("Thragtusk", "")); - cubeCards.add(new CardIdentity("Vorapede", "")); - cubeCards.add(new CardIdentity("Cloudthresher", "")); - cubeCards.add(new CardIdentity("Primeval Titan", "")); - cubeCards.add(new CardIdentity("Avenger of Zendikar", "")); - cubeCards.add(new CardIdentity("Primordial Hydra", "")); - cubeCards.add(new CardIdentity("Craterhoof Behemoth", "")); - cubeCards.add(new CardIdentity("Terastodon", "")); - cubeCards.add(new CardIdentity("Woodfall Primus", "")); - cubeCards.add(new CardIdentity("Garruk Relentless", "")); - cubeCards.add(new CardIdentity("Garruk Wildspeaker", "")); - cubeCards.add(new CardIdentity("Garruk, Primal Hunter", "")); - cubeCards.add(new CardIdentity("Arbor Elf", "")); - cubeCards.add(new CardIdentity("Birthing Pod", "")); - cubeCards.add(new CardIdentity("Vines of Vastwood", "")); - cubeCards.add(new CardIdentity("Moment's Peace", "")); - cubeCards.add(new CardIdentity("Naturalize", "")); - cubeCards.add(new CardIdentity("Beast Within", "")); - cubeCards.add(new CardIdentity("Harrow", "")); - cubeCards.add(new CardIdentity("Stonewood Invocation", "")); - cubeCards.add(new CardIdentity("Summoning Trap", "")); - cubeCards.add(new CardIdentity("Channel", "")); - cubeCards.add(new CardIdentity("Explore", "")); - cubeCards.add(new CardIdentity("Farseek", "")); - cubeCards.add(new CardIdentity("Life from the Loam", "")); - cubeCards.add(new CardIdentity("Rampant Growth", "")); - cubeCards.add(new CardIdentity("Regrowth", "")); - cubeCards.add(new CardIdentity("Call of the Herd", "")); - cubeCards.add(new CardIdentity("Cultivate", "")); - cubeCards.add(new CardIdentity("Kodama's Reach", "")); - cubeCards.add(new CardIdentity("Search for Tomorrow", "")); - cubeCards.add(new CardIdentity("Harmonize", "")); - cubeCards.add(new CardIdentity("Natural Order", "")); - cubeCards.add(new CardIdentity("Overrun", "")); - cubeCards.add(new CardIdentity("Plow Under", "")); - cubeCards.add(new CardIdentity("Primal Command", "")); - cubeCards.add(new CardIdentity("Restock", "")); - cubeCards.add(new CardIdentity("Rude Awakening", "")); - cubeCards.add(new CardIdentity("Stunted Growth", "")); - cubeCards.add(new CardIdentity("Green Sun's Zenith", "")); - cubeCards.add(new CardIdentity("Tooth and Nail", "")); - cubeCards.add(new CardIdentity("Genesis Wave", "")); - cubeCards.add(new CardIdentity("Rancor", "")); - cubeCards.add(new CardIdentity("Oath of Druids", "")); - cubeCards.add(new CardIdentity("Survival of the Fittest", "")); - cubeCards.add(new CardIdentity("Sylvan Library", "")); - cubeCards.add(new CardIdentity("Awakening Zone", "")); - cubeCards.add(new CardIdentity("Heartbeat of Spring", "")); - cubeCards.add(new CardIdentity("Defense of the Heart", "")); - cubeCards.add(new CardIdentity("Courser of Kruphix", "")); - cubeCards.add(new CardIdentity("Gaea's Cradle", "")); - cubeCards.add(new CardIdentity("Treetop Village", "")); - cubeCards.add(new CardIdentity("Yavimaya Hollow", "")); - cubeCards.add(new CardIdentity("Geist of Saint Traft", "")); - cubeCards.add(new CardIdentity("Plumeveil", "")); - cubeCards.add(new CardIdentity("Wall of Denial", "")); - cubeCards.add(new CardIdentity("Grand Arbiter Augustin IV", "")); - cubeCards.add(new CardIdentity("Venser, the Sojourner", "")); - cubeCards.add(new CardIdentity("Supreme Verdict", "")); - cubeCards.add(new CardIdentity("Detention Sphere", "")); - cubeCards.add(new CardIdentity("Celestial Colonnade", "")); - cubeCards.add(new CardIdentity("Glacial Fortress", "")); - cubeCards.add(new CardIdentity("Hallowed Fountain", "")); - cubeCards.add(new CardIdentity("Tundra", "")); - cubeCards.add(new CardIdentity("Psychatog", "")); - cubeCards.add(new CardIdentity("Shadowmage Infiltrator", "")); - cubeCards.add(new CardIdentity("Duskmantle Seer", "")); - cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", "")); - cubeCards.add(new CardIdentity("Baleful Strix", "")); - cubeCards.add(new CardIdentity("Agony Warp", "")); - cubeCards.add(new CardIdentity("Far // Away", "")); - cubeCards.add(new CardIdentity("Creeping Tar Pit", "")); - cubeCards.add(new CardIdentity("Drowned Catacomb", "")); - cubeCards.add(new CardIdentity("Underground Sea", "")); - cubeCards.add(new CardIdentity("Watery Grave", "")); - cubeCards.add(new CardIdentity("Rakdos Cackler", "")); - cubeCards.add(new CardIdentity("Falkenrath Aristocrat", "")); - cubeCards.add(new CardIdentity("Murderous Redcap", "")); - cubeCards.add(new CardIdentity("Olivia Voldaren", "")); - cubeCards.add(new CardIdentity("Sarkhan the Mad", "")); - cubeCards.add(new CardIdentity("Bituminous Blast", "")); - cubeCards.add(new CardIdentity("Dreadbore", "")); - cubeCards.add(new CardIdentity("Badlands", "")); - cubeCards.add(new CardIdentity("Blood Crypt", "")); - cubeCards.add(new CardIdentity("Dragonskull Summit", "")); - cubeCards.add(new CardIdentity("Lavaclaw Reaches", "")); - cubeCards.add(new CardIdentity("Tattermunge Maniac", "")); - cubeCards.add(new CardIdentity("Burning-Tree Emissary", "")); - cubeCards.add(new CardIdentity("Boggart Ram-Gang", "")); - cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); - cubeCards.add(new CardIdentity("Huntmaster of the Fells", "")); - cubeCards.add(new CardIdentity("Domri Rade", "")); - cubeCards.add(new CardIdentity("Manamorphose", "")); - cubeCards.add(new CardIdentity("Raging Ravine", "")); - cubeCards.add(new CardIdentity("Rootbound Crag", "")); - cubeCards.add(new CardIdentity("Stomping Ground", "")); - cubeCards.add(new CardIdentity("Taiga", "")); - cubeCards.add(new CardIdentity("Dryad Militant", "")); - cubeCards.add(new CardIdentity("Qasali Pridemage", "")); - cubeCards.add(new CardIdentity("Voice of Resurgence", "")); - cubeCards.add(new CardIdentity("Kitchen Finks", "")); - cubeCards.add(new CardIdentity("Knight of the Reliquary", "")); - cubeCards.add(new CardIdentity("Mirari's Wake", "")); - cubeCards.add(new CardIdentity("Gavony Township", "")); - cubeCards.add(new CardIdentity("Savannah", "")); - cubeCards.add(new CardIdentity("Stirring Wildwood", "")); - cubeCards.add(new CardIdentity("Sunpetal Grove", "")); - cubeCards.add(new CardIdentity("Temple Garden", "")); - cubeCards.add(new CardIdentity("Stillmoon Cavalier", "")); - cubeCards.add(new CardIdentity("Obzedat, Ghost Council", "")); - cubeCards.add(new CardIdentity("Ashen Rider", "")); - cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", "")); - cubeCards.add(new CardIdentity("Tidehollow Sculler", "")); - cubeCards.add(new CardIdentity("Vindicate", "")); - cubeCards.add(new CardIdentity("Godless Shrine", "")); - cubeCards.add(new CardIdentity("Isolated Chapel", "")); - cubeCards.add(new CardIdentity("Scrubland", "")); - cubeCards.add(new CardIdentity("Vault of the Archangel", "")); - cubeCards.add(new CardIdentity("Deathrite Shaman", "")); - cubeCards.add(new CardIdentity("Putrid Leech", "")); - cubeCards.add(new CardIdentity("Varolz, the Scar-Striped", "")); - cubeCards.add(new CardIdentity("Vraska the Unseen", "")); - cubeCards.add(new CardIdentity("Putrefy", "")); - cubeCards.add(new CardIdentity("Abrupt Decay", "")); - cubeCards.add(new CardIdentity("Maelstrom Pulse", "")); - cubeCards.add(new CardIdentity("Pernicious Deed", "")); - cubeCards.add(new CardIdentity("Bayou", "")); - cubeCards.add(new CardIdentity("Overgrown Tomb", "")); - cubeCards.add(new CardIdentity("Woodland Cemetery", "")); - cubeCards.add(new CardIdentity("Coiling Oracle", "")); - cubeCards.add(new CardIdentity("Cold-Eyed Selkie", "")); - cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", "")); - cubeCards.add(new CardIdentity("Trygon Predator", "")); - cubeCards.add(new CardIdentity("Mystic Snake", "")); - cubeCards.add(new CardIdentity("Simic Sky Swallower", "")); - cubeCards.add(new CardIdentity("Kiora, the Crashing Wave", "")); - cubeCards.add(new CardIdentity("Voidslime", "")); - cubeCards.add(new CardIdentity("Breeding Pool", "")); - cubeCards.add(new CardIdentity("Hinterland Harbor", "")); - cubeCards.add(new CardIdentity("Tropical Island", "")); - cubeCards.add(new CardIdentity("Niv-Mizzet, Dracogenius", "")); - cubeCards.add(new CardIdentity("Nucklavee", "")); - cubeCards.add(new CardIdentity("Ral Zarek", "")); - cubeCards.add(new CardIdentity("Fire // Ice", "")); - cubeCards.add(new CardIdentity("Izzet Charm", "")); - cubeCards.add(new CardIdentity("Electrolyze", "")); - cubeCards.add(new CardIdentity("Steam Augury", "")); - cubeCards.add(new CardIdentity("Prophetic Bolt", "")); - cubeCards.add(new CardIdentity("Steam Vents", "")); - cubeCards.add(new CardIdentity("Sulfur Falls", "")); - cubeCards.add(new CardIdentity("Volcanic Island", "")); - cubeCards.add(new CardIdentity("Figure of Destiny", "")); - cubeCards.add(new CardIdentity("Boros Reckoner", "")); - cubeCards.add(new CardIdentity("Ajani Vengeant", "")); - cubeCards.add(new CardIdentity("Boros Charm", "")); - cubeCards.add(new CardIdentity("Lightning Helix", "")); - cubeCards.add(new CardIdentity("Aurelia's Fury", "")); - cubeCards.add(new CardIdentity("Chained to the Rocks", "")); - cubeCards.add(new CardIdentity("Clifftop Retreat", "")); - cubeCards.add(new CardIdentity("Plateau", "")); - cubeCards.add(new CardIdentity("Sacred Foundry", "")); - cubeCards.add(new CardIdentity("Sphinx of the Steel Wind", "")); - cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker", "")); - cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth", "")); - cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", "")); - cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", "")); - cubeCards.add(new CardIdentity("Karn Liberated", "")); - cubeCards.add(new CardIdentity("Epochrasite", "")); - cubeCards.add(new CardIdentity("Phyrexian Revoker", "")); - cubeCards.add(new CardIdentity("Spellskite", "")); - cubeCards.add(new CardIdentity("Palladium Myr", "")); - cubeCards.add(new CardIdentity("Lodestone Golem", "")); - cubeCards.add(new CardIdentity("Masticore", "")); - cubeCards.add(new CardIdentity("Molten-Tail Masticore", "")); - cubeCards.add(new CardIdentity("Solemn Simulacrum", "")); - cubeCards.add(new CardIdentity("Precursor Golem", "")); - cubeCards.add(new CardIdentity("Wurmcoil Engine", "")); - cubeCards.add(new CardIdentity("Myr Battlesphere", "")); - cubeCards.add(new CardIdentity("Platinum Angel", "")); - cubeCards.add(new CardIdentity("Sundering Titan", "")); - cubeCards.add(new CardIdentity("Black Lotus", "")); - cubeCards.add(new CardIdentity("Chrome Mox", "")); - cubeCards.add(new CardIdentity("Everflowing Chalice", "")); - cubeCards.add(new CardIdentity("Lotus Bloom", "")); - cubeCards.add(new CardIdentity("Lotus Petal", "")); - cubeCards.add(new CardIdentity("Mana Crypt", "")); - cubeCards.add(new CardIdentity("Mox Diamond", "")); - cubeCards.add(new CardIdentity("Mox Emerald", "")); - cubeCards.add(new CardIdentity("Mox Jet", "")); - cubeCards.add(new CardIdentity("Mox Pearl", "")); - cubeCards.add(new CardIdentity("Mox Ruby", "")); - cubeCards.add(new CardIdentity("Mox Sapphire", "")); - cubeCards.add(new CardIdentity("AEther Vial", "")); - cubeCards.add(new CardIdentity("Basilisk Collar", "")); - cubeCards.add(new CardIdentity("Bonesplitter", "")); - cubeCards.add(new CardIdentity("Cursed Scroll", "")); - cubeCards.add(new CardIdentity("Mana Vault", "")); - cubeCards.add(new CardIdentity("Pithing Needle", "")); - cubeCards.add(new CardIdentity("Relic of Progenitus", "")); - cubeCards.add(new CardIdentity("Sensei's Divining Top", "")); - cubeCards.add(new CardIdentity("Skullclamp", "")); - cubeCards.add(new CardIdentity("Sol Ring", "")); - cubeCards.add(new CardIdentity("Ankh of Mishra", "")); - cubeCards.add(new CardIdentity("Chaos Orb", "")); - cubeCards.add(new CardIdentity("Coldsteel Heart", "")); - cubeCards.add(new CardIdentity("Fellwar Stone", "")); - cubeCards.add(new CardIdentity("Grim Monolith", "")); - cubeCards.add(new CardIdentity("Isochron Scepter", "")); - cubeCards.add(new CardIdentity("Lightning Greaves", "")); - cubeCards.add(new CardIdentity("Mind Stone", "")); - cubeCards.add(new CardIdentity("Mortarpod", "")); - cubeCards.add(new CardIdentity("Powder Keg", "")); - cubeCards.add(new CardIdentity("Prismatic Lens", "")); - cubeCards.add(new CardIdentity("Scroll Rack", "")); - cubeCards.add(new CardIdentity("Shrine of Burning Rage", "")); - cubeCards.add(new CardIdentity("Sphere of the Suns", "")); - cubeCards.add(new CardIdentity("Umezawa's Jitte", "")); - cubeCards.add(new CardIdentity("Basalt Monolith", "")); - cubeCards.add(new CardIdentity("Coalition Relic", "")); - cubeCards.add(new CardIdentity("Crucible of Worlds", "")); - cubeCards.add(new CardIdentity("Crystal Shard", "")); - cubeCards.add(new CardIdentity("Grafted Wargear", "")); - cubeCards.add(new CardIdentity("Mimic Vat", "")); - cubeCards.add(new CardIdentity("Pristine Talisman", "")); - cubeCards.add(new CardIdentity("Sword of Body and Mind", "")); - cubeCards.add(new CardIdentity("Sword of Feast and Famine", "")); - cubeCards.add(new CardIdentity("Sword of Fire and Ice", "")); - cubeCards.add(new CardIdentity("Sword of Light and Shadow", "")); - cubeCards.add(new CardIdentity("Sword of War and Peace", "")); - cubeCards.add(new CardIdentity("Tangle Wire", "")); - cubeCards.add(new CardIdentity("Vedalken Shackles", "")); - cubeCards.add(new CardIdentity("Worn Powerstone", "")); - cubeCards.add(new CardIdentity("Nevinyrral's Disk", "")); - cubeCards.add(new CardIdentity("Smokestack", "")); - cubeCards.add(new CardIdentity("Thran Dynamo", "")); - cubeCards.add(new CardIdentity("Batterskull", "")); - cubeCards.add(new CardIdentity("Eldrazi Monument", "")); - cubeCards.add(new CardIdentity("Engineered Explosives", "")); - cubeCards.add(new CardIdentity("Gilded Lotus", "")); - cubeCards.add(new CardIdentity("Memory Jar", "")); - cubeCards.add(new CardIdentity("Mindslaver", "")); - cubeCards.add(new CardIdentity("All Is Dust", "")); - cubeCards.add(new CardIdentity("Ancient Tomb", "")); - cubeCards.add(new CardIdentity("Arid Mesa", "")); - cubeCards.add(new CardIdentity("Bloodstained Mire", "")); - cubeCards.add(new CardIdentity("City of Brass", "")); - cubeCards.add(new CardIdentity("City of Traitors", "")); - cubeCards.add(new CardIdentity("Evolving Wilds", "")); - cubeCards.add(new CardIdentity("Flooded Strand", "")); - cubeCards.add(new CardIdentity("Library of Alexandria", "")); - cubeCards.add(new CardIdentity("Mana Confluence", "")); - cubeCards.add(new CardIdentity("Marsh Flats", "")); - cubeCards.add(new CardIdentity("Maze of Ith", "")); - cubeCards.add(new CardIdentity("Mishra's Factory", "")); - cubeCards.add(new CardIdentity("Misty Rainforest", "")); - cubeCards.add(new CardIdentity("Mutavault", "")); - cubeCards.add(new CardIdentity("Polluted Delta", "")); - cubeCards.add(new CardIdentity("Rishadan Port", "")); - cubeCards.add(new CardIdentity("Scalding Tarn", "")); - cubeCards.add(new CardIdentity("Strip Mine", "")); - cubeCards.add(new CardIdentity("Tectonic Edge", "")); - cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); - cubeCards.add(new CardIdentity("The Tabernacle at Pendrell Vale", "")); - cubeCards.add(new CardIdentity("Verdant Catacombs", "")); - cubeCards.add(new CardIdentity("Wasteland", "")); - cubeCards.add(new CardIdentity("Windswept Heath", "")); - cubeCards.add(new CardIdentity("Wooded Foothills", "")); - - } -} +/* + * 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.tournament.cubes; + +import mage.game.draft.DraftCube; +import mage.game.draft.DraftCube.CardIdentity; + +/** + * + * @author LevelX2 + */ +public class BensCube extends DraftCube { + + public BensCube() { + super("Ben's Cube (720 cards)"); // http://cubetutor.com/viewcube/1 + cubeCards.add(new CardIdentity("Elite Vanguard", "")); + cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); + cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", "")); + cubeCards.add(new CardIdentity("Mother of Runes", "")); + cubeCards.add(new CardIdentity("Soldier of the Pantheon", "")); + cubeCards.add(new CardIdentity("Steppe Lynx", "")); + cubeCards.add(new CardIdentity("Student of Warfare", "")); + cubeCards.add(new CardIdentity("Weathered Wayfarer", "")); + cubeCards.add(new CardIdentity("Accorder Paladin", "")); + cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails", "")); + cubeCards.add(new CardIdentity("Imposing Sovereign", "")); + cubeCards.add(new CardIdentity("Kami of Ancient Law", "")); + cubeCards.add(new CardIdentity("Knight of Glory", "")); + cubeCards.add(new CardIdentity("Knight of Meadowgrain", "")); + cubeCards.add(new CardIdentity("Kor Skyfisher", "")); + cubeCards.add(new CardIdentity("Loyal Cathar", "")); + cubeCards.add(new CardIdentity("Soltari Monk", "")); + cubeCards.add(new CardIdentity("Soltari Priest", "")); + cubeCards.add(new CardIdentity("Stoneforge Mystic", "")); + cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", "")); + cubeCards.add(new CardIdentity("Wall of Omens", "")); + cubeCards.add(new CardIdentity("Aven Mindcensor", "")); + cubeCards.add(new CardIdentity("Blade Splicer", "")); + cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", "")); + cubeCards.add(new CardIdentity("Fiend Hunter", "")); + cubeCards.add(new CardIdentity("Flickerwisp", "")); + cubeCards.add(new CardIdentity("Kor Sanctifiers", "")); + cubeCards.add(new CardIdentity("Loyal Retainers", "")); + cubeCards.add(new CardIdentity("Mentor of the Meek", "")); + cubeCards.add(new CardIdentity("Mirran Crusader", "")); + cubeCards.add(new CardIdentity("Mirror Entity", "")); + cubeCards.add(new CardIdentity("Silverblade Paladin", "")); + cubeCards.add(new CardIdentity("Soltari Champion", "")); + cubeCards.add(new CardIdentity("Stonecloaker", "")); + cubeCards.add(new CardIdentity("Academy Rector", "")); + cubeCards.add(new CardIdentity("Emeria Angel", "")); + cubeCards.add(new CardIdentity("Hero of Bladehold", "")); + cubeCards.add(new CardIdentity("Hokori, Dust Drinker", "")); + cubeCards.add(new CardIdentity("Ranger of Eos", "")); + cubeCards.add(new CardIdentity("Restoration Angel", "")); + cubeCards.add(new CardIdentity("Sublime Archangel", "")); + cubeCards.add(new CardIdentity("Wall of Reverence", "")); + cubeCards.add(new CardIdentity("Archangel of Thune", "")); + cubeCards.add(new CardIdentity("Baneslayer Angel", "")); + cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); + cubeCards.add(new CardIdentity("Karmic Guide", "")); + cubeCards.add(new CardIdentity("Reveillark", "")); + cubeCards.add(new CardIdentity("Mikaeus, the Lunarch", "")); + cubeCards.add(new CardIdentity("Sun Titan", "")); + cubeCards.add(new CardIdentity("Yosei, the Morning Star", "")); + cubeCards.add(new CardIdentity("Angel of Serenity", "")); + cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", "")); + cubeCards.add(new CardIdentity("Eternal Dragon", "")); + cubeCards.add(new CardIdentity("Akroma, Angel of Wrath", "")); + cubeCards.add(new CardIdentity("Avacyn, Angel of Hope", "")); + cubeCards.add(new CardIdentity("Iona, Shield of Emeria", "")); + cubeCards.add(new CardIdentity("Ajani, Caller of the Pride", "")); + cubeCards.add(new CardIdentity("Ajani Goldmane", "")); + cubeCards.add(new CardIdentity("Elspeth, Knight-Errant", "")); + cubeCards.add(new CardIdentity("Gideon Jura", "")); + cubeCards.add(new CardIdentity("Elspeth, Sun's Champion", "")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); + cubeCards.add(new CardIdentity("Cloudshift", "")); + cubeCards.add(new CardIdentity("Condemn", "")); + cubeCards.add(new CardIdentity("Enlightened Tutor", "")); + cubeCards.add(new CardIdentity("Mana Tithe", "")); + cubeCards.add(new CardIdentity("Path to Exile", "")); + cubeCards.add(new CardIdentity("Swords to Plowshares", "")); + cubeCards.add(new CardIdentity("Disenchant", "")); + cubeCards.add(new CardIdentity("Momentary Blink", "")); + cubeCards.add(new CardIdentity("Balance", "")); + cubeCards.add(new CardIdentity("Lingering Souls", "")); + cubeCards.add(new CardIdentity("Spectral Procession", "")); + cubeCards.add(new CardIdentity("Armageddon", "")); + cubeCards.add(new CardIdentity("Cataclysm", "")); + cubeCards.add(new CardIdentity("Day of Judgment", "")); + cubeCards.add(new CardIdentity("Ravages of War", "")); + cubeCards.add(new CardIdentity("Wrath of God", "")); + cubeCards.add(new CardIdentity("Hallowed Burial", "")); + cubeCards.add(new CardIdentity("Increasing Devotion", "")); + cubeCards.add(new CardIdentity("Rout", "")); + cubeCards.add(new CardIdentity("Akroma's Vengeance", "")); + cubeCards.add(new CardIdentity("Terminus", "")); + cubeCards.add(new CardIdentity("Martial Coup", "")); + cubeCards.add(new CardIdentity("Entreat the Angels", "")); + cubeCards.add(new CardIdentity("Decree of Justice", "")); + cubeCards.add(new CardIdentity("Land Tax", "")); + cubeCards.add(new CardIdentity("Honor of the Pure", "")); + cubeCards.add(new CardIdentity("Journey to Nowhere", "")); + cubeCards.add(new CardIdentity("Luminarch Ascension", "")); + cubeCards.add(new CardIdentity("Temporal Isolation", "")); + cubeCards.add(new CardIdentity("Oblivion Ring", "")); + cubeCards.add(new CardIdentity("Angelic Destiny", "")); + cubeCards.add(new CardIdentity("Faith's Fetters", "")); + cubeCards.add(new CardIdentity("Parallax Wave", "")); + cubeCards.add(new CardIdentity("Worship", "")); + cubeCards.add(new CardIdentity("Spear of Heliod", "")); + cubeCards.add(new CardIdentity("Spirit of the Labyrinth", "")); + cubeCards.add(new CardIdentity("Karakas", "")); + cubeCards.add(new CardIdentity("Kjeldoran Outpost", "")); + cubeCards.add(new CardIdentity("Windbrisk Heights", "")); + cubeCards.add(new CardIdentity("Cursecatcher", "")); + cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); + cubeCards.add(new CardIdentity("Augur of Bolas", "")); + cubeCards.add(new CardIdentity("Fathom Seer", "")); + cubeCards.add(new CardIdentity("Gilded Drake", "")); + cubeCards.add(new CardIdentity("Looter il-Kor", "")); + cubeCards.add(new CardIdentity("Omenspeaker", "")); + cubeCards.add(new CardIdentity("Phantasmal Image", "")); + cubeCards.add(new CardIdentity("Snapcaster Mage", "")); + cubeCards.add(new CardIdentity("Waterfront Bouncer", "")); + cubeCards.add(new CardIdentity("AEther Adept", "")); + cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", "")); + cubeCards.add(new CardIdentity("Man-o'-War", "")); + cubeCards.add(new CardIdentity("Sea Gate Oracle", "")); + cubeCards.add(new CardIdentity("Serendib Efreet", "")); + cubeCards.add(new CardIdentity("Trinket Mage", "")); + cubeCards.add(new CardIdentity("Vendilion Clique", "")); + cubeCards.add(new CardIdentity("Wake Thrasher", "")); + cubeCards.add(new CardIdentity("Glen Elendra Archmage", "")); + cubeCards.add(new CardIdentity("Sower of Temptation", "")); + cubeCards.add(new CardIdentity("Talrand, Sky Summoner", "")); + cubeCards.add(new CardIdentity("Tradewind Rider", "")); + cubeCards.add(new CardIdentity("Venser, Shaper Savant", "")); + cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", "")); + cubeCards.add(new CardIdentity("Mulldrifter", "")); + cubeCards.add(new CardIdentity("Prognostic Sphinx", "")); + cubeCards.add(new CardIdentity("Riftwing Cloudskate", "")); + cubeCards.add(new CardIdentity("Vesuvan Shapeshifter", "")); + cubeCards.add(new CardIdentity("AEtherling", "")); + cubeCards.add(new CardIdentity("Brine Elemental", "")); + cubeCards.add(new CardIdentity("Consecrated Sphinx", "")); + cubeCards.add(new CardIdentity("Frost Titan", "")); + cubeCards.add(new CardIdentity("Keiga, the Tide Star", "")); + cubeCards.add(new CardIdentity("Palinchron", "")); + cubeCards.add(new CardIdentity("Jace Beleren", "")); + cubeCards.add(new CardIdentity("Jace, Architect of Thought", "")); + cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", "")); + cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage", "")); + cubeCards.add(new CardIdentity("Phyrexian Metamorph", "")); + cubeCards.add(new CardIdentity("Ancestral Recall", "")); + cubeCards.add(new CardIdentity("Brainstorm", "")); + cubeCards.add(new CardIdentity("Mystical Tutor", "")); + cubeCards.add(new CardIdentity("Opt", "")); + cubeCards.add(new CardIdentity("Brain Freeze", "")); + cubeCards.add(new CardIdentity("Counterspell", "")); + cubeCards.add(new CardIdentity("Cyclonic Rift", "")); + cubeCards.add(new CardIdentity("Daze", "")); + cubeCards.add(new CardIdentity("Essence Scatter", "")); + cubeCards.add(new CardIdentity("Impulse", "")); + cubeCards.add(new CardIdentity("Into the Roil", "")); + cubeCards.add(new CardIdentity("Mana Drain", "")); + cubeCards.add(new CardIdentity("Mana Leak", "")); + cubeCards.add(new CardIdentity("Memory Lapse", "")); + cubeCards.add(new CardIdentity("Miscalculation", "")); + cubeCards.add(new CardIdentity("Negate", "")); + cubeCards.add(new CardIdentity("Remand", "")); + cubeCards.add(new CardIdentity("Capsize", "")); + cubeCards.add(new CardIdentity("Dissipate", "")); + cubeCards.add(new CardIdentity("Forbid", "")); + cubeCards.add(new CardIdentity("Forbidden Alchemy", "")); + cubeCards.add(new CardIdentity("Frantic Search", "")); + cubeCards.add(new CardIdentity("Intuition", "")); + cubeCards.add(new CardIdentity("Psionic Blast", "")); + cubeCards.add(new CardIdentity("Thirst for Knowledge", "")); + cubeCards.add(new CardIdentity("Careful Consideration", "")); + cubeCards.add(new CardIdentity("Cryptic Command", "")); + cubeCards.add(new CardIdentity("Fact or Fiction", "")); + cubeCards.add(new CardIdentity("Gifts Ungiven", "")); + cubeCards.add(new CardIdentity("Turnabout", "")); + cubeCards.add(new CardIdentity("Desertion", "")); + cubeCards.add(new CardIdentity("Force of Will", "")); + cubeCards.add(new CardIdentity("Gush", "")); + cubeCards.add(new CardIdentity("Pact of Negation", "")); + cubeCards.add(new CardIdentity("Opportunity", "")); + cubeCards.add(new CardIdentity("Repeal", "")); + cubeCards.add(new CardIdentity("Ancestral Vision", "")); + cubeCards.add(new CardIdentity("Gitaxian Probe", "")); + cubeCards.add(new CardIdentity("Ponder", "")); + cubeCards.add(new CardIdentity("Preordain", "")); + cubeCards.add(new CardIdentity("Ideas Unbound", "")); + cubeCards.add(new CardIdentity("Time Walk", "")); + cubeCards.add(new CardIdentity("Compulsive Research", "")); + cubeCards.add(new CardIdentity("Show and Tell", "")); + cubeCards.add(new CardIdentity("Timetwister", "")); + cubeCards.add(new CardIdentity("Tinker", "")); + cubeCards.add(new CardIdentity("Deep Analysis", "")); + cubeCards.add(new CardIdentity("Bribery", "")); + cubeCards.add(new CardIdentity("Time Warp", "")); + cubeCards.add(new CardIdentity("Mind's Desire", "")); + cubeCards.add(new CardIdentity("Time Spiral", "")); + cubeCards.add(new CardIdentity("Upheaval", "")); + cubeCards.add(new CardIdentity("Legacy's Allure", "")); + cubeCards.add(new CardIdentity("Narcolepsy", "")); + cubeCards.add(new CardIdentity("Control Magic", "")); + cubeCards.add(new CardIdentity("Opposition", "")); + cubeCards.add(new CardIdentity("Future Sight", "")); + cubeCards.add(new CardIdentity("Treachery", "")); + cubeCards.add(new CardIdentity("Omniscience", "")); + cubeCards.add(new CardIdentity("Academy Ruins", "")); + cubeCards.add(new CardIdentity("Shelldock Isle", "")); + cubeCards.add(new CardIdentity("Carnophage", "")); + cubeCards.add(new CardIdentity("Diregraf Ghoul", "")); + cubeCards.add(new CardIdentity("Gravecrawler", "")); + cubeCards.add(new CardIdentity("Guul Draz Assassin", "")); + cubeCards.add(new CardIdentity("Tormented Hero", "")); + cubeCards.add(new CardIdentity("Vampire Lacerator", "")); + cubeCards.add(new CardIdentity("Blood Scrivener", "")); + cubeCards.add(new CardIdentity("Bloodghast", "")); + cubeCards.add(new CardIdentity("Dark Confidant", "")); + cubeCards.add(new CardIdentity("Dauthi Horror", "")); + cubeCards.add(new CardIdentity("Gatekeeper of Malakir", "")); + cubeCards.add(new CardIdentity("Knight of Infamy", "")); + cubeCards.add(new CardIdentity("Mesmeric Fiend", "")); + cubeCards.add(new CardIdentity("Nantuko Shade", "")); + cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); + cubeCards.add(new CardIdentity("Nezumi Shortfang", "")); + cubeCards.add(new CardIdentity("Nightscape Familiar", "")); + cubeCards.add(new CardIdentity("Oona's Prowler", "")); + cubeCards.add(new CardIdentity("Pack Rat", "")); + cubeCards.add(new CardIdentity("Vampire Hexmage", "")); + cubeCards.add(new CardIdentity("Bone Shredder", "")); + cubeCards.add(new CardIdentity("Geralf's Messenger", "")); + cubeCards.add(new CardIdentity("Hypnotic Specter", "")); + cubeCards.add(new CardIdentity("Phyrexian Rager", "")); + cubeCards.add(new CardIdentity("Vampire Nighthawk", "")); + cubeCards.add(new CardIdentity("Abyssal Persecutor", "")); + cubeCards.add(new CardIdentity("Bloodline Keeper", "")); + cubeCards.add(new CardIdentity("Braids, Cabal Minion", "")); + cubeCards.add(new CardIdentity("Crypt Ghast", "")); + cubeCards.add(new CardIdentity("Desecration Demon", "")); + cubeCards.add(new CardIdentity("Disciple of Bolas", "")); + cubeCards.add(new CardIdentity("Graveborn Muse", "")); + cubeCards.add(new CardIdentity("Nekrataal", "")); + cubeCards.add(new CardIdentity("Phyrexian Obliterator", "")); + cubeCards.add(new CardIdentity("Skinrender", "")); + cubeCards.add(new CardIdentity("Bloodgift Demon", "")); + cubeCards.add(new CardIdentity("Puppeteer Clique", "")); + cubeCards.add(new CardIdentity("Shriekmaw", "")); + cubeCards.add(new CardIdentity("Skithiryx, the Blight Dragon", "")); + cubeCards.add(new CardIdentity("Grave Titan", "")); + cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni", "")); + cubeCards.add(new CardIdentity("Kokusho, the Evening Star", "")); + cubeCards.add(new CardIdentity("Sheoldred, Whispering One", "")); + cubeCards.add(new CardIdentity("Griselbrand", "")); + cubeCards.add(new CardIdentity("Tombstalker", "")); + cubeCards.add(new CardIdentity("Liliana of the Veil", "")); + cubeCards.add(new CardIdentity("Liliana Vess", "")); + cubeCards.add(new CardIdentity("Sorin Markov", "")); + cubeCards.add(new CardIdentity("Booster Tutor", "")); + cubeCards.add(new CardIdentity("Dark Ritual", "")); + cubeCards.add(new CardIdentity("Disfigure", "")); + cubeCards.add(new CardIdentity("Entomb", "")); + cubeCards.add(new CardIdentity("Vampiric Tutor", "")); + cubeCards.add(new CardIdentity("Doom Blade", "")); + cubeCards.add(new CardIdentity("Go for the Throat", "")); + cubeCards.add(new CardIdentity("Tainted Pact", "")); + cubeCards.add(new CardIdentity("Terror", "")); + cubeCards.add(new CardIdentity("Ultimate Price", "")); + cubeCards.add(new CardIdentity("Corpse Dance", "")); + cubeCards.add(new CardIdentity("Dismember", "")); + cubeCards.add(new CardIdentity("Hero's Downfall", "")); + cubeCards.add(new CardIdentity("Slaughter Pact", "")); + cubeCards.add(new CardIdentity("Makeshift Mannequin", "")); + cubeCards.add(new CardIdentity("Snuff Out", "")); + cubeCards.add(new CardIdentity("Duress", "")); + cubeCards.add(new CardIdentity("Innocent Blood", "")); + cubeCards.add(new CardIdentity("Inquisition of Kozilek", "")); + cubeCards.add(new CardIdentity("Reanimate", "")); + cubeCards.add(new CardIdentity("Thoughtseize", "")); + cubeCards.add(new CardIdentity("Chainer's Edict", "")); + cubeCards.add(new CardIdentity("Demonic Tutor", "")); + cubeCards.add(new CardIdentity("Exhume", "")); + cubeCards.add(new CardIdentity("Hymn to Tourach", "")); + cubeCards.add(new CardIdentity("Night's Whisper", "")); + cubeCards.add(new CardIdentity("Sign in Blood", "")); + cubeCards.add(new CardIdentity("Sinkhole", "")); + cubeCards.add(new CardIdentity("Buried Alive", "")); + cubeCards.add(new CardIdentity("Yawgmoth's Will", "")); + cubeCards.add(new CardIdentity("Ambition's Cost", "")); + cubeCards.add(new CardIdentity("Consuming Vapors", "")); + cubeCards.add(new CardIdentity("Damnation", "")); + cubeCards.add(new CardIdentity("Tendrils of Agony", "")); + cubeCards.add(new CardIdentity("Living Death", "")); + cubeCards.add(new CardIdentity("Black Sun's Zenith", "")); + cubeCards.add(new CardIdentity("Mind Shatter", "")); + cubeCards.add(new CardIdentity("Profane Command", "")); + cubeCards.add(new CardIdentity("Animate Dead", "")); + cubeCards.add(new CardIdentity("Bitterblossom", "")); + cubeCards.add(new CardIdentity("Necromancy", "")); + cubeCards.add(new CardIdentity("Necropotence", "")); + cubeCards.add(new CardIdentity("Phyrexian Arena", "")); + cubeCards.add(new CardIdentity("Recurring Nightmare", "")); + cubeCards.add(new CardIdentity("Diabolic Servitude", "")); + cubeCards.add(new CardIdentity("Nether Void", "")); + cubeCards.add(new CardIdentity("The Abyss", "")); + cubeCards.add(new CardIdentity("Yawgmoth's Bargain", "")); + cubeCards.add(new CardIdentity("Gnarled Scarhide", "")); + cubeCards.add(new CardIdentity("Herald of Torment", "")); + cubeCards.add(new CardIdentity("Master of the Feast", "")); + cubeCards.add(new CardIdentity("Cabal Coffers", "")); + cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth", "")); + cubeCards.add(new CardIdentity("Volrath's Stronghold", "")); + cubeCards.add(new CardIdentity("Firedrinker Satyr", "")); + cubeCards.add(new CardIdentity("Frenzied Goblin", "")); + cubeCards.add(new CardIdentity("Goblin Bushwhacker", "")); + cubeCards.add(new CardIdentity("Goblin Guide", "")); + cubeCards.add(new CardIdentity("Goblin Welder", "")); + cubeCards.add(new CardIdentity("Greater Gargadon", "")); + cubeCards.add(new CardIdentity("Grim Lavamancer", "")); + cubeCards.add(new CardIdentity("Jackal Pup", "")); + cubeCards.add(new CardIdentity("Reckless Waif", "")); + cubeCards.add(new CardIdentity("Spikeshot Elder", "")); + cubeCards.add(new CardIdentity("Stromkirk Noble", "")); + cubeCards.add(new CardIdentity("Vexing Devil", "")); + cubeCards.add(new CardIdentity("Ash Zealot", "")); + cubeCards.add(new CardIdentity("Ember Hauler", "")); + cubeCards.add(new CardIdentity("Firefist Striker", "")); + cubeCards.add(new CardIdentity("Goblin Wardriver", "")); + cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); + cubeCards.add(new CardIdentity("Hellspark Elemental", "")); + cubeCards.add(new CardIdentity("Kargan Dragonlord", "")); + cubeCards.add(new CardIdentity("Keldon Marauders", "")); + cubeCards.add(new CardIdentity("Lightning Mauler", "")); + cubeCards.add(new CardIdentity("Mogg Flunkies", "")); + cubeCards.add(new CardIdentity("Mogg War Marshal", "")); + cubeCards.add(new CardIdentity("Plated Geopede", "")); + cubeCards.add(new CardIdentity("Slith Firewalker", "")); + cubeCards.add(new CardIdentity("Stormblood Berserker", "")); + cubeCards.add(new CardIdentity("Torch Fiend", "")); + cubeCards.add(new CardIdentity("Young Pyromancer", "")); + cubeCards.add(new CardIdentity("Ball Lightning", "")); + cubeCards.add(new CardIdentity("Chandra's Phoenix", "")); + cubeCards.add(new CardIdentity("Countryside Crusher", "")); + cubeCards.add(new CardIdentity("Goblin Ruinblaster", "")); + cubeCards.add(new CardIdentity("Hell's Thunder", "")); + cubeCards.add(new CardIdentity("Imperial Recruiter", "")); + cubeCards.add(new CardIdentity("Squee, Goblin Nabob", "")); + cubeCards.add(new CardIdentity("Thunderscape Battlemage", "")); + cubeCards.add(new CardIdentity("Zo-Zu the Punisher", "")); + cubeCards.add(new CardIdentity("Avalanche Riders", "")); + cubeCards.add(new CardIdentity("Blistering Firecat", "")); + cubeCards.add(new CardIdentity("Flametongue Kavu", "")); + cubeCards.add(new CardIdentity("Hellrider", "")); + cubeCards.add(new CardIdentity("Hero of Oxid Ridge", "")); + cubeCards.add(new CardIdentity("Keldon Champion", "")); + cubeCards.add(new CardIdentity("Ravenous Baboons", "")); + cubeCards.add(new CardIdentity("Skizzik", "")); + cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker", "")); + cubeCards.add(new CardIdentity("Siege-Gang Commander", "")); + cubeCards.add(new CardIdentity("Thundermaw Hellkite", "")); + cubeCards.add(new CardIdentity("Urabrask the Hidden", "")); + cubeCards.add(new CardIdentity("Zealous Conscripts", "")); + cubeCards.add(new CardIdentity("Inferno Titan", "")); + cubeCards.add(new CardIdentity("Bogardan Hellkite", "")); + cubeCards.add(new CardIdentity("Chandra, the Firebrand", "")); + cubeCards.add(new CardIdentity("Koth of the Hammer", "")); + cubeCards.add(new CardIdentity("Chandra Nalaar", "")); + cubeCards.add(new CardIdentity("Burst Lightning", "")); + cubeCards.add(new CardIdentity("Lightning Bolt", "")); + cubeCards.add(new CardIdentity("Ancient Grudge", "")); + cubeCards.add(new CardIdentity("Incinerate", "")); + cubeCards.add(new CardIdentity("Lightning Strike", "")); + cubeCards.add(new CardIdentity("Magma Jet", "")); + cubeCards.add(new CardIdentity("Searing Blaze", "")); + cubeCards.add(new CardIdentity("Searing Spear", "")); + cubeCards.add(new CardIdentity("Brimstone Volley", "")); + cubeCards.add(new CardIdentity("Chaos Warp", "")); + cubeCards.add(new CardIdentity("Char", "")); + cubeCards.add(new CardIdentity("Staggershock", "")); + cubeCards.add(new CardIdentity("Volcanic Fallout", "")); + cubeCards.add(new CardIdentity("Beacon of Destruction", "")); + cubeCards.add(new CardIdentity("Fireblast", "")); + cubeCards.add(new CardIdentity("Pyrokinesis", "")); + cubeCards.add(new CardIdentity("Chain Lightning", "")); + cubeCards.add(new CardIdentity("Faithless Looting", "")); + cubeCards.add(new CardIdentity("Firebolt", "")); + cubeCards.add(new CardIdentity("Gamble", "")); + cubeCards.add(new CardIdentity("Reckless Charge", "")); + cubeCards.add(new CardIdentity("Arc Trail", "")); + cubeCards.add(new CardIdentity("Pyroclasm", "")); + cubeCards.add(new CardIdentity("Anger of the Gods", "")); + cubeCards.add(new CardIdentity("Arc Lightning", "")); + cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); + cubeCards.add(new CardIdentity("Molten Rain", "")); + cubeCards.add(new CardIdentity("Pillage", "")); + cubeCards.add(new CardIdentity("Rift Bolt", "")); + cubeCards.add(new CardIdentity("Slagstorm", "")); + cubeCards.add(new CardIdentity("Stone Rain", "")); + cubeCards.add(new CardIdentity("Wheel of Fortune", "")); + cubeCards.add(new CardIdentity("Aftershock", "")); + cubeCards.add(new CardIdentity("Empty the Warrens", "")); + cubeCards.add(new CardIdentity("Banefire", "")); + cubeCards.add(new CardIdentity("Devil's Play", "")); + cubeCards.add(new CardIdentity("Earthquake", "")); + cubeCards.add(new CardIdentity("Jokulhaups", "")); + cubeCards.add(new CardIdentity("Rolling Earthquake", "")); + cubeCards.add(new CardIdentity("Wildfire", "")); + cubeCards.add(new CardIdentity("Bonfire of the Damned", "")); + cubeCards.add(new CardIdentity("Sulfuric Vortex", "")); + cubeCards.add(new CardIdentity("Sneak Attack", "")); + cubeCards.add(new CardIdentity("Purphoros, God of the Forge", "")); + cubeCards.add(new CardIdentity("Ghitu Encampment", "")); + cubeCards.add(new CardIdentity("Teetering Peaks", "")); + cubeCards.add(new CardIdentity("Avacyn's Pilgrim", "")); + cubeCards.add(new CardIdentity("Birds of Paradise", "")); + cubeCards.add(new CardIdentity("Elves of Deep Shadow", "")); + cubeCards.add(new CardIdentity("Elvish Mystic", "")); + cubeCards.add(new CardIdentity("Experiment One", "")); + cubeCards.add(new CardIdentity("Fyndhorn Elves", "")); + cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); + cubeCards.add(new CardIdentity("Llanowar Elves", "")); + cubeCards.add(new CardIdentity("Noble Hierarch", "")); + cubeCards.add(new CardIdentity("Ulvenwald Tracker", "")); + cubeCards.add(new CardIdentity("Devoted Druid", "")); + cubeCards.add(new CardIdentity("Fauna Shaman", "")); + cubeCards.add(new CardIdentity("Lotus Cobra", "")); + cubeCards.add(new CardIdentity("Mayor of Avabruck", "")); + cubeCards.add(new CardIdentity("Overgrown Battlement", "")); + cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", "")); + cubeCards.add(new CardIdentity("Sakura-Tribe Elder", "")); + cubeCards.add(new CardIdentity("Scavenging Ooze", "")); + cubeCards.add(new CardIdentity("Scorned Villager", "")); + cubeCards.add(new CardIdentity("Strangleroot Geist", "")); + cubeCards.add(new CardIdentity("Sylvan Caryatid", "")); + cubeCards.add(new CardIdentity("Tarmogoyf", "")); + cubeCards.add(new CardIdentity("Wall of Blossoms", "")); + cubeCards.add(new CardIdentity("Wall of Roots", "")); + cubeCards.add(new CardIdentity("Werebear", "")); + cubeCards.add(new CardIdentity("Eternal Witness", "")); + cubeCards.add(new CardIdentity("Ohran Viper", "")); + cubeCards.add(new CardIdentity("Wolfir Avenger", "")); + cubeCards.add(new CardIdentity("Wood Elves", "")); + cubeCards.add(new CardIdentity("Yavimaya Elder", "")); + cubeCards.add(new CardIdentity("Blastoderm", "")); + cubeCards.add(new CardIdentity("Chameleon Colossus", "")); + cubeCards.add(new CardIdentity("Master of the Wild Hunt", "")); + cubeCards.add(new CardIdentity("Mold Shambler", "")); + cubeCards.add(new CardIdentity("Nantuko Vigilante", "")); + cubeCards.add(new CardIdentity("Obstinate Baloth", "")); + cubeCards.add(new CardIdentity("Oracle of Mul Daya", "")); + cubeCards.add(new CardIdentity("Polukranos, World Eater", "")); + cubeCards.add(new CardIdentity("Thelonite Hermit", "")); + cubeCards.add(new CardIdentity("Thrun, the Last Troll", "")); + cubeCards.add(new CardIdentity("Vengevine", "")); + cubeCards.add(new CardIdentity("Wickerbough Elder", "")); + cubeCards.add(new CardIdentity("Yeva, Nature's Herald", "")); + cubeCards.add(new CardIdentity("Acidic Slime", "")); + cubeCards.add(new CardIdentity("Deranged Hermit", "")); + cubeCards.add(new CardIdentity("Genesis", "")); + cubeCards.add(new CardIdentity("Indrik Stomphowler", "")); + cubeCards.add(new CardIdentity("Thornling", "")); + cubeCards.add(new CardIdentity("Thragtusk", "")); + cubeCards.add(new CardIdentity("Vorapede", "")); + cubeCards.add(new CardIdentity("Cloudthresher", "")); + cubeCards.add(new CardIdentity("Primeval Titan", "")); + cubeCards.add(new CardIdentity("Avenger of Zendikar", "")); + cubeCards.add(new CardIdentity("Primordial Hydra", "")); + cubeCards.add(new CardIdentity("Craterhoof Behemoth", "")); + cubeCards.add(new CardIdentity("Terastodon", "")); + cubeCards.add(new CardIdentity("Woodfall Primus", "")); + cubeCards.add(new CardIdentity("Garruk Relentless", "")); + cubeCards.add(new CardIdentity("Garruk Wildspeaker", "")); + cubeCards.add(new CardIdentity("Garruk, Primal Hunter", "")); + cubeCards.add(new CardIdentity("Arbor Elf", "")); + cubeCards.add(new CardIdentity("Birthing Pod", "")); + cubeCards.add(new CardIdentity("Vines of Vastwood", "")); + cubeCards.add(new CardIdentity("Moment's Peace", "")); + cubeCards.add(new CardIdentity("Naturalize", "")); + cubeCards.add(new CardIdentity("Beast Within", "")); + cubeCards.add(new CardIdentity("Harrow", "")); + cubeCards.add(new CardIdentity("Stonewood Invocation", "")); + cubeCards.add(new CardIdentity("Summoning Trap", "")); + cubeCards.add(new CardIdentity("Channel", "")); + cubeCards.add(new CardIdentity("Explore", "")); + cubeCards.add(new CardIdentity("Farseek", "")); + cubeCards.add(new CardIdentity("Life from the Loam", "")); + cubeCards.add(new CardIdentity("Rampant Growth", "")); + cubeCards.add(new CardIdentity("Regrowth", "")); + cubeCards.add(new CardIdentity("Call of the Herd", "")); + cubeCards.add(new CardIdentity("Cultivate", "")); + cubeCards.add(new CardIdentity("Kodama's Reach", "")); + cubeCards.add(new CardIdentity("Search for Tomorrow", "")); + cubeCards.add(new CardIdentity("Harmonize", "")); + cubeCards.add(new CardIdentity("Natural Order", "")); + cubeCards.add(new CardIdentity("Overrun", "")); + cubeCards.add(new CardIdentity("Plow Under", "")); + cubeCards.add(new CardIdentity("Primal Command", "")); + cubeCards.add(new CardIdentity("Restock", "")); + cubeCards.add(new CardIdentity("Rude Awakening", "")); + cubeCards.add(new CardIdentity("Stunted Growth", "")); + cubeCards.add(new CardIdentity("Green Sun's Zenith", "")); + cubeCards.add(new CardIdentity("Tooth and Nail", "")); + cubeCards.add(new CardIdentity("Genesis Wave", "")); + cubeCards.add(new CardIdentity("Rancor", "")); + cubeCards.add(new CardIdentity("Oath of Druids", "")); + cubeCards.add(new CardIdentity("Survival of the Fittest", "")); + cubeCards.add(new CardIdentity("Sylvan Library", "")); + cubeCards.add(new CardIdentity("Awakening Zone", "")); + cubeCards.add(new CardIdentity("Heartbeat of Spring", "")); + cubeCards.add(new CardIdentity("Defense of the Heart", "")); + cubeCards.add(new CardIdentity("Courser of Kruphix", "")); + cubeCards.add(new CardIdentity("Gaea's Cradle", "")); + cubeCards.add(new CardIdentity("Treetop Village", "")); + cubeCards.add(new CardIdentity("Yavimaya Hollow", "")); + cubeCards.add(new CardIdentity("Geist of Saint Traft", "")); + cubeCards.add(new CardIdentity("Plumeveil", "")); + cubeCards.add(new CardIdentity("Wall of Denial", "")); + cubeCards.add(new CardIdentity("Grand Arbiter Augustin IV", "")); + cubeCards.add(new CardIdentity("Venser, the Sojourner", "")); + cubeCards.add(new CardIdentity("Supreme Verdict", "")); + cubeCards.add(new CardIdentity("Detention Sphere", "")); + cubeCards.add(new CardIdentity("Celestial Colonnade", "")); + cubeCards.add(new CardIdentity("Glacial Fortress", "")); + cubeCards.add(new CardIdentity("Hallowed Fountain", "")); + cubeCards.add(new CardIdentity("Tundra", "")); + cubeCards.add(new CardIdentity("Psychatog", "")); + cubeCards.add(new CardIdentity("Shadowmage Infiltrator", "")); + cubeCards.add(new CardIdentity("Duskmantle Seer", "")); + cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", "")); + cubeCards.add(new CardIdentity("Baleful Strix", "")); + cubeCards.add(new CardIdentity("Agony Warp", "")); + cubeCards.add(new CardIdentity("Far // Away", "")); + cubeCards.add(new CardIdentity("Creeping Tar Pit", "")); + cubeCards.add(new CardIdentity("Drowned Catacomb", "")); + cubeCards.add(new CardIdentity("Underground Sea", "")); + cubeCards.add(new CardIdentity("Watery Grave", "")); + cubeCards.add(new CardIdentity("Rakdos Cackler", "")); + cubeCards.add(new CardIdentity("Falkenrath Aristocrat", "")); + cubeCards.add(new CardIdentity("Murderous Redcap", "")); + cubeCards.add(new CardIdentity("Olivia Voldaren", "")); + cubeCards.add(new CardIdentity("Sarkhan the Mad", "")); + cubeCards.add(new CardIdentity("Bituminous Blast", "")); + cubeCards.add(new CardIdentity("Dreadbore", "")); + cubeCards.add(new CardIdentity("Badlands", "")); + cubeCards.add(new CardIdentity("Blood Crypt", "")); + cubeCards.add(new CardIdentity("Dragonskull Summit", "")); + cubeCards.add(new CardIdentity("Lavaclaw Reaches", "")); + cubeCards.add(new CardIdentity("Tattermunge Maniac", "")); + cubeCards.add(new CardIdentity("Burning-Tree Emissary", "")); + cubeCards.add(new CardIdentity("Boggart Ram-Gang", "")); + cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); + cubeCards.add(new CardIdentity("Huntmaster of the Fells", "")); + cubeCards.add(new CardIdentity("Domri Rade", "")); + cubeCards.add(new CardIdentity("Manamorphose", "")); + cubeCards.add(new CardIdentity("Raging Ravine", "")); + cubeCards.add(new CardIdentity("Rootbound Crag", "")); + cubeCards.add(new CardIdentity("Stomping Ground", "")); + cubeCards.add(new CardIdentity("Taiga", "")); + cubeCards.add(new CardIdentity("Dryad Militant", "")); + cubeCards.add(new CardIdentity("Qasali Pridemage", "")); + cubeCards.add(new CardIdentity("Voice of Resurgence", "")); + cubeCards.add(new CardIdentity("Kitchen Finks", "")); + cubeCards.add(new CardIdentity("Knight of the Reliquary", "")); + cubeCards.add(new CardIdentity("Mirari's Wake", "")); + cubeCards.add(new CardIdentity("Gavony Township", "")); + cubeCards.add(new CardIdentity("Savannah", "")); + cubeCards.add(new CardIdentity("Stirring Wildwood", "")); + cubeCards.add(new CardIdentity("Sunpetal Grove", "")); + cubeCards.add(new CardIdentity("Temple Garden", "")); + cubeCards.add(new CardIdentity("Stillmoon Cavalier", "")); + cubeCards.add(new CardIdentity("Obzedat, Ghost Council", "")); + cubeCards.add(new CardIdentity("Ashen Rider", "")); + cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", "")); + cubeCards.add(new CardIdentity("Tidehollow Sculler", "")); + cubeCards.add(new CardIdentity("Vindicate", "")); + cubeCards.add(new CardIdentity("Godless Shrine", "")); + cubeCards.add(new CardIdentity("Isolated Chapel", "")); + cubeCards.add(new CardIdentity("Scrubland", "")); + cubeCards.add(new CardIdentity("Vault of the Archangel", "")); + cubeCards.add(new CardIdentity("Deathrite Shaman", "")); + cubeCards.add(new CardIdentity("Putrid Leech", "")); + cubeCards.add(new CardIdentity("Varolz, the Scar-Striped", "")); + cubeCards.add(new CardIdentity("Vraska the Unseen", "")); + cubeCards.add(new CardIdentity("Putrefy", "")); + cubeCards.add(new CardIdentity("Abrupt Decay", "")); + cubeCards.add(new CardIdentity("Maelstrom Pulse", "")); + cubeCards.add(new CardIdentity("Pernicious Deed", "")); + cubeCards.add(new CardIdentity("Bayou", "")); + cubeCards.add(new CardIdentity("Overgrown Tomb", "")); + cubeCards.add(new CardIdentity("Woodland Cemetery", "")); + cubeCards.add(new CardIdentity("Coiling Oracle", "")); + cubeCards.add(new CardIdentity("Cold-Eyed Selkie", "")); + cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", "")); + cubeCards.add(new CardIdentity("Trygon Predator", "")); + cubeCards.add(new CardIdentity("Mystic Snake", "")); + cubeCards.add(new CardIdentity("Simic Sky Swallower", "")); + cubeCards.add(new CardIdentity("Kiora, the Crashing Wave", "")); + cubeCards.add(new CardIdentity("Voidslime", "")); + cubeCards.add(new CardIdentity("Breeding Pool", "")); + cubeCards.add(new CardIdentity("Hinterland Harbor", "")); + cubeCards.add(new CardIdentity("Tropical Island", "")); + cubeCards.add(new CardIdentity("Niv-Mizzet, Dracogenius", "")); + cubeCards.add(new CardIdentity("Nucklavee", "")); + cubeCards.add(new CardIdentity("Ral Zarek", "")); + cubeCards.add(new CardIdentity("Fire // Ice", "")); + cubeCards.add(new CardIdentity("Izzet Charm", "")); + cubeCards.add(new CardIdentity("Electrolyze", "")); + cubeCards.add(new CardIdentity("Steam Augury", "")); + cubeCards.add(new CardIdentity("Prophetic Bolt", "")); + cubeCards.add(new CardIdentity("Steam Vents", "")); + cubeCards.add(new CardIdentity("Sulfur Falls", "")); + cubeCards.add(new CardIdentity("Volcanic Island", "")); + cubeCards.add(new CardIdentity("Figure of Destiny", "")); + cubeCards.add(new CardIdentity("Boros Reckoner", "")); + cubeCards.add(new CardIdentity("Ajani Vengeant", "")); + cubeCards.add(new CardIdentity("Boros Charm", "")); + cubeCards.add(new CardIdentity("Lightning Helix", "")); + cubeCards.add(new CardIdentity("Aurelia's Fury", "")); + cubeCards.add(new CardIdentity("Chained to the Rocks", "")); + cubeCards.add(new CardIdentity("Clifftop Retreat", "")); + cubeCards.add(new CardIdentity("Plateau", "")); + cubeCards.add(new CardIdentity("Sacred Foundry", "")); + cubeCards.add(new CardIdentity("Sphinx of the Steel Wind", "")); + cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker", "")); + cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth", "")); + cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", "")); + cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", "")); + cubeCards.add(new CardIdentity("Karn Liberated", "")); + cubeCards.add(new CardIdentity("Epochrasite", "")); + cubeCards.add(new CardIdentity("Phyrexian Revoker", "")); + cubeCards.add(new CardIdentity("Spellskite", "")); + cubeCards.add(new CardIdentity("Palladium Myr", "")); + cubeCards.add(new CardIdentity("Lodestone Golem", "")); + cubeCards.add(new CardIdentity("Masticore", "")); + cubeCards.add(new CardIdentity("Molten-Tail Masticore", "")); + cubeCards.add(new CardIdentity("Solemn Simulacrum", "")); + cubeCards.add(new CardIdentity("Precursor Golem", "")); + cubeCards.add(new CardIdentity("Wurmcoil Engine", "")); + cubeCards.add(new CardIdentity("Myr Battlesphere", "")); + cubeCards.add(new CardIdentity("Platinum Angel", "")); + cubeCards.add(new CardIdentity("Sundering Titan", "")); + cubeCards.add(new CardIdentity("Black Lotus", "")); + cubeCards.add(new CardIdentity("Chrome Mox", "")); + cubeCards.add(new CardIdentity("Everflowing Chalice", "")); + cubeCards.add(new CardIdentity("Lotus Bloom", "")); + cubeCards.add(new CardIdentity("Lotus Petal", "")); + cubeCards.add(new CardIdentity("Mana Crypt", "")); + cubeCards.add(new CardIdentity("Mox Diamond", "")); + cubeCards.add(new CardIdentity("Mox Emerald", "")); + cubeCards.add(new CardIdentity("Mox Jet", "")); + cubeCards.add(new CardIdentity("Mox Pearl", "")); + cubeCards.add(new CardIdentity("Mox Ruby", "")); + cubeCards.add(new CardIdentity("Mox Sapphire", "")); + cubeCards.add(new CardIdentity("AEther Vial", "")); + cubeCards.add(new CardIdentity("Basilisk Collar", "")); + cubeCards.add(new CardIdentity("Bonesplitter", "")); + cubeCards.add(new CardIdentity("Cursed Scroll", "")); + cubeCards.add(new CardIdentity("Mana Vault", "")); + cubeCards.add(new CardIdentity("Pithing Needle", "")); + cubeCards.add(new CardIdentity("Relic of Progenitus", "")); + cubeCards.add(new CardIdentity("Sensei's Divining Top", "")); + cubeCards.add(new CardIdentity("Skullclamp", "")); + cubeCards.add(new CardIdentity("Sol Ring", "")); + cubeCards.add(new CardIdentity("Ankh of Mishra", "")); + cubeCards.add(new CardIdentity("Chaos Orb", "")); + cubeCards.add(new CardIdentity("Coldsteel Heart", "")); + cubeCards.add(new CardIdentity("Fellwar Stone", "")); + cubeCards.add(new CardIdentity("Grim Monolith", "")); + cubeCards.add(new CardIdentity("Isochron Scepter", "")); + cubeCards.add(new CardIdentity("Lightning Greaves", "")); + cubeCards.add(new CardIdentity("Mind Stone", "")); + cubeCards.add(new CardIdentity("Mortarpod", "")); + cubeCards.add(new CardIdentity("Powder Keg", "")); + cubeCards.add(new CardIdentity("Prismatic Lens", "")); + cubeCards.add(new CardIdentity("Scroll Rack", "")); + cubeCards.add(new CardIdentity("Shrine of Burning Rage", "")); + cubeCards.add(new CardIdentity("Sphere of the Suns", "")); + cubeCards.add(new CardIdentity("Umezawa's Jitte", "")); + cubeCards.add(new CardIdentity("Basalt Monolith", "")); + cubeCards.add(new CardIdentity("Coalition Relic", "")); + cubeCards.add(new CardIdentity("Crucible of Worlds", "")); + cubeCards.add(new CardIdentity("Crystal Shard", "")); + cubeCards.add(new CardIdentity("Grafted Wargear", "")); + cubeCards.add(new CardIdentity("Mimic Vat", "")); + cubeCards.add(new CardIdentity("Pristine Talisman", "")); + cubeCards.add(new CardIdentity("Sword of Body and Mind", "")); + cubeCards.add(new CardIdentity("Sword of Feast and Famine", "")); + cubeCards.add(new CardIdentity("Sword of Fire and Ice", "")); + cubeCards.add(new CardIdentity("Sword of Light and Shadow", "")); + cubeCards.add(new CardIdentity("Sword of War and Peace", "")); + cubeCards.add(new CardIdentity("Tangle Wire", "")); + cubeCards.add(new CardIdentity("Vedalken Shackles", "")); + cubeCards.add(new CardIdentity("Worn Powerstone", "")); + cubeCards.add(new CardIdentity("Nevinyrral's Disk", "")); + cubeCards.add(new CardIdentity("Smokestack", "")); + cubeCards.add(new CardIdentity("Thran Dynamo", "")); + cubeCards.add(new CardIdentity("Batterskull", "")); + cubeCards.add(new CardIdentity("Eldrazi Monument", "")); + cubeCards.add(new CardIdentity("Engineered Explosives", "")); + cubeCards.add(new CardIdentity("Gilded Lotus", "")); + cubeCards.add(new CardIdentity("Memory Jar", "")); + cubeCards.add(new CardIdentity("Mindslaver", "")); + cubeCards.add(new CardIdentity("All Is Dust", "")); + cubeCards.add(new CardIdentity("Ancient Tomb", "")); + cubeCards.add(new CardIdentity("Arid Mesa", "")); + cubeCards.add(new CardIdentity("Bloodstained Mire", "")); + cubeCards.add(new CardIdentity("City of Brass", "")); + cubeCards.add(new CardIdentity("City of Traitors", "")); + cubeCards.add(new CardIdentity("Evolving Wilds", "")); + cubeCards.add(new CardIdentity("Flooded Strand", "")); + cubeCards.add(new CardIdentity("Library of Alexandria", "")); + cubeCards.add(new CardIdentity("Mana Confluence", "")); + cubeCards.add(new CardIdentity("Marsh Flats", "")); + cubeCards.add(new CardIdentity("Maze of Ith", "")); + cubeCards.add(new CardIdentity("Mishra's Factory", "")); + cubeCards.add(new CardIdentity("Misty Rainforest", "")); + cubeCards.add(new CardIdentity("Mutavault", "")); + cubeCards.add(new CardIdentity("Polluted Delta", "")); + cubeCards.add(new CardIdentity("Rishadan Port", "")); + cubeCards.add(new CardIdentity("Scalding Tarn", "")); + cubeCards.add(new CardIdentity("Strip Mine", "")); + cubeCards.add(new CardIdentity("Tectonic Edge", "")); + cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); + cubeCards.add(new CardIdentity("The Tabernacle at Pendrell Vale", "")); + cubeCards.add(new CardIdentity("Verdant Catacombs", "")); + cubeCards.add(new CardIdentity("Wasteland", "")); + cubeCards.add(new CardIdentity("Windswept Heath", "")); + cubeCards.add(new CardIdentity("Wooded Foothills", "")); + + } +} diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGCube.java index c401bb0fa82..509cb3d84cf 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGCube.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGCube.java @@ -1,545 +1,545 @@ -/* - * 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.tournament.cubes; - -import mage.game.draft.DraftCube; - -/** - * - * @author LevelX2 - */ -public class MTGCube extends DraftCube { - - public MTGCube() { - super("www.mtgcube.com (502 cards)"); // http://www.mtgcube.com - - cubeCards.add(new CardIdentity("Abrupt Decay", "")); - cubeCards.add(new CardIdentity("Academy Ruins", "")); - cubeCards.add(new CardIdentity("Accorder Paladin", "")); - cubeCards.add(new CardIdentity("Acidic Slime", "")); - cubeCards.add(new CardIdentity("Aetherling", "")); - cubeCards.add(new CardIdentity("Ajani Goldmane", "")); - cubeCards.add(new CardIdentity("Ajani Vengeant", "")); - cubeCards.add(new CardIdentity("Ancestral Recall", "")); - cubeCards.add(new CardIdentity("Ancestral Vision", "")); - cubeCards.add(new CardIdentity("Animate Dead", "")); - cubeCards.add(new CardIdentity("Arbor Elf", "")); - cubeCards.add(new CardIdentity("Arc Lightning", "")); - cubeCards.add(new CardIdentity("Arc Trail", "")); - cubeCards.add(new CardIdentity("Arcane Denial", "")); - cubeCards.add(new CardIdentity("Archangel of Thune", "")); - cubeCards.add(new CardIdentity("Arid Mesa", "")); - cubeCards.add(new CardIdentity("Armageddon", "")); - cubeCards.add(new CardIdentity("Ash Zealot", "")); - cubeCards.add(new CardIdentity("Augur of Bolas", "")); - cubeCards.add(new CardIdentity("Avalanche Riders", "")); - cubeCards.add(new CardIdentity("Avenger of Zendikar", "")); - cubeCards.add(new CardIdentity("Awakening Zone", "")); - cubeCards.add(new CardIdentity("Azorius Signet", "")); - cubeCards.add(new CardIdentity("Badlands", "")); - cubeCards.add(new CardIdentity("Balance", "")); - cubeCards.add(new CardIdentity("Baleful Strix", "")); - cubeCards.add(new CardIdentity("Bane of the Living", "")); - cubeCards.add(new CardIdentity("Baneslayer Angel", "")); - cubeCards.add(new CardIdentity("Bant", "")); - cubeCards.add(new CardIdentity("Batterskull", "")); - cubeCards.add(new CardIdentity("Battlefield Forge", "")); - cubeCards.add(new CardIdentity("Bayou", "")); - cubeCards.add(new CardIdentity("Birds of Paradise", "")); - cubeCards.add(new CardIdentity("Birthing Pod", "")); - cubeCards.add(new CardIdentity("Bitterblossom", "")); - cubeCards.add(new CardIdentity("Black Lotus", "")); - cubeCards.add(new CardIdentity("Black Vise", "")); - cubeCards.add(new CardIdentity("Blade Splicer", "")); - cubeCards.add(new CardIdentity("Blightning", "")); - cubeCards.add(new CardIdentity("Blistering Firecat", "")); - cubeCards.add(new CardIdentity("Blood Crypt", "")); - cubeCards.add(new CardIdentity("Blood Scrivener", "")); - cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); - cubeCards.add(new CardIdentity("Bloodghast", "")); - cubeCards.add(new CardIdentity("Bloodstained Mire", "")); - cubeCards.add(new CardIdentity("Bone Shredder", "")); - cubeCards.add(new CardIdentity("Bonesplitter", "")); - cubeCards.add(new CardIdentity("Bonfire of the Damned", "")); - cubeCards.add(new CardIdentity("Boros Charm", "")); - cubeCards.add(new CardIdentity("Boros Reckoner", "")); - cubeCards.add(new CardIdentity("Boros Signet", "")); - cubeCards.add(new CardIdentity("Braids, Cabal Minion", "")); - cubeCards.add(new CardIdentity("Brainstorm", "")); - cubeCards.add(new CardIdentity("Breeding Pool", "")); - cubeCards.add(new CardIdentity("Bribery", "")); - cubeCards.add(new CardIdentity("Broodmate Dragon", "")); - cubeCards.add(new CardIdentity("Burning of Xinye", "")); - cubeCards.add(new CardIdentity("Burst Lightning", "")); - cubeCards.add(new CardIdentity("Call of the Herd", "")); - cubeCards.add(new CardIdentity("Carnophage", "")); - cubeCards.add(new CardIdentity("Catastrophe", "")); - cubeCards.add(new CardIdentity("Caves of Koilos", "")); - cubeCards.add(new CardIdentity("Celestial Colonnade", "")); - cubeCards.add(new CardIdentity("Chain Lightning", "")); - cubeCards.add(new CardIdentity("Chainers Edict", "")); - cubeCards.add(new CardIdentity("Chameleon Colossus", "")); - cubeCards.add(new CardIdentity("Chandra Nalaar", "")); - cubeCards.add(new CardIdentity("Chandra, Pyromaster", "")); - cubeCards.add(new CardIdentity("Char", "")); - cubeCards.add(new CardIdentity("Chrome Mox", "")); - cubeCards.add(new CardIdentity("City of Brass", "")); - cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); - cubeCards.add(new CardIdentity("Coalition Relic", "")); - cubeCards.add(new CardIdentity("Coldsteel Heart", "")); - cubeCards.add(new CardIdentity("Consecrated Sphinx", "")); - cubeCards.add(new CardIdentity("Consuming Vapors", "")); - cubeCards.add(new CardIdentity("Contagion", "")); - cubeCards.add(new CardIdentity("Control Magic", "")); - cubeCards.add(new CardIdentity("Counterspell", "")); - cubeCards.add(new CardIdentity("Creakwood Liege", "")); - cubeCards.add(new CardIdentity("Creeping Tar Pit", "")); - cubeCards.add(new CardIdentity("Crucible of Worlds", "")); - cubeCards.add(new CardIdentity("Cryptic Command", "")); - cubeCards.add(new CardIdentity("Crystal Shard", "")); - cubeCards.add(new CardIdentity("Cultivate", "")); - cubeCards.add(new CardIdentity("Cursed Scroll", "")); - cubeCards.add(new CardIdentity("Damnation", "")); - cubeCards.add(new CardIdentity("Dance of the Dead", "")); - cubeCards.add(new CardIdentity("Dark Confidant", "")); - cubeCards.add(new CardIdentity("Dark Ritual", "")); - cubeCards.add(new CardIdentity("Day of Judgment", "")); - cubeCards.add(new CardIdentity("Daze", "")); - cubeCards.add(new CardIdentity("Deep Analysis", "")); - cubeCards.add(new CardIdentity("Demonic Tutor", "")); - cubeCards.add(new CardIdentity("Deranged Hermit", "")); - cubeCards.add(new CardIdentity("Detention Sphere", "")); - cubeCards.add(new CardIdentity("Diabolic Edict", "")); - cubeCards.add(new CardIdentity("Dimir Signet", "")); - cubeCards.add(new CardIdentity("Diregraf Ghoul", "")); - cubeCards.add(new CardIdentity("Disenchant", "")); - cubeCards.add(new CardIdentity("Dismember", "")); - cubeCards.add(new CardIdentity("Dreadbore", "")); - cubeCards.add(new CardIdentity("Dryad Militant", "")); - cubeCards.add(new CardIdentity("Duress", "")); - cubeCards.add(new CardIdentity("Dust Bowl", "")); - cubeCards.add(new CardIdentity("Dwarven Blastminer", "")); - cubeCards.add(new CardIdentity("Earthquake", "")); - cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", "")); - cubeCards.add(new CardIdentity("Electrolyze", "")); - cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", "")); - cubeCards.add(new CardIdentity("Elite Vanguard", "")); - cubeCards.add(new CardIdentity("Elspeth, Knight Errant", "")); - cubeCards.add(new CardIdentity("Elspeth, Sun's Champion", "")); - cubeCards.add(new CardIdentity("Empty the Warrens", "")); - cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", "")); - cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); - cubeCards.add(new CardIdentity("Enlightened Tutor", "")); - cubeCards.add(new CardIdentity("Entomb", "")); - cubeCards.add(new CardIdentity("Erratic Portal", "")); - cubeCards.add(new CardIdentity("Esper", "")); - cubeCards.add(new CardIdentity("Eternal Witness", "")); - cubeCards.add(new CardIdentity("Eureka", "")); - cubeCards.add(new CardIdentity("Everflowing Chalice", "")); - cubeCards.add(new CardIdentity("Evolving Wilds", "")); - cubeCards.add(new CardIdentity("Exalted Angel", "")); - cubeCards.add(new CardIdentity("Exhume", "")); - cubeCards.add(new CardIdentity("Experiment One", "")); - cubeCards.add(new CardIdentity("Fact or Fiction", "")); - cubeCards.add(new CardIdentity("Faerie Conclave", "")); - cubeCards.add(new CardIdentity("Faithless Looting", "")); - cubeCards.add(new CardIdentity("Faiths Fetters", "")); - cubeCards.add(new CardIdentity("Falkenrath Aristocrat", "")); - cubeCards.add(new CardIdentity("Fauna Shaman", "")); - cubeCards.add(new CardIdentity("Figure of Destiny", "")); - cubeCards.add(new CardIdentity("Fire // Ice ", "")); - cubeCards.add(new CardIdentity("Fire Imp", "")); - cubeCards.add(new CardIdentity("Firebolt", "")); - cubeCards.add(new CardIdentity("Firedrinker Satyr", "")); - cubeCards.add(new CardIdentity("Fireslinger", "")); - cubeCards.add(new CardIdentity("Firestorm", "")); - cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); - cubeCards.add(new CardIdentity("Flametongue Kavu", "")); - cubeCards.add(new CardIdentity("Flickerwisp", "")); - cubeCards.add(new CardIdentity("Flooded Strand", "")); - cubeCards.add(new CardIdentity("Forbid", "")); - cubeCards.add(new CardIdentity("Force of Will", "")); - cubeCards.add(new CardIdentity("Force Spike", "")); - cubeCards.add(new CardIdentity("Fyndhorn Elves", "")); - cubeCards.add(new CardIdentity("Gaea's Cradle", "")); - cubeCards.add(new CardIdentity("Galepowder Mage", "")); - cubeCards.add(new CardIdentity("Garruk Relentless", "")); - cubeCards.add(new CardIdentity("Garruk Wildspeaker", "")); - cubeCards.add(new CardIdentity("Garruk, Primal Hunter", "")); - cubeCards.add(new CardIdentity("Geist of Saint Traft", "")); - cubeCards.add(new CardIdentity("Gemstone Mine", "")); - cubeCards.add(new CardIdentity("Genesis", "")); - cubeCards.add(new CardIdentity("Geralf's Messenger", "")); - cubeCards.add(new CardIdentity("Gerrard's Verdict", "")); - cubeCards.add(new CardIdentity("Gideon Jura", "")); - cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); - cubeCards.add(new CardIdentity("Gifts Ungiven", "")); - cubeCards.add(new CardIdentity("Gilded Drake", "")); - cubeCards.add(new CardIdentity("Glen Elendra Archmage", "")); - cubeCards.add(new CardIdentity("Go For The Throat", "")); - cubeCards.add(new CardIdentity("Goblin Guide", "")); - cubeCards.add(new CardIdentity("Goblin Welder", "")); - cubeCards.add(new CardIdentity("Godless Shrine", "")); - cubeCards.add(new CardIdentity("Golgari Signet", "")); - cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); - cubeCards.add(new CardIdentity("Gorilla Shaman", "")); - cubeCards.add(new CardIdentity("Grafted Wargear", "")); - cubeCards.add(new CardIdentity("Grand Coliseum", "")); - cubeCards.add(new CardIdentity("Grave Titan", "")); - cubeCards.add(new CardIdentity("Gravecrawler", "")); - cubeCards.add(new CardIdentity("Greater Gargadon", "")); - cubeCards.add(new CardIdentity("Green Sun's Zenith", "")); - cubeCards.add(new CardIdentity("Grim Lavamancer", "")); - cubeCards.add(new CardIdentity("Grim Monolith", "")); - cubeCards.add(new CardIdentity("Grixis", "")); - cubeCards.add(new CardIdentity("Gruul Signet", "")); - cubeCards.add(new CardIdentity("Guul Draz Assassin", "")); - cubeCards.add(new CardIdentity("Hallowed Fountain", "")); - cubeCards.add(new CardIdentity("Hammer of Purphoros", "")); - cubeCards.add(new CardIdentity("Hellrider", "")); - cubeCards.add(new CardIdentity("Hellspark Elemental", "")); - cubeCards.add(new CardIdentity("Hero of Bladehold", "")); - cubeCards.add(new CardIdentity("Hero of Oxid Ridge", "")); - cubeCards.add(new CardIdentity("Hero's Downfall", "")); - cubeCards.add(new CardIdentity("Horizon Canopy", "")); - cubeCards.add(new CardIdentity("Huntmaster of the Fells", "")); - cubeCards.add(new CardIdentity("Hymn to Tourach", "")); - cubeCards.add(new CardIdentity("Hypnotic Specter", "")); - cubeCards.add(new CardIdentity("Icy Manipulator", "")); - cubeCards.add(new CardIdentity("Impending Disaster", "")); - cubeCards.add(new CardIdentity("Imperial Seal", "")); - cubeCards.add(new CardIdentity("Imposing Sovereign", "")); - cubeCards.add(new CardIdentity("Impulse", "")); - cubeCards.add(new CardIdentity("Incinerate", "")); - cubeCards.add(new CardIdentity("Inferno Titan", "")); - cubeCards.add(new CardIdentity("Inkwell Leviathan", "")); - cubeCards.add(new CardIdentity("Inquisition of Kozilek", "")); - cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", "")); - cubeCards.add(new CardIdentity("Izzet Boilerworks", "")); - cubeCards.add(new CardIdentity("Izzet Charm", "")); - cubeCards.add(new CardIdentity("Izzet Signet", "")); - cubeCards.add(new CardIdentity("Jace Beleren", "")); - cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", "")); - cubeCards.add(new CardIdentity("Jackal Pup", "")); - cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); - cubeCards.add(new CardIdentity("Journey to Nowhere", "")); - cubeCards.add(new CardIdentity("Jund", "")); - cubeCards.add(new CardIdentity("Jungle Lion", "")); - cubeCards.add(new CardIdentity("Kalonian Hydra", "")); - cubeCards.add(new CardIdentity("Karmic Guide", "")); - cubeCards.add(new CardIdentity("Karn Liberated", "")); - cubeCards.add(new CardIdentity("Karn, Silver Golem", "")); - cubeCards.add(new CardIdentity("Kataki, War's Wage", "")); - cubeCards.add(new CardIdentity("Keldon Marauders", "")); - cubeCards.add(new CardIdentity("Keldon Vandals", "")); - cubeCards.add(new CardIdentity("Kird Ape", "")); - cubeCards.add(new CardIdentity("Kitchen Finks", "")); - cubeCards.add(new CardIdentity("Knight of Meadowgrain", "")); - cubeCards.add(new CardIdentity("Kodamas Reach", "")); - cubeCards.add(new CardIdentity("Kor Sanctifiers", "")); - cubeCards.add(new CardIdentity("Kor Skyfisher", "")); - cubeCards.add(new CardIdentity("Koth of the Hammer", "")); - cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth", "")); - cubeCards.add(new CardIdentity("Land Tax", "")); - cubeCards.add(new CardIdentity("Lavaclaw Reaches", "")); - cubeCards.add(new CardIdentity("Library of Alexandria", "")); - cubeCards.add(new CardIdentity("Life from the Loam", "")); - cubeCards.add(new CardIdentity("Lifebane Zombie", "")); - cubeCards.add(new CardIdentity("Lightning Bolt", "")); - cubeCards.add(new CardIdentity("Lightning Greaves", "")); - cubeCards.add(new CardIdentity("Lightning Helix", "")); - cubeCards.add(new CardIdentity("Lightning Mauler", "")); - cubeCards.add(new CardIdentity("Lightning Strike", "")); - cubeCards.add(new CardIdentity("Liliana of the Veil", "")); - cubeCards.add(new CardIdentity("Lingering Souls", "")); - cubeCards.add(new CardIdentity("Llanowar Elves", "")); - cubeCards.add(new CardIdentity("Llanowar Wastes", "")); - cubeCards.add(new CardIdentity("Lone Missionary", "")); - cubeCards.add(new CardIdentity("Looter il-Kor", "")); - cubeCards.add(new CardIdentity("Lotleth Troll", "")); - cubeCards.add(new CardIdentity("Lotus Cobra", "")); - cubeCards.add(new CardIdentity("Luminarch Ascension", "")); - cubeCards.add(new CardIdentity("Maelstrom Pulse", "")); - cubeCards.add(new CardIdentity("Magma Jet", "")); - cubeCards.add(new CardIdentity("Man-O-War", "")); - cubeCards.add(new CardIdentity("Mana Crypt", "")); - cubeCards.add(new CardIdentity("Mana Drain", "")); - cubeCards.add(new CardIdentity("Mana Leak", "")); - cubeCards.add(new CardIdentity("Mana Tithe", "")); - cubeCards.add(new CardIdentity("Mana Vault", "")); - cubeCards.add(new CardIdentity("Manic Vandal", "")); - cubeCards.add(new CardIdentity("Marsh Flats", "")); - cubeCards.add(new CardIdentity("Master of the Wild Hunt", "")); - cubeCards.add(new CardIdentity("Masticore", "")); - cubeCards.add(new CardIdentity("Mayor of Avabruck", "")); - cubeCards.add(new CardIdentity("Maze of Ith", "")); - cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", "")); - cubeCards.add(new CardIdentity("Memory Jar", "")); - cubeCards.add(new CardIdentity("Memory Lapse", "")); - cubeCards.add(new CardIdentity("Metalworker", "")); - cubeCards.add(new CardIdentity("Mimic Vat", "")); - cubeCards.add(new CardIdentity("Mind Stone", "")); - cubeCards.add(new CardIdentity("Mind Twist", "")); - cubeCards.add(new CardIdentity("Mirran Crusader", "")); - cubeCards.add(new CardIdentity("Mirror Entity", "")); - cubeCards.add(new CardIdentity("Miscalculation", "")); - cubeCards.add(new CardIdentity("Mishra's Factory", "")); - cubeCards.add(new CardIdentity("Misty Rainforest", "")); - cubeCards.add(new CardIdentity("Moat", "")); - cubeCards.add(new CardIdentity("Mogg Fanatic", "")); - cubeCards.add(new CardIdentity("Molten Rain", "")); - cubeCards.add(new CardIdentity("Molten-Tail Masticore", "")); - cubeCards.add(new CardIdentity("Morphling", "")); - cubeCards.add(new CardIdentity("Mortify", "")); - cubeCards.add(new CardIdentity("Mother of Runes", "")); - cubeCards.add(new CardIdentity("Mox Diamond", "")); - cubeCards.add(new CardIdentity("Mox Emerald", "")); - cubeCards.add(new CardIdentity("Mox Jet", "")); - cubeCards.add(new CardIdentity("Mox Pearl", "")); - cubeCards.add(new CardIdentity("Mox Ruby", "")); - cubeCards.add(new CardIdentity("Mox Sapphire", "")); - cubeCards.add(new CardIdentity("Mulldrifter", "")); - cubeCards.add(new CardIdentity("Murderous Redcap", "")); - cubeCards.add(new CardIdentity("Mutavault", "")); - cubeCards.add(new CardIdentity("Myr Battlesphere", "")); - cubeCards.add(new CardIdentity("Mystic Snake", "")); - cubeCards.add(new CardIdentity("Mystical Tutor", "")); - cubeCards.add(new CardIdentity("Nantuko Vigilante", "")); - cubeCards.add(new CardIdentity("Natural Order", "")); - cubeCards.add(new CardIdentity("Naya", "")); - cubeCards.add(new CardIdentity("Necromancy", "")); - cubeCards.add(new CardIdentity("Nekrataal", "")); - cubeCards.add(new CardIdentity("Nevinyrrals Disk", "")); - cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); - cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker", "")); - cubeCards.add(new CardIdentity("Noble Hierarch", "")); - cubeCards.add(new CardIdentity("Ob Nixilis, the Fallen", "")); - cubeCards.add(new CardIdentity("Oblivion Ring", "")); - cubeCards.add(new CardIdentity("Oonas Prowler", "")); - cubeCards.add(new CardIdentity("Opposition", "")); - cubeCards.add(new CardIdentity("Orzhov Signet", "")); - cubeCards.add(new CardIdentity("Overgrown Tomb", "")); - cubeCards.add(new CardIdentity("Pack Rat", "")); - cubeCards.add(new CardIdentity("Path to Exile", "")); - cubeCards.add(new CardIdentity("Pernicious Deed", "")); - cubeCards.add(new CardIdentity("Phantasmal Image", "")); - cubeCards.add(new CardIdentity("Phyrexian Arena", "")); - cubeCards.add(new CardIdentity("Phyrexian Metamorph", "")); - cubeCards.add(new CardIdentity("Phyrexian Revoker", "")); - cubeCards.add(new CardIdentity("Pillage", "")); - cubeCards.add(new CardIdentity("Pithing Needle", "")); - cubeCards.add(new CardIdentity("Plateau", "")); - cubeCards.add(new CardIdentity("Plated Geopede", "")); - cubeCards.add(new CardIdentity("Plow Under", "")); - cubeCards.add(new CardIdentity("Polluted Delta", "")); - cubeCards.add(new CardIdentity("Ponder", "")); - cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); - cubeCards.add(new CardIdentity("Pox", "")); - cubeCards.add(new CardIdentity("Preordain", "")); - cubeCards.add(new CardIdentity("Primeval Titan", "")); - cubeCards.add(new CardIdentity("Profane Command", "")); - cubeCards.add(new CardIdentity("Psychatog", "")); - cubeCards.add(new CardIdentity("Purphoros, God of the Forge", "")); - cubeCards.add(new CardIdentity("Qasali Pridemage", "")); - cubeCards.add(new CardIdentity("Raging Ravine", "")); - cubeCards.add(new CardIdentity("Rakdos Cackler", "")); - cubeCards.add(new CardIdentity("Rakdos Signet", "")); - cubeCards.add(new CardIdentity("Ral Zarek", "")); - cubeCards.add(new CardIdentity("Rancor", "")); - cubeCards.add(new CardIdentity("Ranger of Eos", "")); - cubeCards.add(new CardIdentity("Ratchet Bomb", "")); - cubeCards.add(new CardIdentity("Ravages of War", "")); - cubeCards.add(new CardIdentity("Reanimate", "")); - cubeCards.add(new CardIdentity("Reassembling Skeleton", "")); - cubeCards.add(new CardIdentity("Reckless Waif", "")); - cubeCards.add(new CardIdentity("Recurring Nightmare", "")); - cubeCards.add(new CardIdentity("Reflecting Pool", "")); - cubeCards.add(new CardIdentity("Regrowth", "")); - cubeCards.add(new CardIdentity("Remand", "")); - cubeCards.add(new CardIdentity("Restoration Angel", "")); - cubeCards.add(new CardIdentity("Reveillark", "")); - cubeCards.add(new CardIdentity("Rishadan Port", "")); - cubeCards.add(new CardIdentity("River Boa", "")); - cubeCards.add(new CardIdentity("Rolling Earthquake", "")); - cubeCards.add(new CardIdentity("Sacred Foundry", "")); - cubeCards.add(new CardIdentity("Sakura-Tribe Elder", "")); - cubeCards.add(new CardIdentity("Sarkhan Vol", "")); - cubeCards.add(new CardIdentity("Savannah", "")); - cubeCards.add(new CardIdentity("Savannah Lions", "")); - cubeCards.add(new CardIdentity("Scalding Tarn", "")); - cubeCards.add(new CardIdentity("Scavenging Ooze", "")); - cubeCards.add(new CardIdentity("Scroll Rack", "")); - cubeCards.add(new CardIdentity("Scrubland", "")); - cubeCards.add(new CardIdentity("Seal of Cleansing", "")); - cubeCards.add(new CardIdentity("Searing Spear", "")); - cubeCards.add(new CardIdentity("Selesnya Signet", "")); - cubeCards.add(new CardIdentity("Senseis Divining Top", "")); - cubeCards.add(new CardIdentity("Serendib Efreet", "")); - cubeCards.add(new CardIdentity("Shadowborn Demon", "")); - cubeCards.add(new CardIdentity("Shadowmage Infiltrator", "")); - cubeCards.add(new CardIdentity("Show and Tell", "")); - cubeCards.add(new CardIdentity("Shriekmaw", "")); - cubeCards.add(new CardIdentity("Siege-Gang Commander", "")); - cubeCards.add(new CardIdentity("Sigarda, Host of Herons", "")); - cubeCards.add(new CardIdentity("Silverblade Paladin", "")); - cubeCards.add(new CardIdentity("Simic Charm", "")); - cubeCards.add(new CardIdentity("SImic Growth Chamber", "")); - cubeCards.add(new CardIdentity("Simic Signet", "")); - cubeCards.add(new CardIdentity("Simic Sky Swallower", "")); - cubeCards.add(new CardIdentity("Sinkhole", "")); - cubeCards.add(new CardIdentity("Skinrender", "")); - cubeCards.add(new CardIdentity("Skinshifter", "")); - cubeCards.add(new CardIdentity("Skullclamp", "")); - cubeCards.add(new CardIdentity("Smallpox", "")); - cubeCards.add(new CardIdentity("Smoke Stack", "")); - cubeCards.add(new CardIdentity("Snapcaster Mage", "")); - cubeCards.add(new CardIdentity("Sneak Attack", "")); - cubeCards.add(new CardIdentity("Snuff Out", "")); - cubeCards.add(new CardIdentity("Sol Ring", "")); - cubeCards.add(new CardIdentity("Soldier of the Pantheon", "")); - cubeCards.add(new CardIdentity("Solemn Simulacrum", "")); - cubeCards.add(new CardIdentity("Soltari Champion", "")); - cubeCards.add(new CardIdentity("Soltari Monk", "")); - cubeCards.add(new CardIdentity("Soltari Priest", "")); - cubeCards.add(new CardIdentity("Soltari Trooper", "")); - cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", "")); - cubeCards.add(new CardIdentity("Sower of Temptation", "")); - cubeCards.add(new CardIdentity("Spear of Heliod", "")); - cubeCards.add(new CardIdentity("Spectral Procession", "")); - cubeCards.add(new CardIdentity("Sphinx of the Steel Wind", "")); - cubeCards.add(new CardIdentity("Sphinx's Revelation", "")); - cubeCards.add(new CardIdentity("Spikeshot Elder", "")); - cubeCards.add(new CardIdentity("Squee, Goblin Nabob", "")); - cubeCards.add(new CardIdentity("Staggershock", "")); - cubeCards.add(new CardIdentity("Steam Augury", "")); - cubeCards.add(new CardIdentity("Steam Vents", "")); - cubeCards.add(new CardIdentity("Steppe Lynx", "")); - cubeCards.add(new CardIdentity("Stomping Ground", "")); - cubeCards.add(new CardIdentity("Stoneforge Mystic", "")); - cubeCards.add(new CardIdentity("Stormblood Berserker", "")); - cubeCards.add(new CardIdentity("Strangleroot Geist", "")); - cubeCards.add(new CardIdentity("Strip Mine", "")); - cubeCards.add(new CardIdentity("Stromkirk Noble", "")); - cubeCards.add(new CardIdentity("Student of Warfare", "")); - cubeCards.add(new CardIdentity("Sulfuric Vortex", "")); - cubeCards.add(new CardIdentity("Sun Titan", "")); - cubeCards.add(new CardIdentity("Sundering Titan", "")); - cubeCards.add(new CardIdentity("Supreme Verdict", "")); - cubeCards.add(new CardIdentity("Survival of the Fittest", "")); - cubeCards.add(new CardIdentity("Sword of Body and Mind", "")); - cubeCards.add(new CardIdentity("Sword of Feast and Famine", "")); - cubeCards.add(new CardIdentity("Sword of Fire and Ice", "")); - cubeCards.add(new CardIdentity("Sword of Light and Shadow", "")); - cubeCards.add(new CardIdentity("Sword of War and Peace", "")); - cubeCards.add(new CardIdentity("Swords to Plowshares", "")); - cubeCards.add(new CardIdentity("Sylvan Caryatid", "")); - cubeCards.add(new CardIdentity("Sylvan Library", "")); - cubeCards.add(new CardIdentity("Taiga", "")); - cubeCards.add(new CardIdentity("Tangle Wire", "")); - cubeCards.add(new CardIdentity("Tarmogoyf", "")); - cubeCards.add(new CardIdentity("Temple Garden", "")); - cubeCards.add(new CardIdentity("Terminus", "")); - cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); - cubeCards.add(new CardIdentity("Tezzeret the Seeker", "")); - cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", "")); - cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", "")); - cubeCards.add(new CardIdentity("Thassa, God of the Sea", "")); - cubeCards.add(new CardIdentity("The Abyss", "")); - cubeCards.add(new CardIdentity("Thirst for Knowledge", "")); - cubeCards.add(new CardIdentity("Thoughtseize", "")); - cubeCards.add(new CardIdentity("Thragtusk", "")); - cubeCards.add(new CardIdentity("Thrun, the Last Troll", "")); - cubeCards.add(new CardIdentity("Thundermaw Hellkite", "")); - cubeCards.add(new CardIdentity("Time Spiral", "")); - cubeCards.add(new CardIdentity("Time Walk", "")); - cubeCards.add(new CardIdentity("Timetwister", "")); - cubeCards.add(new CardIdentity("Tinker", "")); - cubeCards.add(new CardIdentity("Tolarian Academy", "")); - cubeCards.add(new CardIdentity("Tombstalker", "")); - cubeCards.add(new CardIdentity("Tooth and Nail", "")); - cubeCards.add(new CardIdentity("Tormented Hero", "")); - cubeCards.add(new CardIdentity("Treachery", "")); - cubeCards.add(new CardIdentity("Treetop Village", "")); - cubeCards.add(new CardIdentity("Trinket Mage", "")); - cubeCards.add(new CardIdentity("Triskelion", "")); - cubeCards.add(new CardIdentity("Troll Ascetic", "")); - cubeCards.add(new CardIdentity("Tropical Island", "")); - cubeCards.add(new CardIdentity("Trygon Predator", "")); - cubeCards.add(new CardIdentity("Tundra", "")); - cubeCards.add(new CardIdentity("Twinblade Slasher", "")); - cubeCards.add(new CardIdentity("Uktabi Orangutan", "")); - cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", "")); - cubeCards.add(new CardIdentity("Umezawas Jitte", "")); - cubeCards.add(new CardIdentity("Underground Sea", "")); - cubeCards.add(new CardIdentity("Undiscovered Paradise", "")); - cubeCards.add(new CardIdentity("Upheaval", "")); - cubeCards.add(new CardIdentity("Vampire Hexmage", "")); - cubeCards.add(new CardIdentity("Vampire Lacerator", "")); - cubeCards.add(new CardIdentity("Vampire Nighthawk", "")); - cubeCards.add(new CardIdentity("Vampiric Tutor", "")); - cubeCards.add(new CardIdentity("Vedalken Shackles", "")); - cubeCards.add(new CardIdentity("Vendilion Clique", "")); - cubeCards.add(new CardIdentity("Vengevine", "")); - cubeCards.add(new CardIdentity("Venser, Shaper Savant", "")); - cubeCards.add(new CardIdentity("Venser, the Sojourner", "")); - cubeCards.add(new CardIdentity("Verdant Catacombs", "")); - cubeCards.add(new CardIdentity("Vindicate", "")); - cubeCards.add(new CardIdentity("Vinelasher Kudzu", "")); - cubeCards.add(new CardIdentity("Viridian Shaman", "")); - cubeCards.add(new CardIdentity("Voice of Resurgence", "")); - cubeCards.add(new CardIdentity("Volcanic Island", "")); - cubeCards.add(new CardIdentity("Volraths Stronghold", "")); - cubeCards.add(new CardIdentity("Wall of Blossoms", "")); - cubeCards.add(new CardIdentity("Wall of Omens", "")); - cubeCards.add(new CardIdentity("Wall of Roots", "")); - cubeCards.add(new CardIdentity("Wasteland", "")); - cubeCards.add(new CardIdentity("Waterfront Bouncer", "")); - cubeCards.add(new CardIdentity("Watery Grave", "")); - cubeCards.add(new CardIdentity("Wheel of Fortune", "")); - cubeCards.add(new CardIdentity("Wickerbough Elder", "")); - cubeCards.add(new CardIdentity("Wild Mongrel", "")); - cubeCards.add(new CardIdentity("Wild Nacatl", "")); - cubeCards.add(new CardIdentity("Wildfire", "")); - cubeCards.add(new CardIdentity("Willbender", "")); - cubeCards.add(new CardIdentity("Windswept Heath", "")); - cubeCards.add(new CardIdentity("Winter Orb", "")); - cubeCards.add(new CardIdentity("Wolfbitten Captive", "")); - cubeCards.add(new CardIdentity("Wolfir Silverheart", "")); - cubeCards.add(new CardIdentity("Wooded Foothills", "")); - cubeCards.add(new CardIdentity("Woodfall Primus", "")); - cubeCards.add(new CardIdentity("Worldly Tutor", "")); - cubeCards.add(new CardIdentity("Worn Powerstone", "")); - cubeCards.add(new CardIdentity("Wurmcoil Engine", "")); - cubeCards.add(new CardIdentity("Xenagos, the Reveler", "")); - cubeCards.add(new CardIdentity("Yavimaya Elder", "")); - cubeCards.add(new CardIdentity("Yawgmoths Will", "")); - cubeCards.add(new CardIdentity("Young Pyromancer", "")); - cubeCards.add(new CardIdentity("Zuran Orb", "")); - - } -} +/* + * 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.tournament.cubes; + +import mage.game.draft.DraftCube; + +/** + * + * @author LevelX2 + */ +public class MTGCube extends DraftCube { + + public MTGCube() { + super("www.mtgcube.com (502 cards)"); // http://www.mtgcube.com + + cubeCards.add(new CardIdentity("Abrupt Decay", "")); + cubeCards.add(new CardIdentity("Academy Ruins", "")); + cubeCards.add(new CardIdentity("Accorder Paladin", "")); + cubeCards.add(new CardIdentity("Acidic Slime", "")); + cubeCards.add(new CardIdentity("AEtherling", "")); + cubeCards.add(new CardIdentity("Ajani Goldmane", "")); + cubeCards.add(new CardIdentity("Ajani Vengeant", "")); + cubeCards.add(new CardIdentity("Ancestral Recall", "")); + cubeCards.add(new CardIdentity("Ancestral Vision", "")); + cubeCards.add(new CardIdentity("Animate Dead", "")); + cubeCards.add(new CardIdentity("Arbor Elf", "")); + cubeCards.add(new CardIdentity("Arc Lightning", "")); + cubeCards.add(new CardIdentity("Arc Trail", "")); + cubeCards.add(new CardIdentity("Arcane Denial", "")); + cubeCards.add(new CardIdentity("Archangel of Thune", "")); + cubeCards.add(new CardIdentity("Arid Mesa", "")); + cubeCards.add(new CardIdentity("Armageddon", "")); + cubeCards.add(new CardIdentity("Ash Zealot", "")); + cubeCards.add(new CardIdentity("Augur of Bolas", "")); + cubeCards.add(new CardIdentity("Avalanche Riders", "")); + cubeCards.add(new CardIdentity("Avenger of Zendikar", "")); + cubeCards.add(new CardIdentity("Awakening Zone", "")); + cubeCards.add(new CardIdentity("Azorius Signet", "")); + cubeCards.add(new CardIdentity("Badlands", "")); + cubeCards.add(new CardIdentity("Balance", "")); + cubeCards.add(new CardIdentity("Baleful Strix", "")); + cubeCards.add(new CardIdentity("Bane of the Living", "")); + cubeCards.add(new CardIdentity("Baneslayer Angel", "")); + cubeCards.add(new CardIdentity("Bant Charm", "")); + cubeCards.add(new CardIdentity("Batterskull", "")); + cubeCards.add(new CardIdentity("Battlefield Forge", "")); + cubeCards.add(new CardIdentity("Bayou", "")); + cubeCards.add(new CardIdentity("Birds of Paradise", "")); + cubeCards.add(new CardIdentity("Birthing Pod", "")); + cubeCards.add(new CardIdentity("Bitterblossom", "")); + cubeCards.add(new CardIdentity("Black Lotus", "")); + cubeCards.add(new CardIdentity("Black Vise", "")); + cubeCards.add(new CardIdentity("Blade Splicer", "")); + cubeCards.add(new CardIdentity("Blightning", "")); + cubeCards.add(new CardIdentity("Blistering Firecat", "")); + cubeCards.add(new CardIdentity("Blood Crypt", "")); + cubeCards.add(new CardIdentity("Blood Scrivener", "")); + cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); + cubeCards.add(new CardIdentity("Bloodghast", "")); + cubeCards.add(new CardIdentity("Bloodstained Mire", "")); + cubeCards.add(new CardIdentity("Bone Shredder", "")); + cubeCards.add(new CardIdentity("Bonesplitter", "")); + cubeCards.add(new CardIdentity("Bonfire of the Damned", "")); + cubeCards.add(new CardIdentity("Boros Charm", "")); + cubeCards.add(new CardIdentity("Boros Reckoner", "")); + cubeCards.add(new CardIdentity("Boros Signet", "")); + cubeCards.add(new CardIdentity("Braids, Cabal Minion", "")); + cubeCards.add(new CardIdentity("Brainstorm", "")); + cubeCards.add(new CardIdentity("Breeding Pool", "")); + cubeCards.add(new CardIdentity("Bribery", "")); + cubeCards.add(new CardIdentity("Broodmate Dragon", "")); + cubeCards.add(new CardIdentity("Burning of Xinye", "")); + cubeCards.add(new CardIdentity("Burst Lightning", "")); + cubeCards.add(new CardIdentity("Call of the Herd", "")); + cubeCards.add(new CardIdentity("Carnophage", "")); + cubeCards.add(new CardIdentity("Catastrophe", "")); + cubeCards.add(new CardIdentity("Caves of Koilos", "")); + cubeCards.add(new CardIdentity("Celestial Colonnade", "")); + cubeCards.add(new CardIdentity("Chain Lightning", "")); + cubeCards.add(new CardIdentity("Chainer's Edict", "")); + cubeCards.add(new CardIdentity("Chameleon Colossus", "")); + cubeCards.add(new CardIdentity("Chandra Nalaar", "")); + cubeCards.add(new CardIdentity("Chandra, Pyromaster", "")); + cubeCards.add(new CardIdentity("Char", "")); + cubeCards.add(new CardIdentity("Chrome Mox", "")); + cubeCards.add(new CardIdentity("City of Brass", "")); + cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); + cubeCards.add(new CardIdentity("Coalition Relic", "")); + cubeCards.add(new CardIdentity("Coldsteel Heart", "")); + cubeCards.add(new CardIdentity("Consecrated Sphinx", "")); + cubeCards.add(new CardIdentity("Consuming Vapors", "")); + cubeCards.add(new CardIdentity("Contagion", "")); + cubeCards.add(new CardIdentity("Control Magic", "")); + cubeCards.add(new CardIdentity("Counterspell", "")); + cubeCards.add(new CardIdentity("Creakwood Liege", "")); + cubeCards.add(new CardIdentity("Creeping Tar Pit", "")); + cubeCards.add(new CardIdentity("Crucible of Worlds", "")); + cubeCards.add(new CardIdentity("Cryptic Command", "")); + cubeCards.add(new CardIdentity("Crystal Shard", "")); + cubeCards.add(new CardIdentity("Cultivate", "")); + cubeCards.add(new CardIdentity("Cursed Scroll", "")); + cubeCards.add(new CardIdentity("Damnation", "")); + cubeCards.add(new CardIdentity("Dance of the Dead", "")); + cubeCards.add(new CardIdentity("Dark Confidant", "")); + cubeCards.add(new CardIdentity("Dark Ritual", "")); + cubeCards.add(new CardIdentity("Day of Judgment", "")); + cubeCards.add(new CardIdentity("Daze", "")); + cubeCards.add(new CardIdentity("Deep Analysis", "")); + cubeCards.add(new CardIdentity("Demonic Tutor", "")); + cubeCards.add(new CardIdentity("Deranged Hermit", "")); + cubeCards.add(new CardIdentity("Detention Sphere", "")); + cubeCards.add(new CardIdentity("Diabolic Edict", "")); + cubeCards.add(new CardIdentity("Dimir Signet", "")); + cubeCards.add(new CardIdentity("Diregraf Ghoul", "")); + cubeCards.add(new CardIdentity("Disenchant", "")); + cubeCards.add(new CardIdentity("Dismember", "")); + cubeCards.add(new CardIdentity("Dreadbore", "")); + cubeCards.add(new CardIdentity("Dryad Militant", "")); + cubeCards.add(new CardIdentity("Duress", "")); + cubeCards.add(new CardIdentity("Dust Bowl", "")); + cubeCards.add(new CardIdentity("Dwarven Blastminer", "")); + cubeCards.add(new CardIdentity("Earthquake", "")); + cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", "")); + cubeCards.add(new CardIdentity("Electrolyze", "")); + cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", "")); + cubeCards.add(new CardIdentity("Elite Vanguard", "")); + cubeCards.add(new CardIdentity("Elspeth, Knight-Errant", "")); + cubeCards.add(new CardIdentity("Elspeth, Sun's Champion", "")); + cubeCards.add(new CardIdentity("Empty the Warrens", "")); + cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", "")); + cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); + cubeCards.add(new CardIdentity("Enlightened Tutor", "")); + cubeCards.add(new CardIdentity("Entomb", "")); + cubeCards.add(new CardIdentity("Erratic Portal", "")); + cubeCards.add(new CardIdentity("Esper Charm", "")); + cubeCards.add(new CardIdentity("Eternal Witness", "")); + cubeCards.add(new CardIdentity("Eureka", "")); + cubeCards.add(new CardIdentity("Everflowing Chalice", "")); + cubeCards.add(new CardIdentity("Evolving Wilds", "")); + cubeCards.add(new CardIdentity("Exalted Angel", "")); + cubeCards.add(new CardIdentity("Exhume", "")); + cubeCards.add(new CardIdentity("Experiment One", "")); + cubeCards.add(new CardIdentity("Fact or Fiction", "")); + cubeCards.add(new CardIdentity("Faerie Conclave", "")); + cubeCards.add(new CardIdentity("Faithless Looting", "")); + cubeCards.add(new CardIdentity("Faith's Fetters", "")); + cubeCards.add(new CardIdentity("Falkenrath Aristocrat", "")); + cubeCards.add(new CardIdentity("Fauna Shaman", "")); + cubeCards.add(new CardIdentity("Figure of Destiny", "")); + cubeCards.add(new CardIdentity("Fire // Ice ", "")); + cubeCards.add(new CardIdentity("Fire Imp", "")); + cubeCards.add(new CardIdentity("Firebolt", "")); + cubeCards.add(new CardIdentity("Firedrinker Satyr", "")); + cubeCards.add(new CardIdentity("Fireslinger", "")); + cubeCards.add(new CardIdentity("Firestorm", "")); + cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); + cubeCards.add(new CardIdentity("Flametongue Kavu", "")); + cubeCards.add(new CardIdentity("Flickerwisp", "")); + cubeCards.add(new CardIdentity("Flooded Strand", "")); + cubeCards.add(new CardIdentity("Forbid", "")); + cubeCards.add(new CardIdentity("Force of Will", "")); + cubeCards.add(new CardIdentity("Force Spike", "")); + cubeCards.add(new CardIdentity("Fyndhorn Elves", "")); + cubeCards.add(new CardIdentity("Gaea's Cradle", "")); + cubeCards.add(new CardIdentity("Galepowder Mage", "")); + cubeCards.add(new CardIdentity("Garruk Relentless", "")); + cubeCards.add(new CardIdentity("Garruk Wildspeaker", "")); + cubeCards.add(new CardIdentity("Garruk, Primal Hunter", "")); + cubeCards.add(new CardIdentity("Geist of Saint Traft", "")); + cubeCards.add(new CardIdentity("Gemstone Mine", "")); + cubeCards.add(new CardIdentity("Genesis", "")); + cubeCards.add(new CardIdentity("Geralf's Messenger", "")); + cubeCards.add(new CardIdentity("Gerrard's Verdict", "")); + cubeCards.add(new CardIdentity("Gideon Jura", "")); + cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); + cubeCards.add(new CardIdentity("Gifts Ungiven", "")); + cubeCards.add(new CardIdentity("Gilded Drake", "")); + cubeCards.add(new CardIdentity("Glen Elendra Archmage", "")); + cubeCards.add(new CardIdentity("Go for the Throat", "")); + cubeCards.add(new CardIdentity("Goblin Guide", "")); + cubeCards.add(new CardIdentity("Goblin Welder", "")); + cubeCards.add(new CardIdentity("Godless Shrine", "")); + cubeCards.add(new CardIdentity("Golgari Signet", "")); + cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); + cubeCards.add(new CardIdentity("Gorilla Shaman", "")); + cubeCards.add(new CardIdentity("Grafted Wargear", "")); + cubeCards.add(new CardIdentity("Grand Coliseum", "")); + cubeCards.add(new CardIdentity("Grave Titan", "")); + cubeCards.add(new CardIdentity("Gravecrawler", "")); + cubeCards.add(new CardIdentity("Greater Gargadon", "")); + cubeCards.add(new CardIdentity("Green Sun's Zenith", "")); + cubeCards.add(new CardIdentity("Grim Lavamancer", "")); + cubeCards.add(new CardIdentity("Grim Monolith", "")); + cubeCards.add(new CardIdentity("Grixis Charm", "")); + cubeCards.add(new CardIdentity("Gruul Signet", "")); + cubeCards.add(new CardIdentity("Guul Draz Assassin", "")); + cubeCards.add(new CardIdentity("Hallowed Fountain", "")); + cubeCards.add(new CardIdentity("Hammer of Purphoros", "")); + cubeCards.add(new CardIdentity("Hellrider", "")); + cubeCards.add(new CardIdentity("Hellspark Elemental", "")); + cubeCards.add(new CardIdentity("Hero of Bladehold", "")); + cubeCards.add(new CardIdentity("Hero of Oxid Ridge", "")); + cubeCards.add(new CardIdentity("Hero's Downfall", "")); + cubeCards.add(new CardIdentity("Horizon Canopy", "")); + cubeCards.add(new CardIdentity("Huntmaster of the Fells", "")); + cubeCards.add(new CardIdentity("Hymn to Tourach", "")); + cubeCards.add(new CardIdentity("Hypnotic Specter", "")); + cubeCards.add(new CardIdentity("Icy Manipulator", "")); + cubeCards.add(new CardIdentity("Impending Disaster", "")); + cubeCards.add(new CardIdentity("Imperial Seal", "")); + cubeCards.add(new CardIdentity("Imposing Sovereign", "")); + cubeCards.add(new CardIdentity("Impulse", "")); + cubeCards.add(new CardIdentity("Incinerate", "")); + cubeCards.add(new CardIdentity("Inferno Titan", "")); + cubeCards.add(new CardIdentity("Inkwell Leviathan", "")); + cubeCards.add(new CardIdentity("Inquisition of Kozilek", "")); + cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", "")); + cubeCards.add(new CardIdentity("Izzet Boilerworks", "")); + cubeCards.add(new CardIdentity("Izzet Charm", "")); + cubeCards.add(new CardIdentity("Izzet Signet", "")); + cubeCards.add(new CardIdentity("Jace Beleren", "")); + cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", "")); + cubeCards.add(new CardIdentity("Jackal Pup", "")); + cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); + cubeCards.add(new CardIdentity("Journey to Nowhere", "")); + cubeCards.add(new CardIdentity("Jund Charm", "")); + cubeCards.add(new CardIdentity("Jungle Lion", "")); + cubeCards.add(new CardIdentity("Kalonian Hydra", "")); + cubeCards.add(new CardIdentity("Karmic Guide", "")); + cubeCards.add(new CardIdentity("Karn Liberated", "")); + cubeCards.add(new CardIdentity("Karn, Silver Golem", "")); + cubeCards.add(new CardIdentity("Kataki, War's Wage", "")); + cubeCards.add(new CardIdentity("Keldon Marauders", "")); + cubeCards.add(new CardIdentity("Keldon Vandals", "")); + cubeCards.add(new CardIdentity("Kird Ape", "")); + cubeCards.add(new CardIdentity("Kitchen Finks", "")); + cubeCards.add(new CardIdentity("Knight of Meadowgrain", "")); + cubeCards.add(new CardIdentity("Kodama's Reach", "")); + cubeCards.add(new CardIdentity("Kor Sanctifiers", "")); + cubeCards.add(new CardIdentity("Kor Skyfisher", "")); + cubeCards.add(new CardIdentity("Koth of the Hammer", "")); + cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth", "")); + cubeCards.add(new CardIdentity("Land Tax", "")); + cubeCards.add(new CardIdentity("Lavaclaw Reaches", "")); + cubeCards.add(new CardIdentity("Library of Alexandria", "")); + cubeCards.add(new CardIdentity("Life from the Loam", "")); + cubeCards.add(new CardIdentity("Lifebane Zombie", "")); + cubeCards.add(new CardIdentity("Lightning Bolt", "")); + cubeCards.add(new CardIdentity("Lightning Greaves", "")); + cubeCards.add(new CardIdentity("Lightning Helix", "")); + cubeCards.add(new CardIdentity("Lightning Mauler", "")); + cubeCards.add(new CardIdentity("Lightning Strike", "")); + cubeCards.add(new CardIdentity("Liliana of the Veil", "")); + cubeCards.add(new CardIdentity("Lingering Souls", "")); + cubeCards.add(new CardIdentity("Llanowar Elves", "")); + cubeCards.add(new CardIdentity("Llanowar Wastes", "")); + cubeCards.add(new CardIdentity("Lone Missionary", "")); + cubeCards.add(new CardIdentity("Looter il-Kor", "")); + cubeCards.add(new CardIdentity("Lotleth Troll", "")); + cubeCards.add(new CardIdentity("Lotus Cobra", "")); + cubeCards.add(new CardIdentity("Luminarch Ascension", "")); + cubeCards.add(new CardIdentity("Maelstrom Pulse", "")); + cubeCards.add(new CardIdentity("Magma Jet", "")); + cubeCards.add(new CardIdentity("Man-o'-War", "")); + cubeCards.add(new CardIdentity("Mana Crypt", "")); + cubeCards.add(new CardIdentity("Mana Drain", "")); + cubeCards.add(new CardIdentity("Mana Leak", "")); + cubeCards.add(new CardIdentity("Mana Tithe", "")); + cubeCards.add(new CardIdentity("Mana Vault", "")); + cubeCards.add(new CardIdentity("Manic Vandal", "")); + cubeCards.add(new CardIdentity("Marsh Flats", "")); + cubeCards.add(new CardIdentity("Master of the Wild Hunt", "")); + cubeCards.add(new CardIdentity("Masticore", "")); + cubeCards.add(new CardIdentity("Mayor of Avabruck", "")); + cubeCards.add(new CardIdentity("Maze of Ith", "")); + cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", "")); + cubeCards.add(new CardIdentity("Memory Jar", "")); + cubeCards.add(new CardIdentity("Memory Lapse", "")); + cubeCards.add(new CardIdentity("Metalworker", "")); + cubeCards.add(new CardIdentity("Mimic Vat", "")); + cubeCards.add(new CardIdentity("Mind Stone", "")); + cubeCards.add(new CardIdentity("Mind Twist", "")); + cubeCards.add(new CardIdentity("Mirran Crusader", "")); + cubeCards.add(new CardIdentity("Mirror Entity", "")); + cubeCards.add(new CardIdentity("Miscalculation", "")); + cubeCards.add(new CardIdentity("Mishra's Factory", "")); + cubeCards.add(new CardIdentity("Misty Rainforest", "")); + cubeCards.add(new CardIdentity("Moat", "")); + cubeCards.add(new CardIdentity("Mogg Fanatic", "")); + cubeCards.add(new CardIdentity("Molten Rain", "")); + cubeCards.add(new CardIdentity("Molten-Tail Masticore", "")); + cubeCards.add(new CardIdentity("Morphling", "")); + cubeCards.add(new CardIdentity("Mortify", "")); + cubeCards.add(new CardIdentity("Mother of Runes", "")); + cubeCards.add(new CardIdentity("Mox Diamond", "")); + cubeCards.add(new CardIdentity("Mox Emerald", "")); + cubeCards.add(new CardIdentity("Mox Jet", "")); + cubeCards.add(new CardIdentity("Mox Pearl", "")); + cubeCards.add(new CardIdentity("Mox Ruby", "")); + cubeCards.add(new CardIdentity("Mox Sapphire", "")); + cubeCards.add(new CardIdentity("Mulldrifter", "")); + cubeCards.add(new CardIdentity("Murderous Redcap", "")); + cubeCards.add(new CardIdentity("Mutavault", "")); + cubeCards.add(new CardIdentity("Myr Battlesphere", "")); + cubeCards.add(new CardIdentity("Mystic Snake", "")); + cubeCards.add(new CardIdentity("Mystical Tutor", "")); + cubeCards.add(new CardIdentity("Nantuko Vigilante", "")); + cubeCards.add(new CardIdentity("Natural Order", "")); + cubeCards.add(new CardIdentity("Naya Charm", "")); + cubeCards.add(new CardIdentity("Necromancy", "")); + cubeCards.add(new CardIdentity("Nekrataal", "")); + cubeCards.add(new CardIdentity("Nevinyrral's Disk", "")); + cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); + cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker", "")); + cubeCards.add(new CardIdentity("Noble Hierarch", "")); + cubeCards.add(new CardIdentity("Ob Nixilis, the Fallen", "")); + cubeCards.add(new CardIdentity("Oblivion Ring", "")); + cubeCards.add(new CardIdentity("Oona's Prowler", "")); + cubeCards.add(new CardIdentity("Opposition", "")); + cubeCards.add(new CardIdentity("Orzhov Signet", "")); + cubeCards.add(new CardIdentity("Overgrown Tomb", "")); + cubeCards.add(new CardIdentity("Pack Rat", "")); + cubeCards.add(new CardIdentity("Path to Exile", "")); + cubeCards.add(new CardIdentity("Pernicious Deed", "")); + cubeCards.add(new CardIdentity("Phantasmal Image", "")); + cubeCards.add(new CardIdentity("Phyrexian Arena", "")); + cubeCards.add(new CardIdentity("Phyrexian Metamorph", "")); + cubeCards.add(new CardIdentity("Phyrexian Revoker", "")); + cubeCards.add(new CardIdentity("Pillage", "")); + cubeCards.add(new CardIdentity("Pithing Needle", "")); + cubeCards.add(new CardIdentity("Plateau", "")); + cubeCards.add(new CardIdentity("Plated Geopede", "")); + cubeCards.add(new CardIdentity("Plow Under", "")); + cubeCards.add(new CardIdentity("Polluted Delta", "")); + cubeCards.add(new CardIdentity("Ponder", "")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); + cubeCards.add(new CardIdentity("Pox", "")); + cubeCards.add(new CardIdentity("Preordain", "")); + cubeCards.add(new CardIdentity("Primeval Titan", "")); + cubeCards.add(new CardIdentity("Profane Command", "")); + cubeCards.add(new CardIdentity("Psychatog", "")); + cubeCards.add(new CardIdentity("Purphoros, God of the Forge", "")); + cubeCards.add(new CardIdentity("Qasali Pridemage", "")); + cubeCards.add(new CardIdentity("Raging Ravine", "")); + cubeCards.add(new CardIdentity("Rakdos Cackler", "")); + cubeCards.add(new CardIdentity("Rakdos Signet", "")); + cubeCards.add(new CardIdentity("Ral Zarek", "")); + cubeCards.add(new CardIdentity("Rancor", "")); + cubeCards.add(new CardIdentity("Ranger of Eos", "")); + cubeCards.add(new CardIdentity("Ratchet Bomb", "")); + cubeCards.add(new CardIdentity("Ravages of War", "")); + cubeCards.add(new CardIdentity("Reanimate", "")); + cubeCards.add(new CardIdentity("Reassembling Skeleton", "")); + cubeCards.add(new CardIdentity("Reckless Waif", "")); + cubeCards.add(new CardIdentity("Recurring Nightmare", "")); + cubeCards.add(new CardIdentity("Reflecting Pool", "")); + cubeCards.add(new CardIdentity("Regrowth", "")); + cubeCards.add(new CardIdentity("Remand", "")); + cubeCards.add(new CardIdentity("Restoration Angel", "")); + cubeCards.add(new CardIdentity("Reveillark", "")); + cubeCards.add(new CardIdentity("Rishadan Port", "")); + cubeCards.add(new CardIdentity("River Boa", "")); + cubeCards.add(new CardIdentity("Rolling Earthquake", "")); + cubeCards.add(new CardIdentity("Sacred Foundry", "")); + cubeCards.add(new CardIdentity("Sakura-Tribe Elder", "")); + cubeCards.add(new CardIdentity("Sarkhan Vol", "")); + cubeCards.add(new CardIdentity("Savannah", "")); + cubeCards.add(new CardIdentity("Savannah Lions", "")); + cubeCards.add(new CardIdentity("Scalding Tarn", "")); + cubeCards.add(new CardIdentity("Scavenging Ooze", "")); + cubeCards.add(new CardIdentity("Scroll Rack", "")); + cubeCards.add(new CardIdentity("Scrubland", "")); + cubeCards.add(new CardIdentity("Seal of Cleansing", "")); + cubeCards.add(new CardIdentity("Searing Spear", "")); + cubeCards.add(new CardIdentity("Selesnya Signet", "")); + cubeCards.add(new CardIdentity("Sensei's Divining Top", "")); + cubeCards.add(new CardIdentity("Serendib Efreet", "")); + cubeCards.add(new CardIdentity("Shadowborn Demon", "")); + cubeCards.add(new CardIdentity("Shadowmage Infiltrator", "")); + cubeCards.add(new CardIdentity("Show and Tell", "")); + cubeCards.add(new CardIdentity("Shriekmaw", "")); + cubeCards.add(new CardIdentity("Siege-Gang Commander", "")); + cubeCards.add(new CardIdentity("Sigarda, Host of Herons", "")); + cubeCards.add(new CardIdentity("Silverblade Paladin", "")); + cubeCards.add(new CardIdentity("Simic Charm", "")); + cubeCards.add(new CardIdentity("Simic Growth Chamber", "")); + cubeCards.add(new CardIdentity("Simic Signet", "")); + cubeCards.add(new CardIdentity("Simic Sky Swallower", "")); + cubeCards.add(new CardIdentity("Sinkhole", "")); + cubeCards.add(new CardIdentity("Skinrender", "")); + cubeCards.add(new CardIdentity("Skinshifter", "")); + cubeCards.add(new CardIdentity("Skullclamp", "")); + cubeCards.add(new CardIdentity("Smallpox", "")); + cubeCards.add(new CardIdentity("Smokestack", "")); + cubeCards.add(new CardIdentity("Snapcaster Mage", "")); + cubeCards.add(new CardIdentity("Sneak Attack", "")); + cubeCards.add(new CardIdentity("Snuff Out", "")); + cubeCards.add(new CardIdentity("Sol Ring", "")); + cubeCards.add(new CardIdentity("Soldier of the Pantheon", "")); + cubeCards.add(new CardIdentity("Solemn Simulacrum", "")); + cubeCards.add(new CardIdentity("Soltari Champion", "")); + cubeCards.add(new CardIdentity("Soltari Monk", "")); + cubeCards.add(new CardIdentity("Soltari Priest", "")); + cubeCards.add(new CardIdentity("Soltari Trooper", "")); + cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", "")); + cubeCards.add(new CardIdentity("Sower of Temptation", "")); + cubeCards.add(new CardIdentity("Spear of Heliod", "")); + cubeCards.add(new CardIdentity("Spectral Procession", "")); + cubeCards.add(new CardIdentity("Sphinx of the Steel Wind", "")); + cubeCards.add(new CardIdentity("Sphinx's Revelation", "")); + cubeCards.add(new CardIdentity("Spikeshot Elder", "")); + cubeCards.add(new CardIdentity("Squee, Goblin Nabob", "")); + cubeCards.add(new CardIdentity("Staggershock", "")); + cubeCards.add(new CardIdentity("Steam Augury", "")); + cubeCards.add(new CardIdentity("Steam Vents", "")); + cubeCards.add(new CardIdentity("Steppe Lynx", "")); + cubeCards.add(new CardIdentity("Stomping Ground", "")); + cubeCards.add(new CardIdentity("Stoneforge Mystic", "")); + cubeCards.add(new CardIdentity("Stormblood Berserker", "")); + cubeCards.add(new CardIdentity("Strangleroot Geist", "")); + cubeCards.add(new CardIdentity("Strip Mine", "")); + cubeCards.add(new CardIdentity("Stromkirk Noble", "")); + cubeCards.add(new CardIdentity("Student of Warfare", "")); + cubeCards.add(new CardIdentity("Sulfuric Vortex", "")); + cubeCards.add(new CardIdentity("Sun Titan", "")); + cubeCards.add(new CardIdentity("Sundering Titan", "")); + cubeCards.add(new CardIdentity("Supreme Verdict", "")); + cubeCards.add(new CardIdentity("Survival of the Fittest", "")); + cubeCards.add(new CardIdentity("Sword of Body and Mind", "")); + cubeCards.add(new CardIdentity("Sword of Feast and Famine", "")); + cubeCards.add(new CardIdentity("Sword of Fire and Ice", "")); + cubeCards.add(new CardIdentity("Sword of Light and Shadow", "")); + cubeCards.add(new CardIdentity("Sword of War and Peace", "")); + cubeCards.add(new CardIdentity("Swords to Plowshares", "")); + cubeCards.add(new CardIdentity("Sylvan Caryatid", "")); + cubeCards.add(new CardIdentity("Sylvan Library", "")); + cubeCards.add(new CardIdentity("Taiga", "")); + cubeCards.add(new CardIdentity("Tangle Wire", "")); + cubeCards.add(new CardIdentity("Tarmogoyf", "")); + cubeCards.add(new CardIdentity("Temple Garden", "")); + cubeCards.add(new CardIdentity("Terminus", "")); + cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); + cubeCards.add(new CardIdentity("Tezzeret the Seeker", "")); + cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", "")); + cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", "")); + cubeCards.add(new CardIdentity("Thassa, God of the Sea", "")); + cubeCards.add(new CardIdentity("The Abyss", "")); + cubeCards.add(new CardIdentity("Thirst for Knowledge", "")); + cubeCards.add(new CardIdentity("Thoughtseize", "")); + cubeCards.add(new CardIdentity("Thragtusk", "")); + cubeCards.add(new CardIdentity("Thrun, the Last Troll", "")); + cubeCards.add(new CardIdentity("Thundermaw Hellkite", "")); + cubeCards.add(new CardIdentity("Time Spiral", "")); + cubeCards.add(new CardIdentity("Time Walk", "")); + cubeCards.add(new CardIdentity("Timetwister", "")); + cubeCards.add(new CardIdentity("Tinker", "")); + cubeCards.add(new CardIdentity("Tolarian Academy", "")); + cubeCards.add(new CardIdentity("Tombstalker", "")); + cubeCards.add(new CardIdentity("Tooth and Nail", "")); + cubeCards.add(new CardIdentity("Tormented Hero", "")); + cubeCards.add(new CardIdentity("Treachery", "")); + cubeCards.add(new CardIdentity("Treetop Village", "")); + cubeCards.add(new CardIdentity("Trinket Mage", "")); + cubeCards.add(new CardIdentity("Triskelion", "")); + cubeCards.add(new CardIdentity("Troll Ascetic", "")); + cubeCards.add(new CardIdentity("Tropical Island", "")); + cubeCards.add(new CardIdentity("Trygon Predator", "")); + cubeCards.add(new CardIdentity("Tundra", "")); + cubeCards.add(new CardIdentity("Twinblade Slasher", "")); + cubeCards.add(new CardIdentity("Uktabi Orangutan", "")); + cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", "")); + cubeCards.add(new CardIdentity("Umezawa's Jitte", "")); + cubeCards.add(new CardIdentity("Underground Sea", "")); + cubeCards.add(new CardIdentity("Undiscovered Paradise", "")); + cubeCards.add(new CardIdentity("Upheaval", "")); + cubeCards.add(new CardIdentity("Vampire Hexmage", "")); + cubeCards.add(new CardIdentity("Vampire Lacerator", "")); + cubeCards.add(new CardIdentity("Vampire Nighthawk", "")); + cubeCards.add(new CardIdentity("Vampiric Tutor", "")); + cubeCards.add(new CardIdentity("Vedalken Shackles", "")); + cubeCards.add(new CardIdentity("Vendilion Clique", "")); + cubeCards.add(new CardIdentity("Vengevine", "")); + cubeCards.add(new CardIdentity("Venser, Shaper Savant", "")); + cubeCards.add(new CardIdentity("Venser, the Sojourner", "")); + cubeCards.add(new CardIdentity("Verdant Catacombs", "")); + cubeCards.add(new CardIdentity("Vindicate", "")); + cubeCards.add(new CardIdentity("Vinelasher Kudzu", "")); + cubeCards.add(new CardIdentity("Viridian Shaman", "")); + cubeCards.add(new CardIdentity("Voice of Resurgence", "")); + cubeCards.add(new CardIdentity("Volcanic Island", "")); + cubeCards.add(new CardIdentity("Volrath's Stronghold", "")); + cubeCards.add(new CardIdentity("Wall of Blossoms", "")); + cubeCards.add(new CardIdentity("Wall of Omens", "")); + cubeCards.add(new CardIdentity("Wall of Roots", "")); + cubeCards.add(new CardIdentity("Wasteland", "")); + cubeCards.add(new CardIdentity("Waterfront Bouncer", "")); + cubeCards.add(new CardIdentity("Watery Grave", "")); + cubeCards.add(new CardIdentity("Wheel of Fortune", "")); + cubeCards.add(new CardIdentity("Wickerbough Elder", "")); + cubeCards.add(new CardIdentity("Wild Mongrel", "")); + cubeCards.add(new CardIdentity("Wild Nacatl", "")); + cubeCards.add(new CardIdentity("Wildfire", "")); + cubeCards.add(new CardIdentity("Willbender", "")); + cubeCards.add(new CardIdentity("Windswept Heath", "")); + cubeCards.add(new CardIdentity("Winter Orb", "")); + cubeCards.add(new CardIdentity("Wolfbitten Captive", "")); + cubeCards.add(new CardIdentity("Wolfir Silverheart", "")); + cubeCards.add(new CardIdentity("Wooded Foothills", "")); + cubeCards.add(new CardIdentity("Woodfall Primus", "")); + cubeCards.add(new CardIdentity("Worldly Tutor", "")); + cubeCards.add(new CardIdentity("Worn Powerstone", "")); + cubeCards.add(new CardIdentity("Wurmcoil Engine", "")); + cubeCards.add(new CardIdentity("Xenagos, the Reveler", "")); + cubeCards.add(new CardIdentity("Yavimaya Elder", "")); + cubeCards.add(new CardIdentity("Yawgmoth's Will", "")); + cubeCards.add(new CardIdentity("Young Pyromancer", "")); + cubeCards.add(new CardIdentity("Zuran Orb", "")); + + } +} diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube2015.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube2015.java index 1a51d0365b5..ff78a85711d 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube2015.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube2015.java @@ -54,7 +54,7 @@ public class MTGOLegacyCube2015 extends DraftCube { cubeCards.add(new DraftCube.CardIdentity("Angelic Destiny","")); cubeCards.add(new DraftCube.CardIdentity("Anger of the Gods","")); cubeCards.add(new DraftCube.CardIdentity("Animate Dead","")); - cubeCards.add(new DraftCube.CardIdentity("Anowon, the Ruiun Sage","")); + cubeCards.add(new DraftCube.CardIdentity("Anowon, the Ruin Sage","")); cubeCards.add(new DraftCube.CardIdentity("Arbor Elf","")); cubeCards.add(new DraftCube.CardIdentity("Arc Trail","")); cubeCards.add(new DraftCube.CardIdentity("Archangel of Thune","")); @@ -95,7 +95,7 @@ public class MTGOLegacyCube2015 extends DraftCube { cubeCards.add(new DraftCube.CardIdentity("Bloodline Keeper","")); cubeCards.add(new DraftCube.CardIdentity("Bloodlord of Vaasgoth","")); cubeCards.add(new DraftCube.CardIdentity("Bloodstained Mire","")); - cubeCards.add(new DraftCube.CardIdentity("Bogarden Hellkite","")); + cubeCards.add(new DraftCube.CardIdentity("Bogardan Hellkite","")); cubeCards.add(new DraftCube.CardIdentity("Bone Shredder","")); cubeCards.add(new DraftCube.CardIdentity("Bonesplitter","")); cubeCards.add(new DraftCube.CardIdentity("Bonfire of the Damned","")); @@ -274,8 +274,8 @@ public class MTGOLegacyCube2015 extends DraftCube { cubeCards.add(new DraftCube.CardIdentity("Green Sun's Zenith","")); cubeCards.add(new DraftCube.CardIdentity("Grim Lavamancer","")); cubeCards.add(new DraftCube.CardIdentity("Griselbrand","")); - cubeCards.add(new DraftCube.CardIdentity("Gruul Draz Assassin","")); - cubeCards.add(new DraftCube.CardIdentity("Gruul Draz Vampire","")); + cubeCards.add(new DraftCube.CardIdentity("Guul Draz Assassin","")); + cubeCards.add(new DraftCube.CardIdentity("Guul Draz Vampire","")); cubeCards.add(new DraftCube.CardIdentity("Hall of Triumph","")); cubeCards.add(new DraftCube.CardIdentity("Hallowed Fountain","")); cubeCards.add(new DraftCube.CardIdentity("Hallowed Spiritkeeper","")); @@ -332,7 +332,7 @@ public class MTGOLegacyCube2015 extends DraftCube { cubeCards.add(new DraftCube.CardIdentity("Land Tax","")); cubeCards.add(new DraftCube.CardIdentity("Legacy's Allure","")); cubeCards.add(new DraftCube.CardIdentity("Leonin Relic-Warder","")); - cubeCards.add(new DraftCube.CardIdentity("Life From the Loam","")); + cubeCards.add(new DraftCube.CardIdentity("Life from the Loam","")); cubeCards.add(new DraftCube.CardIdentity("Lightning Bolt","")); cubeCards.add(new DraftCube.CardIdentity("Lightning Greaves","")); cubeCards.add(new DraftCube.CardIdentity("Lightning Helix","")); diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOMarchCube2014.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOMarchCube2014.java index 6dfe2614902..d2499ae6bdd 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOMarchCube2014.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOMarchCube2014.java @@ -1,763 +1,762 @@ -/* -* 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.tournament.cubes; - -import mage.game.draft.DraftCube; - -/** - * - * @author LevelX2 - */ -public class MTGOMarchCube2014 extends DraftCube { - - public MTGOMarchCube2014() { - super("MTGO Cube March 2014"); - - cubeCards.add(new CardIdentity("Academy Rector","")); - cubeCards.add(new CardIdentity("Akroma, Angel of Wrath","")); - cubeCards.add(new CardIdentity("Angel of Serenity","")); - cubeCards.add(new CardIdentity("Aven Mindcensor","")); - cubeCards.add(new CardIdentity("Baneslayer Angel","")); - cubeCards.add(new CardIdentity("Blade Splicer","")); - cubeCards.add(new CardIdentity("Calciderm","")); - cubeCards.add(new CardIdentity("Cloudgoat Ranger","")); - cubeCards.add(new CardIdentity("Descendant of Kiyomaro","")); - cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails","")); - cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite","")); - cubeCards.add(new CardIdentity("Elite Vanguard","")); - cubeCards.add(new CardIdentity("Emeria Angel","")); - cubeCards.add(new CardIdentity("Exalted Angel","")); - cubeCards.add(new CardIdentity("Banisher Priest","")); - cubeCards.add(new CardIdentity("Flickerwisp","")); - cubeCards.add(new CardIdentity("Hand of Honor","")); - cubeCards.add(new CardIdentity("Hero of Bladehold","")); - cubeCards.add(new CardIdentity("Hokori, Dust Drinker","")); - cubeCards.add(new CardIdentity("Iona, Shield of Emeria","")); - cubeCards.add(new CardIdentity("Isamaru, Hound of Konda","")); - cubeCards.add(new CardIdentity("Jötun Grunt","")); - cubeCards.add(new CardIdentity("Kami of Ancient Law","")); - cubeCards.add(new CardIdentity("Knight of Glory","")); - cubeCards.add(new CardIdentity("Imposing Sovereign","")); - cubeCards.add(new CardIdentity("Leonin Relic-Warder","")); - cubeCards.add(new CardIdentity("Linvala, Keeper of Silence","")); - cubeCards.add(new CardIdentity("Loam Lion","")); - cubeCards.add(new CardIdentity("Mentor of the Meek","")); - cubeCards.add(new CardIdentity("Mirran Crusader","")); - cubeCards.add(new CardIdentity("Mirror Entity","")); - cubeCards.add(new CardIdentity("Mother of Runes","")); - cubeCards.add(new CardIdentity("Nearheath Pilgrim","")); - cubeCards.add(new CardIdentity("Brimaz, King of Oreskos","")); - cubeCards.add(new CardIdentity("Porcelain Legionnaire","")); - cubeCards.add(new CardIdentity("Pristine Angel","")); - cubeCards.add(new CardIdentity("Ranger of Eos","")); - cubeCards.add(new CardIdentity("Restoration Angel","")); - cubeCards.add(new CardIdentity("Reveillark","")); - cubeCards.add(new CardIdentity("Soldier of the Pantheon","")); - cubeCards.add(new CardIdentity("Savannah Lions","")); - cubeCards.add(new CardIdentity("Shrieking Grotesque","")); - cubeCards.add(new CardIdentity("Silver Knight","")); - cubeCards.add(new CardIdentity("Silverblade Paladin","")); - cubeCards.add(new CardIdentity("Steppe Lynx","")); - cubeCards.add(new CardIdentity("Stonecloaker","")); - cubeCards.add(new CardIdentity("Stoneforge Mystic","")); - cubeCards.add(new CardIdentity("Student of Warfare","")); - cubeCards.add(new CardIdentity("Sublime Archangel","")); - cubeCards.add(new CardIdentity("Sun Titan","")); - cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben","")); - cubeCards.add(new CardIdentity("Wall of Omens","")); - cubeCards.add(new CardIdentity("Wall of Reverence","")); - cubeCards.add(new CardIdentity("Weathered Wayfarer","")); - cubeCards.add(new CardIdentity("Whipcorder","")); - cubeCards.add(new CardIdentity("Yosei, the Morning Star","")); - cubeCards.add(new CardIdentity("Heliod, God of the Sun","")); - cubeCards.add(new CardIdentity("Faith's Fetters","")); - cubeCards.add(new CardIdentity("Spear of Heliod","")); - cubeCards.add(new CardIdentity("Honor of the Pure","")); - cubeCards.add(new CardIdentity("Journey to Nowhere","")); - cubeCards.add(new CardIdentity("Land Tax","")); - cubeCards.add(new CardIdentity("Oblivion Ring","")); - cubeCards.add(new CardIdentity("Parallax Wave","")); - cubeCards.add(new CardIdentity("Seal of Cleansing","")); - cubeCards.add(new CardIdentity("Celestial Purge","")); - cubeCards.add(new CardIdentity("Condemn","")); - cubeCards.add(new CardIdentity("Disenchant","")); - cubeCards.add(new CardIdentity("Dismantling Blow","")); - cubeCards.add(new CardIdentity("Enlightened Tutor","")); - cubeCards.add(new CardIdentity("Mana Tithe","")); - cubeCards.add(new CardIdentity("Momentary Blink","")); - cubeCards.add(new CardIdentity("Oust","")); - cubeCards.add(new CardIdentity("Path to Exile","")); - cubeCards.add(new CardIdentity("Elspeth, Sun's Champion","")); - cubeCards.add(new CardIdentity("Swords to Plowshares","")); - cubeCards.add(new CardIdentity("Archangel of Thune","")); - cubeCards.add(new CardIdentity("Ajani Goldmane","")); - cubeCards.add(new CardIdentity("Ajani, Caller of the Pride","")); - cubeCards.add(new CardIdentity("Elspeth Tirel","")); - cubeCards.add(new CardIdentity("Elspeth, Knight-Errant","")); - cubeCards.add(new CardIdentity("Gideon Jura","")); - cubeCards.add(new CardIdentity("Gideon, Champion of Justice","")); - cubeCards.add(new CardIdentity("Akroma's Vengeance","")); - cubeCards.add(new CardIdentity("Armageddon","")); - cubeCards.add(new CardIdentity("Balance","")); - cubeCards.add(new CardIdentity("Celestial Flare","")); - cubeCards.add(new CardIdentity("Catastrophe","")); - cubeCards.add(new CardIdentity("Day of Judgment","")); - cubeCards.add(new CardIdentity("Decree of Justice","")); - cubeCards.add(new CardIdentity("Entreat the Angels","")); - cubeCards.add(new CardIdentity("Hallowed Burial","")); - cubeCards.add(new CardIdentity("Lingering Souls","")); - cubeCards.add(new CardIdentity("Martial Coup","")); - cubeCards.add(new CardIdentity("Ravages of War","")); - cubeCards.add(new CardIdentity("Rout","")); - cubeCards.add(new CardIdentity("Spectral Procession","")); - cubeCards.add(new CardIdentity("Terminus","")); - cubeCards.add(new CardIdentity("Wrath of God","")); - cubeCards.add(new CardIdentity("Phyrexian Metamorph","")); - cubeCards.add(new CardIdentity("AEtherling","")); - cubeCards.add(new CardIdentity("Augur of Bolas","")); - cubeCards.add(new CardIdentity("Consecrated Sphinx","")); - cubeCards.add(new CardIdentity("Coralhelm Commander","")); - cubeCards.add(new CardIdentity("Court Hussar","")); - cubeCards.add(new CardIdentity("Cursecatcher","")); - cubeCards.add(new CardIdentity("Delver of Secrets","")); - cubeCards.add(new CardIdentity("Dungeon Geists","")); - cubeCards.add(new CardIdentity("Enclave Cryptologist","")); - cubeCards.add(new CardIdentity("Fathom Seer","")); - cubeCards.add(new CardIdentity("Frost Titan","")); - cubeCards.add(new CardIdentity("Glen Elendra Archmage","")); - cubeCards.add(new CardIdentity("Jushi Apprentice","")); - cubeCards.add(new CardIdentity("Keiga, the Tide Star","")); - cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner","")); - cubeCards.add(new CardIdentity("Looter il-Kor","")); - cubeCards.add(new CardIdentity("Man-o'-War","")); - cubeCards.add(new CardIdentity("Meloku the Clouded Mirror","")); - cubeCards.add(new CardIdentity("Mulldrifter","")); - cubeCards.add(new CardIdentity("Master of Waves","")); - cubeCards.add(new CardIdentity("Old Man of the Sea","")); - cubeCards.add(new CardIdentity("Palinchron","")); - cubeCards.add(new CardIdentity("Phantasmal Bear","")); - cubeCards.add(new CardIdentity("Phantasmal Image","")); - cubeCards.add(new CardIdentity("Riftwing Cloudskate","")); - cubeCards.add(new CardIdentity("Sakashima's Student","")); - cubeCards.add(new CardIdentity("Sea Gate Oracle","")); - cubeCards.add(new CardIdentity("Serendib Efreet","")); - cubeCards.add(new CardIdentity("Snapcaster Mage","")); - cubeCards.add(new CardIdentity("Sower of Temptation","")); - cubeCards.add(new CardIdentity("Talrand, Sky Summoner","")); - cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir","")); - cubeCards.add(new CardIdentity("Thieving Magpie","")); - cubeCards.add(new CardIdentity("Tradewind Rider","")); - cubeCards.add(new CardIdentity("Trinket Mage","")); - cubeCards.add(new CardIdentity("Vendilion Clique","")); - cubeCards.add(new CardIdentity("Venser, Shaper Savant","")); - cubeCards.add(new CardIdentity("Vesuvan Shapeshifter","")); - cubeCards.add(new CardIdentity("Voidmage Prodigy","")); - cubeCards.add(new CardIdentity("Wake Thrasher","")); - cubeCards.add(new CardIdentity("Willbender","")); - cubeCards.add(new CardIdentity("Control Magic","")); - cubeCards.add(new CardIdentity("Future Sight","")); - cubeCards.add(new CardIdentity("Legacy's Allure","")); - cubeCards.add(new CardIdentity("Narcolepsy","")); - cubeCards.add(new CardIdentity("Opposition","")); - cubeCards.add(new CardIdentity("Spreading Seas","")); - cubeCards.add(new CardIdentity("Treachery","")); - cubeCards.add(new CardIdentity("Blue Elemental Blast","")); - cubeCards.add(new CardIdentity("Brain Freeze","")); - cubeCards.add(new CardIdentity("Brainstorm","")); - cubeCards.add(new CardIdentity("Capsize","")); - cubeCards.add(new CardIdentity("Condescend","")); - cubeCards.add(new CardIdentity("Counterspell","")); - cubeCards.add(new CardIdentity("Cryptic Command","")); - cubeCards.add(new CardIdentity("Daze","")); - cubeCards.add(new CardIdentity("Dismiss","")); - cubeCards.add(new CardIdentity("Dissipate","")); - cubeCards.add(new CardIdentity("Essence Scatter","")); - cubeCards.add(new CardIdentity("Fact or Fiction","")); - cubeCards.add(new CardIdentity("Flashfreeze","")); - cubeCards.add(new CardIdentity("Forbid","")); - cubeCards.add(new CardIdentity("Thassa, God of the Sea","")); - cubeCards.add(new CardIdentity("Force of Will","")); - cubeCards.add(new CardIdentity("Force Spike","")); - cubeCards.add(new CardIdentity("Frantic Search","")); - cubeCards.add(new CardIdentity("Gifts Ungiven","")); - cubeCards.add(new CardIdentity("Hinder","")); - cubeCards.add(new CardIdentity("Impulse","")); - cubeCards.add(new CardIdentity("Into the Roil","")); - cubeCards.add(new CardIdentity("Mana Leak","")); - cubeCards.add(new CardIdentity("Miscalculation","")); - cubeCards.add(new CardIdentity("Misdirection","")); - cubeCards.add(new CardIdentity("Mystical Tutor","")); - cubeCards.add(new CardIdentity("Negate","")); - cubeCards.add(new CardIdentity("Pact of Negation","")); - cubeCards.add(new CardIdentity("Remand","")); - cubeCards.add(new CardIdentity("Repeal","")); - cubeCards.add(new CardIdentity("Spell Pierce","")); - cubeCards.add(new CardIdentity("Thirst for Knowledge","")); - cubeCards.add(new CardIdentity("Turnabout","")); - cubeCards.add(new CardIdentity("Jace Beleren","")); - cubeCards.add(new CardIdentity("Jace, Architect of Thought","")); - cubeCards.add(new CardIdentity("Jace, the Mind Sculptor","")); - cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage","")); - cubeCards.add(new CardIdentity("Ancestral Vision","")); - cubeCards.add(new CardIdentity("Compulsive Research","")); - cubeCards.add(new CardIdentity("Deep Analysis","")); - cubeCards.add(new CardIdentity("Mind's Desire","")); - cubeCards.add(new CardIdentity("Ponder","")); - cubeCards.add(new CardIdentity("Preordain","")); - cubeCards.add(new CardIdentity("Serum Visions","")); - cubeCards.add(new CardIdentity("Show and Tell","")); - cubeCards.add(new CardIdentity("Tidings","")); - cubeCards.add(new CardIdentity("Time Spiral","")); - cubeCards.add(new CardIdentity("Time Warp","")); - cubeCards.add(new CardIdentity("Tinker","")); - cubeCards.add(new CardIdentity("Upheaval","")); - cubeCards.add(new CardIdentity("Bane of the Living","")); - cubeCards.add(new CardIdentity("Bloodghast","")); - cubeCards.add(new CardIdentity("Bloodgift Demon","")); - cubeCards.add(new CardIdentity("Bloodline Keeper","")); - cubeCards.add(new CardIdentity("Bone Shredder","")); - cubeCards.add(new CardIdentity("Braids, Cabal Minion","")); - cubeCards.add(new CardIdentity("Carnophage","")); - cubeCards.add(new CardIdentity("Dark Confidant","")); - cubeCards.add(new CardIdentity("Diregraf Ghoul","")); - cubeCards.add(new CardIdentity("Gatekeeper of Malakir","")); - cubeCards.add(new CardIdentity("Geralf's Messenger","")); - cubeCards.add(new CardIdentity("Grave Titan","")); - cubeCards.add(new CardIdentity("Graveborn Muse","")); - cubeCards.add(new CardIdentity("Gravecrawler","")); - cubeCards.add(new CardIdentity("Griselbrand","")); - cubeCards.add(new CardIdentity("Guul Draz Assassin","")); - cubeCards.add(new CardIdentity("Hand of Cruelty","")); - cubeCards.add(new CardIdentity("Headhunter","")); - cubeCards.add(new CardIdentity("Hypnotic Specter","")); - cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni","")); - cubeCards.add(new CardIdentity("Knight of Infamy","")); - cubeCards.add(new CardIdentity("Kokusho, the Evening Star","")); - cubeCards.add(new CardIdentity("Liliana's Reaver","")); - cubeCards.add(new CardIdentity("Mesmeric Fiend","")); - cubeCards.add(new CardIdentity("Nantuko Shade","")); - cubeCards.add(new CardIdentity("Nekrataal","")); - cubeCards.add(new CardIdentity("Nezumi Graverobber","")); - cubeCards.add(new CardIdentity("Nezumi Shortfang","")); - cubeCards.add(new CardIdentity("Nightscape Familiar","")); - cubeCards.add(new CardIdentity("Erebos, God of the Dead","")); - cubeCards.add(new CardIdentity("Oona's Prowler","")); - cubeCards.add(new CardIdentity("Phyrexian Obliterator","")); - cubeCards.add(new CardIdentity("Phyrexian Rager","")); - cubeCards.add(new CardIdentity("Plague Sliver","")); - cubeCards.add(new CardIdentity("Putrid Imp","")); - cubeCards.add(new CardIdentity("Pain Seer","")); - cubeCards.add(new CardIdentity("Shriekmaw","")); - cubeCards.add(new CardIdentity("Silent Specter","")); - cubeCards.add(new CardIdentity("Lifebane Zombie","")); - cubeCards.add(new CardIdentity("Skinrender","")); - cubeCards.add(new CardIdentity("Tombstalker","")); - cubeCards.add(new CardIdentity("Herald of Torment","")); - cubeCards.add(new CardIdentity("Vampire Hexmage","")); - cubeCards.add(new CardIdentity("Vampire Lacerator","")); - cubeCards.add(new CardIdentity("Vampire Nighthawk","")); - cubeCards.add(new CardIdentity("Visara the Dreadful","")); - cubeCards.add(new CardIdentity("Wrench Mind","")); - cubeCards.add(new CardIdentity("Animate Dead","")); - cubeCards.add(new CardIdentity("Attrition","")); - cubeCards.add(new CardIdentity("Bitterblossom","")); - cubeCards.add(new CardIdentity("Diabolic Servitude","")); - cubeCards.add(new CardIdentity("Necromancy","")); - cubeCards.add(new CardIdentity("Necropotence","")); - cubeCards.add(new CardIdentity("Phyrexian Arena","")); - cubeCards.add(new CardIdentity("Recurring Nightmare","")); - cubeCards.add(new CardIdentity("Sarcomancy","")); - cubeCards.add(new CardIdentity("Dark Ritual","")); - cubeCards.add(new CardIdentity("Disfigure","")); - cubeCards.add(new CardIdentity("Dismember","")); - cubeCards.add(new CardIdentity("Doom Blade","")); - cubeCards.add(new CardIdentity("Duress","")); - cubeCards.add(new CardIdentity("Entomb","")); - cubeCards.add(new CardIdentity("Go for the Throat","")); - cubeCards.add(new CardIdentity("Makeshift Mannequin","")); - cubeCards.add(new CardIdentity("Night's Whisper","")); - cubeCards.add(new CardIdentity("Skeletal Scrying","")); - cubeCards.add(new CardIdentity("Slaughter Pact","")); - cubeCards.add(new CardIdentity("Smother","")); - cubeCards.add(new CardIdentity("Snuff Out","")); - cubeCards.add(new CardIdentity("Sorin's Thirst","")); - cubeCards.add(new CardIdentity("Spinning Darkness","")); - cubeCards.add(new CardIdentity("Tainted Pact","")); - cubeCards.add(new CardIdentity("Tragic Slip","")); - cubeCards.add(new CardIdentity("Ultimate Price","")); - cubeCards.add(new CardIdentity("Vampiric Tutor","")); - cubeCards.add(new CardIdentity("Liliana of the Veil","")); - cubeCards.add(new CardIdentity("Liliana Vess","")); - cubeCards.add(new CardIdentity("Black Sun's Zenith","")); - cubeCards.add(new CardIdentity("Buried Alive","")); - cubeCards.add(new CardIdentity("Chainer's Edict","")); - cubeCards.add(new CardIdentity("Corrupt","")); - cubeCards.add(new CardIdentity("Damnation","")); - cubeCards.add(new CardIdentity("Death Cloud","")); - cubeCards.add(new CardIdentity("Demonic Tutor","")); - cubeCards.add(new CardIdentity("Exhume","")); - cubeCards.add(new CardIdentity("Hymn to Tourach","")); - cubeCards.add(new CardIdentity("Inquisition of Kozilek","")); - cubeCards.add(new CardIdentity("Living Death","")); - cubeCards.add(new CardIdentity("Persecute","")); - cubeCards.add(new CardIdentity("Hero's Downfall","")); - cubeCards.add(new CardIdentity("Reanimate","")); - cubeCards.add(new CardIdentity("Sign in Blood","")); - cubeCards.add(new CardIdentity("Sinkhole","")); - cubeCards.add(new CardIdentity("Stupor","")); - cubeCards.add(new CardIdentity("Tendrils of Agony","")); - cubeCards.add(new CardIdentity("Tendrils of Corruption","")); - cubeCards.add(new CardIdentity("Thoughtseize","")); - cubeCards.add(new CardIdentity("Unburial Rites","")); - cubeCards.add(new CardIdentity("Yawgmoth's Will","")); - cubeCards.add(new CardIdentity("Ash Zealot","")); - cubeCards.add(new CardIdentity("Avalanche Riders","")); - cubeCards.add(new CardIdentity("Ball Lightning","")); - cubeCards.add(new CardIdentity("Blistering Firecat","")); - cubeCards.add(new CardIdentity("Bogardan Hellkite","")); - cubeCards.add(new CardIdentity("Chandra, the Firebrand","")); - cubeCards.add(new CardIdentity("Chandra's Phoenix","")); - cubeCards.add(new CardIdentity("Countryside Crusher","")); - cubeCards.add(new CardIdentity("Cunning Sparkmage","")); - cubeCards.add(new CardIdentity("Ember Hauler","")); - cubeCards.add(new CardIdentity("Flametongue Kavu","")); - cubeCards.add(new CardIdentity("Frenzied Goblin","")); - cubeCards.add(new CardIdentity("Gathan Raiders","")); - cubeCards.add(new CardIdentity("Goblin Cadets","")); - cubeCards.add(new CardIdentity("Goblin Guide","")); - cubeCards.add(new CardIdentity("Firedrinker Satyr","")); - cubeCards.add(new CardIdentity("Goblin Ruinblaster","")); - cubeCards.add(new CardIdentity("Goblin Welder","")); - cubeCards.add(new CardIdentity("Gore-House Chainwalker","")); - cubeCards.add(new CardIdentity("Greater Gargadon","")); - cubeCards.add(new CardIdentity("Grim Lavamancer","")); - cubeCards.add(new CardIdentity("Hell's Thunder","")); - cubeCards.add(new CardIdentity("Hellrider","")); - cubeCards.add(new CardIdentity("Hellspark Elemental","")); - cubeCards.add(new CardIdentity("Hero of Oxid Ridge","")); - cubeCards.add(new CardIdentity("Inferno Titan","")); - cubeCards.add(new CardIdentity("Jackal Pup","")); - cubeCards.add(new CardIdentity("Kargan Dragonlord","")); - cubeCards.add(new CardIdentity("Keldon Champion","")); - cubeCards.add(new CardIdentity("Keldon Marauders","")); - cubeCards.add(new CardIdentity("Kird Ape","")); - cubeCards.add(new CardIdentity("Lightning Mauler","")); - cubeCards.add(new CardIdentity("Magus of the Moon","")); - cubeCards.add(new CardIdentity("Mogg War Marshal","")); - cubeCards.add(new CardIdentity("Orcish Lumberjack","")); - cubeCards.add(new CardIdentity("Plated Geopede","")); - cubeCards.add(new CardIdentity("Priest of Urabrask","")); - cubeCards.add(new CardIdentity("Ravenous Baboons","")); - cubeCards.add(new CardIdentity("Siege-Gang Commander","")); - cubeCards.add(new CardIdentity("Spikeshot Elder","")); - cubeCards.add(new CardIdentity("Stormblood Berserker","")); - cubeCards.add(new CardIdentity("Stromkirk Noble","")); - cubeCards.add(new CardIdentity("Taurean Mauler","")); - cubeCards.add(new CardIdentity("Thunderblust","")); - cubeCards.add(new CardIdentity("Thundermaw Hellkite","")); - cubeCards.add(new CardIdentity("Thunderscape Battlemage","")); - cubeCards.add(new CardIdentity("Tin Street Hooligan","")); - cubeCards.add(new CardIdentity("Torch Fiend","")); - cubeCards.add(new CardIdentity("Urabrask the Hidden","")); - cubeCards.add(new CardIdentity("Zealous Conscripts","")); - cubeCards.add(new CardIdentity("Zo-Zu the Punisher","")); - cubeCards.add(new CardIdentity("Genju of the Spires","")); - cubeCards.add(new CardIdentity("Sneak Attack","")); - cubeCards.add(new CardIdentity("Sulfuric Vortex","")); - cubeCards.add(new CardIdentity("Ancient Grudge","")); - cubeCards.add(new CardIdentity("Brimstone Volley","")); - cubeCards.add(new CardIdentity("Burst Lightning","")); - cubeCards.add(new CardIdentity("Chain Lightning","")); - cubeCards.add(new CardIdentity("Chaos Warp","")); - cubeCards.add(new CardIdentity("Char","")); - cubeCards.add(new CardIdentity("Desperate Ravings","")); - cubeCards.add(new CardIdentity("Fireblast","")); - cubeCards.add(new CardIdentity("Firestorm","")); - cubeCards.add(new CardIdentity("Flame Javelin","")); - cubeCards.add(new CardIdentity("Searing Blood","")); - cubeCards.add(new CardIdentity("Lightning Bolt","")); - cubeCards.add(new CardIdentity("Magma Jet","")); - cubeCards.add(new CardIdentity("Price of Progress","")); - cubeCards.add(new CardIdentity("Red Elemental Blast","")); - cubeCards.add(new CardIdentity("Searing Blaze","")); - cubeCards.add(new CardIdentity("Seething Song","")); - cubeCards.add(new CardIdentity("Skullcrack","")); - cubeCards.add(new CardIdentity("Smash to Smithereens","")); - cubeCards.add(new CardIdentity("Ogre Battledriver","")); - cubeCards.add(new CardIdentity("Volcanic Fallout","")); - cubeCards.add(new CardIdentity("Koth of the Hammer","")); - cubeCards.add(new CardIdentity("Arc Trail","")); - cubeCards.add(new CardIdentity("Chandra, Pyromaster","")); - cubeCards.add(new CardIdentity("Bonfire of the Damned","")); - cubeCards.add(new CardIdentity("Burning of Xinye","")); - cubeCards.add(new CardIdentity("Purphoros, God of the Forge","")); - cubeCards.add(new CardIdentity("Devil's Play","")); - cubeCards.add(new CardIdentity("Earthquake","")); - cubeCards.add(new CardIdentity("Empty the Warrens","")); - cubeCards.add(new CardIdentity("Faithless Looting","")); - cubeCards.add(new CardIdentity("Firebolt","")); - cubeCards.add(new CardIdentity("Forked Bolt","")); - cubeCards.add(new CardIdentity("Gamble","")); - cubeCards.add(new CardIdentity("Mark of Mutiny","")); - cubeCards.add(new CardIdentity("Mizzium Mortars","")); - cubeCards.add(new CardIdentity("Molten Rain","")); - cubeCards.add(new CardIdentity("Pillage","")); - cubeCards.add(new CardIdentity("Pyroclasm","")); - cubeCards.add(new CardIdentity("Reckless Charge","")); - cubeCards.add(new CardIdentity("Rift Bolt","")); - cubeCards.add(new CardIdentity("Rolling Earthquake","")); - cubeCards.add(new CardIdentity("Slagstorm","")); - cubeCards.add(new CardIdentity("Wheel of Fortune","")); - cubeCards.add(new CardIdentity("Wildfire","")); - cubeCards.add(new CardIdentity("Birthing Pod","")); - cubeCards.add(new CardIdentity("Acidic Slime","")); - cubeCards.add(new CardIdentity("Arbor Elf","")); - cubeCards.add(new CardIdentity("Avacyn's Pilgrim","")); - cubeCards.add(new CardIdentity("Avenger of Zendikar","")); - cubeCards.add(new CardIdentity("Birds of Paradise","")); - cubeCards.add(new CardIdentity("Blastoderm","")); - cubeCards.add(new CardIdentity("Borderland Ranger","")); - cubeCards.add(new CardIdentity("Boreal Druid","")); - cubeCards.add(new CardIdentity("Brooding Saurian","")); - cubeCards.add(new CardIdentity("Boon Satyr","")); - cubeCards.add(new CardIdentity("Deranged Hermit","")); - cubeCards.add(new CardIdentity("Sylvan Caryatid","")); - cubeCards.add(new CardIdentity("Dryad Sophisticate","")); - cubeCards.add(new CardIdentity("Elves of Deep Shadow","")); - cubeCards.add(new CardIdentity("Eternal Witness","")); - cubeCards.add(new CardIdentity("Experiment One","")); - cubeCards.add(new CardIdentity("Fauna Shaman","")); - cubeCards.add(new CardIdentity("Flinthoof Boar","")); - cubeCards.add(new CardIdentity("Fyndhorn Elves","")); - cubeCards.add(new CardIdentity("Genesis","")); - cubeCards.add(new CardIdentity("Great Sable Stag","")); - cubeCards.add(new CardIdentity("Hystrodon","")); - cubeCards.add(new CardIdentity("Indrik Stomphowler","")); - cubeCards.add(new CardIdentity("Joraga Treespeaker","")); - cubeCards.add(new CardIdentity("Llanowar Elves","")); - cubeCards.add(new CardIdentity("Lotus Cobra","")); - cubeCards.add(new CardIdentity("Master of the Wild Hunt","")); - cubeCards.add(new CardIdentity("Mold Shambler","")); - cubeCards.add(new CardIdentity("Nantuko Vigilante","")); - cubeCards.add(new CardIdentity("Noble Hierarch","")); - cubeCards.add(new CardIdentity("Obstinate Baloth","")); - cubeCards.add(new CardIdentity("Ohran Viper","")); - cubeCards.add(new CardIdentity("Oracle of Mul Daya","")); - cubeCards.add(new CardIdentity("Primeval Titan","")); - cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary","")); - cubeCards.add(new CardIdentity("Sakura-Tribe Elder","")); - cubeCards.add(new CardIdentity("Scavenging Ooze","")); - cubeCards.add(new CardIdentity("Strangleroot Geist","")); - cubeCards.add(new CardIdentity("Tarmogoyf","")); - cubeCards.add(new CardIdentity("Terastodon","")); - cubeCards.add(new CardIdentity("Thelonite Hermit","")); - cubeCards.add(new CardIdentity("Thornscape Battlemage","")); - cubeCards.add(new CardIdentity("Thragtusk","")); - cubeCards.add(new CardIdentity("Thrun, the Last Troll","")); - cubeCards.add(new CardIdentity("Troll Ascetic","")); - cubeCards.add(new CardIdentity("Ulvenwald Tracker","")); - cubeCards.add(new CardIdentity("Vengevine","")); - cubeCards.add(new CardIdentity("Wall of Blossoms","")); - cubeCards.add(new CardIdentity("Wall of Roots","")); - cubeCards.add(new CardIdentity("Wickerbough Elder","")); - cubeCards.add(new CardIdentity("Wild Nacatl","")); - cubeCards.add(new CardIdentity("Wolfir Silverheart","")); - cubeCards.add(new CardIdentity("Wood Elves","")); - cubeCards.add(new CardIdentity("Woodfall Primus","")); - cubeCards.add(new CardIdentity("Yavimaya Elder","")); - cubeCards.add(new CardIdentity("Polukranos, World Eater","")); - cubeCards.add(new CardIdentity("Courser of Kruphix","")); - cubeCards.add(new CardIdentity("Awakening Zone","")); - cubeCards.add(new CardIdentity("Exploration","")); - cubeCards.add(new CardIdentity("Fertile Ground","")); - cubeCards.add(new CardIdentity("Heartbeat of Spring","")); - cubeCards.add(new CardIdentity("Rancor","")); - cubeCards.add(new CardIdentity("Survival of the Fittest","")); - cubeCards.add(new CardIdentity("Sylvan Library","")); - cubeCards.add(new CardIdentity("Beast Within","")); - cubeCards.add(new CardIdentity("Chord of Calling","")); - cubeCards.add(new CardIdentity("Krosan Grip","")); - cubeCards.add(new CardIdentity("Moment's Peace","")); - cubeCards.add(new CardIdentity("Naturalize","")); - cubeCards.add(new CardIdentity("Nature's Claim","")); - cubeCards.add(new CardIdentity("Vines of Vastwood","")); - cubeCards.add(new CardIdentity("Garruk Relentless","")); - cubeCards.add(new CardIdentity("Garruk Wildspeaker","")); - cubeCards.add(new CardIdentity("Garruk, Primal Hunter","")); - cubeCards.add(new CardIdentity("Pattern of Rebirth","")); - cubeCards.add(new CardIdentity("Call of the Herd","")); - cubeCards.add(new CardIdentity("Channel","")); - cubeCards.add(new CardIdentity("Cultivate","")); - cubeCards.add(new CardIdentity("Elvish Mystic","")); - cubeCards.add(new CardIdentity("Eureka","")); - cubeCards.add(new CardIdentity("Explore","")); - cubeCards.add(new CardIdentity("Farseek","")); - cubeCards.add(new CardIdentity("Genesis Wave","")); - cubeCards.add(new CardIdentity("Green Sun's Zenith","")); - cubeCards.add(new CardIdentity("Harmonize","")); - cubeCards.add(new CardIdentity("Life from the Loam","")); - cubeCards.add(new CardIdentity("Natural Order","")); - cubeCards.add(new CardIdentity("Nature's Lore","")); - cubeCards.add(new CardIdentity("Nostalgic Dreams","")); - cubeCards.add(new CardIdentity("Plow Under","")); - cubeCards.add(new CardIdentity("Primal Command","")); - cubeCards.add(new CardIdentity("Rampant Growth","")); - cubeCards.add(new CardIdentity("Regrowth","")); - cubeCards.add(new CardIdentity("Restock","")); - cubeCards.add(new CardIdentity("Rude Awakening","")); - cubeCards.add(new CardIdentity("Search for Tomorrow","")); - cubeCards.add(new CardIdentity("Stunted Growth","")); - cubeCards.add(new CardIdentity("Tooth and Nail","")); - cubeCards.add(new CardIdentity("Academy Ruins","")); - cubeCards.add(new CardIdentity("Adarkar Wastes","")); - cubeCards.add(new CardIdentity("Ancient Tomb","")); - cubeCards.add(new CardIdentity("Seaside Citadel","")); - cubeCards.add(new CardIdentity("Arid Mesa","")); - cubeCards.add(new CardIdentity("Azorius Chancery","")); - cubeCards.add(new CardIdentity("Bad River","")); - cubeCards.add(new CardIdentity("Badlands","")); - cubeCards.add(new CardIdentity("Barbarian Ring","")); - cubeCards.add(new CardIdentity("Battlefield Forge","")); - cubeCards.add(new CardIdentity("Bayou","")); - cubeCards.add(new CardIdentity("Blood Crypt","")); - cubeCards.add(new CardIdentity("Bloodstained Mire","")); - cubeCards.add(new CardIdentity("Boros Garrison","")); - cubeCards.add(new CardIdentity("Breeding Pool","")); - cubeCards.add(new CardIdentity("Brushland","")); - cubeCards.add(new CardIdentity("Cascade Bluffs","")); - cubeCards.add(new CardIdentity("Caves of Koilos","")); - cubeCards.add(new CardIdentity("Celestial Colonnade","")); - cubeCards.add(new CardIdentity("City of Brass","")); - cubeCards.add(new CardIdentity("Clifftop Retreat","")); - cubeCards.add(new CardIdentity("Creeping Tar Pit","")); - cubeCards.add(new CardIdentity("Arcane Sanctum","")); - cubeCards.add(new CardIdentity("Dimir Aqueduct","")); - cubeCards.add(new CardIdentity("Dragonskull Summit","")); - cubeCards.add(new CardIdentity("Drowned Catacomb","")); - cubeCards.add(new CardIdentity("Faerie Conclave","")); - cubeCards.add(new CardIdentity("Fetid Heath","")); - cubeCards.add(new CardIdentity("Fire-Lit Thicket","")); - cubeCards.add(new CardIdentity("Flagstones of Trokair","")); - cubeCards.add(new CardIdentity("Flood Plain","")); - cubeCards.add(new CardIdentity("Flooded Grove","")); - cubeCards.add(new CardIdentity("Flooded Strand","")); - cubeCards.add(new CardIdentity("Gaea's Cradle","")); - cubeCards.add(new CardIdentity("Ghitu Encampment","")); - cubeCards.add(new CardIdentity("Glacial Fortress","")); - cubeCards.add(new CardIdentity("Godless Shrine","")); - cubeCards.add(new CardIdentity("Golgari Rot Farm","")); - cubeCards.add(new CardIdentity("Grasslands","")); - cubeCards.add(new CardIdentity("Graven Cairns","")); - cubeCards.add(new CardIdentity("Gruul Turf","")); - cubeCards.add(new CardIdentity("Halimar Depths","")); - cubeCards.add(new CardIdentity("Hallowed Fountain","")); - cubeCards.add(new CardIdentity("Hinterland Harbor","")); - cubeCards.add(new CardIdentity("Isolated Chapel","")); - cubeCards.add(new CardIdentity("Izzet Boilerworks","")); - cubeCards.add(new CardIdentity("Jungle Shrine","")); - cubeCards.add(new CardIdentity("Karakas","")); - cubeCards.add(new CardIdentity("Karplusan Forest","")); - cubeCards.add(new CardIdentity("Lake of the Dead","")); - cubeCards.add(new CardIdentity("Lavaclaw Reaches","")); - cubeCards.add(new CardIdentity("Llanowar Wastes","")); - cubeCards.add(new CardIdentity("Marsh Flats","")); - cubeCards.add(new CardIdentity("Maze of Ith","")); - cubeCards.add(new CardIdentity("Mishra's Factory","")); - cubeCards.add(new CardIdentity("Misty Rainforest","")); - cubeCards.add(new CardIdentity("Mountain Valley","")); - cubeCards.add(new CardIdentity("Murmuring Bosk","")); - cubeCards.add(new CardIdentity("Mutavault","")); - cubeCards.add(new CardIdentity("Mystic Gate","")); - cubeCards.add(new CardIdentity("Orzhov Basilica","")); - cubeCards.add(new CardIdentity("Overgrown Tomb","")); - cubeCards.add(new CardIdentity("Plateau","")); - cubeCards.add(new CardIdentity("Polluted Delta","")); - cubeCards.add(new CardIdentity("Raging Ravine","")); - cubeCards.add(new CardIdentity("Rakdos Carnarium","")); - cubeCards.add(new CardIdentity("Reflecting Pool","")); - cubeCards.add(new CardIdentity("Rishadan Port","")); - cubeCards.add(new CardIdentity("Rocky Tar Pit","")); - cubeCards.add(new CardIdentity("Rootbound Crag","")); - cubeCards.add(new CardIdentity("Rugged Prairie","")); - cubeCards.add(new CardIdentity("Sacred Foundry","")); - cubeCards.add(new CardIdentity("Savage Lands","")); - cubeCards.add(new CardIdentity("Savannah","")); - cubeCards.add(new CardIdentity("Scalding Tarn","")); - cubeCards.add(new CardIdentity("Scrubland","")); - cubeCards.add(new CardIdentity("Crumbling Necropolis","")); - cubeCards.add(new CardIdentity("Selesnya Sanctuary","")); - cubeCards.add(new CardIdentity("Shivan Reef","")); - cubeCards.add(new CardIdentity("Simic Growth Chamber","")); - cubeCards.add(new CardIdentity("Steam Vents","")); - cubeCards.add(new CardIdentity("Stirring Wildwood","")); - cubeCards.add(new CardIdentity("Stomping Grounds ","")); - cubeCards.add(new CardIdentity("Strip Mine","")); - cubeCards.add(new CardIdentity("Sulfur Falls","")); - cubeCards.add(new CardIdentity("Sulfurous Springs","")); - cubeCards.add(new CardIdentity("Sunken Ruins","")); - cubeCards.add(new CardIdentity("Sunpetal Grove","")); - cubeCards.add(new CardIdentity("Taiga","")); - cubeCards.add(new CardIdentity("Tectonic Edge","")); - cubeCards.add(new CardIdentity("Teetering Peaks","")); - cubeCards.add(new CardIdentity("Temple Garden","")); - cubeCards.add(new CardIdentity("Thawing Glaciers","")); - cubeCards.add(new CardIdentity("Treetop Village","")); - cubeCards.add(new CardIdentity("Tropical Island","")); - cubeCards.add(new CardIdentity("Tundra","")); - cubeCards.add(new CardIdentity("Twilight Mire","")); - cubeCards.add(new CardIdentity("Underground River","")); - cubeCards.add(new CardIdentity("Underground Sea","")); - cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth","")); - cubeCards.add(new CardIdentity("Verdant Catacombs","")); - cubeCards.add(new CardIdentity("Volcanic Island","")); - cubeCards.add(new CardIdentity("Volrath's Stronghold","")); - cubeCards.add(new CardIdentity("Wasteland","")); - cubeCards.add(new CardIdentity("Watery Grave","")); - cubeCards.add(new CardIdentity("Windbrisk Heights","")); - cubeCards.add(new CardIdentity("Windswept Heath","")); - cubeCards.add(new CardIdentity("Wooded Bastion","")); - cubeCards.add(new CardIdentity("Wooded Foothills","")); - cubeCards.add(new CardIdentity("Woodland Cemetery","")); - cubeCards.add(new CardIdentity("Yavimaya Coast","")); - cubeCards.add(new CardIdentity("Fleecemane Lion","")); - cubeCards.add(new CardIdentity("Baleful Strix","")); - cubeCards.add(new CardIdentity("Shardless Agent","")); - cubeCards.add(new CardIdentity("Bloodbraid Elf","")); - cubeCards.add(new CardIdentity("Broodmate Dragon","")); - cubeCards.add(new CardIdentity("Edric, Spymaster of Trest","")); - cubeCards.add(new CardIdentity("Falkenrath Aristocrat","")); - cubeCards.add(new CardIdentity("Figure of Destiny","")); - cubeCards.add(new CardIdentity("Geist of Saint Traft","")); - cubeCards.add(new CardIdentity("Xenagos, the Reveler","")); - cubeCards.add(new CardIdentity("Huntmaster of the Fells","")); - cubeCards.add(new CardIdentity("Kitchen Finks","")); - cubeCards.add(new CardIdentity("Mystic Snake","")); - cubeCards.add(new CardIdentity("Nightveil Specter","")); - cubeCards.add(new CardIdentity("Steam Augury","")); - cubeCards.add(new CardIdentity("Obzedat, Ghost Council","")); - cubeCards.add(new CardIdentity("Progenitus","")); - cubeCards.add(new CardIdentity("Putrid Leech","")); - cubeCards.add(new CardIdentity("Qasali Pridemage","")); - cubeCards.add(new CardIdentity("Rakdos Cackler","")); - cubeCards.add(new CardIdentity("Shadowmage Infiltrator","")); - cubeCards.add(new CardIdentity("Simic Sky Swallower","")); - cubeCards.add(new CardIdentity("Blood Baron of Vizkopa","")); - cubeCards.add(new CardIdentity("Kiora, the Crashing Wave","")); - cubeCards.add(new CardIdentity("Voice of Resurgence","")); - cubeCards.add(new CardIdentity("Woolly Thoctar","")); - cubeCards.add(new CardIdentity("Deadbridge Chant","")); - cubeCards.add(new CardIdentity("Detention Sphere","")); - cubeCards.add(new CardIdentity("Mirari's Wake","")); - cubeCards.add(new CardIdentity("Pernicious Deed","")); - cubeCards.add(new CardIdentity("Daxos of Meletis","")); - cubeCards.add(new CardIdentity("Aurelia's Fury","")); - cubeCards.add(new CardIdentity("Bant Charm","")); - cubeCards.add(new CardIdentity("Wear // Tear","")); - cubeCards.add(new CardIdentity("Dimir Charm","")); - cubeCards.add(new CardIdentity("Electrolyze","")); - cubeCards.add(new CardIdentity("Esper Charm","")); - cubeCards.add(new CardIdentity("Izzet Charm","")); - cubeCards.add(new CardIdentity("Lightning Helix","")); - cubeCards.add(new CardIdentity("Prophetic Bolt","")); - cubeCards.add(new CardIdentity("Putrefy","")); - cubeCards.add(new CardIdentity("Sphinx's Revelation","")); - cubeCards.add(new CardIdentity("Terminate","")); - cubeCards.add(new CardIdentity("Undermine","")); - cubeCards.add(new CardIdentity("Domri Rade","")); - cubeCards.add(new CardIdentity("Ajani Vengeant","")); - cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker","")); - cubeCards.add(new CardIdentity("Ral Zarek","")); - cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad","")); - cubeCards.add(new CardIdentity("Blightning","")); - cubeCards.add(new CardIdentity("Dreadbore","")); - cubeCards.add(new CardIdentity("Firespout","")); - cubeCards.add(new CardIdentity("Maelstrom Pulse","")); - cubeCards.add(new CardIdentity("Merciless Eviction","")); - cubeCards.add(new CardIdentity("Supreme Verdict","")); - cubeCards.add(new CardIdentity("Vindicate","")); - cubeCards.add(new CardIdentity("Skullclamp","")); - cubeCards.add(new CardIdentity("Bonesplitter","")); - cubeCards.add(new CardIdentity("Umezawa's Jitte","")); - cubeCards.add(new CardIdentity("Manriki-Gusari","")); - cubeCards.add(new CardIdentity("Sword of Body and Mind","")); - cubeCards.add(new CardIdentity("Sword of Fire and Ice","")); - cubeCards.add(new CardIdentity("Sword of War and Peace","")); - cubeCards.add(new CardIdentity("Batterskull","")); - cubeCards.add(new CardIdentity("Lotus Bloom","")); - cubeCards.add(new CardIdentity("Lion's Eye Diamond","")); - cubeCards.add(new CardIdentity("Chrome Mox","")); - cubeCards.add(new CardIdentity("Mox Diamond","")); - cubeCards.add(new CardIdentity("Mind Stone","")); - cubeCards.add(new CardIdentity("Sphere of the Suns","")); - cubeCards.add(new CardIdentity("Everflowing Chalice","")); - cubeCards.add(new CardIdentity("Grim Monolith","")); - cubeCards.add(new CardIdentity("Pristine Talisman","")); - cubeCards.add(new CardIdentity("Coalition Relic","")); - cubeCards.add(new CardIdentity("Worn Powerstone","")); - cubeCards.add(new CardIdentity("Basalt Monolith","")); - cubeCards.add(new CardIdentity("Thran Dynamo","")); - cubeCards.add(new CardIdentity("Gilded Lotus","")); - cubeCards.add(new CardIdentity("Spellskite","")); - cubeCards.add(new CardIdentity("Epochrasite","")); - cubeCards.add(new CardIdentity("Phyrexian Revoker","")); - cubeCards.add(new CardIdentity("Palladium Myr","")); - cubeCards.add(new CardIdentity("Lodestone Golem","")); - cubeCards.add(new CardIdentity("Etched Oracle","")); - cubeCards.add(new CardIdentity("Molten-Tail Masticore","")); - cubeCards.add(new CardIdentity("Solemn Simulacrum","")); - cubeCards.add(new CardIdentity("Precursor Golem","")); - cubeCards.add(new CardIdentity("Wurmcoil Engine","")); - cubeCards.add(new CardIdentity("Myr Battlesphere","")); - cubeCards.add(new CardIdentity("Sundering Titan","")); - cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth","")); - cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre","")); - cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn","")); - cubeCards.add(new CardIdentity("AEther Vial","")); - cubeCards.add(new CardIdentity("Elixir of Immortality","")); - cubeCards.add(new CardIdentity("Pithing Needle","")); - cubeCards.add(new CardIdentity("Relic of Progenitus","")); - cubeCards.add(new CardIdentity("Cursed Scroll","")); - cubeCards.add(new CardIdentity("Sensei's Divining Top","")); - cubeCards.add(new CardIdentity("Scroll Rack","")); - cubeCards.add(new CardIdentity("Pentad Prism","")); - cubeCards.add(new CardIdentity("Winter Orb","")); - cubeCards.add(new CardIdentity("Shrine of Burning Rage","")); - cubeCards.add(new CardIdentity("Ratchet Bomb","")); - cubeCards.add(new CardIdentity("Oblivion Stone","")); - cubeCards.add(new CardIdentity("Crucible of Worlds","")); - cubeCards.add(new CardIdentity("Vedalken Shackles","")); - cubeCards.add(new CardIdentity("Tangle Wire","")); - cubeCards.add(new CardIdentity("Smokestack","")); - cubeCards.add(new CardIdentity("Nevinyrral's Disk","")); - cubeCards.add(new CardIdentity("Memory Jar","")); - cubeCards.add(new CardIdentity("Karn Liberated","")); - cubeCards.add(new CardIdentity("All Is Dust","")); - cubeCards.add(new CardIdentity("Engineered Explosives","")); - - } -} +/* +* 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.tournament.cubes; + +import mage.game.draft.DraftCube; + +/** + * + * @author LevelX2 + */ +public class MTGOMarchCube2014 extends DraftCube { + + public MTGOMarchCube2014() { + super("MTGO Cube March 2014"); + + cubeCards.add(new CardIdentity("Academy Rector","")); + cubeCards.add(new CardIdentity("Academy Ruins","")); + cubeCards.add(new CardIdentity("Acidic Slime","")); + cubeCards.add(new CardIdentity("Adarkar Wastes","")); + cubeCards.add(new CardIdentity("AEther Vial","")); + cubeCards.add(new CardIdentity("AEtherling","")); + cubeCards.add(new CardIdentity("Ajani Goldmane","")); + cubeCards.add(new CardIdentity("Ajani Vengeant","")); + cubeCards.add(new CardIdentity("Ajani, Caller of the Pride","")); + cubeCards.add(new CardIdentity("Akroma, Angel of Wrath","")); + cubeCards.add(new CardIdentity("Akroma's Vengeance","")); + cubeCards.add(new CardIdentity("All Is Dust","")); + cubeCards.add(new CardIdentity("Ancestral Vision","")); + cubeCards.add(new CardIdentity("Ancient Grudge","")); + cubeCards.add(new CardIdentity("Ancient Tomb","")); + cubeCards.add(new CardIdentity("Angel of Serenity","")); + cubeCards.add(new CardIdentity("Animate Dead","")); + cubeCards.add(new CardIdentity("Arbor Elf","")); + cubeCards.add(new CardIdentity("Arc Trail","")); + cubeCards.add(new CardIdentity("Arcane Sanctum","")); + cubeCards.add(new CardIdentity("Archangel of Thune","")); + cubeCards.add(new CardIdentity("Arid Mesa","")); + cubeCards.add(new CardIdentity("Armageddon","")); + cubeCards.add(new CardIdentity("Ash Zealot","")); + cubeCards.add(new CardIdentity("Attrition","")); + cubeCards.add(new CardIdentity("Augur of Bolas","")); + cubeCards.add(new CardIdentity("Aurelia's Fury","")); + cubeCards.add(new CardIdentity("Avacyn's Pilgrim","")); + cubeCards.add(new CardIdentity("Avalanche Riders","")); + cubeCards.add(new CardIdentity("Aven Mindcensor","")); + cubeCards.add(new CardIdentity("Avenger of Zendikar","")); + cubeCards.add(new CardIdentity("Awakening Zone","")); + cubeCards.add(new CardIdentity("Azorius Chancery","")); + cubeCards.add(new CardIdentity("Bad River","")); + cubeCards.add(new CardIdentity("Badlands","")); + cubeCards.add(new CardIdentity("Balance","")); + cubeCards.add(new CardIdentity("Baleful Strix","")); + cubeCards.add(new CardIdentity("Ball Lightning","")); + cubeCards.add(new CardIdentity("Bane of the Living","")); + cubeCards.add(new CardIdentity("Baneslayer Angel","")); + cubeCards.add(new CardIdentity("Banisher Priest","")); + cubeCards.add(new CardIdentity("Bant Charm","")); + cubeCards.add(new CardIdentity("Barbarian Ring","")); + cubeCards.add(new CardIdentity("Basalt Monolith","")); + cubeCards.add(new CardIdentity("Batterskull","")); + cubeCards.add(new CardIdentity("Battlefield Forge","")); + cubeCards.add(new CardIdentity("Bayou","")); + cubeCards.add(new CardIdentity("Beast Within","")); + cubeCards.add(new CardIdentity("Birds of Paradise","")); + cubeCards.add(new CardIdentity("Birthing Pod","")); + cubeCards.add(new CardIdentity("Bitterblossom","")); + cubeCards.add(new CardIdentity("Black Sun's Zenith","")); + cubeCards.add(new CardIdentity("Blade Splicer","")); + cubeCards.add(new CardIdentity("Blastoderm","")); + cubeCards.add(new CardIdentity("Blightning","")); + cubeCards.add(new CardIdentity("Blistering Firecat","")); + cubeCards.add(new CardIdentity("Blood Baron of Vizkopa","")); + cubeCards.add(new CardIdentity("Blood Crypt","")); + cubeCards.add(new CardIdentity("Bloodbraid Elf","")); + cubeCards.add(new CardIdentity("Bloodghast","")); + cubeCards.add(new CardIdentity("Bloodgift Demon","")); + cubeCards.add(new CardIdentity("Bloodline Keeper","")); + cubeCards.add(new CardIdentity("Bloodstained Mire","")); + cubeCards.add(new CardIdentity("Blue Elemental Blast","")); + cubeCards.add(new CardIdentity("Bogardan Hellkite","")); + cubeCards.add(new CardIdentity("Bone Shredder","")); + cubeCards.add(new CardIdentity("Bonesplitter","")); + cubeCards.add(new CardIdentity("Bonfire of the Damned","")); + cubeCards.add(new CardIdentity("Boon Satyr","")); + cubeCards.add(new CardIdentity("Borderland Ranger","")); + cubeCards.add(new CardIdentity("Boreal Druid","")); + cubeCards.add(new CardIdentity("Boros Garrison","")); + cubeCards.add(new CardIdentity("Braids, Cabal Minion","")); + cubeCards.add(new CardIdentity("Brain Freeze","")); + cubeCards.add(new CardIdentity("Brainstorm","")); + cubeCards.add(new CardIdentity("Breeding Pool","")); + cubeCards.add(new CardIdentity("Brimaz, King of Oreskos","")); + cubeCards.add(new CardIdentity("Brimstone Volley","")); + cubeCards.add(new CardIdentity("Brooding Saurian","")); + cubeCards.add(new CardIdentity("Broodmate Dragon","")); + cubeCards.add(new CardIdentity("Brushland","")); + cubeCards.add(new CardIdentity("Buried Alive","")); + cubeCards.add(new CardIdentity("Burning of Xinye","")); + cubeCards.add(new CardIdentity("Burst Lightning","")); + cubeCards.add(new CardIdentity("Calciderm","")); + cubeCards.add(new CardIdentity("Call of the Herd","")); + cubeCards.add(new CardIdentity("Capsize","")); + cubeCards.add(new CardIdentity("Carnophage","")); + cubeCards.add(new CardIdentity("Cascade Bluffs","")); + cubeCards.add(new CardIdentity("Catastrophe","")); + cubeCards.add(new CardIdentity("Caves of Koilos","")); + cubeCards.add(new CardIdentity("Celestial Colonnade","")); + cubeCards.add(new CardIdentity("Celestial Flare","")); + cubeCards.add(new CardIdentity("Celestial Purge","")); + cubeCards.add(new CardIdentity("Chain Lightning","")); + cubeCards.add(new CardIdentity("Chainer's Edict","")); + cubeCards.add(new CardIdentity("Chandra, Pyromaster","")); + cubeCards.add(new CardIdentity("Chandra, the Firebrand","")); + cubeCards.add(new CardIdentity("Chandra's Phoenix","")); + cubeCards.add(new CardIdentity("Channel","")); + cubeCards.add(new CardIdentity("Chaos Warp","")); + cubeCards.add(new CardIdentity("Char","")); + cubeCards.add(new CardIdentity("Chord of Calling","")); + cubeCards.add(new CardIdentity("Chrome Mox","")); + cubeCards.add(new CardIdentity("City of Brass","")); + cubeCards.add(new CardIdentity("Clifftop Retreat","")); + cubeCards.add(new CardIdentity("Cloudgoat Ranger","")); + cubeCards.add(new CardIdentity("Coalition Relic","")); + cubeCards.add(new CardIdentity("Compulsive Research","")); + cubeCards.add(new CardIdentity("Condemn","")); + cubeCards.add(new CardIdentity("Condescend","")); + cubeCards.add(new CardIdentity("Consecrated Sphinx","")); + cubeCards.add(new CardIdentity("Control Magic","")); + cubeCards.add(new CardIdentity("Coralhelm Commander","")); + cubeCards.add(new CardIdentity("Corrupt","")); + cubeCards.add(new CardIdentity("Counterspell","")); + cubeCards.add(new CardIdentity("Countryside Crusher","")); + cubeCards.add(new CardIdentity("Courser of Kruphix","")); + cubeCards.add(new CardIdentity("Court Hussar","")); + cubeCards.add(new CardIdentity("Creeping Tar Pit","")); + cubeCards.add(new CardIdentity("Crucible of Worlds","")); + cubeCards.add(new CardIdentity("Crumbling Necropolis","")); + cubeCards.add(new CardIdentity("Cryptic Command","")); + cubeCards.add(new CardIdentity("Cultivate","")); + cubeCards.add(new CardIdentity("Cunning Sparkmage","")); + cubeCards.add(new CardIdentity("Cursecatcher","")); + cubeCards.add(new CardIdentity("Cursed Scroll","")); + cubeCards.add(new CardIdentity("Damnation","")); + cubeCards.add(new CardIdentity("Dark Confidant","")); + cubeCards.add(new CardIdentity("Dark Ritual","")); + cubeCards.add(new CardIdentity("Daxos of Meletis","")); + cubeCards.add(new CardIdentity("Day of Judgment","")); + cubeCards.add(new CardIdentity("Daze","")); + cubeCards.add(new CardIdentity("Deadbridge Chant","")); + cubeCards.add(new CardIdentity("Death Cloud","")); + cubeCards.add(new CardIdentity("Decree of Justice","")); + cubeCards.add(new CardIdentity("Deep Analysis","")); + cubeCards.add(new CardIdentity("Delver of Secrets","")); + cubeCards.add(new CardIdentity("Demonic Tutor","")); + cubeCards.add(new CardIdentity("Deranged Hermit","")); + cubeCards.add(new CardIdentity("Descendant of Kiyomaro","")); + cubeCards.add(new CardIdentity("Desperate Ravings","")); + cubeCards.add(new CardIdentity("Detention Sphere","")); + cubeCards.add(new CardIdentity("Devil's Play","")); + cubeCards.add(new CardIdentity("Diabolic Servitude","")); + cubeCards.add(new CardIdentity("Dimir Aqueduct","")); + cubeCards.add(new CardIdentity("Dimir Charm","")); + cubeCards.add(new CardIdentity("Diregraf Ghoul","")); + cubeCards.add(new CardIdentity("Disenchant","")); + cubeCards.add(new CardIdentity("Disfigure","")); + cubeCards.add(new CardIdentity("Dismantling Blow","")); + cubeCards.add(new CardIdentity("Dismember","")); + cubeCards.add(new CardIdentity("Dismiss","")); + cubeCards.add(new CardIdentity("Dissipate","")); + cubeCards.add(new CardIdentity("Domri Rade","")); + cubeCards.add(new CardIdentity("Doom Blade","")); + cubeCards.add(new CardIdentity("Dragonskull Summit","")); + cubeCards.add(new CardIdentity("Dreadbore","")); + cubeCards.add(new CardIdentity("Drowned Catacomb","")); + cubeCards.add(new CardIdentity("Dryad Sophisticate","")); + cubeCards.add(new CardIdentity("Dungeon Geists","")); + cubeCards.add(new CardIdentity("Duress","")); + cubeCards.add(new CardIdentity("Earthquake","")); + cubeCards.add(new CardIdentity("Edric, Spymaster of Trest","")); + cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails","")); + cubeCards.add(new CardIdentity("Electrolyze","")); + cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite","")); + cubeCards.add(new CardIdentity("Elite Vanguard","")); + cubeCards.add(new CardIdentity("Elixir of Immortality","")); + cubeCards.add(new CardIdentity("Elspeth Tirel","")); + cubeCards.add(new CardIdentity("Elspeth, Knight-Errant","")); + cubeCards.add(new CardIdentity("Elspeth, Sun's Champion","")); + cubeCards.add(new CardIdentity("Elves of Deep Shadow","")); + cubeCards.add(new CardIdentity("Elvish Mystic","")); + cubeCards.add(new CardIdentity("Ember Hauler","")); + cubeCards.add(new CardIdentity("Emeria Angel","")); + cubeCards.add(new CardIdentity("Empty the Warrens","")); + cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn","")); + cubeCards.add(new CardIdentity("Enclave Cryptologist","")); + cubeCards.add(new CardIdentity("Engineered Explosives","")); + cubeCards.add(new CardIdentity("Enlightened Tutor","")); + cubeCards.add(new CardIdentity("Entomb","")); + cubeCards.add(new CardIdentity("Entreat the Angels","")); + cubeCards.add(new CardIdentity("Epochrasite","")); + cubeCards.add(new CardIdentity("Erebos, God of the Dead","")); + cubeCards.add(new CardIdentity("Esper Charm","")); + cubeCards.add(new CardIdentity("Essence Scatter","")); + cubeCards.add(new CardIdentity("Etched Oracle","")); + cubeCards.add(new CardIdentity("Eternal Witness","")); + cubeCards.add(new CardIdentity("Eureka","")); + cubeCards.add(new CardIdentity("Everflowing Chalice","")); + cubeCards.add(new CardIdentity("Exalted Angel","")); + cubeCards.add(new CardIdentity("Exhume","")); + cubeCards.add(new CardIdentity("Experiment One","")); + cubeCards.add(new CardIdentity("Exploration","")); + cubeCards.add(new CardIdentity("Explore","")); + cubeCards.add(new CardIdentity("Fact or Fiction","")); + cubeCards.add(new CardIdentity("Faerie Conclave","")); + cubeCards.add(new CardIdentity("Faithless Looting","")); + cubeCards.add(new CardIdentity("Faith's Fetters","")); + cubeCards.add(new CardIdentity("Falkenrath Aristocrat","")); + cubeCards.add(new CardIdentity("Farseek","")); + cubeCards.add(new CardIdentity("Fathom Seer","")); + cubeCards.add(new CardIdentity("Fauna Shaman","")); + cubeCards.add(new CardIdentity("Fertile Ground","")); + cubeCards.add(new CardIdentity("Fetid Heath","")); + cubeCards.add(new CardIdentity("Figure of Destiny","")); + cubeCards.add(new CardIdentity("Fireblast","")); + cubeCards.add(new CardIdentity("Firebolt","")); + cubeCards.add(new CardIdentity("Firedrinker Satyr","")); + cubeCards.add(new CardIdentity("Fire-Lit Thicket","")); + cubeCards.add(new CardIdentity("Firespout","")); + cubeCards.add(new CardIdentity("Firestorm","")); + cubeCards.add(new CardIdentity("Flagstones of Trokair","")); + cubeCards.add(new CardIdentity("Flame Javelin","")); + cubeCards.add(new CardIdentity("Flametongue Kavu","")); + cubeCards.add(new CardIdentity("Flashfreeze","")); + cubeCards.add(new CardIdentity("Fleecemane Lion","")); + cubeCards.add(new CardIdentity("Flickerwisp","")); + cubeCards.add(new CardIdentity("Flinthoof Boar","")); + cubeCards.add(new CardIdentity("Flood Plain","")); + cubeCards.add(new CardIdentity("Flooded Grove","")); + cubeCards.add(new CardIdentity("Flooded Strand","")); + cubeCards.add(new CardIdentity("Forbid","")); + cubeCards.add(new CardIdentity("Force of Will","")); + cubeCards.add(new CardIdentity("Force Spike","")); + cubeCards.add(new CardIdentity("Forked Bolt","")); + cubeCards.add(new CardIdentity("Frantic Search","")); + cubeCards.add(new CardIdentity("Frenzied Goblin","")); + cubeCards.add(new CardIdentity("Frost Titan","")); + cubeCards.add(new CardIdentity("Future Sight","")); + cubeCards.add(new CardIdentity("Fyndhorn Elves","")); + cubeCards.add(new CardIdentity("Gaea's Cradle","")); + cubeCards.add(new CardIdentity("Gamble","")); + cubeCards.add(new CardIdentity("Garruk Relentless","")); + cubeCards.add(new CardIdentity("Garruk Wildspeaker","")); + cubeCards.add(new CardIdentity("Garruk, Primal Hunter","")); + cubeCards.add(new CardIdentity("Gatekeeper of Malakir","")); + cubeCards.add(new CardIdentity("Gathan Raiders","")); + cubeCards.add(new CardIdentity("Geist of Saint Traft","")); + cubeCards.add(new CardIdentity("Genesis Wave","")); + cubeCards.add(new CardIdentity("Genesis","")); + cubeCards.add(new CardIdentity("Genju of the Spires","")); + cubeCards.add(new CardIdentity("Geralf's Messenger","")); + cubeCards.add(new CardIdentity("Ghitu Encampment","")); + cubeCards.add(new CardIdentity("Gideon Jura","")); + cubeCards.add(new CardIdentity("Gideon, Champion of Justice","")); + cubeCards.add(new CardIdentity("Gifts Ungiven","")); + cubeCards.add(new CardIdentity("Gilded Lotus","")); + cubeCards.add(new CardIdentity("Glacial Fortress","")); + cubeCards.add(new CardIdentity("Glen Elendra Archmage","")); + cubeCards.add(new CardIdentity("Go for the Throat","")); + cubeCards.add(new CardIdentity("Goblin Cadets","")); + cubeCards.add(new CardIdentity("Goblin Guide","")); + cubeCards.add(new CardIdentity("Goblin Ruinblaster","")); + cubeCards.add(new CardIdentity("Goblin Welder","")); + cubeCards.add(new CardIdentity("Godless Shrine","")); + cubeCards.add(new CardIdentity("Golgari Rot Farm","")); + cubeCards.add(new CardIdentity("Gore-House Chainwalker","")); + cubeCards.add(new CardIdentity("Grasslands","")); + cubeCards.add(new CardIdentity("Grave Titan","")); + cubeCards.add(new CardIdentity("Graveborn Muse","")); + cubeCards.add(new CardIdentity("Gravecrawler","")); + cubeCards.add(new CardIdentity("Graven Cairns","")); + cubeCards.add(new CardIdentity("Great Sable Stag","")); + cubeCards.add(new CardIdentity("Greater Gargadon","")); + cubeCards.add(new CardIdentity("Green Sun's Zenith","")); + cubeCards.add(new CardIdentity("Grim Lavamancer","")); + cubeCards.add(new CardIdentity("Grim Monolith","")); + cubeCards.add(new CardIdentity("Griselbrand","")); + cubeCards.add(new CardIdentity("Gruul Turf","")); + cubeCards.add(new CardIdentity("Guul Draz Assassin","")); + cubeCards.add(new CardIdentity("Halimar Depths","")); + cubeCards.add(new CardIdentity("Hallowed Burial","")); + cubeCards.add(new CardIdentity("Hallowed Fountain","")); + cubeCards.add(new CardIdentity("Hand of Cruelty","")); + cubeCards.add(new CardIdentity("Hand of Honor","")); + cubeCards.add(new CardIdentity("Harmonize","")); + cubeCards.add(new CardIdentity("Headhunter","")); + cubeCards.add(new CardIdentity("Heartbeat of Spring","")); + cubeCards.add(new CardIdentity("Heliod, God of the Sun","")); + cubeCards.add(new CardIdentity("Hellrider","")); + cubeCards.add(new CardIdentity("Hell's Thunder","")); + cubeCards.add(new CardIdentity("Hellspark Elemental","")); + cubeCards.add(new CardIdentity("Herald of Torment","")); + cubeCards.add(new CardIdentity("Hero of Bladehold","")); + cubeCards.add(new CardIdentity("Hero of Oxid Ridge","")); + cubeCards.add(new CardIdentity("Hero's Downfall","")); + cubeCards.add(new CardIdentity("Hinder","")); + cubeCards.add(new CardIdentity("Hinterland Harbor","")); + cubeCards.add(new CardIdentity("Hokori, Dust Drinker","")); + cubeCards.add(new CardIdentity("Honor of the Pure","")); + cubeCards.add(new CardIdentity("Huntmaster of the Fells","")); + cubeCards.add(new CardIdentity("Hymn to Tourach","")); + cubeCards.add(new CardIdentity("Hypnotic Specter","")); + cubeCards.add(new CardIdentity("Hystrodon","")); + cubeCards.add(new CardIdentity("Imposing Sovereign","")); + cubeCards.add(new CardIdentity("Impulse","")); + cubeCards.add(new CardIdentity("Indrik Stomphowler","")); + cubeCards.add(new CardIdentity("Inferno Titan","")); + cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni","")); + cubeCards.add(new CardIdentity("Inquisition of Kozilek","")); + cubeCards.add(new CardIdentity("Into the Roil","")); + cubeCards.add(new CardIdentity("Iona, Shield of Emeria","")); + cubeCards.add(new CardIdentity("Isamaru, Hound of Konda","")); + cubeCards.add(new CardIdentity("Isolated Chapel","")); + cubeCards.add(new CardIdentity("Izzet Boilerworks","")); + cubeCards.add(new CardIdentity("Izzet Charm","")); + cubeCards.add(new CardIdentity("Jace Beleren","")); + cubeCards.add(new CardIdentity("Jace, Architect of Thought","")); + cubeCards.add(new CardIdentity("Jace, the Mind Sculptor","")); + cubeCards.add(new CardIdentity("Jackal Pup","")); + cubeCards.add(new CardIdentity("Joraga Treespeaker","")); + cubeCards.add(new CardIdentity("Jotun Grunt","")); + cubeCards.add(new CardIdentity("Journey to Nowhere","")); + cubeCards.add(new CardIdentity("Jungle Shrine","")); + cubeCards.add(new CardIdentity("Jushi Apprentice","")); + cubeCards.add(new CardIdentity("Kami of Ancient Law","")); + cubeCards.add(new CardIdentity("Karakas","")); + cubeCards.add(new CardIdentity("Kargan Dragonlord","")); + cubeCards.add(new CardIdentity("Karn Liberated","")); + cubeCards.add(new CardIdentity("Karplusan Forest","")); + cubeCards.add(new CardIdentity("Keiga, the Tide Star","")); + cubeCards.add(new CardIdentity("Keldon Champion","")); + cubeCards.add(new CardIdentity("Keldon Marauders","")); + cubeCards.add(new CardIdentity("Kiora, the Crashing Wave","")); + cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner","")); + cubeCards.add(new CardIdentity("Kird Ape","")); + cubeCards.add(new CardIdentity("Kitchen Finks","")); + cubeCards.add(new CardIdentity("Knight of Glory","")); + cubeCards.add(new CardIdentity("Knight of Infamy","")); + cubeCards.add(new CardIdentity("Kokusho, the Evening Star","")); + cubeCards.add(new CardIdentity("Koth of the Hammer","")); + cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth","")); + cubeCards.add(new CardIdentity("Krosan Grip","")); + cubeCards.add(new CardIdentity("Lake of the Dead","")); + cubeCards.add(new CardIdentity("Land Tax","")); + cubeCards.add(new CardIdentity("Lavaclaw Reaches","")); + cubeCards.add(new CardIdentity("Legacy's Allure","")); + cubeCards.add(new CardIdentity("Leonin Relic-Warder","")); + cubeCards.add(new CardIdentity("Life from the Loam","")); + cubeCards.add(new CardIdentity("Lifebane Zombie","")); + cubeCards.add(new CardIdentity("Lightning Bolt","")); + cubeCards.add(new CardIdentity("Lightning Helix","")); + cubeCards.add(new CardIdentity("Lightning Mauler","")); + cubeCards.add(new CardIdentity("Liliana of the Veil","")); + cubeCards.add(new CardIdentity("Liliana Vess","")); + cubeCards.add(new CardIdentity("Liliana's Reaver","")); + cubeCards.add(new CardIdentity("Lingering Souls","")); + cubeCards.add(new CardIdentity("Linvala, Keeper of Silence","")); + cubeCards.add(new CardIdentity("Lion's Eye Diamond","")); + cubeCards.add(new CardIdentity("Living Death","")); + cubeCards.add(new CardIdentity("Llanowar Elves","")); + cubeCards.add(new CardIdentity("Llanowar Wastes","")); + cubeCards.add(new CardIdentity("Loam Lion","")); + cubeCards.add(new CardIdentity("Lodestone Golem","")); + cubeCards.add(new CardIdentity("Looter il-Kor","")); + cubeCards.add(new CardIdentity("Lotus Bloom","")); + cubeCards.add(new CardIdentity("Lotus Cobra","")); + cubeCards.add(new CardIdentity("Maelstrom Pulse","")); + cubeCards.add(new CardIdentity("Magma Jet","")); + cubeCards.add(new CardIdentity("Magus of the Moon","")); + cubeCards.add(new CardIdentity("Makeshift Mannequin","")); + cubeCards.add(new CardIdentity("Mana Leak","")); + cubeCards.add(new CardIdentity("Mana Tithe","")); + cubeCards.add(new CardIdentity("Man-o'-War","")); + cubeCards.add(new CardIdentity("Manriki-Gusari","")); + cubeCards.add(new CardIdentity("Mark of Mutiny","")); + cubeCards.add(new CardIdentity("Marsh Flats","")); + cubeCards.add(new CardIdentity("Martial Coup","")); + cubeCards.add(new CardIdentity("Master of the Wild Hunt","")); + cubeCards.add(new CardIdentity("Master of Waves","")); + cubeCards.add(new CardIdentity("Maze of Ith","")); + cubeCards.add(new CardIdentity("Meloku the Clouded Mirror","")); + cubeCards.add(new CardIdentity("Memory Jar","")); + cubeCards.add(new CardIdentity("Mentor of the Meek","")); + cubeCards.add(new CardIdentity("Merciless Eviction","")); + cubeCards.add(new CardIdentity("Mesmeric Fiend","")); + cubeCards.add(new CardIdentity("Mind Stone","")); + cubeCards.add(new CardIdentity("Mind's Desire","")); + cubeCards.add(new CardIdentity("Mirari's Wake","")); + cubeCards.add(new CardIdentity("Mirran Crusader","")); + cubeCards.add(new CardIdentity("Mirror Entity","")); + cubeCards.add(new CardIdentity("Miscalculation","")); + cubeCards.add(new CardIdentity("Misdirection","")); + cubeCards.add(new CardIdentity("Mishra's Factory","")); + cubeCards.add(new CardIdentity("Misty Rainforest","")); + cubeCards.add(new CardIdentity("Mizzium Mortars","")); + cubeCards.add(new CardIdentity("Mogg War Marshal","")); + cubeCards.add(new CardIdentity("Mold Shambler","")); + cubeCards.add(new CardIdentity("Molten Rain","")); + cubeCards.add(new CardIdentity("Molten-Tail Masticore","")); + cubeCards.add(new CardIdentity("Momentary Blink","")); + cubeCards.add(new CardIdentity("Moment's Peace","")); + cubeCards.add(new CardIdentity("Mother of Runes","")); + cubeCards.add(new CardIdentity("Mountain Valley","")); + cubeCards.add(new CardIdentity("Mox Diamond","")); + cubeCards.add(new CardIdentity("Mulldrifter","")); + cubeCards.add(new CardIdentity("Murmuring Bosk","")); + cubeCards.add(new CardIdentity("Mutavault","")); + cubeCards.add(new CardIdentity("Myr Battlesphere","")); + cubeCards.add(new CardIdentity("Mystic Gate","")); + cubeCards.add(new CardIdentity("Mystic Snake","")); + cubeCards.add(new CardIdentity("Mystical Tutor","")); + cubeCards.add(new CardIdentity("Nantuko Shade","")); + cubeCards.add(new CardIdentity("Nantuko Vigilante","")); + cubeCards.add(new CardIdentity("Narcolepsy","")); + cubeCards.add(new CardIdentity("Natural Order","")); + cubeCards.add(new CardIdentity("Naturalize","")); + cubeCards.add(new CardIdentity("Nature's Claim","")); + cubeCards.add(new CardIdentity("Nature's Lore","")); + cubeCards.add(new CardIdentity("Nearheath Pilgrim","")); + cubeCards.add(new CardIdentity("Necromancy","")); + cubeCards.add(new CardIdentity("Necropotence","")); + cubeCards.add(new CardIdentity("Negate","")); + cubeCards.add(new CardIdentity("Nekrataal","")); + cubeCards.add(new CardIdentity("Nevinyrral's Disk","")); + cubeCards.add(new CardIdentity("Nezumi Graverobber","")); + cubeCards.add(new CardIdentity("Nezumi Shortfang","")); + cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker","")); + cubeCards.add(new CardIdentity("Night's Whisper","")); + cubeCards.add(new CardIdentity("Nightscape Familiar","")); + cubeCards.add(new CardIdentity("Nightveil Specter","")); + cubeCards.add(new CardIdentity("Noble Hierarch","")); + cubeCards.add(new CardIdentity("Nostalgic Dreams","")); + cubeCards.add(new CardIdentity("Oblivion Ring","")); + cubeCards.add(new CardIdentity("Oblivion Stone","")); + cubeCards.add(new CardIdentity("Obstinate Baloth","")); + cubeCards.add(new CardIdentity("Obzedat, Ghost Council","")); + cubeCards.add(new CardIdentity("Ogre Battledriver","")); + cubeCards.add(new CardIdentity("Ohran Viper","")); + cubeCards.add(new CardIdentity("Old Man of the Sea","")); + cubeCards.add(new CardIdentity("Oona's Prowler","")); + cubeCards.add(new CardIdentity("Opposition","")); + cubeCards.add(new CardIdentity("Oracle of Mul Daya","")); + cubeCards.add(new CardIdentity("Orcish Lumberjack","")); + cubeCards.add(new CardIdentity("Orzhov Basilica","")); + cubeCards.add(new CardIdentity("Oust","")); + cubeCards.add(new CardIdentity("Overgrown Tomb","")); + cubeCards.add(new CardIdentity("Pact of Negation","")); + cubeCards.add(new CardIdentity("Pain Seer","")); + cubeCards.add(new CardIdentity("Palinchron","")); + cubeCards.add(new CardIdentity("Palladium Myr","")); + cubeCards.add(new CardIdentity("Parallax Wave","")); + cubeCards.add(new CardIdentity("Path to Exile","")); + cubeCards.add(new CardIdentity("Pattern of Rebirth","")); + cubeCards.add(new CardIdentity("Pentad Prism","")); + cubeCards.add(new CardIdentity("Pernicious Deed","")); + cubeCards.add(new CardIdentity("Persecute","")); + cubeCards.add(new CardIdentity("Phantasmal Bear","")); + cubeCards.add(new CardIdentity("Phantasmal Image","")); + cubeCards.add(new CardIdentity("Phyrexian Arena","")); + cubeCards.add(new CardIdentity("Phyrexian Metamorph","")); + cubeCards.add(new CardIdentity("Phyrexian Obliterator","")); + cubeCards.add(new CardIdentity("Phyrexian Rager","")); + cubeCards.add(new CardIdentity("Phyrexian Revoker","")); + cubeCards.add(new CardIdentity("Pillage","")); + cubeCards.add(new CardIdentity("Pithing Needle","")); + cubeCards.add(new CardIdentity("Plague Sliver","")); + cubeCards.add(new CardIdentity("Plateau","")); + cubeCards.add(new CardIdentity("Plated Geopede","")); + cubeCards.add(new CardIdentity("Plow Under","")); + cubeCards.add(new CardIdentity("Polluted Delta","")); + cubeCards.add(new CardIdentity("Polukranos, World Eater","")); + cubeCards.add(new CardIdentity("Ponder","")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire","")); + cubeCards.add(new CardIdentity("Precursor Golem","")); + cubeCards.add(new CardIdentity("Preordain","")); + cubeCards.add(new CardIdentity("Price of Progress","")); + cubeCards.add(new CardIdentity("Priest of Urabrask","")); + cubeCards.add(new CardIdentity("Primal Command","")); + cubeCards.add(new CardIdentity("Primeval Titan","")); + cubeCards.add(new CardIdentity("Pristine Angel","")); + cubeCards.add(new CardIdentity("Pristine Talisman","")); + cubeCards.add(new CardIdentity("Progenitus","")); + cubeCards.add(new CardIdentity("Prophetic Bolt","")); + cubeCards.add(new CardIdentity("Purphoros, God of the Forge","")); + cubeCards.add(new CardIdentity("Putrefy","")); + cubeCards.add(new CardIdentity("Putrid Imp","")); + cubeCards.add(new CardIdentity("Putrid Leech","")); + cubeCards.add(new CardIdentity("Pyroclasm","")); + cubeCards.add(new CardIdentity("Qasali Pridemage","")); + cubeCards.add(new CardIdentity("Raging Ravine","")); + cubeCards.add(new CardIdentity("Rakdos Cackler","")); + cubeCards.add(new CardIdentity("Rakdos Carnarium","")); + cubeCards.add(new CardIdentity("Ral Zarek","")); + cubeCards.add(new CardIdentity("Rampant Growth","")); + cubeCards.add(new CardIdentity("Rancor","")); + cubeCards.add(new CardIdentity("Ranger of Eos","")); + cubeCards.add(new CardIdentity("Ratchet Bomb","")); + cubeCards.add(new CardIdentity("Ravages of War","")); + cubeCards.add(new CardIdentity("Ravenous Baboons","")); + cubeCards.add(new CardIdentity("Reanimate","")); + cubeCards.add(new CardIdentity("Reckless Charge","")); + cubeCards.add(new CardIdentity("Recurring Nightmare","")); + cubeCards.add(new CardIdentity("Red Elemental Blast","")); + cubeCards.add(new CardIdentity("Reflecting Pool","")); + cubeCards.add(new CardIdentity("Regrowth","")); + cubeCards.add(new CardIdentity("Relic of Progenitus","")); + cubeCards.add(new CardIdentity("Remand","")); + cubeCards.add(new CardIdentity("Repeal","")); + cubeCards.add(new CardIdentity("Restock","")); + cubeCards.add(new CardIdentity("Restoration Angel","")); + cubeCards.add(new CardIdentity("Reveillark","")); + cubeCards.add(new CardIdentity("Rift Bolt","")); + cubeCards.add(new CardIdentity("Riftwing Cloudskate","")); + cubeCards.add(new CardIdentity("Rishadan Port","")); + cubeCards.add(new CardIdentity("Rocky Tar Pit","")); + cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary","")); + cubeCards.add(new CardIdentity("Rolling Earthquake","")); + cubeCards.add(new CardIdentity("Rootbound Crag","")); + cubeCards.add(new CardIdentity("Rout","")); + cubeCards.add(new CardIdentity("Rude Awakening","")); + cubeCards.add(new CardIdentity("Rugged Prairie","")); + cubeCards.add(new CardIdentity("Sacred Foundry","")); + cubeCards.add(new CardIdentity("Sakashima's Student","")); + cubeCards.add(new CardIdentity("Sakura-Tribe Elder","")); + cubeCards.add(new CardIdentity("Sarcomancy","")); + cubeCards.add(new CardIdentity("Savage Lands","")); + cubeCards.add(new CardIdentity("Savannah Lions","")); + cubeCards.add(new CardIdentity("Savannah","")); + cubeCards.add(new CardIdentity("Scalding Tarn","")); + cubeCards.add(new CardIdentity("Scavenging Ooze","")); + cubeCards.add(new CardIdentity("Scroll Rack","")); + cubeCards.add(new CardIdentity("Scrubland","")); + cubeCards.add(new CardIdentity("Sea Gate Oracle","")); + cubeCards.add(new CardIdentity("Seal of Cleansing","")); + cubeCards.add(new CardIdentity("Search for Tomorrow","")); + cubeCards.add(new CardIdentity("Searing Blaze","")); + cubeCards.add(new CardIdentity("Searing Blood","")); + cubeCards.add(new CardIdentity("Seaside Citadel","")); + cubeCards.add(new CardIdentity("Seething Song","")); + cubeCards.add(new CardIdentity("Selesnya Sanctuary","")); + cubeCards.add(new CardIdentity("Sensei's Divining Top","")); + cubeCards.add(new CardIdentity("Serendib Efreet","")); + cubeCards.add(new CardIdentity("Serum Visions","")); + cubeCards.add(new CardIdentity("Shadowmage Infiltrator","")); + cubeCards.add(new CardIdentity("Shardless Agent","")); + cubeCards.add(new CardIdentity("Shivan Reef","")); + cubeCards.add(new CardIdentity("Show and Tell","")); + cubeCards.add(new CardIdentity("Shrieking Grotesque","")); + cubeCards.add(new CardIdentity("Shriekmaw","")); + cubeCards.add(new CardIdentity("Shrine of Burning Rage","")); + cubeCards.add(new CardIdentity("Siege-Gang Commander","")); + cubeCards.add(new CardIdentity("Sign in Blood","")); + cubeCards.add(new CardIdentity("Silent Specter","")); + cubeCards.add(new CardIdentity("Silver Knight","")); + cubeCards.add(new CardIdentity("Silverblade Paladin","")); + cubeCards.add(new CardIdentity("Simic Growth Chamber","")); + cubeCards.add(new CardIdentity("Simic Sky Swallower","")); + cubeCards.add(new CardIdentity("Sinkhole","")); + cubeCards.add(new CardIdentity("Skeletal Scrying","")); + cubeCards.add(new CardIdentity("Skinrender","")); + cubeCards.add(new CardIdentity("Skullclamp","")); + cubeCards.add(new CardIdentity("Skullcrack","")); + cubeCards.add(new CardIdentity("Slagstorm","")); + cubeCards.add(new CardIdentity("Slaughter Pact","")); + cubeCards.add(new CardIdentity("Smash to Smithereens","")); + cubeCards.add(new CardIdentity("Smokestack","")); + cubeCards.add(new CardIdentity("Smother","")); + cubeCards.add(new CardIdentity("Snapcaster Mage","")); + cubeCards.add(new CardIdentity("Sneak Attack","")); + cubeCards.add(new CardIdentity("Snuff Out","")); + cubeCards.add(new CardIdentity("Soldier of the Pantheon","")); + cubeCards.add(new CardIdentity("Solemn Simulacrum","")); + cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad","")); + cubeCards.add(new CardIdentity("Sorin's Thirst","")); + cubeCards.add(new CardIdentity("Sower of Temptation","")); + cubeCards.add(new CardIdentity("Spear of Heliod","")); + cubeCards.add(new CardIdentity("Spectral Procession","")); + cubeCards.add(new CardIdentity("Spell Pierce","")); + cubeCards.add(new CardIdentity("Spellskite","")); + cubeCards.add(new CardIdentity("Sphere of the Suns","")); + cubeCards.add(new CardIdentity("Sphinx's Revelation","")); + cubeCards.add(new CardIdentity("Spikeshot Elder","")); + cubeCards.add(new CardIdentity("Spinning Darkness","")); + cubeCards.add(new CardIdentity("Spreading Seas","")); + cubeCards.add(new CardIdentity("Steam Augury","")); + cubeCards.add(new CardIdentity("Steam Vents","")); + cubeCards.add(new CardIdentity("Steppe Lynx","")); + cubeCards.add(new CardIdentity("Stirring Wildwood","")); + cubeCards.add(new CardIdentity("Stomping Ground","")); + cubeCards.add(new CardIdentity("Stonecloaker","")); + cubeCards.add(new CardIdentity("Stoneforge Mystic","")); + cubeCards.add(new CardIdentity("Stormblood Berserker","")); + cubeCards.add(new CardIdentity("Strangleroot Geist","")); + cubeCards.add(new CardIdentity("Strip Mine","")); + cubeCards.add(new CardIdentity("Stromkirk Noble","")); + cubeCards.add(new CardIdentity("Student of Warfare","")); + cubeCards.add(new CardIdentity("Stunted Growth","")); + cubeCards.add(new CardIdentity("Stupor","")); + cubeCards.add(new CardIdentity("Sublime Archangel","")); + cubeCards.add(new CardIdentity("Sulfur Falls","")); + cubeCards.add(new CardIdentity("Sulfuric Vortex","")); + cubeCards.add(new CardIdentity("Sulfurous Springs","")); + cubeCards.add(new CardIdentity("Sun Titan","")); + cubeCards.add(new CardIdentity("Sundering Titan","")); + cubeCards.add(new CardIdentity("Sunken Ruins","")); + cubeCards.add(new CardIdentity("Sunpetal Grove","")); + cubeCards.add(new CardIdentity("Supreme Verdict","")); + cubeCards.add(new CardIdentity("Survival of the Fittest","")); + cubeCards.add(new CardIdentity("Sword of Body and Mind","")); + cubeCards.add(new CardIdentity("Sword of Fire and Ice","")); + cubeCards.add(new CardIdentity("Sword of War and Peace","")); + cubeCards.add(new CardIdentity("Swords to Plowshares","")); + cubeCards.add(new CardIdentity("Sylvan Caryatid","")); + cubeCards.add(new CardIdentity("Sylvan Library","")); + cubeCards.add(new CardIdentity("Taiga","")); + cubeCards.add(new CardIdentity("Tainted Pact","")); + cubeCards.add(new CardIdentity("Talrand, Sky Summoner","")); + cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage","")); + cubeCards.add(new CardIdentity("Tangle Wire","")); + cubeCards.add(new CardIdentity("Tarmogoyf","")); + cubeCards.add(new CardIdentity("Taurean Mauler","")); + cubeCards.add(new CardIdentity("Tectonic Edge","")); + cubeCards.add(new CardIdentity("Teetering Peaks","")); + cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir","")); + cubeCards.add(new CardIdentity("Temple Garden","")); + cubeCards.add(new CardIdentity("Tendrils of Agony","")); + cubeCards.add(new CardIdentity("Tendrils of Corruption","")); + cubeCards.add(new CardIdentity("Terastodon","")); + cubeCards.add(new CardIdentity("Terminate","")); + cubeCards.add(new CardIdentity("Terminus","")); + cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben","")); + cubeCards.add(new CardIdentity("Thassa, God of the Sea","")); + cubeCards.add(new CardIdentity("Thawing Glaciers","")); + cubeCards.add(new CardIdentity("Thelonite Hermit","")); + cubeCards.add(new CardIdentity("Thieving Magpie","")); + cubeCards.add(new CardIdentity("Thirst for Knowledge","")); + cubeCards.add(new CardIdentity("Thornscape Battlemage","")); + cubeCards.add(new CardIdentity("Thoughtseize","")); + cubeCards.add(new CardIdentity("Thragtusk","")); + cubeCards.add(new CardIdentity("Thran Dynamo","")); + cubeCards.add(new CardIdentity("Thrun, the Last Troll","")); + cubeCards.add(new CardIdentity("Thunderblust","")); + cubeCards.add(new CardIdentity("Thundermaw Hellkite","")); + cubeCards.add(new CardIdentity("Thunderscape Battlemage","")); + cubeCards.add(new CardIdentity("Tidings","")); + cubeCards.add(new CardIdentity("Time Spiral","")); + cubeCards.add(new CardIdentity("Time Warp","")); + cubeCards.add(new CardIdentity("Tin Street Hooligan","")); + cubeCards.add(new CardIdentity("Tinker","")); + cubeCards.add(new CardIdentity("Tombstalker","")); + cubeCards.add(new CardIdentity("Tooth and Nail","")); + cubeCards.add(new CardIdentity("Torch Fiend","")); + cubeCards.add(new CardIdentity("Tradewind Rider","")); + cubeCards.add(new CardIdentity("Tragic Slip","")); + cubeCards.add(new CardIdentity("Treachery","")); + cubeCards.add(new CardIdentity("Treetop Village","")); + cubeCards.add(new CardIdentity("Trinket Mage","")); + cubeCards.add(new CardIdentity("Troll Ascetic","")); + cubeCards.add(new CardIdentity("Tropical Island","")); + cubeCards.add(new CardIdentity("Tundra","")); + cubeCards.add(new CardIdentity("Turnabout","")); + cubeCards.add(new CardIdentity("Twilight Mire","")); + cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre","")); + cubeCards.add(new CardIdentity("Ultimate Price","")); + cubeCards.add(new CardIdentity("Ulvenwald Tracker","")); + cubeCards.add(new CardIdentity("Umezawa's Jitte","")); + cubeCards.add(new CardIdentity("Unburial Rites","")); + cubeCards.add(new CardIdentity("Underground River","")); + cubeCards.add(new CardIdentity("Underground Sea","")); + cubeCards.add(new CardIdentity("Undermine","")); + cubeCards.add(new CardIdentity("Upheaval","")); + cubeCards.add(new CardIdentity("Urabrask the Hidden","")); + cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth","")); + cubeCards.add(new CardIdentity("Vampire Hexmage","")); + cubeCards.add(new CardIdentity("Vampire Lacerator","")); + cubeCards.add(new CardIdentity("Vampire Nighthawk","")); + cubeCards.add(new CardIdentity("Vampiric Tutor","")); + cubeCards.add(new CardIdentity("Vedalken Shackles","")); + cubeCards.add(new CardIdentity("Vendilion Clique","")); + cubeCards.add(new CardIdentity("Vengevine","")); + cubeCards.add(new CardIdentity("Venser, Shaper Savant","")); + cubeCards.add(new CardIdentity("Verdant Catacombs","")); + cubeCards.add(new CardIdentity("Vesuvan Shapeshifter","")); + cubeCards.add(new CardIdentity("Vindicate","")); + cubeCards.add(new CardIdentity("Vines of Vastwood","")); + cubeCards.add(new CardIdentity("Visara the Dreadful","")); + cubeCards.add(new CardIdentity("Voice of Resurgence","")); + cubeCards.add(new CardIdentity("Voidmage Prodigy","")); + cubeCards.add(new CardIdentity("Volcanic Fallout","")); + cubeCards.add(new CardIdentity("Volcanic Island","")); + cubeCards.add(new CardIdentity("Volrath's Stronghold","")); + cubeCards.add(new CardIdentity("Wake Thrasher","")); + cubeCards.add(new CardIdentity("Wall of Blossoms","")); + cubeCards.add(new CardIdentity("Wall of Omens","")); + cubeCards.add(new CardIdentity("Wall of Reverence","")); + cubeCards.add(new CardIdentity("Wall of Roots","")); + cubeCards.add(new CardIdentity("Wasteland","")); + cubeCards.add(new CardIdentity("Watery Grave","")); + cubeCards.add(new CardIdentity("Wear // Tear","")); + cubeCards.add(new CardIdentity("Weathered Wayfarer","")); + cubeCards.add(new CardIdentity("Wheel of Fortune","")); + cubeCards.add(new CardIdentity("Whipcorder","")); + cubeCards.add(new CardIdentity("Wickerbough Elder","")); + cubeCards.add(new CardIdentity("Wild Nacatl","")); + cubeCards.add(new CardIdentity("Wildfire","")); + cubeCards.add(new CardIdentity("Willbender","")); + cubeCards.add(new CardIdentity("Windbrisk Heights","")); + cubeCards.add(new CardIdentity("Windswept Heath","")); + cubeCards.add(new CardIdentity("Winter Orb","")); + cubeCards.add(new CardIdentity("Wolfir Silverheart","")); + cubeCards.add(new CardIdentity("Wood Elves","")); + cubeCards.add(new CardIdentity("Wooded Bastion","")); + cubeCards.add(new CardIdentity("Wooded Foothills","")); + cubeCards.add(new CardIdentity("Woodfall Primus","")); + cubeCards.add(new CardIdentity("Woodland Cemetery","")); + cubeCards.add(new CardIdentity("Woolly Thoctar","")); + cubeCards.add(new CardIdentity("Worn Powerstone","")); + cubeCards.add(new CardIdentity("Wrath of God","")); + cubeCards.add(new CardIdentity("Wrench Mind","")); + cubeCards.add(new CardIdentity("Wurmcoil Engine","")); + cubeCards.add(new CardIdentity("Xenagos, the Reveler","")); + cubeCards.add(new CardIdentity("Yavimaya Coast","")); + cubeCards.add(new CardIdentity("Yavimaya Elder","")); + cubeCards.add(new CardIdentity("Yawgmoth's Will","")); + cubeCards.add(new CardIdentity("Yosei, the Morning Star","")); + cubeCards.add(new CardIdentity("Zealous Conscripts","")); + cubeCards.add(new CardIdentity("Zo-Zu the Punisher","")); + } +} diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MonoBlueCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MonoBlueCube.java index 6f83bc066e3..538193858a5 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MonoBlueCube.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MonoBlueCube.java @@ -1,407 +1,406 @@ -/* -* 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.tournament.cubes; - -import mage.game.draft.DraftCube; -import mage.game.draft.DraftCube.CardIdentity; - -/** - * Cube taken from - * http://www.mtgsalvation.com/articles/29806-close-to-the-edge-mono-blue-cube-overview - * - * @author LevelX2 - */ -public class MonoBlueCube extends DraftCube { - - public MonoBlueCube() { - super("Mono Blue Cube"); - cubeCards.add(new CardIdentity("All Is Dust","")); - cubeCards.add(new CardIdentity("Amnesia","")); - cubeCards.add(new CardIdentity("Ancestral Vision","")); - cubeCards.add(new CardIdentity("Braingeyser","")); - cubeCards.add(new CardIdentity("Call to Mind","")); - cubeCards.add(new CardIdentity("Compulsive Research","")); - cubeCards.add(new CardIdentity("Deep Analysis","")); - cubeCards.add(new CardIdentity("Devastation Tide","")); - cubeCards.add(new CardIdentity("Enter the Infinite","")); - cubeCards.add(new CardIdentity("Fabricate","")); - cubeCards.add(new CardIdentity("Gitaxian Probe","")); - cubeCards.add(new CardIdentity("Ideas Unbound","")); - cubeCards.add(new CardIdentity("Increasing Confusion","")); - cubeCards.add(new CardIdentity("Legerdemain","")); - cubeCards.add(new CardIdentity("Memory Sluice","")); - cubeCards.add(new CardIdentity("Merchant Scroll","")); - cubeCards.add(new CardIdentity("Mind Sculpt","")); - cubeCards.add(new CardIdentity("Mind's Desire","")); - cubeCards.add(new CardIdentity("Personal Tutor","")); - cubeCards.add(new CardIdentity("Ponder","")); - cubeCards.add(new CardIdentity("Portent","")); - cubeCards.add(new CardIdentity("Preordain","")); - cubeCards.add(new CardIdentity("Reconstruction","")); - cubeCards.add(new CardIdentity("Serum Visions","")); - cubeCards.add(new CardIdentity("Shape Anew","")); - cubeCards.add(new CardIdentity("Show and Tell","")); - cubeCards.add(new CardIdentity("Sleight of Hand","")); - cubeCards.add(new CardIdentity("Temporal Fissure","")); - cubeCards.add(new CardIdentity("Time Spiral","")); - cubeCards.add(new CardIdentity("Time Stretch","")); - cubeCards.add(new CardIdentity("Time Walk","")); - cubeCards.add(new CardIdentity("Timetwister","")); - cubeCards.add(new CardIdentity("Tinker","")); - cubeCards.add(new CardIdentity("Tome Scour","")); - cubeCards.add(new CardIdentity("Undo","")); - cubeCards.add(new CardIdentity("Upheaval","")); - cubeCards.add(new CardIdentity("Windfall","")); - cubeCards.add(new CardIdentity("Adaptive Automaton","")); - cubeCards.add(new CardIdentity("Aeon Chronicler","")); - cubeCards.add(new CardIdentity("AEtherling","")); - cubeCards.add(new CardIdentity("Ambassador Laquatus","")); - cubeCards.add(new CardIdentity("Arcanis the Omnipotent","")); - cubeCards.add(new CardIdentity("Archaeomancer","")); - cubeCards.add(new CardIdentity("Augur of Bolas","")); - cubeCards.add(new CardIdentity("Blightsteel Colossus","")); - cubeCards.add(new CardIdentity("Braids, Conjurer Adept","")); - cubeCards.add(new CardIdentity("Briarberry Cohort","")); - cubeCards.add(new CardIdentity("Chancellor of the Spires","")); - cubeCards.add(new CardIdentity("Chronomaton","")); - cubeCards.add(new CardIdentity("Cloud of Faeries","")); - cubeCards.add(new CardIdentity("Cloudfin Raptor","")); - cubeCards.add(new CardIdentity("Cold-Eyed Selkie","")); - cubeCards.add(new CardIdentity("Conundrum Sphinx","")); - cubeCards.add(new CardIdentity("Copper Gnomes","")); - cubeCards.add(new CardIdentity("Coralhelm Commander","")); - cubeCards.add(new CardIdentity("Cursecatcher","")); - cubeCards.add(new CardIdentity("Darksteel Colossus","")); - cubeCards.add(new CardIdentity("Delver of Secrets Flip","")); - cubeCards.add(new CardIdentity("Dewdrop Spy","")); - cubeCards.add(new CardIdentity("Draining Whelk","")); - cubeCards.add(new CardIdentity("Drift of Phantasms","")); - cubeCards.add(new CardIdentity("Drowner Initiate","")); - cubeCards.add(new CardIdentity("Dungeon Geists","")); - cubeCards.add(new CardIdentity("Duplicant","")); - cubeCards.add(new CardIdentity("Elite Arcanist","")); - cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn","")); - cubeCards.add(new CardIdentity("Enclave Cryptologist","")); - cubeCards.add(new CardIdentity("Errant Ephemeron","")); - cubeCards.add(new CardIdentity("Ertai, Wizard Adept","")); - cubeCards.add(new CardIdentity("Faerie Harbinger","")); - cubeCards.add(new CardIdentity("Frost Titan","")); - cubeCards.add(new CardIdentity("Geralf's Mindcrusher","")); - cubeCards.add(new CardIdentity("Glen Elendra Archmage","")); - cubeCards.add(new CardIdentity("Gomazoa","")); - cubeCards.add(new CardIdentity("Grand Architect","")); - cubeCards.add(new CardIdentity("Hammerhead Shark","")); - cubeCards.add(new CardIdentity("Hedron Crab","")); - cubeCards.add(new CardIdentity("Horizon Drake","")); - cubeCards.add(new CardIdentity("Illusionary Servant","")); - cubeCards.add(new CardIdentity("Illusory Angel","")); - cubeCards.add(new CardIdentity("Inkfathom Infiltrator","")); - cubeCards.add(new CardIdentity("Inkwell Leviathan","")); - cubeCards.add(new CardIdentity("Inspired Sprite","")); - cubeCards.add(new CardIdentity("Jace's Archivist","")); - cubeCards.add(new CardIdentity("Jushi Apprentice","")); - cubeCards.add(new CardIdentity("Kederekt Leviathan","")); - cubeCards.add(new CardIdentity("Kuldotha Forgemaster","")); - cubeCards.add(new CardIdentity("Laboratory Maniac","")); - cubeCards.add(new CardIdentity("Lighthouse Chronologist","")); - cubeCards.add(new CardIdentity("Llawan, Cephalid Empress","")); - cubeCards.add(new CardIdentity("Looter il-Kor","")); - cubeCards.add(new CardIdentity("Lord of Atlantis","")); - cubeCards.add(new CardIdentity("Lullmage Mentor","")); - cubeCards.add(new CardIdentity("Master of the Pearl Trident","")); - cubeCards.add(new CardIdentity("Master of Waves","")); - cubeCards.add(new CardIdentity("Master Thief","")); - cubeCards.add(new CardIdentity("Master Transmuter","")); - cubeCards.add(new CardIdentity("Meloku the Clouded Mirror","")); - cubeCards.add(new CardIdentity("Merfolk Looter","")); - cubeCards.add(new CardIdentity("Merfolk Mesmerist","")); - cubeCards.add(new CardIdentity("Merfolk Sovereign","")); - cubeCards.add(new CardIdentity("Merfolk Spy","")); - cubeCards.add(new CardIdentity("Merrow Reejerey","")); - cubeCards.add(new CardIdentity("Metalworker","")); - cubeCards.add(new CardIdentity("Minister of Impediments","")); - cubeCards.add(new CardIdentity("Mothdust Changeling","")); - cubeCards.add(new CardIdentity("Mulldrifter","")); - cubeCards.add(new CardIdentity("Myr Battlesphere","")); - cubeCards.add(new CardIdentity("Nightveil Specter","")); - cubeCards.add(new CardIdentity("Nimbus Naiad","")); - cubeCards.add(new CardIdentity("Ninja of the Deep Hours","")); - cubeCards.add(new CardIdentity("Oona, Queen of the Fae","")); - cubeCards.add(new CardIdentity("Overtaker","")); - cubeCards.add(new CardIdentity("Painter's Servant","")); - cubeCards.add(new CardIdentity("Palinchron","")); - cubeCards.add(new CardIdentity("Patron Wizard","")); - cubeCards.add(new CardIdentity("Pestermite","")); - cubeCards.add(new CardIdentity("Phantasmal Bear","")); - cubeCards.add(new CardIdentity("Phantasmal Dragon","")); - cubeCards.add(new CardIdentity("Phantasmal Image","")); - cubeCards.add(new CardIdentity("Phyrexian Ingester","")); - cubeCards.add(new CardIdentity("Phyrexian Metamorph","")); - cubeCards.add(new CardIdentity("Platinum Angel","")); - cubeCards.add(new CardIdentity("Plumeveil","")); - cubeCards.add(new CardIdentity("Precursor Golem","")); - cubeCards.add(new CardIdentity("Prognostic Sphinx","")); - cubeCards.add(new CardIdentity("Puresight Merrow","")); - cubeCards.add(new CardIdentity("Raven Guild Master","")); - cubeCards.add(new CardIdentity("Riftwing Cloudskate","")); - cubeCards.add(new CardIdentity("Riptide Director","")); - cubeCards.add(new CardIdentity("Sage of Fables","")); - cubeCards.add(new CardIdentity("Sand Squid","")); - cubeCards.add(new CardIdentity("Sea Drake","")); - cubeCards.add(new CardIdentity("Sea Gate Oracle","")); - cubeCards.add(new CardIdentity("Sea Scryer","")); - cubeCards.add(new CardIdentity("Seasinger","")); - cubeCards.add(new CardIdentity("Serendib Efreet","")); - cubeCards.add(new CardIdentity("Shapesharer","")); - cubeCards.add(new CardIdentity("Signal Pest","")); - cubeCards.add(new CardIdentity("Silvergill Adept","")); - cubeCards.add(new CardIdentity("Skywatcher Adept","")); - cubeCards.add(new CardIdentity("Snapcaster Mage","")); - cubeCards.add(new CardIdentity("Sower of Temptation","")); - cubeCards.add(new CardIdentity("Spellstutter Sprite","")); - cubeCards.add(new CardIdentity("Spiketail Drakeling","")); - cubeCards.add(new CardIdentity("Spire Golem","")); - cubeCards.add(new CardIdentity("Sprite Noble","")); - cubeCards.add(new CardIdentity("Steel Hellkite","")); - cubeCards.add(new CardIdentity("Stern Mentor","")); - cubeCards.add(new CardIdentity("Stonybrook Banneret","")); - cubeCards.add(new CardIdentity("Sygg, River Cutthroat","")); - cubeCards.add(new CardIdentity("Talrand, Sky Summoner","")); - cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir","")); - cubeCards.add(new CardIdentity("Temporal Adept","")); - cubeCards.add(new CardIdentity("Thada Adel, Acquisitor","")); - cubeCards.add(new CardIdentity("Thalakos Deceiver","")); - cubeCards.add(new CardIdentity("Thassa, God of the Sea","")); - cubeCards.add(new CardIdentity("Thistledown Liege","")); - cubeCards.add(new CardIdentity("True-Name Nemesis","")); - cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre","")); - cubeCards.add(new CardIdentity("Vaporkin","")); - cubeCards.add(new CardIdentity("Vedalken AEthermage","")); - cubeCards.add(new CardIdentity("Vendilion Clique","")); - cubeCards.add(new CardIdentity("Venser, Shaper Savant","")); - cubeCards.add(new CardIdentity("Vesuvan Shapeshifter","")); - cubeCards.add(new CardIdentity("Vexing Sphinx","")); - cubeCards.add(new CardIdentity("Vodalian Knights","")); - cubeCards.add(new CardIdentity("Void Stalker","")); - cubeCards.add(new CardIdentity("Voidmage Prodigy","")); - cubeCards.add(new CardIdentity("Wake Thrasher","")); - cubeCards.add(new CardIdentity("Wasp Lancer","")); - cubeCards.add(new CardIdentity("Waterfront Bouncer","")); - cubeCards.add(new CardIdentity("Welkin Tern","")); - cubeCards.add(new CardIdentity("Wurmcoil Engine","")); - cubeCards.add(new CardIdentity("Jace, Architect of Thought","")); - cubeCards.add(new CardIdentity("Jace Beleren","")); - cubeCards.add(new CardIdentity("Jace, Memory Adept","")); - cubeCards.add(new CardIdentity("Jace, the Mind Sculptor","")); - cubeCards.add(new CardIdentity("Karn Liberated","")); - cubeCards.add(new CardIdentity("Ancestral Recall","")); - cubeCards.add(new CardIdentity("Annul","")); - cubeCards.add(new CardIdentity("Archive Trap","")); - cubeCards.add(new CardIdentity("Blue Sun's Zenith","")); - cubeCards.add(new CardIdentity("Boomerang","")); - cubeCards.add(new CardIdentity("Brain Freeze","")); - cubeCards.add(new CardIdentity("Brainstorm","")); - cubeCards.add(new CardIdentity("Broken Ambitions","")); - cubeCards.add(new CardIdentity("Capsize","")); - cubeCards.add(new CardIdentity("Careful Consideration","")); - cubeCards.add(new CardIdentity("Commandeer","")); - cubeCards.add(new CardIdentity("Complicate","")); - cubeCards.add(new CardIdentity("Condescend","")); - cubeCards.add(new CardIdentity("Counterspell","")); - cubeCards.add(new CardIdentity("Crippling Chill","")); - cubeCards.add(new CardIdentity("Cryptic Command","")); - cubeCards.add(new CardIdentity("Cyclonic Rift","")); - cubeCards.add(new CardIdentity("Daze","")); - cubeCards.add(new CardIdentity("Delay","")); - cubeCards.add(new CardIdentity("Deprive","")); - cubeCards.add(new CardIdentity("Dismiss","")); - cubeCards.add(new CardIdentity("Dispel","")); - cubeCards.add(new CardIdentity("Disrupt","")); - cubeCards.add(new CardIdentity("Dissipate","")); - cubeCards.add(new CardIdentity("Dissolve","")); - cubeCards.add(new CardIdentity("Dizzy Spell","")); - cubeCards.add(new CardIdentity("Dream Twist","")); - cubeCards.add(new CardIdentity("Evacuation","")); - cubeCards.add(new CardIdentity("Exclude","")); - cubeCards.add(new CardIdentity("Fact or Fiction","")); - cubeCards.add(new CardIdentity("Flash of Insight","")); - cubeCards.add(new CardIdentity("Flusterstorm","")); - cubeCards.add(new CardIdentity("Foil","")); - cubeCards.add(new CardIdentity("Forbid","")); - cubeCards.add(new CardIdentity("Force of Will","")); - cubeCards.add(new CardIdentity("Force Spike","")); - cubeCards.add(new CardIdentity("Frantic Search","")); - cubeCards.add(new CardIdentity("Gainsay","")); - cubeCards.add(new CardIdentity("Gush","")); - cubeCards.add(new CardIdentity("High Tide","")); - cubeCards.add(new CardIdentity("Impulse","")); - cubeCards.add(new CardIdentity("Into the Roil","")); - cubeCards.add(new CardIdentity("Logic Knot","")); - cubeCards.add(new CardIdentity("Long-Term Plans","")); - cubeCards.add(new CardIdentity("Mana Drain","")); - cubeCards.add(new CardIdentity("Mana Leak","")); - cubeCards.add(new CardIdentity("Meditate","")); - cubeCards.add(new CardIdentity("Mental Misstep","")); - cubeCards.add(new CardIdentity("Miscalculation","")); - cubeCards.add(new CardIdentity("Misdirection","")); - cubeCards.add(new CardIdentity("Muddle the Mixture","")); - cubeCards.add(new CardIdentity("Mystical Tutor","")); - cubeCards.add(new CardIdentity("Negate","")); - cubeCards.add(new CardIdentity("Opportunity","")); - cubeCards.add(new CardIdentity("Pact of Negation","")); - cubeCards.add(new CardIdentity("Peek","")); - cubeCards.add(new CardIdentity("Peer Through Depths","")); - cubeCards.add(new CardIdentity("Piracy Charm","")); - cubeCards.add(new CardIdentity("Pongify","")); - cubeCards.add(new CardIdentity("Psionic Blast","")); - cubeCards.add(new CardIdentity("Psychic Barrier","")); - cubeCards.add(new CardIdentity("Rapid Hybridization","")); - cubeCards.add(new CardIdentity("Ray of Command","")); - cubeCards.add(new CardIdentity("Remand","")); - cubeCards.add(new CardIdentity("Repeal","")); - cubeCards.add(new CardIdentity("Rewind","")); - cubeCards.add(new CardIdentity("Spell Pierce","")); - cubeCards.add(new CardIdentity("Spell Snare","")); - cubeCards.add(new CardIdentity("Steel Sabotage","")); - cubeCards.add(new CardIdentity("Stroke of Genius","")); - cubeCards.add(new CardIdentity("Swan Song","")); - cubeCards.add(new CardIdentity("Telling Time","")); - cubeCards.add(new CardIdentity("Think Twice","")); - cubeCards.add(new CardIdentity("Thought Scour","")); - cubeCards.add(new CardIdentity("Thwart","")); - cubeCards.add(new CardIdentity("Turnabout","")); - cubeCards.add(new CardIdentity("Vapor Snag","")); - cubeCards.add(new CardIdentity("Vision Charm","")); - cubeCards.add(new CardIdentity("Visions of Beyond","")); - cubeCards.add(new CardIdentity("Wheel and Deal","")); - cubeCards.add(new CardIdentity("Withdraw","")); - cubeCards.add(new CardIdentity("Academy Ruins","")); - cubeCards.add(new CardIdentity("Ancient Tomb","")); - cubeCards.add(new CardIdentity("Blinkmoth Nexus","")); - cubeCards.add(new CardIdentity("Buried Ruin","")); - cubeCards.add(new CardIdentity("Cavern of Souls","")); - cubeCards.add(new CardIdentity("Contested War Zone","")); - cubeCards.add(new CardIdentity("Desert","")); - cubeCards.add(new CardIdentity("Faerie Conclave","")); - cubeCards.add(new CardIdentity("Inkmoth Nexus","")); - cubeCards.add(new CardIdentity("Library of Alexandria","")); - cubeCards.add(new CardIdentity("Lonely Sandbar","")); - cubeCards.add(new CardIdentity("Maze of Ith","")); - cubeCards.add(new CardIdentity("Mishra's Factory","")); - cubeCards.add(new CardIdentity("Mishra's Workshop","")); - cubeCards.add(new CardIdentity("Mutavault","")); - cubeCards.add(new CardIdentity("Quicksand","")); - cubeCards.add(new CardIdentity("Rath's Edge","")); - cubeCards.add(new CardIdentity("Reliquary Tower","")); - cubeCards.add(new CardIdentity("Remote Isle","")); - cubeCards.add(new CardIdentity("Riptide Laboratory","")); - cubeCards.add(new CardIdentity("Rishadan Port","")); - cubeCards.add(new CardIdentity("Shelldock Isle","")); - cubeCards.add(new CardIdentity("Strip Mine","")); - cubeCards.add(new CardIdentity("The Tabernacle at Pendrell Vale","")); - cubeCards.add(new CardIdentity("Tolaria West","")); - cubeCards.add(new CardIdentity("Tolarian Academy","")); - cubeCards.add(new CardIdentity("Tower of the Magistrate","")); - cubeCards.add(new CardIdentity("Bident of Thassa","")); - cubeCards.add(new CardIdentity("Claustrophobia","")); - cubeCards.add(new CardIdentity("Control Magic","")); - cubeCards.add(new CardIdentity("Eye of the Storm","")); - cubeCards.add(new CardIdentity("Leyline of Anticipation","")); - cubeCards.add(new CardIdentity("Meishin, the Mind Cage","")); - cubeCards.add(new CardIdentity("Mind Over Matter","")); - cubeCards.add(new CardIdentity("Omniscience","")); - cubeCards.add(new CardIdentity("Power Artifact","")); - cubeCards.add(new CardIdentity("Propaganda","")); - cubeCards.add(new CardIdentity("Sensory Deprivation","")); - cubeCards.add(new CardIdentity("Standstill","")); - cubeCards.add(new CardIdentity("Take Possession","")); - cubeCards.add(new CardIdentity("Treachery","")); - cubeCards.add(new CardIdentity("Veiled Serpent","")); - cubeCards.add(new CardIdentity("Aeolipile","")); - cubeCards.add(new CardIdentity("AEther Spellbomb","")); - cubeCards.add(new CardIdentity("AEther Vial","")); - cubeCards.add(new CardIdentity("Ankh of Mishra","")); - cubeCards.add(new CardIdentity("Basalt Monolith","")); - cubeCards.add(new CardIdentity("Black Lotus","")); - cubeCards.add(new CardIdentity("Black Vise","")); - cubeCards.add(new CardIdentity("Bonesplitter","")); - cubeCards.add(new CardIdentity("Brittle Effigy","")); - cubeCards.add(new CardIdentity("Caged Sun","")); - cubeCards.add(new CardIdentity("Candelabra of Tawnos","")); - cubeCards.add(new CardIdentity("Chalice of the Void","")); - cubeCards.add(new CardIdentity("Coalition Relic","")); - cubeCards.add(new CardIdentity("Coat of Arms","")); - cubeCards.add(new CardIdentity("Codex Shredder","")); - cubeCards.add(new CardIdentity("Elixir of Immortality","")); - cubeCards.add(new CardIdentity("Extraplanar Lens","")); - cubeCards.add(new CardIdentity("Gilded Lotus","")); - cubeCards.add(new CardIdentity("Grafted Wargear","")); - cubeCards.add(new CardIdentity("Grim Monolith","")); - cubeCards.add(new CardIdentity("Grindclock","")); - cubeCards.add(new CardIdentity("Grindstone","")); - cubeCards.add(new CardIdentity("Howling Mine","")); - cubeCards.add(new CardIdentity("Isochron Scepter","")); - cubeCards.add(new CardIdentity("Keening Stone","")); - cubeCards.add(new CardIdentity("Knowledge Pool","")); - cubeCards.add(new CardIdentity("Lotus Bloom","")); - cubeCards.add(new CardIdentity("Mana Crypt","")); - cubeCards.add(new CardIdentity("Mana Vault","")); - cubeCards.add(new CardIdentity("Memory Jar","")); - cubeCards.add(new CardIdentity("Mind Stone","")); - cubeCards.add(new CardIdentity("Mindslaver","")); - cubeCards.add(new CardIdentity("Mishra's Helix","")); - cubeCards.add(new CardIdentity("Mortarpod","")); - cubeCards.add(new CardIdentity("Mox Diamond","")); - cubeCards.add(new CardIdentity("Mox Sapphire","")); - cubeCards.add(new CardIdentity("Nevinyrral's Disk","")); - cubeCards.add(new CardIdentity("Oblivion Stone","")); - cubeCards.add(new CardIdentity("Powder Keg","")); - cubeCards.add(new CardIdentity("Ratchet Bomb","")); - cubeCards.add(new CardIdentity("Runechanter's Pike","")); - cubeCards.add(new CardIdentity("Sands of Delirium","")); - cubeCards.add(new CardIdentity("Sapphire Medallion","")); - cubeCards.add(new CardIdentity("Sensei's Divining Top","")); - cubeCards.add(new CardIdentity("Skullclamp","")); - cubeCards.add(new CardIdentity("Smokestack","")); - cubeCards.add(new CardIdentity("Sol Ring","")); - cubeCards.add(new CardIdentity("Strata Scythe","")); - cubeCards.add(new CardIdentity("Sword of Body and Mind","")); - cubeCards.add(new CardIdentity("Sword of Fire and Ice","")); - cubeCards.add(new CardIdentity("Tangle Wire","")); - cubeCards.add(new CardIdentity("Thran Dynamo","")); - cubeCards.add(new CardIdentity("Time Vault","")); - cubeCards.add(new CardIdentity("Umezawa's Jitte","")); - cubeCards.add(new CardIdentity("Vedalken Shackles","")); - cubeCards.add(new CardIdentity("Voltaic Key","")); - cubeCards.add(new CardIdentity("Winter Orb","")); - cubeCards.add(new CardIdentity("Worn Powerstone","")); - - } -} - +/* +* 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.tournament.cubes; + +import mage.game.draft.DraftCube; +import mage.game.draft.DraftCube.CardIdentity; + +/** + * Cube taken from + * http://www.mtgsalvation.com/articles/29806-close-to-the-edge-mono-blue-cube-overview + * + * @author LevelX2 + */ +public class MonoBlueCube extends DraftCube { + + public MonoBlueCube() { + super("Mono Blue Cube"); + cubeCards.add(new CardIdentity("Academy Ruins","")); + cubeCards.add(new CardIdentity("Adaptive Automaton","")); + cubeCards.add(new CardIdentity("Aeolipile","")); + cubeCards.add(new CardIdentity("Aeon Chronicler","")); + cubeCards.add(new CardIdentity("AEther Spellbomb","")); + cubeCards.add(new CardIdentity("AEther Vial","")); + cubeCards.add(new CardIdentity("AEtherling","")); + cubeCards.add(new CardIdentity("All Is Dust","")); + cubeCards.add(new CardIdentity("Ambassador Laquatus","")); + cubeCards.add(new CardIdentity("Amnesia","")); + cubeCards.add(new CardIdentity("Ancestral Recall","")); + cubeCards.add(new CardIdentity("Ancestral Vision","")); + cubeCards.add(new CardIdentity("Ancient Tomb","")); + cubeCards.add(new CardIdentity("Ankh of Mishra","")); + cubeCards.add(new CardIdentity("Annul","")); + cubeCards.add(new CardIdentity("Arcanis the Omnipotent","")); + cubeCards.add(new CardIdentity("Archaeomancer","")); + cubeCards.add(new CardIdentity("Archive Trap","")); + cubeCards.add(new CardIdentity("Augur of Bolas","")); + cubeCards.add(new CardIdentity("Basalt Monolith","")); + cubeCards.add(new CardIdentity("Bident of Thassa","")); + cubeCards.add(new CardIdentity("Black Lotus","")); + cubeCards.add(new CardIdentity("Black Vise","")); + cubeCards.add(new CardIdentity("Blightsteel Colossus","")); + cubeCards.add(new CardIdentity("Blinkmoth Nexus","")); + cubeCards.add(new CardIdentity("Blue Sun's Zenith","")); + cubeCards.add(new CardIdentity("Bonesplitter","")); + cubeCards.add(new CardIdentity("Boomerang","")); + cubeCards.add(new CardIdentity("Braids, Conjurer Adept","")); + cubeCards.add(new CardIdentity("Brain Freeze","")); + cubeCards.add(new CardIdentity("Braingeyser","")); + cubeCards.add(new CardIdentity("Brainstorm","")); + cubeCards.add(new CardIdentity("Briarberry Cohort","")); + cubeCards.add(new CardIdentity("Brittle Effigy","")); + cubeCards.add(new CardIdentity("Broken Ambitions","")); + cubeCards.add(new CardIdentity("Buried Ruin","")); + cubeCards.add(new CardIdentity("Caged Sun","")); + cubeCards.add(new CardIdentity("Call to Mind","")); + cubeCards.add(new CardIdentity("Candelabra of Tawnos","")); + cubeCards.add(new CardIdentity("Capsize","")); + cubeCards.add(new CardIdentity("Careful Consideration","")); + cubeCards.add(new CardIdentity("Cavern of Souls","")); + cubeCards.add(new CardIdentity("Chalice of the Void","")); + cubeCards.add(new CardIdentity("Chancellor of the Spires","")); + cubeCards.add(new CardIdentity("Chronomaton","")); + cubeCards.add(new CardIdentity("Claustrophobia","")); + cubeCards.add(new CardIdentity("Cloud of Faeries","")); + cubeCards.add(new CardIdentity("Cloudfin Raptor","")); + cubeCards.add(new CardIdentity("Coalition Relic","")); + cubeCards.add(new CardIdentity("Coat of Arms","")); + cubeCards.add(new CardIdentity("Codex Shredder","")); + cubeCards.add(new CardIdentity("Cold-Eyed Selkie","")); + cubeCards.add(new CardIdentity("Commandeer","")); + cubeCards.add(new CardIdentity("Complicate","")); + cubeCards.add(new CardIdentity("Compulsive Research","")); + cubeCards.add(new CardIdentity("Condescend","")); + cubeCards.add(new CardIdentity("Contested War Zone","")); + cubeCards.add(new CardIdentity("Control Magic","")); + cubeCards.add(new CardIdentity("Conundrum Sphinx","")); + cubeCards.add(new CardIdentity("Copper Gnomes","")); + cubeCards.add(new CardIdentity("Coralhelm Commander","")); + cubeCards.add(new CardIdentity("Counterspell","")); + cubeCards.add(new CardIdentity("Crippling Chill","")); + cubeCards.add(new CardIdentity("Cryptic Command","")); + cubeCards.add(new CardIdentity("Cursecatcher","")); + cubeCards.add(new CardIdentity("Cyclonic Rift","")); + cubeCards.add(new CardIdentity("Darksteel Colossus","")); + cubeCards.add(new CardIdentity("Daze","")); + cubeCards.add(new CardIdentity("Deep Analysis","")); + cubeCards.add(new CardIdentity("Delay","")); + cubeCards.add(new CardIdentity("Delver of Secrets","")); + cubeCards.add(new CardIdentity("Deprive","")); + cubeCards.add(new CardIdentity("Desert","")); + cubeCards.add(new CardIdentity("Devastation Tide","")); + cubeCards.add(new CardIdentity("Dewdrop Spy","")); + cubeCards.add(new CardIdentity("Dismiss","")); + cubeCards.add(new CardIdentity("Dispel","")); + cubeCards.add(new CardIdentity("Disrupt","")); + cubeCards.add(new CardIdentity("Dissipate","")); + cubeCards.add(new CardIdentity("Dissolve","")); + cubeCards.add(new CardIdentity("Dizzy Spell","")); + cubeCards.add(new CardIdentity("Draining Whelk","")); + cubeCards.add(new CardIdentity("Dream Twist","")); + cubeCards.add(new CardIdentity("Drift of Phantasms","")); + cubeCards.add(new CardIdentity("Drowner Initiate","")); + cubeCards.add(new CardIdentity("Dungeon Geists","")); + cubeCards.add(new CardIdentity("Duplicant","")); + cubeCards.add(new CardIdentity("Elite Arcanist","")); + cubeCards.add(new CardIdentity("Elixir of Immortality","")); + cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn","")); + cubeCards.add(new CardIdentity("Enclave Cryptologist","")); + cubeCards.add(new CardIdentity("Enter the Infinite","")); + cubeCards.add(new CardIdentity("Errant Ephemeron","")); + cubeCards.add(new CardIdentity("Ertai, Wizard Adept","")); + cubeCards.add(new CardIdentity("Evacuation","")); + cubeCards.add(new CardIdentity("Exclude","")); + cubeCards.add(new CardIdentity("Extraplanar Lens","")); + cubeCards.add(new CardIdentity("Eye of the Storm","")); + cubeCards.add(new CardIdentity("Fabricate","")); + cubeCards.add(new CardIdentity("Fact or Fiction","")); + cubeCards.add(new CardIdentity("Faerie Conclave","")); + cubeCards.add(new CardIdentity("Faerie Harbinger","")); + cubeCards.add(new CardIdentity("Flash of Insight","")); + cubeCards.add(new CardIdentity("Flusterstorm","")); + cubeCards.add(new CardIdentity("Foil","")); + cubeCards.add(new CardIdentity("Forbid","")); + cubeCards.add(new CardIdentity("Force of Will","")); + cubeCards.add(new CardIdentity("Force Spike","")); + cubeCards.add(new CardIdentity("Frantic Search","")); + cubeCards.add(new CardIdentity("Frost Titan","")); + cubeCards.add(new CardIdentity("Gainsay","")); + cubeCards.add(new CardIdentity("Geralf's Mindcrusher","")); + cubeCards.add(new CardIdentity("Gilded Lotus","")); + cubeCards.add(new CardIdentity("Gitaxian Probe","")); + cubeCards.add(new CardIdentity("Glen Elendra Archmage","")); + cubeCards.add(new CardIdentity("Gomazoa","")); + cubeCards.add(new CardIdentity("Grafted Wargear","")); + cubeCards.add(new CardIdentity("Grand Architect","")); + cubeCards.add(new CardIdentity("Grim Monolith","")); + cubeCards.add(new CardIdentity("Grindclock","")); + cubeCards.add(new CardIdentity("Grindstone","")); + cubeCards.add(new CardIdentity("Gush","")); + cubeCards.add(new CardIdentity("Hammerhead Shark","")); + cubeCards.add(new CardIdentity("Hedron Crab","")); + cubeCards.add(new CardIdentity("High Tide","")); + cubeCards.add(new CardIdentity("Horizon Drake","")); + cubeCards.add(new CardIdentity("Howling Mine","")); + cubeCards.add(new CardIdentity("Ideas Unbound","")); + cubeCards.add(new CardIdentity("Illusionary Servant","")); + cubeCards.add(new CardIdentity("Illusory Angel","")); + cubeCards.add(new CardIdentity("Impulse","")); + cubeCards.add(new CardIdentity("Increasing Confusion","")); + cubeCards.add(new CardIdentity("Inkfathom Infiltrator","")); + cubeCards.add(new CardIdentity("Inkmoth Nexus","")); + cubeCards.add(new CardIdentity("Inkwell Leviathan","")); + cubeCards.add(new CardIdentity("Inspired Sprite","")); + cubeCards.add(new CardIdentity("Into the Roil","")); + cubeCards.add(new CardIdentity("Isochron Scepter","")); + cubeCards.add(new CardIdentity("Jace Beleren","")); + cubeCards.add(new CardIdentity("Jace, Architect of Thought","")); + cubeCards.add(new CardIdentity("Jace, Memory Adept","")); + cubeCards.add(new CardIdentity("Jace, the Mind Sculptor","")); + cubeCards.add(new CardIdentity("Jace's Archivist","")); + cubeCards.add(new CardIdentity("Jushi Apprentice","")); + cubeCards.add(new CardIdentity("Karn Liberated","")); + cubeCards.add(new CardIdentity("Kederekt Leviathan","")); + cubeCards.add(new CardIdentity("Keening Stone","")); + cubeCards.add(new CardIdentity("Knowledge Pool","")); + cubeCards.add(new CardIdentity("Kuldotha Forgemaster","")); + cubeCards.add(new CardIdentity("Laboratory Maniac","")); + cubeCards.add(new CardIdentity("Legerdemain","")); + cubeCards.add(new CardIdentity("Leyline of Anticipation","")); + cubeCards.add(new CardIdentity("Library of Alexandria","")); + cubeCards.add(new CardIdentity("Lighthouse Chronologist","")); + cubeCards.add(new CardIdentity("Llawan, Cephalid Empress","")); + cubeCards.add(new CardIdentity("Logic Knot","")); + cubeCards.add(new CardIdentity("Lonely Sandbar","")); + cubeCards.add(new CardIdentity("Long-Term Plans","")); + cubeCards.add(new CardIdentity("Looter il-Kor","")); + cubeCards.add(new CardIdentity("Lord of Atlantis","")); + cubeCards.add(new CardIdentity("Lotus Bloom","")); + cubeCards.add(new CardIdentity("Lullmage Mentor","")); + cubeCards.add(new CardIdentity("Mana Crypt","")); + cubeCards.add(new CardIdentity("Mana Drain","")); + cubeCards.add(new CardIdentity("Mana Leak","")); + cubeCards.add(new CardIdentity("Mana Vault","")); + cubeCards.add(new CardIdentity("Master of the Pearl Trident","")); + cubeCards.add(new CardIdentity("Master of Waves","")); + cubeCards.add(new CardIdentity("Master Thief","")); + cubeCards.add(new CardIdentity("Master Transmuter","")); + cubeCards.add(new CardIdentity("Maze of Ith","")); + cubeCards.add(new CardIdentity("Meditate","")); + cubeCards.add(new CardIdentity("Meishin, the Mind Cage","")); + cubeCards.add(new CardIdentity("Meloku the Clouded Mirror","")); + cubeCards.add(new CardIdentity("Memory Jar","")); + cubeCards.add(new CardIdentity("Memory Sluice","")); + cubeCards.add(new CardIdentity("Mental Misstep","")); + cubeCards.add(new CardIdentity("Merchant Scroll","")); + cubeCards.add(new CardIdentity("Merfolk Looter","")); + cubeCards.add(new CardIdentity("Merfolk Mesmerist","")); + cubeCards.add(new CardIdentity("Merfolk Sovereign","")); + cubeCards.add(new CardIdentity("Merfolk Spy","")); + cubeCards.add(new CardIdentity("Merrow Reejerey","")); + cubeCards.add(new CardIdentity("Metalworker","")); + cubeCards.add(new CardIdentity("Mind Over Matter","")); + cubeCards.add(new CardIdentity("Mind Sculpt","")); + cubeCards.add(new CardIdentity("Mind Stone","")); + cubeCards.add(new CardIdentity("Mind's Desire","")); + cubeCards.add(new CardIdentity("Mindslaver","")); + cubeCards.add(new CardIdentity("Minister of Impediments","")); + cubeCards.add(new CardIdentity("Miscalculation","")); + cubeCards.add(new CardIdentity("Misdirection","")); + cubeCards.add(new CardIdentity("Mishra's Factory","")); + cubeCards.add(new CardIdentity("Mishra's Helix","")); + cubeCards.add(new CardIdentity("Mishra's Workshop","")); + cubeCards.add(new CardIdentity("Mortarpod","")); + cubeCards.add(new CardIdentity("Mothdust Changeling","")); + cubeCards.add(new CardIdentity("Mox Diamond","")); + cubeCards.add(new CardIdentity("Mox Sapphire","")); + cubeCards.add(new CardIdentity("Muddle the Mixture","")); + cubeCards.add(new CardIdentity("Mulldrifter","")); + cubeCards.add(new CardIdentity("Mutavault","")); + cubeCards.add(new CardIdentity("Myr Battlesphere","")); + cubeCards.add(new CardIdentity("Mystical Tutor","")); + cubeCards.add(new CardIdentity("Negate","")); + cubeCards.add(new CardIdentity("Nevinyrral's Disk","")); + cubeCards.add(new CardIdentity("Nightveil Specter","")); + cubeCards.add(new CardIdentity("Nimbus Naiad","")); + cubeCards.add(new CardIdentity("Ninja of the Deep Hours","")); + cubeCards.add(new CardIdentity("Oblivion Stone","")); + cubeCards.add(new CardIdentity("Omniscience","")); + cubeCards.add(new CardIdentity("Oona, Queen of the Fae","")); + cubeCards.add(new CardIdentity("Opportunity","")); + cubeCards.add(new CardIdentity("Overtaker","")); + cubeCards.add(new CardIdentity("Pact of Negation","")); + cubeCards.add(new CardIdentity("Painter's Servant","")); + cubeCards.add(new CardIdentity("Palinchron","")); + cubeCards.add(new CardIdentity("Patron Wizard","")); + cubeCards.add(new CardIdentity("Peek","")); + cubeCards.add(new CardIdentity("Peer Through Depths","")); + cubeCards.add(new CardIdentity("Personal Tutor","")); + cubeCards.add(new CardIdentity("Pestermite","")); + cubeCards.add(new CardIdentity("Phantasmal Bear","")); + cubeCards.add(new CardIdentity("Phantasmal Dragon","")); + cubeCards.add(new CardIdentity("Phantasmal Image","")); + cubeCards.add(new CardIdentity("Phyrexian Ingester","")); + cubeCards.add(new CardIdentity("Phyrexian Metamorph","")); + cubeCards.add(new CardIdentity("Piracy Charm","")); + cubeCards.add(new CardIdentity("Platinum Angel","")); + cubeCards.add(new CardIdentity("Plumeveil","")); + cubeCards.add(new CardIdentity("Ponder","")); + cubeCards.add(new CardIdentity("Pongify","")); + cubeCards.add(new CardIdentity("Portent","")); + cubeCards.add(new CardIdentity("Powder Keg","")); + cubeCards.add(new CardIdentity("Power Artifact","")); + cubeCards.add(new CardIdentity("Precursor Golem","")); + cubeCards.add(new CardIdentity("Preordain","")); + cubeCards.add(new CardIdentity("Prognostic Sphinx","")); + cubeCards.add(new CardIdentity("Propaganda","")); + cubeCards.add(new CardIdentity("Psionic Blast","")); + cubeCards.add(new CardIdentity("Psychic Barrier","")); + cubeCards.add(new CardIdentity("Puresight Merrow","")); + cubeCards.add(new CardIdentity("Quicksand","")); + cubeCards.add(new CardIdentity("Rapid Hybridization","")); + cubeCards.add(new CardIdentity("Ratchet Bomb","")); + cubeCards.add(new CardIdentity("Rath's Edge","")); + cubeCards.add(new CardIdentity("Raven Guild Master","")); + cubeCards.add(new CardIdentity("Ray of Command","")); + cubeCards.add(new CardIdentity("Reconstruction","")); + cubeCards.add(new CardIdentity("Reliquary Tower","")); + cubeCards.add(new CardIdentity("Remand","")); + cubeCards.add(new CardIdentity("Remote Isle","")); + cubeCards.add(new CardIdentity("Repeal","")); + cubeCards.add(new CardIdentity("Rewind","")); + cubeCards.add(new CardIdentity("Riftwing Cloudskate","")); + cubeCards.add(new CardIdentity("Riptide Director","")); + cubeCards.add(new CardIdentity("Riptide Laboratory","")); + cubeCards.add(new CardIdentity("Rishadan Port","")); + cubeCards.add(new CardIdentity("Runechanter's Pike","")); + cubeCards.add(new CardIdentity("Sage of Fables","")); + cubeCards.add(new CardIdentity("Sand Squid","")); + cubeCards.add(new CardIdentity("Sands of Delirium","")); + cubeCards.add(new CardIdentity("Sapphire Medallion","")); + cubeCards.add(new CardIdentity("Sea Drake","")); + cubeCards.add(new CardIdentity("Sea Gate Oracle","")); + cubeCards.add(new CardIdentity("Sea Scryer","")); + cubeCards.add(new CardIdentity("Seasinger","")); + cubeCards.add(new CardIdentity("Sensei's Divining Top","")); + cubeCards.add(new CardIdentity("Sensory Deprivation","")); + cubeCards.add(new CardIdentity("Serendib Efreet","")); + cubeCards.add(new CardIdentity("Serum Visions","")); + cubeCards.add(new CardIdentity("Shape Anew","")); + cubeCards.add(new CardIdentity("Shapesharer","")); + cubeCards.add(new CardIdentity("Shelldock Isle","")); + cubeCards.add(new CardIdentity("Show and Tell","")); + cubeCards.add(new CardIdentity("Signal Pest","")); + cubeCards.add(new CardIdentity("Silvergill Adept","")); + cubeCards.add(new CardIdentity("Skullclamp","")); + cubeCards.add(new CardIdentity("Skywatcher Adept","")); + cubeCards.add(new CardIdentity("Sleight of Hand","")); + cubeCards.add(new CardIdentity("Smokestack","")); + cubeCards.add(new CardIdentity("Snapcaster Mage","")); + cubeCards.add(new CardIdentity("Sol Ring","")); + cubeCards.add(new CardIdentity("Sower of Temptation","")); + cubeCards.add(new CardIdentity("Spell Pierce","")); + cubeCards.add(new CardIdentity("Spell Snare","")); + cubeCards.add(new CardIdentity("Spellstutter Sprite","")); + cubeCards.add(new CardIdentity("Spiketail Drakeling","")); + cubeCards.add(new CardIdentity("Spire Golem","")); + cubeCards.add(new CardIdentity("Sprite Noble","")); + cubeCards.add(new CardIdentity("Standstill","")); + cubeCards.add(new CardIdentity("Steel Hellkite","")); + cubeCards.add(new CardIdentity("Steel Sabotage","")); + cubeCards.add(new CardIdentity("Stern Mentor","")); + cubeCards.add(new CardIdentity("Stonybrook Banneret","")); + cubeCards.add(new CardIdentity("Strata Scythe","")); + cubeCards.add(new CardIdentity("Strip Mine","")); + cubeCards.add(new CardIdentity("Stroke of Genius","")); + cubeCards.add(new CardIdentity("Swan Song","")); + cubeCards.add(new CardIdentity("Sword of Body and Mind","")); + cubeCards.add(new CardIdentity("Sword of Fire and Ice","")); + cubeCards.add(new CardIdentity("Sygg, River Cutthroat","")); + cubeCards.add(new CardIdentity("Take Possession","")); + cubeCards.add(new CardIdentity("Talrand, Sky Summoner","")); + cubeCards.add(new CardIdentity("Tangle Wire","")); + cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir","")); + cubeCards.add(new CardIdentity("Telling Time","")); + cubeCards.add(new CardIdentity("Temporal Adept","")); + cubeCards.add(new CardIdentity("Temporal Fissure","")); + cubeCards.add(new CardIdentity("Thada Adel, Acquisitor","")); + cubeCards.add(new CardIdentity("Thalakos Deceiver","")); + cubeCards.add(new CardIdentity("Thassa, God of the Sea","")); + cubeCards.add(new CardIdentity("The Tabernacle at Pendrell Vale","")); + cubeCards.add(new CardIdentity("Think Twice","")); + cubeCards.add(new CardIdentity("Thistledown Liege","")); + cubeCards.add(new CardIdentity("Thought Scour","")); + cubeCards.add(new CardIdentity("Thran Dynamo","")); + cubeCards.add(new CardIdentity("Thwart","")); + cubeCards.add(new CardIdentity("Time Spiral","")); + cubeCards.add(new CardIdentity("Time Stretch","")); + cubeCards.add(new CardIdentity("Time Vault","")); + cubeCards.add(new CardIdentity("Time Walk","")); + cubeCards.add(new CardIdentity("Timetwister","")); + cubeCards.add(new CardIdentity("Tinker","")); + cubeCards.add(new CardIdentity("Tolaria West","")); + cubeCards.add(new CardIdentity("Tolarian Academy","")); + cubeCards.add(new CardIdentity("Tome Scour","")); + cubeCards.add(new CardIdentity("Tower of the Magistrate","")); + cubeCards.add(new CardIdentity("Treachery","")); + cubeCards.add(new CardIdentity("True-Name Nemesis","")); + cubeCards.add(new CardIdentity("Turnabout","")); + cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre","")); + cubeCards.add(new CardIdentity("Umezawa's Jitte","")); + cubeCards.add(new CardIdentity("Undo","")); + cubeCards.add(new CardIdentity("Upheaval","")); + cubeCards.add(new CardIdentity("Vapor Snag","")); + cubeCards.add(new CardIdentity("Vaporkin","")); + cubeCards.add(new CardIdentity("Vedalken AEthermage","")); + cubeCards.add(new CardIdentity("Vedalken Shackles","")); + cubeCards.add(new CardIdentity("Veiled Serpent","")); + cubeCards.add(new CardIdentity("Vendilion Clique","")); + cubeCards.add(new CardIdentity("Venser, Shaper Savant","")); + cubeCards.add(new CardIdentity("Vesuvan Shapeshifter","")); + cubeCards.add(new CardIdentity("Vexing Sphinx","")); + cubeCards.add(new CardIdentity("Vision Charm","")); + cubeCards.add(new CardIdentity("Visions of Beyond","")); + cubeCards.add(new CardIdentity("Vodalian Knights","")); + cubeCards.add(new CardIdentity("Void Stalker","")); + cubeCards.add(new CardIdentity("Voidmage Prodigy","")); + cubeCards.add(new CardIdentity("Voltaic Key","")); + cubeCards.add(new CardIdentity("Wake Thrasher","")); + cubeCards.add(new CardIdentity("Wasp Lancer","")); + cubeCards.add(new CardIdentity("Waterfront Bouncer","")); + cubeCards.add(new CardIdentity("Welkin Tern","")); + cubeCards.add(new CardIdentity("Wheel and Deal","")); + cubeCards.add(new CardIdentity("Windfall","")); + cubeCards.add(new CardIdentity("Winter Orb","")); + cubeCards.add(new CardIdentity("Withdraw","")); + cubeCards.add(new CardIdentity("Worn Powerstone","")); + cubeCards.add(new CardIdentity("Wurmcoil Engine","")); + } +} + diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/PeasantsToolboxCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/PeasantsToolboxCube.java index df5459ac826..afe63e3d623 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/PeasantsToolboxCube.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/PeasantsToolboxCube.java @@ -1,844 +1,843 @@ -/* - * 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.tournament.cubes; - -import mage.game.draft.DraftCube; -import mage.game.draft.DraftCube.CardIdentity; - -/** - * Cube taken from http://www.cubetutor.com/viewcube/10358 - * - * @author LevelX2 - */ -public class PeasantsToolboxCube extends DraftCube { - - public PeasantsToolboxCube() { - super("The Peasant's Toolbox"); - cubeCards.add(new CardIdentity("Boros Elite", "")); - cubeCards.add(new CardIdentity("Caravan Escort", "")); - cubeCards.add(new CardIdentity("Cenn's Tactician", "")); - cubeCards.add(new CardIdentity("Ghost-Lit Redeemer", "")); - cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); - cubeCards.add(new CardIdentity("Loyal Pegasus", "")); - cubeCards.add(new CardIdentity("Accorder Paladin", "")); - cubeCards.add(new CardIdentity("Alabaster Mage", "")); - cubeCards.add(new CardIdentity("Azorius Arrester", "")); - cubeCards.add(new CardIdentity("Cloistered Youth", "")); - cubeCards.add(new CardIdentity("Daring Skyjek", "")); - cubeCards.add(new CardIdentity("Dauntless River Marshal", "")); - cubeCards.add(new CardIdentity("God-Favored General", "")); - cubeCards.add(new CardIdentity("Knight of Cliffhaven", "")); - cubeCards.add(new CardIdentity("Knight of the Holy Nimbus", "")); - cubeCards.add(new CardIdentity("Knight of the Skyward Eye", "")); - cubeCards.add(new CardIdentity("Kor Aeronaut", "")); - cubeCards.add(new CardIdentity("Kor Skyfisher", "")); - cubeCards.add(new CardIdentity("Nearheath Pilgrim", "")); - cubeCards.add(new CardIdentity("Order of the Golden Cricket", "")); - cubeCards.add(new CardIdentity("Squall Drifter", "")); - cubeCards.add(new CardIdentity("Syndic of Tithes", "")); - cubeCards.add(new CardIdentity("Unruly Mob", "")); - cubeCards.add(new CardIdentity("Affa Guard Hound", "")); - cubeCards.add(new CardIdentity("Apex Hawks", "")); - cubeCards.add(new CardIdentity("Azorius Herald", "")); - cubeCards.add(new CardIdentity("Banisher Priest", "")); - cubeCards.add(new CardIdentity("Basilica Guards", "")); - cubeCards.add(new CardIdentity("Burrenton Bombardier", "")); - cubeCards.add(new CardIdentity("Dawnglare Invoker", "")); - cubeCards.add(new CardIdentity("Fiend Hunter", "")); - cubeCards.add(new CardIdentity("Flickerwisp", "")); - cubeCards.add(new CardIdentity("Haazda Snare Squad", "")); - cubeCards.add(new CardIdentity("Icatian Crier", "")); - cubeCards.add(new CardIdentity("Kabuto Moth", "")); - cubeCards.add(new CardIdentity("Riftmarked Knight", "")); - cubeCards.add(new CardIdentity("Roc Egg", "")); - cubeCards.add(new CardIdentity("Scholar of Athreos", "")); - cubeCards.add(new CardIdentity("Soulsworn Jury", "")); - cubeCards.add(new CardIdentity("Spirit en-Dal", "")); - cubeCards.add(new CardIdentity("Village Bell-Ringer", "")); - cubeCards.add(new CardIdentity("Wingsteed Rider", "")); - cubeCards.add(new CardIdentity("Akroan Phalanx", "")); - cubeCards.add(new CardIdentity("Ballista Squad", "")); - cubeCards.add(new CardIdentity("Celestial Crusader", "")); - cubeCards.add(new CardIdentity("Glimmerpoint Stag", "")); - cubeCards.add(new CardIdentity("Goldmeadow Lookout", "")); - cubeCards.add(new CardIdentity("Goldnight Commander", "")); - cubeCards.add(new CardIdentity("Kabira Vindicator", "")); - cubeCards.add(new CardIdentity("Knight of Obligation", "")); - cubeCards.add(new CardIdentity("Lightkeeper of Emeria", "")); - cubeCards.add(new CardIdentity("Master Splicer", "")); - cubeCards.add(new CardIdentity("Meadowboon", "")); - cubeCards.add(new CardIdentity("Prized Elephant", "")); - cubeCards.add(new CardIdentity("Shade of Trokair", "")); - cubeCards.add(new CardIdentity("Thraben Sentry", "")); - cubeCards.add(new CardIdentity("Wakestone Gargoyle", "")); - cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); - cubeCards.add(new CardIdentity("Ornitharch", "")); - cubeCards.add(new CardIdentity("Yoked Plowbeast", "")); - cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); - cubeCards.add(new CardIdentity("Harm's Way", "")); - cubeCards.add(new CardIdentity("Reciprocate", "")); - cubeCards.add(new CardIdentity("Smite", "")); - cubeCards.add(new CardIdentity("Stand Firm", "")); - cubeCards.add(new CardIdentity("Celestial Flare", "")); - cubeCards.add(new CardIdentity("Dawn Charm", "")); - cubeCards.add(new CardIdentity("Judge Unworthy", "")); - cubeCards.add(new CardIdentity("Otherworldly Journey", "")); - cubeCards.add(new CardIdentity("Puncturing Light", "")); - cubeCards.add(new CardIdentity("Test of Faith", "")); - cubeCards.add(new CardIdentity("Blinding Beam", "")); - cubeCards.add(new CardIdentity("Choking Fumes", "")); - cubeCards.add(new CardIdentity("Dauntless Onslaught", "")); - cubeCards.add(new CardIdentity("Devouring Light", "")); - cubeCards.add(new CardIdentity("Dispense Justice", "")); - cubeCards.add(new CardIdentity("Lapse of Certainty", "")); - cubeCards.add(new CardIdentity("Pitfall Trap", "")); - cubeCards.add(new CardIdentity("Rally the Peasants", "")); - cubeCards.add(new CardIdentity("Chastise", "")); - cubeCards.add(new CardIdentity("Divine Verdict", "")); - cubeCards.add(new CardIdentity("Refraction Trap", "")); - cubeCards.add(new CardIdentity("Arrow Volley Trap", "")); - cubeCards.add(new CardIdentity("Gleam of Resistance", "")); - cubeCards.add(new CardIdentity("Swell of Courage", "")); - cubeCards.add(new CardIdentity("Banishing Stroke", "")); - cubeCards.add(new CardIdentity("Hail of Arrows", "")); - cubeCards.add(new CardIdentity("Lingering Souls", "")); - cubeCards.add(new CardIdentity("Marshaling Cry", "")); - cubeCards.add(new CardIdentity("Survival Cache", "")); - cubeCards.add(new CardIdentity("Timely Reinforcements", "")); - cubeCards.add(new CardIdentity("Cenn's Enlistment", "")); - cubeCards.add(new CardIdentity("Genju of the Fields", "")); - cubeCards.add(new CardIdentity("Hyena Umbra", "")); - cubeCards.add(new CardIdentity("Oppressive Rays", "")); - cubeCards.add(new CardIdentity("Shadow Lance", "")); - cubeCards.add(new CardIdentity("Bonds of Faith", "")); - cubeCards.add(new CardIdentity("Ordeal of Heliod", "")); - cubeCards.add(new CardIdentity("Triclopean Sight", "")); - cubeCards.add(new CardIdentity("Cage of Hands", "")); - cubeCards.add(new CardIdentity("Ghostly Prison", "")); - cubeCards.add(new CardIdentity("Security Blockade", "")); - cubeCards.add(new CardIdentity("Faith's Fetters", "")); - cubeCards.add(new CardIdentity("Knightly Valor", "")); - cubeCards.add(new CardIdentity("Hopeful Eidolon", "")); - cubeCards.add(new CardIdentity("Nyx-Fleece Ram", "")); - cubeCards.add(new CardIdentity("Sightless Brawler", "")); - cubeCards.add(new CardIdentity("Archetype of Courage", "")); - cubeCards.add(new CardIdentity("Observant Alseid", "")); - cubeCards.add(new CardIdentity("Heliod's Emissary", "")); - cubeCards.add(new CardIdentity("Cloudfin Raptor", "")); - cubeCards.add(new CardIdentity("Dakra Mystic", "")); - cubeCards.add(new CardIdentity("Drifter il-Dal", "")); - cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); - cubeCards.add(new CardIdentity("Vortex Elemental", "")); - cubeCards.add(new CardIdentity("Aether Figment", "")); - cubeCards.add(new CardIdentity("Dreamscape Artist", "")); - cubeCards.add(new CardIdentity("Frilled Oculus", "")); - cubeCards.add(new CardIdentity("Ghost-Lit Warder", "")); - cubeCards.add(new CardIdentity("Hada Spy Patrol", "")); - cubeCards.add(new CardIdentity("Looter il-Kor", "")); - cubeCards.add(new CardIdentity("Plaxmanta", "")); - cubeCards.add(new CardIdentity("Sigiled Starfish", "")); - cubeCards.add(new CardIdentity("Stitcher's Apprentice", "")); - cubeCards.add(new CardIdentity("Thrummingbird", "")); - cubeCards.add(new CardIdentity("Arctic Aven", "")); - cubeCards.add(new CardIdentity("Brackwater Elemental", "")); - cubeCards.add(new CardIdentity("Civilized Scholar", "")); - cubeCards.add(new CardIdentity("Court Hussar", "")); - cubeCards.add(new CardIdentity("Courtly Provocateur", "")); - cubeCards.add(new CardIdentity("Crackling Triton", "")); - cubeCards.add(new CardIdentity("Deceiver Exarch", "")); - cubeCards.add(new CardIdentity("Drift of Phantasms", "")); - cubeCards.add(new CardIdentity("Fettergeist", "")); - cubeCards.add(new CardIdentity("Frontline Sage", "")); - cubeCards.add(new CardIdentity("Jorubai Murk Lurker", "")); - cubeCards.add(new CardIdentity("Leech Bonder", "")); - cubeCards.add(new CardIdentity("Mistblade Shinobi", "")); - cubeCards.add(new CardIdentity("Neurok Invisimancer", "")); - cubeCards.add(new CardIdentity("Niblis of the Breath", "")); - cubeCards.add(new CardIdentity("Simic Fluxmage", "")); - cubeCards.add(new CardIdentity("Stitched Drake", "")); - cubeCards.add(new CardIdentity("Tandem Lookout", "")); - cubeCards.add(new CardIdentity("Trained Condor", "")); - cubeCards.add(new CardIdentity("Trinket Mage", "")); - cubeCards.add(new CardIdentity("Vedalken Anatomist", "")); - cubeCards.add(new CardIdentity("War-Wing Siren", "")); - cubeCards.add(new CardIdentity("Aerie Worshippers", "")); - cubeCards.add(new CardIdentity("Aven Augur", "")); - cubeCards.add(new CardIdentity("Crookclaw Transmuter", "")); - cubeCards.add(new CardIdentity("Cryptic Annelid", "")); - cubeCards.add(new CardIdentity("Fatestitcher", "")); - cubeCards.add(new CardIdentity("Impaler Shrike", "")); - cubeCards.add(new CardIdentity("Inspired Sprite", "")); - cubeCards.add(new CardIdentity("Mist Raven", "")); - cubeCards.add(new CardIdentity("Nevermaker", "")); - cubeCards.add(new CardIdentity("Ninja of the Deep Hours", "")); - cubeCards.add(new CardIdentity("Phantasmal Dragon", "")); - cubeCards.add(new CardIdentity("Secretkeeper", "")); - cubeCards.add(new CardIdentity("Soratami Savant", "")); - cubeCards.add(new CardIdentity("Water Servant", "")); - cubeCards.add(new CardIdentity("Windrider Eel", "")); - cubeCards.add(new CardIdentity("Wing Splicer", "")); - cubeCards.add(new CardIdentity("Air Servant", "")); - cubeCards.add(new CardIdentity("Helium Squirter", "")); - cubeCards.add(new CardIdentity("Mulldrifter", "")); - cubeCards.add(new CardIdentity("Riftwing Cloudskate", "")); - cubeCards.add(new CardIdentity("Sealock Monster", "")); - cubeCards.add(new CardIdentity("Siren of the Fanged Coast", "")); - cubeCards.add(new CardIdentity("Tidewater Minion", "")); - cubeCards.add(new CardIdentity("Aethersnipe", "")); - cubeCards.add(new CardIdentity("Floodchaser", "")); - cubeCards.add(new CardIdentity("Maze Glider", "")); - cubeCards.add(new CardIdentity("Triton Tactics", "")); - cubeCards.add(new CardIdentity("Essence Scatter", "")); - cubeCards.add(new CardIdentity("Familiar's Ruse", "")); - cubeCards.add(new CardIdentity("Into the Roil", "")); - cubeCards.add(new CardIdentity("Mana Leak", "")); - cubeCards.add(new CardIdentity("Muddle the Mixture", "")); - cubeCards.add(new CardIdentity("Ovinize", "")); - cubeCards.add(new CardIdentity("Spell Rupture", "")); - cubeCards.add(new CardIdentity("Think Twice", "")); - cubeCards.add(new CardIdentity("Dissolve", "")); - cubeCards.add(new CardIdentity("Erratic Mutation", "")); - cubeCards.add(new CardIdentity("Hour of Need", "")); - cubeCards.add(new CardIdentity("Spell Contortion", "")); - cubeCards.add(new CardIdentity("Aetherize", "")); - cubeCards.add(new CardIdentity("Careful Consideration", "")); - cubeCards.add(new CardIdentity("Controvert", "")); - cubeCards.add(new CardIdentity("Mystical Teachings", "")); - cubeCards.add(new CardIdentity("Lost in the Mist", "")); - cubeCards.add(new CardIdentity("Traumatic Visions", "")); - cubeCards.add(new CardIdentity("Vanishment", "")); - cubeCards.add(new CardIdentity("Whiplash Trap", "")); - cubeCards.add(new CardIdentity("Condescend", "")); - cubeCards.add(new CardIdentity("Repeal", "")); - cubeCards.add(new CardIdentity("Logic Knot", "")); - cubeCards.add(new CardIdentity("Serum Visions", "")); - cubeCards.add(new CardIdentity("Hands of Binding", "")); - cubeCards.add(new CardIdentity("Hidden Strings", "")); - cubeCards.add(new CardIdentity("Grasp of Phantoms", "")); - cubeCards.add(new CardIdentity("Mystic Retrieval", "")); - cubeCards.add(new CardIdentity("Tezzeret's Gambit", "")); - cubeCards.add(new CardIdentity("Aqueous Form", "")); - cubeCards.add(new CardIdentity("Genju of the Falls", "")); - cubeCards.add(new CardIdentity("Eel Umbra", "")); - cubeCards.add(new CardIdentity("Military Intelligence", "")); - cubeCards.add(new CardIdentity("Ordeal of Thassa", "")); - cubeCards.add(new CardIdentity("Phantom Wings", "")); - cubeCards.add(new CardIdentity("Stratus Walk", "")); - cubeCards.add(new CardIdentity("Freed from the Real", "")); - cubeCards.add(new CardIdentity("Leaden Fists", "")); - cubeCards.add(new CardIdentity("Bonds of Quicksilver", "")); - cubeCards.add(new CardIdentity("Domestication", "")); - cubeCards.add(new CardIdentity("Flight of Fancy", "")); - cubeCards.add(new CardIdentity("Ocular Halo", "")); - cubeCards.add(new CardIdentity("Crystalline Nautilus", "")); - cubeCards.add(new CardIdentity("Nimbus Naiad", "")); - cubeCards.add(new CardIdentity("Thassa's Emissary", "")); - cubeCards.add(new CardIdentity("Duty-Bound Dead", "")); - cubeCards.add(new CardIdentity("Thrull Parasite", "")); - cubeCards.add(new CardIdentity("Augur of Skulls", "")); - cubeCards.add(new CardIdentity("Basilica Screecher", "")); - cubeCards.add(new CardIdentity("Blind Creeper", "")); - cubeCards.add(new CardIdentity("Blood Artist", "")); - cubeCards.add(new CardIdentity("Disciple of Griselbrand", "")); - cubeCards.add(new CardIdentity("Gatekeeper of Malakir", "")); - cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); - cubeCards.add(new CardIdentity("Onyx Mage", "")); - cubeCards.add(new CardIdentity("Returned Phalanx", "")); - cubeCards.add(new CardIdentity("Arrogant Bloodlord", "")); - cubeCards.add(new CardIdentity("Blind Zealot", "")); - cubeCards.add(new CardIdentity("Bloodflow Connoisseur", "")); - cubeCards.add(new CardIdentity("Bloodhusk Ritualist", "")); - cubeCards.add(new CardIdentity("Deepcavern Imp", "")); - cubeCards.add(new CardIdentity("Demonic Taskmaster", "")); - cubeCards.add(new CardIdentity("Fleshbag Marauder", "")); - cubeCards.add(new CardIdentity("Harbor Bandit", "")); - cubeCards.add(new CardIdentity("Hired Torturer", "")); - cubeCards.add(new CardIdentity("Nirkana Cutthroat", "")); - cubeCards.add(new CardIdentity("Orzhov Euthanist", "")); - cubeCards.add(new CardIdentity("Pawn of Ulamog", "")); - cubeCards.add(new CardIdentity("Phyrexian Rager", "")); - cubeCards.add(new CardIdentity("Screeching Bat", "")); - cubeCards.add(new CardIdentity("Servant of Tymaret", "")); - cubeCards.add(new CardIdentity("Sewer Shambler", "")); - cubeCards.add(new CardIdentity("Stinkweed Imp", "")); - cubeCards.add(new CardIdentity("Undercity Informer", "")); - cubeCards.add(new CardIdentity("Wakedancer", "")); - cubeCards.add(new CardIdentity("Xathrid Slyblade", "")); - cubeCards.add(new CardIdentity("Corpse Traders", "")); - cubeCards.add(new CardIdentity("Crypt Champion", "")); - cubeCards.add(new CardIdentity("Dimir House Guard", "")); - cubeCards.add(new CardIdentity("Entomber Exarch", "")); - cubeCards.add(new CardIdentity("Falkenrath Noble", "")); - cubeCards.add(new CardIdentity("Final-Sting Faerie", "")); - cubeCards.add(new CardIdentity("Fleshwrither", "")); - cubeCards.add(new CardIdentity("Forlorn Pseudamma", "")); - cubeCards.add(new CardIdentity("Heartstabber Mosquito", "")); - cubeCards.add(new CardIdentity("Marsh Flitter", "")); - cubeCards.add(new CardIdentity("Mortis Dogs", "")); - cubeCards.add(new CardIdentity("Nightshade Assassin", "")); - cubeCards.add(new CardIdentity("Perilous Shadow", "")); - cubeCards.add(new CardIdentity("Scavenger Drake", "")); - cubeCards.add(new CardIdentity("Skinrender", "")); - cubeCards.add(new CardIdentity("Slum Reaper", "")); - cubeCards.add(new CardIdentity("Soul Snuffers", "")); - cubeCards.add(new CardIdentity("Vampire Outcasts", "")); - cubeCards.add(new CardIdentity("Viscera Dragger", "")); - cubeCards.add(new CardIdentity("Gray Merchant of Asphodel", "")); - cubeCards.add(new CardIdentity("Keepsake Gorgon", "")); - cubeCards.add(new CardIdentity("Morkrut Banshee", "")); - cubeCards.add(new CardIdentity("Nightfire Giant", "")); - cubeCards.add(new CardIdentity("Revenant Patriarch", "")); - cubeCards.add(new CardIdentity("Shriekmaw", "")); - cubeCards.add(new CardIdentity("Shrike Harpy", "")); - cubeCards.add(new CardIdentity("Throat Slitter", "")); - cubeCards.add(new CardIdentity("Grixis Slavedriver", "")); - cubeCards.add(new CardIdentity("Twisted Abomination", "")); - cubeCards.add(new CardIdentity("Terrus Wurm", "")); - cubeCards.add(new CardIdentity("Darkblast", "")); - cubeCards.add(new CardIdentity("Tragic Slip", "")); - cubeCards.add(new CardIdentity("Undying Evil", "")); - cubeCards.add(new CardIdentity("Virulent Swipe", "")); - cubeCards.add(new CardIdentity("Cradle to Grave", "")); - cubeCards.add(new CardIdentity("Devour Flesh", "")); - cubeCards.add(new CardIdentity("Grim Harvest", "")); - cubeCards.add(new CardIdentity("Necrobite", "")); - cubeCards.add(new CardIdentity("Strangling Soot", "")); - cubeCards.add(new CardIdentity("Tomb Hex", "")); - cubeCards.add(new CardIdentity("Makeshift Mannequin", "")); - cubeCards.add(new CardIdentity("Death Denied", "")); - cubeCards.add(new CardIdentity("Deadly Allure", "")); - cubeCards.add(new CardIdentity("Cruel Edict", "")); - cubeCards.add(new CardIdentity("Premature Burial", "")); - cubeCards.add(new CardIdentity("Smallpox", "")); - cubeCards.add(new CardIdentity("Asphyxiate", "")); - cubeCards.add(new CardIdentity("Assassinate", "")); - cubeCards.add(new CardIdentity("Beseech the Queen", "")); - cubeCards.add(new CardIdentity("Dead Reckoning", "")); - cubeCards.add(new CardIdentity("Dimir Machinations", "")); - cubeCards.add(new CardIdentity("Drown in Sorrow", "")); - cubeCards.add(new CardIdentity("Ichor Slick", "")); - cubeCards.add(new CardIdentity("Read the Bones", "")); - cubeCards.add(new CardIdentity("Syphon Life", "")); - cubeCards.add(new CardIdentity("Barter in Blood", "")); - cubeCards.add(new CardIdentity("Diabolic Tutor", "")); - cubeCards.add(new CardIdentity("Moan of the Unhallowed", "")); - cubeCards.add(new CardIdentity("Vigor Mortis", "")); - cubeCards.add(new CardIdentity("Incremental Blight", "")); - cubeCards.add(new CardIdentity("Ribbons of Night", "")); - cubeCards.add(new CardIdentity("Unburial Rites", "")); - cubeCards.add(new CardIdentity("Absorb Vis", "")); - cubeCards.add(new CardIdentity("Genju of the Fens", "")); - cubeCards.add(new CardIdentity("Quest for the Gravelord", "")); - cubeCards.add(new CardIdentity("Soul Stair Expedition", "")); - cubeCards.add(new CardIdentity("Grave Peril", "")); - cubeCards.add(new CardIdentity("Ordeal of Erebos", "")); - cubeCards.add(new CardIdentity("Yoke of the Damned", "")); - cubeCards.add(new CardIdentity("Fallen Ideal", "")); - cubeCards.add(new CardIdentity("Stab Wound", "")); - cubeCards.add(new CardIdentity("Witch's Mist", "")); - cubeCards.add(new CardIdentity("Brink of Disaster", "")); - cubeCards.add(new CardIdentity("Strands of Undeath", "")); - cubeCards.add(new CardIdentity("Homicidal Seclusion", "")); - cubeCards.add(new CardIdentity("Gnarled Scarhide", "")); - cubeCards.add(new CardIdentity("Baleful Eidolon", "")); - cubeCards.add(new CardIdentity("Spiteful Returned", "")); - cubeCards.add(new CardIdentity("Erebos's Emissary", "")); - cubeCards.add(new CardIdentity("Frenzied Goblin", "")); - cubeCards.add(new CardIdentity("Goblin Bushwhacker", "")); - cubeCards.add(new CardIdentity("Jackal Familiar", "")); - cubeCards.add(new CardIdentity("Reckless Waif", "")); - cubeCards.add(new CardIdentity("Skitter of Lizards", "")); - cubeCards.add(new CardIdentity("Stonewright", "")); - cubeCards.add(new CardIdentity("Altac Bloodseeker", "")); - cubeCards.add(new CardIdentity("Bomber Corps", "")); - cubeCards.add(new CardIdentity("Crimson Muckwader", "")); - cubeCards.add(new CardIdentity("Deathbellow Raider", "")); - cubeCards.add(new CardIdentity("Falkenrath Exterminator", "")); - cubeCards.add(new CardIdentity("Generator Servant", "")); - cubeCards.add(new CardIdentity("Goblin Wardriver", "")); - cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); - cubeCards.add(new CardIdentity("Kruin Striker", "")); - cubeCards.add(new CardIdentity("Lightning Mauler", "")); - cubeCards.add(new CardIdentity("Mogg War Marshal", "")); - cubeCards.add(new CardIdentity("Plated Geopede", "")); - cubeCards.add(new CardIdentity("Skinbrand Goblin", "")); - cubeCards.add(new CardIdentity("Stingscourger", "")); - cubeCards.add(new CardIdentity("Stormblood Berserker", "")); - cubeCards.add(new CardIdentity("Blisterstick Shaman", "")); - cubeCards.add(new CardIdentity("Blood Ogre", "")); - cubeCards.add(new CardIdentity("Dragon Egg", "")); - cubeCards.add(new CardIdentity("Flamewave Invoker", "")); - cubeCards.add(new CardIdentity("Ghost-Lit Raider", "")); - cubeCards.add(new CardIdentity("Hanweir Watchkeep", "")); - cubeCards.add(new CardIdentity("Inner-Flame Acolyte", "")); - cubeCards.add(new CardIdentity("Kessig Wolf", "")); - cubeCards.add(new CardIdentity("Pyreheart Wolf", "")); - cubeCards.add(new CardIdentity("Satyr Nyx-Smith", "")); - cubeCards.add(new CardIdentity("Sparkspitter", "")); - cubeCards.add(new CardIdentity("Stormcaller of Keranos", "")); - cubeCards.add(new CardIdentity("Thunder-Thrash Elder", "")); - cubeCards.add(new CardIdentity("Torch Slinger", "")); - cubeCards.add(new CardIdentity("Vithian Stinger", "")); - cubeCards.add(new CardIdentity("Changeling Berserker", "")); - cubeCards.add(new CardIdentity("Cinder Elemental", "")); - cubeCards.add(new CardIdentity("Flame-Kin War Scout", "")); - cubeCards.add(new CardIdentity("Gorehorn Minotaurs", "")); - cubeCards.add(new CardIdentity("Havengul Vampire", "")); - cubeCards.add(new CardIdentity("Henchfiend of Ukor", "")); - cubeCards.add(new CardIdentity("Ill-Tempered Cyclops", "")); - cubeCards.add(new CardIdentity("Kird Chieftain", "")); - cubeCards.add(new CardIdentity("Mad Prophet", "")); - cubeCards.add(new CardIdentity("Rubblebelt Maaka", "")); - cubeCards.add(new CardIdentity("Skirsdag Cultist", "")); - cubeCards.add(new CardIdentity("Thorn-Thrash Viashino", "")); - cubeCards.add(new CardIdentity("Tormentor Exarch", "")); - cubeCards.add(new CardIdentity("Viashino Shanktail", "")); - cubeCards.add(new CardIdentity("Akroan Conscriptor", "")); - cubeCards.add(new CardIdentity("Emrakul's Hatcher", "")); - cubeCards.add(new CardIdentity("Geyser Glider", "")); - cubeCards.add(new CardIdentity("Glarewielder", "")); - cubeCards.add(new CardIdentity("Pharagax Giant", "")); - cubeCards.add(new CardIdentity("Scourge Devil", "")); - cubeCards.add(new CardIdentity("Stoneshock Giant", "")); - cubeCards.add(new CardIdentity("Towering Thunderfist", "")); - cubeCards.add(new CardIdentity("Firemaw Kavu", "")); - cubeCards.add(new CardIdentity("Greater Stone Spirit", "")); - cubeCards.add(new CardIdentity("Spitebellows", "")); - cubeCards.add(new CardIdentity("Boldwyr Intimidator", "")); - cubeCards.add(new CardIdentity("Ridge Rannet", "")); - cubeCards.add(new CardIdentity("Burst Lightning", "")); - cubeCards.add(new CardIdentity("Coordinated Assault", "")); - cubeCards.add(new CardIdentity("Titan's Strength", "")); - cubeCards.add(new CardIdentity("Weapon Surge", "")); - cubeCards.add(new CardIdentity("Burning Oil", "")); - cubeCards.add(new CardIdentity("Magma Jet", "")); - cubeCards.add(new CardIdentity("Searing Blaze", "")); - cubeCards.add(new CardIdentity("Barbed Lightning", "")); - cubeCards.add(new CardIdentity("Brimstone Volley", "")); - cubeCards.add(new CardIdentity("Staggershock", "")); - cubeCards.add(new CardIdentity("Volt Charge", "")); - cubeCards.add(new CardIdentity("Grab the Reins", "")); - cubeCards.add(new CardIdentity("Inferno Trap", "")); - cubeCards.add(new CardIdentity("Act of Aggression", "")); - cubeCards.add(new CardIdentity("Fiery Fall", "")); - cubeCards.add(new CardIdentity("Flash Conscription", "")); - cubeCards.add(new CardIdentity("Street Spasm", "")); - cubeCards.add(new CardIdentity("Thunderous Wrath", "")); - cubeCards.add(new CardIdentity("Forked Bolt", "")); - cubeCards.add(new CardIdentity("Arc Trail", "")); - cubeCards.add(new CardIdentity("Nightbird's Clutches", "")); - cubeCards.add(new CardIdentity("Pyroclasm", "")); - cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); - cubeCards.add(new CardIdentity("Rift Bolt", "")); - cubeCards.add(new CardIdentity("Rolling Temblor", "")); - cubeCards.add(new CardIdentity("Thatcher Revolt", "")); - cubeCards.add(new CardIdentity("Burn Trail", "")); - cubeCards.add(new CardIdentity("Rivals' Duel", "")); - cubeCards.add(new CardIdentity("Cone of Flame", "")); - cubeCards.add(new CardIdentity("Fireball", "")); - cubeCards.add(new CardIdentity("Dragon Mantle", "")); - cubeCards.add(new CardIdentity("Genju of the Spires", "")); - cubeCards.add(new CardIdentity("Hammerhand", "")); - cubeCards.add(new CardIdentity("Circle of Flame", "")); - cubeCards.add(new CardIdentity("Emblem of the Warmind", "")); - cubeCards.add(new CardIdentity("Madcap Skills", "")); - cubeCards.add(new CardIdentity("Ordeal of Purphoros", "")); - cubeCards.add(new CardIdentity("Pursuit of Flight", "")); - cubeCards.add(new CardIdentity("Zektar Shrine Expedition", "")); - cubeCards.add(new CardIdentity("Fatal Attraction", "")); - cubeCards.add(new CardIdentity("Fearsome Temper", "")); - cubeCards.add(new CardIdentity("Galvanic Arc", "")); - cubeCards.add(new CardIdentity("Hypervolt Grasp", "")); - cubeCards.add(new CardIdentity("Lust for War", "")); - cubeCards.add(new CardIdentity("Everflame Eidolon", "")); - cubeCards.add(new CardIdentity("Mogis's Warhound", "")); - cubeCards.add(new CardIdentity("Spearpoint Oread", "")); - cubeCards.add(new CardIdentity("Purphoros's Emissary", "")); - cubeCards.add(new CardIdentity("Centaur's Herald", "")); - cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); - cubeCards.add(new CardIdentity("Llanowar Augur", "")); - cubeCards.add(new CardIdentity("Renowned Weaver", "")); - cubeCards.add(new CardIdentity("Sunblade Elf", "")); - cubeCards.add(new CardIdentity("Twinblade Slasher", "")); - cubeCards.add(new CardIdentity("Wasteland Viper", "")); - cubeCards.add(new CardIdentity("Ambush Viper", "")); - cubeCards.add(new CardIdentity("Aquastrand Spider", "")); - cubeCards.add(new CardIdentity("Beastbreaker of Bala Ged", "")); - cubeCards.add(new CardIdentity("Bramblesnap", "")); - cubeCards.add(new CardIdentity("Darkthicket Wolf", "")); - cubeCards.add(new CardIdentity("Dawntreader Elk", "")); - cubeCards.add(new CardIdentity("Death-Hood Cobra", "")); - cubeCards.add(new CardIdentity("Flinthoof Boar", "")); - cubeCards.add(new CardIdentity("Gatstaf Shepherd", "")); - cubeCards.add(new CardIdentity("Gnarlid Pack", "")); - cubeCards.add(new CardIdentity("Nest Invader", "")); - cubeCards.add(new CardIdentity("Nightshade Peddler", "")); - cubeCards.add(new CardIdentity("River Boa", "")); - cubeCards.add(new CardIdentity("Shinen of Life's Roar", "")); - cubeCards.add(new CardIdentity("Agent of Horizons", "")); - cubeCards.add(new CardIdentity("Awakener Druid", "")); - cubeCards.add(new CardIdentity("Citanul Woodreaders", "")); - cubeCards.add(new CardIdentity("Crocanura", "")); - cubeCards.add(new CardIdentity("Ghost-Lit Nourisher", "")); - cubeCards.add(new CardIdentity("Gluttonous Slime", "")); - cubeCards.add(new CardIdentity("Hedge Troll", "")); - cubeCards.add(new CardIdentity("Lambholt Elder", "")); - cubeCards.add(new CardIdentity("Rootwalla", "")); - cubeCards.add(new CardIdentity("Slaughterhorn", "")); - cubeCards.add(new CardIdentity("Stonefare Crocodile", "")); - cubeCards.add(new CardIdentity("Thornscape Battlemage", "")); - cubeCards.add(new CardIdentity("Trusted Forcemage", "")); - cubeCards.add(new CardIdentity("Turntimber Basilisk", "")); - cubeCards.add(new CardIdentity("Ulvenwald Bear", "")); - cubeCards.add(new CardIdentity("Villagers of Estwald", "")); - cubeCards.add(new CardIdentity("Wolfir Avenger", "")); - cubeCards.add(new CardIdentity("Briarhorn", "")); - cubeCards.add(new CardIdentity("Druid's Familiar", "")); - cubeCards.add(new CardIdentity("Drumhunter", "")); - cubeCards.add(new CardIdentity("Festerhide Boar", "")); - cubeCards.add(new CardIdentity("Golgari Decoy", "")); - cubeCards.add(new CardIdentity("Graverobber Spider", "")); - cubeCards.add(new CardIdentity("Kavu Primarch", "")); - cubeCards.add(new CardIdentity("Kozilek's Predator", "")); - cubeCards.add(new CardIdentity("Masked Admirers", "")); - cubeCards.add(new CardIdentity("Patagia Viper", "")); - cubeCards.add(new CardIdentity("Penumbra Spider", "")); - cubeCards.add(new CardIdentity("Pouncing Wurm", "")); - cubeCards.add(new CardIdentity("Scab-Clan Charger", "")); - cubeCards.add(new CardIdentity("Swarmborn Giant", "")); - cubeCards.add(new CardIdentity("Thrashing Mossdog", "")); - cubeCards.add(new CardIdentity("Vital Splicer", "")); - cubeCards.add(new CardIdentity("Acidic Slime", "")); - cubeCards.add(new CardIdentity("Durkwood Tracker", "")); - cubeCards.add(new CardIdentity("Grizzled Outcasts", "")); - cubeCards.add(new CardIdentity("Nessian Asp", "")); - cubeCards.add(new CardIdentity("Snake of the Golden Grove", "")); - cubeCards.add(new CardIdentity("Somberwald Spider", "")); - cubeCards.add(new CardIdentity("Durkwood Baloth", "")); - cubeCards.add(new CardIdentity("Pathbreaker Wurm", "")); - cubeCards.add(new CardIdentity("Pheres-Band Raiders", "")); - cubeCards.add(new CardIdentity("Jungle Weaver", "")); - cubeCards.add(new CardIdentity("Thundering Tanadon", "")); - cubeCards.add(new CardIdentity("Groundswell", "")); - cubeCards.add(new CardIdentity("Hunger of the Howlpack", "")); - cubeCards.add(new CardIdentity("Vines of Vastwood", "")); - cubeCards.add(new CardIdentity("Earthbrawn", "")); - cubeCards.add(new CardIdentity("Evolution Charm", "")); - cubeCards.add(new CardIdentity("Resize", "")); - cubeCards.add(new CardIdentity("Sprout Swarm", "")); - cubeCards.add(new CardIdentity("Gilt-Leaf Ambush", "")); - cubeCards.add(new CardIdentity("Lace with Moonglove", "")); - cubeCards.add(new CardIdentity("Wild Hunger", "")); - cubeCards.add(new CardIdentity("Baloth Cage Trap", "")); - cubeCards.add(new CardIdentity("Reach of Branches", "")); - cubeCards.add(new CardIdentity("Stand Together", "")); - cubeCards.add(new CardIdentity("Sylvan Bounty", "")); - cubeCards.add(new CardIdentity("Ancient Stirrings", "")); - cubeCards.add(new CardIdentity("Commune with the Gods", "")); - cubeCards.add(new CardIdentity("Edge of Autumn", "")); - cubeCards.add(new CardIdentity("Phytoburst", "")); - cubeCards.add(new CardIdentity("Tracker's Instincts", "")); - cubeCards.add(new CardIdentity("Travel Preparations", "")); - cubeCards.add(new CardIdentity("Journey of Discovery", "")); - cubeCards.add(new CardIdentity("Lead the Stampede", "")); - cubeCards.add(new CardIdentity("Search for Tomorrow", "")); - cubeCards.add(new CardIdentity("Tower Above", "")); - cubeCards.add(new CardIdentity("Fungal Sprouting", "")); - cubeCards.add(new CardIdentity("Hunt the Weak", "")); - cubeCards.add(new CardIdentity("Hunting Triad", "")); - cubeCards.add(new CardIdentity("Blessings of Nature", "")); - cubeCards.add(new CardIdentity("Enlarge", "")); - cubeCards.add(new CardIdentity("Incremental Growth", "")); - cubeCards.add(new CardIdentity("Spider Spawning", "")); - cubeCards.add(new CardIdentity("Genju of the Cedars", "")); - cubeCards.add(new CardIdentity("Fists of Ironwood", "")); - cubeCards.add(new CardIdentity("Lignify", "")); - cubeCards.add(new CardIdentity("Ordeal of Nylea", "")); - cubeCards.add(new CardIdentity("Quest for the Gemblades", "")); - cubeCards.add(new CardIdentity("Quiet Disrepair", "")); - cubeCards.add(new CardIdentity("Utopia Vow", "")); - cubeCards.add(new CardIdentity("Feral Invocation", "")); - cubeCards.add(new CardIdentity("Moldervine Cloak", "")); - cubeCards.add(new CardIdentity("Petrified Plating", "")); - cubeCards.add(new CardIdentity("Snake Umbra", "")); - cubeCards.add(new CardIdentity("Triumph of Ferocity", "")); - cubeCards.add(new CardIdentity("Trollhide", "")); - cubeCards.add(new CardIdentity("Leafcrown Dryad", "")); - cubeCards.add(new CardIdentity("Spirespine", "")); - cubeCards.add(new CardIdentity("Nylea's Emissary", "")); - cubeCards.add(new CardIdentity("Azorius Guildmage", "")); - cubeCards.add(new CardIdentity("Battlewise Hoplite", "")); - cubeCards.add(new CardIdentity("Deputy of Acquittals", "")); - cubeCards.add(new CardIdentity("New Prahv Guildmage", "")); - cubeCards.add(new CardIdentity("Lyev Skyknight", "")); - cubeCards.add(new CardIdentity("Plumeveil", "")); - cubeCards.add(new CardIdentity("Silkbind Faerie", "")); - cubeCards.add(new CardIdentity("Skymark Roc", "")); - cubeCards.add(new CardIdentity("Sky Hussar", "")); - cubeCards.add(new CardIdentity("Shield of the Righteous", "")); - cubeCards.add(new CardIdentity("Azorius Charm", "")); - cubeCards.add(new CardIdentity("Repel Intruders", "")); - cubeCards.add(new CardIdentity("Ephara's Enlightenment", "")); - cubeCards.add(new CardIdentity("Plumes of Peace", "")); - cubeCards.add(new CardIdentity("Dimir Guildmage", "")); - cubeCards.add(new CardIdentity("Dimir Infiltrator", "")); - cubeCards.add(new CardIdentity("Disciple of Deceit", "")); - cubeCards.add(new CardIdentity("Duskmantle Guildmage", "")); - cubeCards.add(new CardIdentity("Inkfathom Witch", "")); - cubeCards.add(new CardIdentity("Shipwreck Singer", "")); - cubeCards.add(new CardIdentity("Wasp Lancer", "")); - cubeCards.add(new CardIdentity("Blizzard Specter", "")); - cubeCards.add(new CardIdentity("Agony Warp", "")); - cubeCards.add(new CardIdentity("Dimir Charm", "")); - cubeCards.add(new CardIdentity("Far // Away", "")); - cubeCards.add(new CardIdentity("Perplex", "")); - cubeCards.add(new CardIdentity("Soul Manipulation", "")); - cubeCards.add(new CardIdentity("Call of the Nightwing", "")); - cubeCards.add(new CardIdentity("River's Grasp", "")); - cubeCards.add(new CardIdentity("Rix Maadi Guildmage", "")); - cubeCards.add(new CardIdentity("Spike Jester", "")); - cubeCards.add(new CardIdentity("Ashenmoor Gouger", "")); - cubeCards.add(new CardIdentity("Hellhole Flailer", "")); - cubeCards.add(new CardIdentity("Kathari Bomber", "")); - cubeCards.add(new CardIdentity("Shambling Remains", "")); - cubeCards.add(new CardIdentity("Carnage Gladiator", "")); - cubeCards.add(new CardIdentity("Murderous Redcap", "")); - cubeCards.add(new CardIdentity("Grief Tyrant", "")); - cubeCards.add(new CardIdentity("Rakdos Charm", "")); - cubeCards.add(new CardIdentity("Bituminous Blast", "")); - cubeCards.add(new CardIdentity("Twinstrike", "")); - cubeCards.add(new CardIdentity("Blightning", "")); - cubeCards.add(new CardIdentity("Torrent of Souls", "")); - cubeCards.add(new CardIdentity("Burning-Tree Emissary", "")); - cubeCards.add(new CardIdentity("Scab-Clan Mauler", "")); - cubeCards.add(new CardIdentity("Skarrg Guildmage", "")); - cubeCards.add(new CardIdentity("Zhur-Taa Druid", "")); - cubeCards.add(new CardIdentity("Boggart Ram-Gang", "")); - cubeCards.add(new CardIdentity("Fanatic of Xenagos", "")); - cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); - cubeCards.add(new CardIdentity("Ghor-Clan Rampager", "")); - cubeCards.add(new CardIdentity("Zhur-Taa Swine", "")); - cubeCards.add(new CardIdentity("Gruul Charm", "")); - cubeCards.add(new CardIdentity("Pit Fight", "")); - cubeCards.add(new CardIdentity("Branching Bolt", "")); - cubeCards.add(new CardIdentity("Armed // Dangerous", "")); - cubeCards.add(new CardIdentity("Firespout", "")); - cubeCards.add(new CardIdentity("Savage Twister", "")); - cubeCards.add(new CardIdentity("Seedcradle Witch", "")); - cubeCards.add(new CardIdentity("Qasali Pridemage", "")); - cubeCards.add(new CardIdentity("Selesnya Evangel", "")); - cubeCards.add(new CardIdentity("Vitu-Ghazi Guildmage", "")); - cubeCards.add(new CardIdentity("Kitchen Finks", "")); - cubeCards.add(new CardIdentity("Qasali Ambusher", "")); - cubeCards.add(new CardIdentity("Wilt-Leaf Cavaliers", "")); - cubeCards.add(new CardIdentity("Juniper Order Ranger", "")); - cubeCards.add(new CardIdentity("Enlisted Wurm", "")); - cubeCards.add(new CardIdentity("Selesnya Charm", "")); - cubeCards.add(new CardIdentity("Sigil Blessing", "")); - cubeCards.add(new CardIdentity("Common Bond", "")); - cubeCards.add(new CardIdentity("Mercy Killing", "")); - cubeCards.add(new CardIdentity("Alive // Well", "")); - cubeCards.add(new CardIdentity("Sigil of the Nayan Gods", "")); - cubeCards.add(new CardIdentity("Cartel Aristocrat", "")); - cubeCards.add(new CardIdentity("Tithe Drinker", "")); - cubeCards.add(new CardIdentity("Vizkopa Guildmage", "")); - cubeCards.add(new CardIdentity("Gwyllion Hedge-Mage", "")); - cubeCards.add(new CardIdentity("Kingpin's Pet", "")); - cubeCards.add(new CardIdentity("Restless Apparition", "")); - cubeCards.add(new CardIdentity("Blind Hunter", "")); - cubeCards.add(new CardIdentity("Harvest Gwyllion", "")); - cubeCards.add(new CardIdentity("Sentry of the Underworld", "")); - cubeCards.add(new CardIdentity("Tidehollow Sculler", "")); - cubeCards.add(new CardIdentity("Cauldron Haze", "")); - cubeCards.add(new CardIdentity("Executioner's Swing", "")); - cubeCards.add(new CardIdentity("Orzhov Charm", "")); - cubeCards.add(new CardIdentity("Profit // Loss", "")); - cubeCards.add(new CardIdentity("Zealous Persecution", "")); - cubeCards.add(new CardIdentity("Korozda Guildmage", "")); - cubeCards.add(new CardIdentity("Putrid Leech", "")); - cubeCards.add(new CardIdentity("Dreg Mangler", "")); - cubeCards.add(new CardIdentity("Shambling Shell", "")); - cubeCards.add(new CardIdentity("Trestle Troll", "")); - cubeCards.add(new CardIdentity("Canker Abomination", "")); - cubeCards.add(new CardIdentity("Desecrator Hag", "")); - cubeCards.add(new CardIdentity("Sluiceway Scorpion", "")); - cubeCards.add(new CardIdentity("Marrow Chomper", "")); - cubeCards.add(new CardIdentity("Golgari Charm", "")); - cubeCards.add(new CardIdentity("Cankerous Thirst", "")); - cubeCards.add(new CardIdentity("Down // Dirty", "")); - cubeCards.add(new CardIdentity("Worm Harvest", "")); - cubeCards.add(new CardIdentity("Necrogenesis", "")); - cubeCards.add(new CardIdentity("Nyx Weaver", "")); - cubeCards.add(new CardIdentity("Coiling Oracle", "")); - cubeCards.add(new CardIdentity("Kiora's Follower", "")); - cubeCards.add(new CardIdentity("Zameck Guildmage", "")); - cubeCards.add(new CardIdentity("Beetleform Mage", "")); - cubeCards.add(new CardIdentity("Gilder Bairn", "")); - cubeCards.add(new CardIdentity("Lorescale Coatl", "")); - cubeCards.add(new CardIdentity("Plaxcaster Frogling", "")); - cubeCards.add(new CardIdentity("Selkie Hedge-Mage", "")); - cubeCards.add(new CardIdentity("Wistful Selkie", "")); - cubeCards.add(new CardIdentity("Horizon Chimera", "")); - cubeCards.add(new CardIdentity("Fleetfeather Cockatrice", "")); - cubeCards.add(new CardIdentity("Simic Charm", "")); - cubeCards.add(new CardIdentity("Snakeform", "")); - cubeCards.add(new CardIdentity("Give // Take", "")); - cubeCards.add(new CardIdentity("Leafdrake Roost", "")); - cubeCards.add(new CardIdentity("Frostburn Weird", "")); - cubeCards.add(new CardIdentity("Goblin Electromancer", "")); - cubeCards.add(new CardIdentity("Nivix Guildmage", "")); - cubeCards.add(new CardIdentity("Crag Puca", "")); - cubeCards.add(new CardIdentity("Gelectrode", "")); - cubeCards.add(new CardIdentity("Izzet Staticaster", "")); - cubeCards.add(new CardIdentity("Nivix Cyclops", "")); - cubeCards.add(new CardIdentity("Fluxcharger", "")); - cubeCards.add(new CardIdentity("Shrewd Hatchling", "")); - cubeCards.add(new CardIdentity("Nucklavee", "")); - cubeCards.add(new CardIdentity("Izzet Charm", "")); - cubeCards.add(new CardIdentity("Swerve", "")); - cubeCards.add(new CardIdentity("Turn // Burn", "")); - cubeCards.add(new CardIdentity("Electrolyze", "")); - cubeCards.add(new CardIdentity("Blast of Genius", "")); - cubeCards.add(new CardIdentity("Boros Guildmage", "")); - cubeCards.add(new CardIdentity("Stun Sniper", "")); - cubeCards.add(new CardIdentity("Sunhome Guildmage", "")); - cubeCards.add(new CardIdentity("Truefire Paladin", "")); - cubeCards.add(new CardIdentity("Wojek Halberdiers", "")); - cubeCards.add(new CardIdentity("Skyknight Legionnaire", "")); - cubeCards.add(new CardIdentity("Viashino Firstblade", "")); - cubeCards.add(new CardIdentity("Spitemare", "")); - cubeCards.add(new CardIdentity("Wear // Tear", "")); - cubeCards.add(new CardIdentity("Boros Charm", "")); - cubeCards.add(new CardIdentity("Martial Glory", "")); - cubeCards.add(new CardIdentity("Arrows of Justice", "")); - cubeCards.add(new CardIdentity("Fire at Will", "")); - cubeCards.add(new CardIdentity("Intimidation Bolt", "")); - cubeCards.add(new CardIdentity("Warleader's Helix", "")); - cubeCards.add(new CardIdentity("Chronomaton", "")); - cubeCards.add(new CardIdentity("Whispergear Sneak", "")); - cubeCards.add(new CardIdentity("Agent of Acquisitions", "")); - cubeCards.add(new CardIdentity("Wall of Tanglecord", "")); - cubeCards.add(new CardIdentity("Burnished Hart", "")); - cubeCards.add(new CardIdentity("Cogwork Spy", "")); - cubeCards.add(new CardIdentity("Gargoyle Sentinel", "")); - cubeCards.add(new CardIdentity("Moriok Replica", "")); - cubeCards.add(new CardIdentity("Cogwork Librarian", "")); - cubeCards.add(new CardIdentity("Paradise Mantle", "")); - cubeCards.add(new CardIdentity("Aether Vial", "")); - cubeCards.add(new CardIdentity("Bonesplitter", "")); - cubeCards.add(new CardIdentity("Infiltration Lens", "")); - cubeCards.add(new CardIdentity("O-Naginata", "")); - cubeCards.add(new CardIdentity("Pyrite Spellbomb", "")); - cubeCards.add(new CardIdentity("Sensei's Divining Top", "")); - cubeCards.add(new CardIdentity("Shuriken", "")); - cubeCards.add(new CardIdentity("Traveler's Amulet", "")); - cubeCards.add(new CardIdentity("Wayfarer's Bauble", "")); - cubeCards.add(new CardIdentity("Banshee's Blade", "")); - cubeCards.add(new CardIdentity("Contagion Clasp", "")); - cubeCards.add(new CardIdentity("Glint Hawk Idol", "")); - cubeCards.add(new CardIdentity("Gorgon Flail", "")); - cubeCards.add(new CardIdentity("Mortarpod", "")); - cubeCards.add(new CardIdentity("Prismatic Lens", "")); - cubeCards.add(new CardIdentity("Prophetic Prism", "")); - cubeCards.add(new CardIdentity("Ring of Evos Isle", "")); - cubeCards.add(new CardIdentity("Ring of Kalonia", "")); - cubeCards.add(new CardIdentity("Ring of Thune", "")); - cubeCards.add(new CardIdentity("Ring of Valkas", "")); - cubeCards.add(new CardIdentity("Ring of Xathrid", "")); - cubeCards.add(new CardIdentity("Azorius Keyrune", "")); - cubeCards.add(new CardIdentity("Boros Keyrune", "")); - cubeCards.add(new CardIdentity("Chronatog Totem", "")); - cubeCards.add(new CardIdentity("Crystal Shard", "")); - cubeCards.add(new CardIdentity("Dimir Keyrune", "")); - cubeCards.add(new CardIdentity("Foriysian Totem", "")); - cubeCards.add(new CardIdentity("Golgari Keyrune", "")); - cubeCards.add(new CardIdentity("Grafted Wargear", "")); - cubeCards.add(new CardIdentity("Gruul Keyrune", "")); - cubeCards.add(new CardIdentity("Izzet Keyrune", "")); - cubeCards.add(new CardIdentity("Orzhov Keyrune", "")); - cubeCards.add(new CardIdentity("Phyrexian Totem", "")); - cubeCards.add(new CardIdentity("Rakdos Keyrune", "")); - cubeCards.add(new CardIdentity("Selesnya Keyrune", "")); - cubeCards.add(new CardIdentity("Sickleslicer", "")); - cubeCards.add(new CardIdentity("Simic Keyrune", "")); - cubeCards.add(new CardIdentity("Strider Harness", "")); - cubeCards.add(new CardIdentity("Thunder Totem", "")); - cubeCards.add(new CardIdentity("Tumble Magnet", "")); - cubeCards.add(new CardIdentity("Weatherseed Totem", "")); - cubeCards.add(new CardIdentity("Serrated Arrows", "")); - cubeCards.add(new CardIdentity("Skinwing", "")); - cubeCards.add(new CardIdentity("Strandwalker", "")); - cubeCards.add(new CardIdentity("Azorius Chancery", "")); - cubeCards.add(new CardIdentity("Azorius Guildgate", "")); - cubeCards.add(new CardIdentity("Bant Panorama", "")); - cubeCards.add(new CardIdentity("Boros Garrison", "")); - cubeCards.add(new CardIdentity("Boros Guildgate", "")); - cubeCards.add(new CardIdentity("Dimir Aqueduct", "")); - cubeCards.add(new CardIdentity("Dimir Guildgate", "")); - cubeCards.add(new CardIdentity("Dread Statuary", "")); - cubeCards.add(new CardIdentity("Esper Panorama", "")); - cubeCards.add(new CardIdentity("Faerie Conclave", "")); - cubeCards.add(new CardIdentity("Forbidding Watchtower", "")); - cubeCards.add(new CardIdentity("Ghitu Encampment", "")); - cubeCards.add(new CardIdentity("Golgari Guildgate", "")); - cubeCards.add(new CardIdentity("Golgari Rot Farm", "")); - cubeCards.add(new CardIdentity("Grixis Panorama", "")); - cubeCards.add(new CardIdentity("Gruul Guildgate", "")); - cubeCards.add(new CardIdentity("Gruul Turf", "")); - cubeCards.add(new CardIdentity("Izzet Boilerworks", "")); - cubeCards.add(new CardIdentity("Izzet Guildgate", "")); - cubeCards.add(new CardIdentity("Jund Panorama", "")); - cubeCards.add(new CardIdentity("Mirrodin's Core", "")); - cubeCards.add(new CardIdentity("Naya Panorama", "")); - cubeCards.add(new CardIdentity("Orzhov Basilica", "")); - cubeCards.add(new CardIdentity("Orzhov Guildgate", "")); - cubeCards.add(new CardIdentity("Rakdos Carnarium", "")); - cubeCards.add(new CardIdentity("Rakdos Guildgate", "")); - cubeCards.add(new CardIdentity("Selesnya Guildgate", "")); - cubeCards.add(new CardIdentity("Selesnya Sanctuary", "")); - cubeCards.add(new CardIdentity("Shimmering Grotto", "")); - cubeCards.add(new CardIdentity("Simic Growth Chamber", "")); - cubeCards.add(new CardIdentity("Simic Guildgate", "")); - cubeCards.add(new CardIdentity("Spawning Pool", "")); - cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); - cubeCards.add(new CardIdentity("Transguild Promenade", "")); - cubeCards.add(new CardIdentity("Treetop Village", "")); - cubeCards.add(new CardIdentity("Vivid Crag", "")); - cubeCards.add(new CardIdentity("Vivid Creek", "")); - cubeCards.add(new CardIdentity("Vivid Grove", "")); - cubeCards.add(new CardIdentity("Vivid Marsh", "")); - cubeCards.add(new CardIdentity("Vivid Meadow", "")); - cubeCards.add(new CardIdentity("Brago's Favor", "")); - cubeCards.add(new CardIdentity("Double Stroke", "")); - cubeCards.add(new CardIdentity("Immediate Action", "")); - cubeCards.add(new CardIdentity("Muzzio's Preparations", "")); - cubeCards.add(new CardIdentity("Power Play", "")); - cubeCards.add(new CardIdentity("Unexpected Potential", "")); - - } -} +/* + * 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.tournament.cubes; + +import mage.game.draft.DraftCube; +import mage.game.draft.DraftCube.CardIdentity; + +/** + * Cube taken from http://www.cubetutor.com/viewcube/10358 + * + * @author LevelX2 + */ +public class PeasantsToolboxCube extends DraftCube { + + public PeasantsToolboxCube() { + super("The Peasant's Toolbox"); + cubeCards.add(new CardIdentity("Absorb Vis", "")); + cubeCards.add(new CardIdentity("Accorder Paladin", "")); + cubeCards.add(new CardIdentity("Acidic Slime", "")); + cubeCards.add(new CardIdentity("Act of Aggression", "")); + cubeCards.add(new CardIdentity("Aerie Worshippers", "")); + cubeCards.add(new CardIdentity("AEther Figment", "")); + cubeCards.add(new CardIdentity("AEther Vial", "")); + cubeCards.add(new CardIdentity("AEtherize", "")); + cubeCards.add(new CardIdentity("AEthersnipe", "")); + cubeCards.add(new CardIdentity("Affa Guard Hound", "")); + cubeCards.add(new CardIdentity("Agent of Acquisitions", "")); + cubeCards.add(new CardIdentity("Agent of Horizons", "")); + cubeCards.add(new CardIdentity("Agony Warp", "")); + cubeCards.add(new CardIdentity("Air Servant", "")); + cubeCards.add(new CardIdentity("Akroan Conscriptor", "")); + cubeCards.add(new CardIdentity("Akroan Phalanx", "")); + cubeCards.add(new CardIdentity("Alabaster Mage", "")); + cubeCards.add(new CardIdentity("Alive // Well", "")); + cubeCards.add(new CardIdentity("Altac Bloodseeker", "")); + cubeCards.add(new CardIdentity("Ambush Viper", "")); + cubeCards.add(new CardIdentity("Ancient Stirrings", "")); + cubeCards.add(new CardIdentity("Apex Hawks", "")); + cubeCards.add(new CardIdentity("Aquastrand Spider", "")); + cubeCards.add(new CardIdentity("Aqueous Form", "")); + cubeCards.add(new CardIdentity("Arc Trail", "")); + cubeCards.add(new CardIdentity("Archetype of Courage", "")); + cubeCards.add(new CardIdentity("Arctic Aven", "")); + cubeCards.add(new CardIdentity("Armed // Dangerous", "")); + cubeCards.add(new CardIdentity("Arrogant Bloodlord", "")); + cubeCards.add(new CardIdentity("Arrow Volley Trap", "")); + cubeCards.add(new CardIdentity("Arrows of Justice", "")); + cubeCards.add(new CardIdentity("Ashenmoor Gouger", "")); + cubeCards.add(new CardIdentity("Asphyxiate", "")); + cubeCards.add(new CardIdentity("Assassinate", "")); + cubeCards.add(new CardIdentity("Augur of Skulls", "")); + cubeCards.add(new CardIdentity("Aven Augur", "")); + cubeCards.add(new CardIdentity("Awakener Druid", "")); + cubeCards.add(new CardIdentity("Azorius Arrester", "")); + cubeCards.add(new CardIdentity("Azorius Chancery", "")); + cubeCards.add(new CardIdentity("Azorius Charm", "")); + cubeCards.add(new CardIdentity("Azorius Guildgate", "")); + cubeCards.add(new CardIdentity("Azorius Guildmage", "")); + cubeCards.add(new CardIdentity("Azorius Herald", "")); + cubeCards.add(new CardIdentity("Azorius Keyrune", "")); + cubeCards.add(new CardIdentity("Baleful Eidolon", "")); + cubeCards.add(new CardIdentity("Ballista Squad", "")); + cubeCards.add(new CardIdentity("Baloth Cage Trap", "")); + cubeCards.add(new CardIdentity("Banisher Priest", "")); + cubeCards.add(new CardIdentity("Banishing Stroke", "")); + cubeCards.add(new CardIdentity("Banshee's Blade", "")); + cubeCards.add(new CardIdentity("Bant Panorama", "")); + cubeCards.add(new CardIdentity("Barbed Lightning", "")); + cubeCards.add(new CardIdentity("Barter in Blood", "")); + cubeCards.add(new CardIdentity("Basilica Guards", "")); + cubeCards.add(new CardIdentity("Basilica Screecher", "")); + cubeCards.add(new CardIdentity("Battlewise Hoplite", "")); + cubeCards.add(new CardIdentity("Beastbreaker of Bala Ged", "")); + cubeCards.add(new CardIdentity("Beetleform Mage", "")); + cubeCards.add(new CardIdentity("Beseech the Queen", "")); + cubeCards.add(new CardIdentity("Bituminous Blast", "")); + cubeCards.add(new CardIdentity("Blast of Genius", "")); + cubeCards.add(new CardIdentity("Blessings of Nature", "")); + cubeCards.add(new CardIdentity("Blightning", "")); + cubeCards.add(new CardIdentity("Blind Creeper", "")); + cubeCards.add(new CardIdentity("Blind Hunter", "")); + cubeCards.add(new CardIdentity("Blind Zealot", "")); + cubeCards.add(new CardIdentity("Blinding Beam", "")); + cubeCards.add(new CardIdentity("Blisterstick Shaman", "")); + cubeCards.add(new CardIdentity("Blizzard Specter", "")); + cubeCards.add(new CardIdentity("Blood Artist", "")); + cubeCards.add(new CardIdentity("Blood Ogre", "")); + cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); + cubeCards.add(new CardIdentity("Bloodflow Connoisseur", "")); + cubeCards.add(new CardIdentity("Bloodhusk Ritualist", "")); + cubeCards.add(new CardIdentity("Boggart Ram-Gang", "")); + cubeCards.add(new CardIdentity("Boldwyr Intimidator", "")); + cubeCards.add(new CardIdentity("Bomber Corps", "")); + cubeCards.add(new CardIdentity("Bonds of Faith", "")); + cubeCards.add(new CardIdentity("Bonds of Quicksilver", "")); + cubeCards.add(new CardIdentity("Bonesplitter", "")); + cubeCards.add(new CardIdentity("Boros Charm", "")); + cubeCards.add(new CardIdentity("Boros Elite", "")); + cubeCards.add(new CardIdentity("Boros Garrison", "")); + cubeCards.add(new CardIdentity("Boros Guildgate", "")); + cubeCards.add(new CardIdentity("Boros Guildmage", "")); + cubeCards.add(new CardIdentity("Boros Keyrune", "")); + cubeCards.add(new CardIdentity("Brackwater Elemental", "")); + cubeCards.add(new CardIdentity("Brago's Favor", "")); + cubeCards.add(new CardIdentity("Bramblesnap", "")); + cubeCards.add(new CardIdentity("Branching Bolt", "")); + cubeCards.add(new CardIdentity("Briarhorn", "")); + cubeCards.add(new CardIdentity("Brimstone Volley", "")); + cubeCards.add(new CardIdentity("Brink of Disaster", "")); + cubeCards.add(new CardIdentity("Burn Trail", "")); + cubeCards.add(new CardIdentity("Burning Oil", "")); + cubeCards.add(new CardIdentity("Burning-Tree Emissary", "")); + cubeCards.add(new CardIdentity("Burnished Hart", "")); + cubeCards.add(new CardIdentity("Burrenton Bombardier", "")); + cubeCards.add(new CardIdentity("Burst Lightning", "")); + cubeCards.add(new CardIdentity("Cage of Hands", "")); + cubeCards.add(new CardIdentity("Call of the Nightwing", "")); + cubeCards.add(new CardIdentity("Canker Abomination", "")); + cubeCards.add(new CardIdentity("Cankerous Thirst", "")); + cubeCards.add(new CardIdentity("Caravan Escort", "")); + cubeCards.add(new CardIdentity("Careful Consideration", "")); + cubeCards.add(new CardIdentity("Carnage Gladiator", "")); + cubeCards.add(new CardIdentity("Cartel Aristocrat", "")); + cubeCards.add(new CardIdentity("Cauldron Haze", "")); + cubeCards.add(new CardIdentity("Celestial Crusader", "")); + cubeCards.add(new CardIdentity("Celestial Flare", "")); + cubeCards.add(new CardIdentity("Cenn's Enlistment", "")); + cubeCards.add(new CardIdentity("Cenn's Tactician", "")); + cubeCards.add(new CardIdentity("Centaur's Herald", "")); + cubeCards.add(new CardIdentity("Changeling Berserker", "")); + cubeCards.add(new CardIdentity("Chastise", "")); + cubeCards.add(new CardIdentity("Choking Fumes", "")); + cubeCards.add(new CardIdentity("Chronatog Totem", "")); + cubeCards.add(new CardIdentity("Chronomaton", "")); + cubeCards.add(new CardIdentity("Cinder Elemental", "")); + cubeCards.add(new CardIdentity("Circle of Flame", "")); + cubeCards.add(new CardIdentity("Citanul Woodreaders", "")); + cubeCards.add(new CardIdentity("Civilized Scholar", "")); + cubeCards.add(new CardIdentity("Cloistered Youth", "")); + cubeCards.add(new CardIdentity("Cloudfin Raptor", "")); + cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); + cubeCards.add(new CardIdentity("Cogwork Librarian", "")); + cubeCards.add(new CardIdentity("Cogwork Spy", "")); + cubeCards.add(new CardIdentity("Coiling Oracle", "")); + cubeCards.add(new CardIdentity("Common Bond", "")); + cubeCards.add(new CardIdentity("Commune with the Gods", "")); + cubeCards.add(new CardIdentity("Condescend", "")); + cubeCards.add(new CardIdentity("Cone of Flame", "")); + cubeCards.add(new CardIdentity("Contagion Clasp", "")); + cubeCards.add(new CardIdentity("Controvert", "")); + cubeCards.add(new CardIdentity("Coordinated Assault", "")); + cubeCards.add(new CardIdentity("Corpse Traders", "")); + cubeCards.add(new CardIdentity("Court Hussar", "")); + cubeCards.add(new CardIdentity("Courtly Provocateur", "")); + cubeCards.add(new CardIdentity("Crackling Triton", "")); + cubeCards.add(new CardIdentity("Cradle to Grave", "")); + cubeCards.add(new CardIdentity("Crag Puca", "")); + cubeCards.add(new CardIdentity("Crimson Muckwader", "")); + cubeCards.add(new CardIdentity("Crocanura", "")); + cubeCards.add(new CardIdentity("Crookclaw Transmuter", "")); + cubeCards.add(new CardIdentity("Cruel Edict", "")); + cubeCards.add(new CardIdentity("Crypt Champion", "")); + cubeCards.add(new CardIdentity("Cryptic Annelid", "")); + cubeCards.add(new CardIdentity("Crystal Shard", "")); + cubeCards.add(new CardIdentity("Crystalline Nautilus", "")); + cubeCards.add(new CardIdentity("Dakra Mystic", "")); + cubeCards.add(new CardIdentity("Daring Skyjek", "")); + cubeCards.add(new CardIdentity("Darkblast", "")); + cubeCards.add(new CardIdentity("Darkthicket Wolf", "")); + cubeCards.add(new CardIdentity("Dauntless Onslaught", "")); + cubeCards.add(new CardIdentity("Dauntless River Marshal", "")); + cubeCards.add(new CardIdentity("Dawn Charm", "")); + cubeCards.add(new CardIdentity("Dawnglare Invoker", "")); + cubeCards.add(new CardIdentity("Dawntreader Elk", "")); + cubeCards.add(new CardIdentity("Dead Reckoning", "")); + cubeCards.add(new CardIdentity("Deadly Allure", "")); + cubeCards.add(new CardIdentity("Death Denied", "")); + cubeCards.add(new CardIdentity("Deathbellow Raider", "")); + cubeCards.add(new CardIdentity("Death-Hood Cobra", "")); + cubeCards.add(new CardIdentity("Deceiver Exarch", "")); + cubeCards.add(new CardIdentity("Deepcavern Imp", "")); + cubeCards.add(new CardIdentity("Demonic Taskmaster", "")); + cubeCards.add(new CardIdentity("Deputy of Acquittals", "")); + cubeCards.add(new CardIdentity("Desecrator Hag", "")); + cubeCards.add(new CardIdentity("Devour Flesh", "")); + cubeCards.add(new CardIdentity("Devouring Light", "")); + cubeCards.add(new CardIdentity("Diabolic Tutor", "")); + cubeCards.add(new CardIdentity("Dimir Aqueduct", "")); + cubeCards.add(new CardIdentity("Dimir Charm", "")); + cubeCards.add(new CardIdentity("Dimir Guildgate", "")); + cubeCards.add(new CardIdentity("Dimir Guildmage", "")); + cubeCards.add(new CardIdentity("Dimir House Guard", "")); + cubeCards.add(new CardIdentity("Dimir Infiltrator", "")); + cubeCards.add(new CardIdentity("Dimir Keyrune", "")); + cubeCards.add(new CardIdentity("Dimir Machinations", "")); + cubeCards.add(new CardIdentity("Disciple of Deceit", "")); + cubeCards.add(new CardIdentity("Disciple of Griselbrand", "")); + cubeCards.add(new CardIdentity("Dispense Justice", "")); + cubeCards.add(new CardIdentity("Dissolve", "")); + cubeCards.add(new CardIdentity("Divine Verdict", "")); + cubeCards.add(new CardIdentity("Domestication", "")); + cubeCards.add(new CardIdentity("Double Stroke", "")); + cubeCards.add(new CardIdentity("Down // Dirty", "")); + cubeCards.add(new CardIdentity("Dragon Egg", "")); + cubeCards.add(new CardIdentity("Dragon Mantle", "")); + cubeCards.add(new CardIdentity("Dread Statuary", "")); + cubeCards.add(new CardIdentity("Dreamscape Artist", "")); + cubeCards.add(new CardIdentity("Dreg Mangler", "")); + cubeCards.add(new CardIdentity("Drift of Phantasms", "")); + cubeCards.add(new CardIdentity("Drifter il-Dal", "")); + cubeCards.add(new CardIdentity("Drown in Sorrow", "")); + cubeCards.add(new CardIdentity("Druid's Familiar", "")); + cubeCards.add(new CardIdentity("Drumhunter", "")); + cubeCards.add(new CardIdentity("Durkwood Baloth", "")); + cubeCards.add(new CardIdentity("Durkwood Tracker", "")); + cubeCards.add(new CardIdentity("Duskmantle Guildmage", "")); + cubeCards.add(new CardIdentity("Duty-Bound Dead", "")); + cubeCards.add(new CardIdentity("Earthbrawn", "")); + cubeCards.add(new CardIdentity("Edge of Autumn", "")); + cubeCards.add(new CardIdentity("Eel Umbra", "")); + cubeCards.add(new CardIdentity("Electrolyze", "")); + cubeCards.add(new CardIdentity("Emblem of the Warmind", "")); + cubeCards.add(new CardIdentity("Emrakul's Hatcher", "")); + cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); + cubeCards.add(new CardIdentity("Enlarge", "")); + cubeCards.add(new CardIdentity("Enlisted Wurm", "")); + cubeCards.add(new CardIdentity("Entomber Exarch", "")); + cubeCards.add(new CardIdentity("Ephara's Enlightenment", "")); + cubeCards.add(new CardIdentity("Erebos's Emissary", "")); + cubeCards.add(new CardIdentity("Erratic Mutation", "")); + cubeCards.add(new CardIdentity("Esper Panorama", "")); + cubeCards.add(new CardIdentity("Essence Scatter", "")); + cubeCards.add(new CardIdentity("Everflame Eidolon", "")); + cubeCards.add(new CardIdentity("Evolution Charm", "")); + cubeCards.add(new CardIdentity("Executioner's Swing", "")); + cubeCards.add(new CardIdentity("Faerie Conclave", "")); + cubeCards.add(new CardIdentity("Faith's Fetters", "")); + cubeCards.add(new CardIdentity("Falkenrath Exterminator", "")); + cubeCards.add(new CardIdentity("Falkenrath Noble", "")); + cubeCards.add(new CardIdentity("Fallen Ideal", "")); + cubeCards.add(new CardIdentity("Familiar's Ruse", "")); + cubeCards.add(new CardIdentity("Fanatic of Xenagos", "")); + cubeCards.add(new CardIdentity("Far // Away", "")); + cubeCards.add(new CardIdentity("Fatal Attraction", "")); + cubeCards.add(new CardIdentity("Fatestitcher", "")); + cubeCards.add(new CardIdentity("Fearsome Temper", "")); + cubeCards.add(new CardIdentity("Feral Invocation", "")); + cubeCards.add(new CardIdentity("Festerhide Boar", "")); + cubeCards.add(new CardIdentity("Fettergeist", "")); + cubeCards.add(new CardIdentity("Fiend Hunter", "")); + cubeCards.add(new CardIdentity("Fiery Fall", "")); + cubeCards.add(new CardIdentity("Final-Sting Faerie", "")); + cubeCards.add(new CardIdentity("Fire at Will", "")); + cubeCards.add(new CardIdentity("Fireball", "")); + cubeCards.add(new CardIdentity("Firemaw Kavu", "")); + cubeCards.add(new CardIdentity("Firespout", "")); + cubeCards.add(new CardIdentity("Fists of Ironwood", "")); + cubeCards.add(new CardIdentity("Flame-Kin War Scout", "")); + cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); + cubeCards.add(new CardIdentity("Flamewave Invoker", "")); + cubeCards.add(new CardIdentity("Flash Conscription", "")); + cubeCards.add(new CardIdentity("Fleetfeather Cockatrice", "")); + cubeCards.add(new CardIdentity("Fleshbag Marauder", "")); + cubeCards.add(new CardIdentity("Fleshwrither", "")); + cubeCards.add(new CardIdentity("Flickerwisp", "")); + cubeCards.add(new CardIdentity("Flight of Fancy", "")); + cubeCards.add(new CardIdentity("Flinthoof Boar", "")); + cubeCards.add(new CardIdentity("Floodchaser", "")); + cubeCards.add(new CardIdentity("Fluxcharger", "")); + cubeCards.add(new CardIdentity("Forbidding Watchtower", "")); + cubeCards.add(new CardIdentity("Foriysian Totem", "")); + cubeCards.add(new CardIdentity("Forked Bolt", "")); + cubeCards.add(new CardIdentity("Forlorn Pseudamma", "")); + cubeCards.add(new CardIdentity("Freed from the Real", "")); + cubeCards.add(new CardIdentity("Frenzied Goblin", "")); + cubeCards.add(new CardIdentity("Frilled Oculus", "")); + cubeCards.add(new CardIdentity("Frontline Sage", "")); + cubeCards.add(new CardIdentity("Frostburn Weird", "")); + cubeCards.add(new CardIdentity("Fungal Sprouting", "")); + cubeCards.add(new CardIdentity("Galvanic Arc", "")); + cubeCards.add(new CardIdentity("Gargoyle Sentinel", "")); + cubeCards.add(new CardIdentity("Gatekeeper of Malakir", "")); + cubeCards.add(new CardIdentity("Gatstaf Shepherd", "")); + cubeCards.add(new CardIdentity("Gelectrode", "")); + cubeCards.add(new CardIdentity("Generator Servant", "")); + cubeCards.add(new CardIdentity("Genju of the Cedars", "")); + cubeCards.add(new CardIdentity("Genju of the Falls", "")); + cubeCards.add(new CardIdentity("Genju of the Fens", "")); + cubeCards.add(new CardIdentity("Genju of the Fields", "")); + cubeCards.add(new CardIdentity("Genju of the Spires", "")); + cubeCards.add(new CardIdentity("Geyser Glider", "")); + cubeCards.add(new CardIdentity("Ghitu Encampment", "")); + cubeCards.add(new CardIdentity("Ghor-Clan Rampager", "")); + cubeCards.add(new CardIdentity("Ghost-Lit Nourisher", "")); + cubeCards.add(new CardIdentity("Ghost-Lit Raider", "")); + cubeCards.add(new CardIdentity("Ghost-Lit Redeemer", "")); + cubeCards.add(new CardIdentity("Ghost-Lit Warder", "")); + cubeCards.add(new CardIdentity("Ghostly Prison", "")); + cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); + cubeCards.add(new CardIdentity("Gilder Bairn", "")); + cubeCards.add(new CardIdentity("Gilt-Leaf Ambush", "")); + cubeCards.add(new CardIdentity("Give // Take", "")); + cubeCards.add(new CardIdentity("Glarewielder", "")); + cubeCards.add(new CardIdentity("Gleam of Resistance", "")); + cubeCards.add(new CardIdentity("Glimmerpoint Stag", "")); + cubeCards.add(new CardIdentity("Glint Hawk Idol", "")); + cubeCards.add(new CardIdentity("Gluttonous Slime", "")); + cubeCards.add(new CardIdentity("Gnarled Scarhide", "")); + cubeCards.add(new CardIdentity("Gnarlid Pack", "")); + cubeCards.add(new CardIdentity("Goblin Bushwhacker", "")); + cubeCards.add(new CardIdentity("Goblin Electromancer", "")); + cubeCards.add(new CardIdentity("Goblin Wardriver", "")); + cubeCards.add(new CardIdentity("God-Favored General", "")); + cubeCards.add(new CardIdentity("Goldmeadow Lookout", "")); + cubeCards.add(new CardIdentity("Goldnight Commander", "")); + cubeCards.add(new CardIdentity("Golgari Charm", "")); + cubeCards.add(new CardIdentity("Golgari Decoy", "")); + cubeCards.add(new CardIdentity("Golgari Guildgate", "")); + cubeCards.add(new CardIdentity("Golgari Keyrune", "")); + cubeCards.add(new CardIdentity("Golgari Rot Farm", "")); + cubeCards.add(new CardIdentity("Gorehorn Minotaurs", "")); + cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); + cubeCards.add(new CardIdentity("Gorgon Flail", "")); + cubeCards.add(new CardIdentity("Grab the Reins", "")); + cubeCards.add(new CardIdentity("Grafted Wargear", "")); + cubeCards.add(new CardIdentity("Grasp of Phantoms", "")); + cubeCards.add(new CardIdentity("Grave Peril", "")); + cubeCards.add(new CardIdentity("Graverobber Spider", "")); + cubeCards.add(new CardIdentity("Gray Merchant of Asphodel", "")); + cubeCards.add(new CardIdentity("Greater Stone Spirit", "")); + cubeCards.add(new CardIdentity("Grief Tyrant", "")); + cubeCards.add(new CardIdentity("Grim Harvest", "")); + cubeCards.add(new CardIdentity("Grixis Panorama", "")); + cubeCards.add(new CardIdentity("Grixis Slavedriver", "")); + cubeCards.add(new CardIdentity("Grizzled Outcasts", "")); + cubeCards.add(new CardIdentity("Groundswell", "")); + cubeCards.add(new CardIdentity("Gruul Charm", "")); + cubeCards.add(new CardIdentity("Gruul Guildgate", "")); + cubeCards.add(new CardIdentity("Gruul Keyrune", "")); + cubeCards.add(new CardIdentity("Gruul Turf", "")); + cubeCards.add(new CardIdentity("Gwyllion Hedge-Mage", "")); + cubeCards.add(new CardIdentity("Haazda Snare Squad", "")); + cubeCards.add(new CardIdentity("Hada Spy Patrol", "")); + cubeCards.add(new CardIdentity("Hail of Arrows", "")); + cubeCards.add(new CardIdentity("Hammerhand", "")); + cubeCards.add(new CardIdentity("Hands of Binding", "")); + cubeCards.add(new CardIdentity("Hanweir Watchkeep", "")); + cubeCards.add(new CardIdentity("Harbor Bandit", "")); + cubeCards.add(new CardIdentity("Harm's Way", "")); + cubeCards.add(new CardIdentity("Harvest Gwyllion", "")); + cubeCards.add(new CardIdentity("Havengul Vampire", "")); + cubeCards.add(new CardIdentity("Heartstabber Mosquito", "")); + cubeCards.add(new CardIdentity("Hedge Troll", "")); + cubeCards.add(new CardIdentity("Heliod's Emissary", "")); + cubeCards.add(new CardIdentity("Helium Squirter", "")); + cubeCards.add(new CardIdentity("Hellhole Flailer", "")); + cubeCards.add(new CardIdentity("Henchfiend of Ukor", "")); + cubeCards.add(new CardIdentity("Hidden Strings", "")); + cubeCards.add(new CardIdentity("Hired Torturer", "")); + cubeCards.add(new CardIdentity("Homicidal Seclusion", "")); + cubeCards.add(new CardIdentity("Hopeful Eidolon", "")); + cubeCards.add(new CardIdentity("Horizon Chimera", "")); + cubeCards.add(new CardIdentity("Hour of Need", "")); + cubeCards.add(new CardIdentity("Hunger of the Howlpack", "")); + cubeCards.add(new CardIdentity("Hunt the Weak", "")); + cubeCards.add(new CardIdentity("Hunting Triad", "")); + cubeCards.add(new CardIdentity("Hyena Umbra", "")); + cubeCards.add(new CardIdentity("Hypervolt Grasp", "")); + cubeCards.add(new CardIdentity("Icatian Crier", "")); + cubeCards.add(new CardIdentity("Ichor Slick", "")); + cubeCards.add(new CardIdentity("Ill-Tempered Cyclops", "")); + cubeCards.add(new CardIdentity("Immediate Action", "")); + cubeCards.add(new CardIdentity("Impaler Shrike", "")); + cubeCards.add(new CardIdentity("Incremental Blight", "")); + cubeCards.add(new CardIdentity("Incremental Growth", "")); + cubeCards.add(new CardIdentity("Inferno Trap", "")); + cubeCards.add(new CardIdentity("Infiltration Lens", "")); + cubeCards.add(new CardIdentity("Inkfathom Witch", "")); + cubeCards.add(new CardIdentity("Inner-Flame Acolyte", "")); + cubeCards.add(new CardIdentity("Inspired Sprite", "")); + cubeCards.add(new CardIdentity("Intimidation Bolt", "")); + cubeCards.add(new CardIdentity("Into the Roil", "")); + cubeCards.add(new CardIdentity("Izzet Boilerworks", "")); + cubeCards.add(new CardIdentity("Izzet Charm", "")); + cubeCards.add(new CardIdentity("Izzet Guildgate", "")); + cubeCards.add(new CardIdentity("Izzet Keyrune", "")); + cubeCards.add(new CardIdentity("Izzet Staticaster", "")); + cubeCards.add(new CardIdentity("Jackal Familiar", "")); + cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); + cubeCards.add(new CardIdentity("Jorubai Murk Lurker", "")); + cubeCards.add(new CardIdentity("Journey of Discovery", "")); + cubeCards.add(new CardIdentity("Judge Unworthy", "")); + cubeCards.add(new CardIdentity("Jund Panorama", "")); + cubeCards.add(new CardIdentity("Jungle Weaver", "")); + cubeCards.add(new CardIdentity("Juniper Order Ranger", "")); + cubeCards.add(new CardIdentity("Kabira Vindicator", "")); + cubeCards.add(new CardIdentity("Kabuto Moth", "")); + cubeCards.add(new CardIdentity("Kathari Bomber", "")); + cubeCards.add(new CardIdentity("Kavu Primarch", "")); + cubeCards.add(new CardIdentity("Keepsake Gorgon", "")); + cubeCards.add(new CardIdentity("Kessig Wolf", "")); + cubeCards.add(new CardIdentity("Kingpin's Pet", "")); + cubeCards.add(new CardIdentity("Kiora's Follower", "")); + cubeCards.add(new CardIdentity("Kird Chieftain", "")); + cubeCards.add(new CardIdentity("Kitchen Finks", "")); + cubeCards.add(new CardIdentity("Knight of Cliffhaven", "")); + cubeCards.add(new CardIdentity("Knight of Obligation", "")); + cubeCards.add(new CardIdentity("Knight of the Holy Nimbus", "")); + cubeCards.add(new CardIdentity("Knight of the Skyward Eye", "")); + cubeCards.add(new CardIdentity("Knightly Valor", "")); + cubeCards.add(new CardIdentity("Kor Aeronaut", "")); + cubeCards.add(new CardIdentity("Kor Skyfisher", "")); + cubeCards.add(new CardIdentity("Korozda Guildmage", "")); + cubeCards.add(new CardIdentity("Kozilek's Predator", "")); + cubeCards.add(new CardIdentity("Kruin Striker", "")); + cubeCards.add(new CardIdentity("Lace with Moonglove", "")); + cubeCards.add(new CardIdentity("Lambholt Elder", "")); + cubeCards.add(new CardIdentity("Lapse of Certainty", "")); + cubeCards.add(new CardIdentity("Lead the Stampede", "")); + cubeCards.add(new CardIdentity("Leaden Fists", "")); + cubeCards.add(new CardIdentity("Leafcrown Dryad", "")); + cubeCards.add(new CardIdentity("Leafdrake Roost", "")); + cubeCards.add(new CardIdentity("Leech Bonder", "")); + cubeCards.add(new CardIdentity("Lightkeeper of Emeria", "")); + cubeCards.add(new CardIdentity("Lightning Mauler", "")); + cubeCards.add(new CardIdentity("Lignify", "")); + cubeCards.add(new CardIdentity("Lingering Souls", "")); + cubeCards.add(new CardIdentity("Llanowar Augur", "")); + cubeCards.add(new CardIdentity("Logic Knot", "")); + cubeCards.add(new CardIdentity("Looter il-Kor", "")); + cubeCards.add(new CardIdentity("Lorescale Coatl", "")); + cubeCards.add(new CardIdentity("Lost in the Mist", "")); + cubeCards.add(new CardIdentity("Loyal Pegasus", "")); + cubeCards.add(new CardIdentity("Lust for War", "")); + cubeCards.add(new CardIdentity("Lyev Skyknight", "")); + cubeCards.add(new CardIdentity("Mad Prophet", "")); + cubeCards.add(new CardIdentity("Madcap Skills", "")); + cubeCards.add(new CardIdentity("Magma Jet", "")); + cubeCards.add(new CardIdentity("Makeshift Mannequin", "")); + cubeCards.add(new CardIdentity("Mana Leak", "")); + cubeCards.add(new CardIdentity("Marrow Chomper", "")); + cubeCards.add(new CardIdentity("Marsh Flitter", "")); + cubeCards.add(new CardIdentity("Marshaling Cry", "")); + cubeCards.add(new CardIdentity("Martial Glory", "")); + cubeCards.add(new CardIdentity("Masked Admirers", "")); + cubeCards.add(new CardIdentity("Master Splicer", "")); + cubeCards.add(new CardIdentity("Maze Glider", "")); + cubeCards.add(new CardIdentity("Meadowboon", "")); + cubeCards.add(new CardIdentity("Mercy Killing", "")); + cubeCards.add(new CardIdentity("Military Intelligence", "")); + cubeCards.add(new CardIdentity("Mirrodin's Core", "")); + cubeCards.add(new CardIdentity("Mist Raven", "")); + cubeCards.add(new CardIdentity("Mistblade Shinobi", "")); + cubeCards.add(new CardIdentity("Moan of the Unhallowed", "")); + cubeCards.add(new CardIdentity("Mogg War Marshal", "")); + cubeCards.add(new CardIdentity("Mogis's Warhound", "")); + cubeCards.add(new CardIdentity("Moldervine Cloak", "")); + cubeCards.add(new CardIdentity("Moriok Replica", "")); + cubeCards.add(new CardIdentity("Morkrut Banshee", "")); + cubeCards.add(new CardIdentity("Mortarpod", "")); + cubeCards.add(new CardIdentity("Mortis Dogs", "")); + cubeCards.add(new CardIdentity("Muddle the Mixture", "")); + cubeCards.add(new CardIdentity("Mulldrifter", "")); + cubeCards.add(new CardIdentity("Murderous Redcap", "")); + cubeCards.add(new CardIdentity("Muzzio's Preparations", "")); + cubeCards.add(new CardIdentity("Mystic Retrieval", "")); + cubeCards.add(new CardIdentity("Mystical Teachings", "")); + cubeCards.add(new CardIdentity("Naya Panorama", "")); + cubeCards.add(new CardIdentity("Nearheath Pilgrim", "")); + cubeCards.add(new CardIdentity("Necrobite", "")); + cubeCards.add(new CardIdentity("Necrogenesis", "")); + cubeCards.add(new CardIdentity("Nessian Asp", "")); + cubeCards.add(new CardIdentity("Nest Invader", "")); + cubeCards.add(new CardIdentity("Neurok Invisimancer", "")); + cubeCards.add(new CardIdentity("Nevermaker", "")); + cubeCards.add(new CardIdentity("New Prahv Guildmage", "")); + cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); + cubeCards.add(new CardIdentity("Niblis of the Breath", "")); + cubeCards.add(new CardIdentity("Nightbird's Clutches", "")); + cubeCards.add(new CardIdentity("Nightfire Giant", "")); + cubeCards.add(new CardIdentity("Nightshade Assassin", "")); + cubeCards.add(new CardIdentity("Nightshade Peddler", "")); + cubeCards.add(new CardIdentity("Nimbus Naiad", "")); + cubeCards.add(new CardIdentity("Ninja of the Deep Hours", "")); + cubeCards.add(new CardIdentity("Nirkana Cutthroat", "")); + cubeCards.add(new CardIdentity("Nivix Cyclops", "")); + cubeCards.add(new CardIdentity("Nivix Guildmage", "")); + cubeCards.add(new CardIdentity("Nucklavee", "")); + cubeCards.add(new CardIdentity("Nylea's Emissary", "")); + cubeCards.add(new CardIdentity("Nyx Weaver", "")); + cubeCards.add(new CardIdentity("Nyx-Fleece Ram", "")); + cubeCards.add(new CardIdentity("Observant Alseid", "")); + cubeCards.add(new CardIdentity("Ocular Halo", "")); + cubeCards.add(new CardIdentity("O-Naginata", "")); + cubeCards.add(new CardIdentity("Onyx Mage", "")); + cubeCards.add(new CardIdentity("Oppressive Rays", "")); + cubeCards.add(new CardIdentity("Ordeal of Erebos", "")); + cubeCards.add(new CardIdentity("Ordeal of Heliod", "")); + cubeCards.add(new CardIdentity("Ordeal of Nylea", "")); + cubeCards.add(new CardIdentity("Ordeal of Purphoros", "")); + cubeCards.add(new CardIdentity("Ordeal of Thassa", "")); + cubeCards.add(new CardIdentity("Order of the Golden Cricket", "")); + cubeCards.add(new CardIdentity("Ornitharch", "")); + cubeCards.add(new CardIdentity("Orzhov Basilica", "")); + cubeCards.add(new CardIdentity("Orzhov Charm", "")); + cubeCards.add(new CardIdentity("Orzhov Euthanist", "")); + cubeCards.add(new CardIdentity("Orzhov Guildgate", "")); + cubeCards.add(new CardIdentity("Orzhov Keyrune", "")); + cubeCards.add(new CardIdentity("Otherworldly Journey", "")); + cubeCards.add(new CardIdentity("Ovinize", "")); + cubeCards.add(new CardIdentity("Paradise Mantle", "")); + cubeCards.add(new CardIdentity("Patagia Viper", "")); + cubeCards.add(new CardIdentity("Pathbreaker Wurm", "")); + cubeCards.add(new CardIdentity("Pawn of Ulamog", "")); + cubeCards.add(new CardIdentity("Penumbra Spider", "")); + cubeCards.add(new CardIdentity("Perilous Shadow", "")); + cubeCards.add(new CardIdentity("Perplex", "")); + cubeCards.add(new CardIdentity("Petrified Plating", "")); + cubeCards.add(new CardIdentity("Phantasmal Dragon", "")); + cubeCards.add(new CardIdentity("Phantom Wings", "")); + cubeCards.add(new CardIdentity("Pharagax Giant", "")); + cubeCards.add(new CardIdentity("Pheres-Band Raiders", "")); + cubeCards.add(new CardIdentity("Phyrexian Rager", "")); + cubeCards.add(new CardIdentity("Phyrexian Totem", "")); + cubeCards.add(new CardIdentity("Phytoburst", "")); + cubeCards.add(new CardIdentity("Pit Fight", "")); + cubeCards.add(new CardIdentity("Pitfall Trap", "")); + cubeCards.add(new CardIdentity("Plated Geopede", "")); + cubeCards.add(new CardIdentity("Plaxcaster Frogling", "")); + cubeCards.add(new CardIdentity("Plaxmanta", "")); + cubeCards.add(new CardIdentity("Plumes of Peace", "")); + cubeCards.add(new CardIdentity("Plumeveil", "")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); + cubeCards.add(new CardIdentity("Pouncing Wurm", "")); + cubeCards.add(new CardIdentity("Power Play", "")); + cubeCards.add(new CardIdentity("Premature Burial", "")); + cubeCards.add(new CardIdentity("Prismatic Lens", "")); + cubeCards.add(new CardIdentity("Prized Elephant", "")); + cubeCards.add(new CardIdentity("Profit // Loss", "")); + cubeCards.add(new CardIdentity("Prophetic Prism", "")); + cubeCards.add(new CardIdentity("Puncturing Light", "")); + cubeCards.add(new CardIdentity("Purphoros's Emissary", "")); + cubeCards.add(new CardIdentity("Pursuit of Flight", "")); + cubeCards.add(new CardIdentity("Putrid Leech", "")); + cubeCards.add(new CardIdentity("Pyreheart Wolf", "")); + cubeCards.add(new CardIdentity("Pyrite Spellbomb", "")); + cubeCards.add(new CardIdentity("Pyroclasm", "")); + cubeCards.add(new CardIdentity("Qasali Ambusher", "")); + cubeCards.add(new CardIdentity("Qasali Pridemage", "")); + cubeCards.add(new CardIdentity("Quest for the Gemblades", "")); + cubeCards.add(new CardIdentity("Quest for the Gravelord", "")); + cubeCards.add(new CardIdentity("Quiet Disrepair", "")); + cubeCards.add(new CardIdentity("Rakdos Carnarium", "")); + cubeCards.add(new CardIdentity("Rakdos Charm", "")); + cubeCards.add(new CardIdentity("Rakdos Guildgate", "")); + cubeCards.add(new CardIdentity("Rakdos Keyrune", "")); + cubeCards.add(new CardIdentity("Rally the Peasants", "")); + cubeCards.add(new CardIdentity("Reach of Branches", "")); + cubeCards.add(new CardIdentity("Read the Bones", "")); + cubeCards.add(new CardIdentity("Reciprocate", "")); + cubeCards.add(new CardIdentity("Reckless Waif", "")); + cubeCards.add(new CardIdentity("Refraction Trap", "")); + cubeCards.add(new CardIdentity("Renowned Weaver", "")); + cubeCards.add(new CardIdentity("Repeal", "")); + cubeCards.add(new CardIdentity("Repel Intruders", "")); + cubeCards.add(new CardIdentity("Resize", "")); + cubeCards.add(new CardIdentity("Restless Apparition", "")); + cubeCards.add(new CardIdentity("Returned Phalanx", "")); + cubeCards.add(new CardIdentity("Revenant Patriarch", "")); + cubeCards.add(new CardIdentity("Ribbons of Night", "")); + cubeCards.add(new CardIdentity("Ridge Rannet", "")); + cubeCards.add(new CardIdentity("Rift Bolt", "")); + cubeCards.add(new CardIdentity("Riftmarked Knight", "")); + cubeCards.add(new CardIdentity("Riftwing Cloudskate", "")); + cubeCards.add(new CardIdentity("Ring of Evos Isle", "")); + cubeCards.add(new CardIdentity("Ring of Kalonia", "")); + cubeCards.add(new CardIdentity("Ring of Thune", "")); + cubeCards.add(new CardIdentity("Ring of Valkas", "")); + cubeCards.add(new CardIdentity("Ring of Xathrid", "")); + cubeCards.add(new CardIdentity("Rivals' Duel", "")); + cubeCards.add(new CardIdentity("River Boa", "")); + cubeCards.add(new CardIdentity("River's Grasp", "")); + cubeCards.add(new CardIdentity("Rix Maadi Guildmage", "")); + cubeCards.add(new CardIdentity("Roc Egg", "")); + cubeCards.add(new CardIdentity("Rolling Temblor", "")); + cubeCards.add(new CardIdentity("Rootwalla", "")); + cubeCards.add(new CardIdentity("Rubblebelt Maaka", "")); + cubeCards.add(new CardIdentity("Satyr Nyx-Smith", "")); + cubeCards.add(new CardIdentity("Savage Twister", "")); + cubeCards.add(new CardIdentity("Scab-Clan Charger", "")); + cubeCards.add(new CardIdentity("Scab-Clan Mauler", "")); + cubeCards.add(new CardIdentity("Scavenger Drake", "")); + cubeCards.add(new CardIdentity("Scholar of Athreos", "")); + cubeCards.add(new CardIdentity("Scourge Devil", "")); + cubeCards.add(new CardIdentity("Screeching Bat", "")); + cubeCards.add(new CardIdentity("Sealock Monster", "")); + cubeCards.add(new CardIdentity("Search for Tomorrow", "")); + cubeCards.add(new CardIdentity("Searing Blaze", "")); + cubeCards.add(new CardIdentity("Secretkeeper", "")); + cubeCards.add(new CardIdentity("Security Blockade", "")); + cubeCards.add(new CardIdentity("Seedcradle Witch", "")); + cubeCards.add(new CardIdentity("Selesnya Charm", "")); + cubeCards.add(new CardIdentity("Selesnya Evangel", "")); + cubeCards.add(new CardIdentity("Selesnya Guildgate", "")); + cubeCards.add(new CardIdentity("Selesnya Keyrune", "")); + cubeCards.add(new CardIdentity("Selesnya Sanctuary", "")); + cubeCards.add(new CardIdentity("Selkie Hedge-Mage", "")); + cubeCards.add(new CardIdentity("Sensei's Divining Top", "")); + cubeCards.add(new CardIdentity("Sentry of the Underworld", "")); + cubeCards.add(new CardIdentity("Serrated Arrows", "")); + cubeCards.add(new CardIdentity("Serum Visions", "")); + cubeCards.add(new CardIdentity("Servant of Tymaret", "")); + cubeCards.add(new CardIdentity("Sewer Shambler", "")); + cubeCards.add(new CardIdentity("Shade of Trokair", "")); + cubeCards.add(new CardIdentity("Shadow Lance", "")); + cubeCards.add(new CardIdentity("Shambling Remains", "")); + cubeCards.add(new CardIdentity("Shambling Shell", "")); + cubeCards.add(new CardIdentity("Shield of the Righteous", "")); + cubeCards.add(new CardIdentity("Shimmering Grotto", "")); + cubeCards.add(new CardIdentity("Shinen of Life's Roar", "")); + cubeCards.add(new CardIdentity("Shipwreck Singer", "")); + cubeCards.add(new CardIdentity("Shrewd Hatchling", "")); + cubeCards.add(new CardIdentity("Shriekmaw", "")); + cubeCards.add(new CardIdentity("Shrike Harpy", "")); + cubeCards.add(new CardIdentity("Shuriken", "")); + cubeCards.add(new CardIdentity("Sickleslicer", "")); + cubeCards.add(new CardIdentity("Sightless Brawler", "")); + cubeCards.add(new CardIdentity("Sigil Blessing", "")); + cubeCards.add(new CardIdentity("Sigil of the Nayan Gods", "")); + cubeCards.add(new CardIdentity("Sigiled Starfish", "")); + cubeCards.add(new CardIdentity("Silkbind Faerie", "")); + cubeCards.add(new CardIdentity("Simic Charm", "")); + cubeCards.add(new CardIdentity("Simic Fluxmage", "")); + cubeCards.add(new CardIdentity("Simic Growth Chamber", "")); + cubeCards.add(new CardIdentity("Simic Guildgate", "")); + cubeCards.add(new CardIdentity("Simic Keyrune", "")); + cubeCards.add(new CardIdentity("Siren of the Fanged Coast", "")); + cubeCards.add(new CardIdentity("Skarrg Guildmage", "")); + cubeCards.add(new CardIdentity("Skinbrand Goblin", "")); + cubeCards.add(new CardIdentity("Skinrender", "")); + cubeCards.add(new CardIdentity("Skinwing", "")); + cubeCards.add(new CardIdentity("Skirsdag Cultist", "")); + cubeCards.add(new CardIdentity("Skitter of Lizards", "")); + cubeCards.add(new CardIdentity("Sky Hussar", "")); + cubeCards.add(new CardIdentity("Skyknight Legionnaire", "")); + cubeCards.add(new CardIdentity("Skymark Roc", "")); + cubeCards.add(new CardIdentity("Slaughterhorn", "")); + cubeCards.add(new CardIdentity("Sluiceway Scorpion", "")); + cubeCards.add(new CardIdentity("Slum Reaper", "")); + cubeCards.add(new CardIdentity("Smallpox", "")); + cubeCards.add(new CardIdentity("Smite", "")); + cubeCards.add(new CardIdentity("Snake of the Golden Grove", "")); + cubeCards.add(new CardIdentity("Snake Umbra", "")); + cubeCards.add(new CardIdentity("Snakeform", "")); + cubeCards.add(new CardIdentity("Somberwald Spider", "")); + cubeCards.add(new CardIdentity("Soratami Savant", "")); + cubeCards.add(new CardIdentity("Soul Manipulation", "")); + cubeCards.add(new CardIdentity("Soul Snuffers", "")); + cubeCards.add(new CardIdentity("Soul Stair Expedition", "")); + cubeCards.add(new CardIdentity("Soulsworn Jury", "")); + cubeCards.add(new CardIdentity("Sparkspitter", "")); + cubeCards.add(new CardIdentity("Spawning Pool", "")); + cubeCards.add(new CardIdentity("Spearpoint Oread", "")); + cubeCards.add(new CardIdentity("Spell Contortion", "")); + cubeCards.add(new CardIdentity("Spell Rupture", "")); + cubeCards.add(new CardIdentity("Spider Spawning", "")); + cubeCards.add(new CardIdentity("Spike Jester", "")); + cubeCards.add(new CardIdentity("Spirespine", "")); + cubeCards.add(new CardIdentity("Spirit en-Dal", "")); + cubeCards.add(new CardIdentity("Spitebellows", "")); + cubeCards.add(new CardIdentity("Spiteful Returned", "")); + cubeCards.add(new CardIdentity("Spitemare", "")); + cubeCards.add(new CardIdentity("Sprout Swarm", "")); + cubeCards.add(new CardIdentity("Squall Drifter", "")); + cubeCards.add(new CardIdentity("Stab Wound", "")); + cubeCards.add(new CardIdentity("Staggershock", "")); + cubeCards.add(new CardIdentity("Stand Firm", "")); + cubeCards.add(new CardIdentity("Stand Together", "")); + cubeCards.add(new CardIdentity("Stingscourger", "")); + cubeCards.add(new CardIdentity("Stinkweed Imp", "")); + cubeCards.add(new CardIdentity("Stitched Drake", "")); + cubeCards.add(new CardIdentity("Stitcher's Apprentice", "")); + cubeCards.add(new CardIdentity("Stonefare Crocodile", "")); + cubeCards.add(new CardIdentity("Stoneshock Giant", "")); + cubeCards.add(new CardIdentity("Stonewright", "")); + cubeCards.add(new CardIdentity("Stormblood Berserker", "")); + cubeCards.add(new CardIdentity("Stormcaller of Keranos", "")); + cubeCards.add(new CardIdentity("Strands of Undeath", "")); + cubeCards.add(new CardIdentity("Strandwalker", "")); + cubeCards.add(new CardIdentity("Strangling Soot", "")); + cubeCards.add(new CardIdentity("Stratus Walk", "")); + cubeCards.add(new CardIdentity("Street Spasm", "")); + cubeCards.add(new CardIdentity("Strider Harness", "")); + cubeCards.add(new CardIdentity("Stun Sniper", "")); + cubeCards.add(new CardIdentity("Sunblade Elf", "")); + cubeCards.add(new CardIdentity("Sunhome Guildmage", "")); + cubeCards.add(new CardIdentity("Survival Cache", "")); + cubeCards.add(new CardIdentity("Swarmborn Giant", "")); + cubeCards.add(new CardIdentity("Swell of Courage", "")); + cubeCards.add(new CardIdentity("Swerve", "")); + cubeCards.add(new CardIdentity("Sylvan Bounty", "")); + cubeCards.add(new CardIdentity("Syndic of Tithes", "")); + cubeCards.add(new CardIdentity("Syphon Life", "")); + cubeCards.add(new CardIdentity("Tandem Lookout", "")); + cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); + cubeCards.add(new CardIdentity("Terrus Wurm", "")); + cubeCards.add(new CardIdentity("Test of Faith", "")); + cubeCards.add(new CardIdentity("Tezzeret's Gambit", "")); + cubeCards.add(new CardIdentity("Thassa's Emissary", "")); + cubeCards.add(new CardIdentity("Thatcher Revolt", "")); + cubeCards.add(new CardIdentity("Think Twice", "")); + cubeCards.add(new CardIdentity("Thornscape Battlemage", "")); + cubeCards.add(new CardIdentity("Thorn-Thrash Viashino", "")); + cubeCards.add(new CardIdentity("Thraben Sentry", "")); + cubeCards.add(new CardIdentity("Thrashing Mossdog", "")); + cubeCards.add(new CardIdentity("Throat Slitter", "")); + cubeCards.add(new CardIdentity("Thrull Parasite", "")); + cubeCards.add(new CardIdentity("Thrummingbird", "")); + cubeCards.add(new CardIdentity("Thunder Totem", "")); + cubeCards.add(new CardIdentity("Thundering Tanadon", "")); + cubeCards.add(new CardIdentity("Thunderous Wrath", "")); + cubeCards.add(new CardIdentity("Thunder-Thrash Elder", "")); + cubeCards.add(new CardIdentity("Tidehollow Sculler", "")); + cubeCards.add(new CardIdentity("Tidewater Minion", "")); + cubeCards.add(new CardIdentity("Timely Reinforcements", "")); + cubeCards.add(new CardIdentity("Titan's Strength", "")); + cubeCards.add(new CardIdentity("Tithe Drinker", "")); + cubeCards.add(new CardIdentity("Tomb Hex", "")); + cubeCards.add(new CardIdentity("Torch Slinger", "")); + cubeCards.add(new CardIdentity("Tormentor Exarch", "")); + cubeCards.add(new CardIdentity("Torrent of Souls", "")); + cubeCards.add(new CardIdentity("Tower Above", "")); + cubeCards.add(new CardIdentity("Towering Thunderfist", "")); + cubeCards.add(new CardIdentity("Tracker's Instincts", "")); + cubeCards.add(new CardIdentity("Tragic Slip", "")); + cubeCards.add(new CardIdentity("Trained Condor", "")); + cubeCards.add(new CardIdentity("Transguild Promenade", "")); + cubeCards.add(new CardIdentity("Traumatic Visions", "")); + cubeCards.add(new CardIdentity("Travel Preparations", "")); + cubeCards.add(new CardIdentity("Traveler's Amulet", "")); + cubeCards.add(new CardIdentity("Treetop Village", "")); + cubeCards.add(new CardIdentity("Trestle Troll", "")); + cubeCards.add(new CardIdentity("Triclopean Sight", "")); + cubeCards.add(new CardIdentity("Trinket Mage", "")); + cubeCards.add(new CardIdentity("Triton Tactics", "")); + cubeCards.add(new CardIdentity("Triumph of Ferocity", "")); + cubeCards.add(new CardIdentity("Trollhide", "")); + cubeCards.add(new CardIdentity("Truefire Paladin", "")); + cubeCards.add(new CardIdentity("Trusted Forcemage", "")); + cubeCards.add(new CardIdentity("Tumble Magnet", "")); + cubeCards.add(new CardIdentity("Turn // Burn", "")); + cubeCards.add(new CardIdentity("Turntimber Basilisk", "")); + cubeCards.add(new CardIdentity("Twinblade Slasher", "")); + cubeCards.add(new CardIdentity("Twinstrike", "")); + cubeCards.add(new CardIdentity("Twisted Abomination", "")); + cubeCards.add(new CardIdentity("Ulvenwald Bear", "")); + cubeCards.add(new CardIdentity("Unburial Rites", "")); + cubeCards.add(new CardIdentity("Undercity Informer", "")); + cubeCards.add(new CardIdentity("Undying Evil", "")); + cubeCards.add(new CardIdentity("Unexpected Potential", "")); + cubeCards.add(new CardIdentity("Unruly Mob", "")); + cubeCards.add(new CardIdentity("Utopia Vow", "")); + cubeCards.add(new CardIdentity("Vampire Outcasts", "")); + cubeCards.add(new CardIdentity("Vanishment", "")); + cubeCards.add(new CardIdentity("Vedalken Anatomist", "")); + cubeCards.add(new CardIdentity("Viashino Firstblade", "")); + cubeCards.add(new CardIdentity("Viashino Shanktail", "")); + cubeCards.add(new CardIdentity("Vigor Mortis", "")); + cubeCards.add(new CardIdentity("Village Bell-Ringer", "")); + cubeCards.add(new CardIdentity("Villagers of Estwald", "")); + cubeCards.add(new CardIdentity("Vines of Vastwood", "")); + cubeCards.add(new CardIdentity("Virulent Swipe", "")); + cubeCards.add(new CardIdentity("Viscera Dragger", "")); + cubeCards.add(new CardIdentity("Vital Splicer", "")); + cubeCards.add(new CardIdentity("Vithian Stinger", "")); + cubeCards.add(new CardIdentity("Vitu-Ghazi Guildmage", "")); + cubeCards.add(new CardIdentity("Vivid Crag", "")); + cubeCards.add(new CardIdentity("Vivid Creek", "")); + cubeCards.add(new CardIdentity("Vivid Grove", "")); + cubeCards.add(new CardIdentity("Vivid Marsh", "")); + cubeCards.add(new CardIdentity("Vivid Meadow", "")); + cubeCards.add(new CardIdentity("Vizkopa Guildmage", "")); + cubeCards.add(new CardIdentity("Volt Charge", "")); + cubeCards.add(new CardIdentity("Vortex Elemental", "")); + cubeCards.add(new CardIdentity("Wakedancer", "")); + cubeCards.add(new CardIdentity("Wakestone Gargoyle", "")); + cubeCards.add(new CardIdentity("Wall of Tanglecord", "")); + cubeCards.add(new CardIdentity("Warleader's Helix", "")); + cubeCards.add(new CardIdentity("War-Wing Siren", "")); + cubeCards.add(new CardIdentity("Wasp Lancer", "")); + cubeCards.add(new CardIdentity("Wasteland Viper", "")); + cubeCards.add(new CardIdentity("Water Servant", "")); + cubeCards.add(new CardIdentity("Wayfarer's Bauble", "")); + cubeCards.add(new CardIdentity("Weapon Surge", "")); + cubeCards.add(new CardIdentity("Wear // Tear", "")); + cubeCards.add(new CardIdentity("Weatherseed Totem", "")); + cubeCards.add(new CardIdentity("Whiplash Trap", "")); + cubeCards.add(new CardIdentity("Whispergear Sneak", "")); + cubeCards.add(new CardIdentity("Wild Hunger", "")); + cubeCards.add(new CardIdentity("Wilt-Leaf Cavaliers", "")); + cubeCards.add(new CardIdentity("Windrider Eel", "")); + cubeCards.add(new CardIdentity("Wing Splicer", "")); + cubeCards.add(new CardIdentity("Wingsteed Rider", "")); + cubeCards.add(new CardIdentity("Wistful Selkie", "")); + cubeCards.add(new CardIdentity("Witch's Mist", "")); + cubeCards.add(new CardIdentity("Wojek Halberdiers", "")); + cubeCards.add(new CardIdentity("Wolfir Avenger", "")); + cubeCards.add(new CardIdentity("Worm Harvest", "")); + cubeCards.add(new CardIdentity("Xathrid Slyblade", "")); + cubeCards.add(new CardIdentity("Yoke of the Damned", "")); + cubeCards.add(new CardIdentity("Yoked Plowbeast", "")); + cubeCards.add(new CardIdentity("Zameck Guildmage", "")); + cubeCards.add(new CardIdentity("Zealous Persecution", "")); + cubeCards.add(new CardIdentity("Zektar Shrine Expedition", "")); + cubeCards.add(new CardIdentity("Zhur-Taa Druid", "")); + cubeCards.add(new CardIdentity("Zhur-Taa Swine", "")); + } +} From cb083d73e464416a572bdf6428ed0061a7b90fc3 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Thu, 16 Jul 2015 15:17:13 -0500 Subject: [PATCH 079/375] Alphabetized Ben's Cube --- .../src/mage/tournament/cubes/BensCube.java | 1347 ++++++++--------- 1 file changed, 673 insertions(+), 674 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java index 6d6bab90f12..8ab2768632f 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java @@ -38,725 +38,724 @@ public class BensCube extends DraftCube { public BensCube() { super("Ben's Cube (720 cards)"); // http://cubetutor.com/viewcube/1 - cubeCards.add(new CardIdentity("Elite Vanguard", "")); - cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); - cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", "")); - cubeCards.add(new CardIdentity("Mother of Runes", "")); - cubeCards.add(new CardIdentity("Soldier of the Pantheon", "")); - cubeCards.add(new CardIdentity("Steppe Lynx", "")); - cubeCards.add(new CardIdentity("Student of Warfare", "")); - cubeCards.add(new CardIdentity("Weathered Wayfarer", "")); - cubeCards.add(new CardIdentity("Accorder Paladin", "")); - cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails", "")); - cubeCards.add(new CardIdentity("Imposing Sovereign", "")); - cubeCards.add(new CardIdentity("Kami of Ancient Law", "")); - cubeCards.add(new CardIdentity("Knight of Glory", "")); - cubeCards.add(new CardIdentity("Knight of Meadowgrain", "")); - cubeCards.add(new CardIdentity("Kor Skyfisher", "")); - cubeCards.add(new CardIdentity("Loyal Cathar", "")); - cubeCards.add(new CardIdentity("Soltari Monk", "")); - cubeCards.add(new CardIdentity("Soltari Priest", "")); - cubeCards.add(new CardIdentity("Stoneforge Mystic", "")); - cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", "")); - cubeCards.add(new CardIdentity("Wall of Omens", "")); - cubeCards.add(new CardIdentity("Aven Mindcensor", "")); - cubeCards.add(new CardIdentity("Blade Splicer", "")); - cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", "")); - cubeCards.add(new CardIdentity("Fiend Hunter", "")); - cubeCards.add(new CardIdentity("Flickerwisp", "")); - cubeCards.add(new CardIdentity("Kor Sanctifiers", "")); - cubeCards.add(new CardIdentity("Loyal Retainers", "")); - cubeCards.add(new CardIdentity("Mentor of the Meek", "")); - cubeCards.add(new CardIdentity("Mirran Crusader", "")); - cubeCards.add(new CardIdentity("Mirror Entity", "")); - cubeCards.add(new CardIdentity("Silverblade Paladin", "")); - cubeCards.add(new CardIdentity("Soltari Champion", "")); - cubeCards.add(new CardIdentity("Stonecloaker", "")); - cubeCards.add(new CardIdentity("Academy Rector", "")); - cubeCards.add(new CardIdentity("Emeria Angel", "")); - cubeCards.add(new CardIdentity("Hero of Bladehold", "")); - cubeCards.add(new CardIdentity("Hokori, Dust Drinker", "")); - cubeCards.add(new CardIdentity("Ranger of Eos", "")); - cubeCards.add(new CardIdentity("Restoration Angel", "")); - cubeCards.add(new CardIdentity("Sublime Archangel", "")); - cubeCards.add(new CardIdentity("Wall of Reverence", "")); - cubeCards.add(new CardIdentity("Archangel of Thune", "")); - cubeCards.add(new CardIdentity("Baneslayer Angel", "")); - cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); - cubeCards.add(new CardIdentity("Karmic Guide", "")); - cubeCards.add(new CardIdentity("Reveillark", "")); - cubeCards.add(new CardIdentity("Mikaeus, the Lunarch", "")); - cubeCards.add(new CardIdentity("Sun Titan", "")); - cubeCards.add(new CardIdentity("Yosei, the Morning Star", "")); - cubeCards.add(new CardIdentity("Angel of Serenity", "")); - cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", "")); - cubeCards.add(new CardIdentity("Eternal Dragon", "")); - cubeCards.add(new CardIdentity("Akroma, Angel of Wrath", "")); - cubeCards.add(new CardIdentity("Avacyn, Angel of Hope", "")); - cubeCards.add(new CardIdentity("Iona, Shield of Emeria", "")); - cubeCards.add(new CardIdentity("Ajani, Caller of the Pride", "")); - cubeCards.add(new CardIdentity("Ajani Goldmane", "")); - cubeCards.add(new CardIdentity("Elspeth, Knight-Errant", "")); - cubeCards.add(new CardIdentity("Gideon Jura", "")); - cubeCards.add(new CardIdentity("Elspeth, Sun's Champion", "")); - cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); - cubeCards.add(new CardIdentity("Cloudshift", "")); - cubeCards.add(new CardIdentity("Condemn", "")); - cubeCards.add(new CardIdentity("Enlightened Tutor", "")); - cubeCards.add(new CardIdentity("Mana Tithe", "")); - cubeCards.add(new CardIdentity("Path to Exile", "")); - cubeCards.add(new CardIdentity("Swords to Plowshares", "")); - cubeCards.add(new CardIdentity("Disenchant", "")); - cubeCards.add(new CardIdentity("Momentary Blink", "")); - cubeCards.add(new CardIdentity("Balance", "")); - cubeCards.add(new CardIdentity("Lingering Souls", "")); - cubeCards.add(new CardIdentity("Spectral Procession", "")); - cubeCards.add(new CardIdentity("Armageddon", "")); - cubeCards.add(new CardIdentity("Cataclysm", "")); - cubeCards.add(new CardIdentity("Day of Judgment", "")); - cubeCards.add(new CardIdentity("Ravages of War", "")); - cubeCards.add(new CardIdentity("Wrath of God", "")); - cubeCards.add(new CardIdentity("Hallowed Burial", "")); - cubeCards.add(new CardIdentity("Increasing Devotion", "")); - cubeCards.add(new CardIdentity("Rout", "")); - cubeCards.add(new CardIdentity("Akroma's Vengeance", "")); - cubeCards.add(new CardIdentity("Terminus", "")); - cubeCards.add(new CardIdentity("Martial Coup", "")); - cubeCards.add(new CardIdentity("Entreat the Angels", "")); - cubeCards.add(new CardIdentity("Decree of Justice", "")); - cubeCards.add(new CardIdentity("Land Tax", "")); - cubeCards.add(new CardIdentity("Honor of the Pure", "")); - cubeCards.add(new CardIdentity("Journey to Nowhere", "")); - cubeCards.add(new CardIdentity("Luminarch Ascension", "")); - cubeCards.add(new CardIdentity("Temporal Isolation", "")); - cubeCards.add(new CardIdentity("Oblivion Ring", "")); - cubeCards.add(new CardIdentity("Angelic Destiny", "")); - cubeCards.add(new CardIdentity("Faith's Fetters", "")); - cubeCards.add(new CardIdentity("Parallax Wave", "")); - cubeCards.add(new CardIdentity("Worship", "")); - cubeCards.add(new CardIdentity("Spear of Heliod", "")); - cubeCards.add(new CardIdentity("Spirit of the Labyrinth", "")); - cubeCards.add(new CardIdentity("Karakas", "")); - cubeCards.add(new CardIdentity("Kjeldoran Outpost", "")); - cubeCards.add(new CardIdentity("Windbrisk Heights", "")); - cubeCards.add(new CardIdentity("Cursecatcher", "")); - cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); - cubeCards.add(new CardIdentity("Augur of Bolas", "")); - cubeCards.add(new CardIdentity("Fathom Seer", "")); - cubeCards.add(new CardIdentity("Gilded Drake", "")); - cubeCards.add(new CardIdentity("Looter il-Kor", "")); - cubeCards.add(new CardIdentity("Omenspeaker", "")); - cubeCards.add(new CardIdentity("Phantasmal Image", "")); - cubeCards.add(new CardIdentity("Snapcaster Mage", "")); - cubeCards.add(new CardIdentity("Waterfront Bouncer", "")); - cubeCards.add(new CardIdentity("AEther Adept", "")); - cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", "")); - cubeCards.add(new CardIdentity("Man-o'-War", "")); - cubeCards.add(new CardIdentity("Sea Gate Oracle", "")); - cubeCards.add(new CardIdentity("Serendib Efreet", "")); - cubeCards.add(new CardIdentity("Trinket Mage", "")); - cubeCards.add(new CardIdentity("Vendilion Clique", "")); - cubeCards.add(new CardIdentity("Wake Thrasher", "")); - cubeCards.add(new CardIdentity("Glen Elendra Archmage", "")); - cubeCards.add(new CardIdentity("Sower of Temptation", "")); - cubeCards.add(new CardIdentity("Talrand, Sky Summoner", "")); - cubeCards.add(new CardIdentity("Tradewind Rider", "")); - cubeCards.add(new CardIdentity("Venser, Shaper Savant", "")); - cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", "")); - cubeCards.add(new CardIdentity("Mulldrifter", "")); - cubeCards.add(new CardIdentity("Prognostic Sphinx", "")); - cubeCards.add(new CardIdentity("Riftwing Cloudskate", "")); - cubeCards.add(new CardIdentity("Vesuvan Shapeshifter", "")); - cubeCards.add(new CardIdentity("AEtherling", "")); - cubeCards.add(new CardIdentity("Brine Elemental", "")); - cubeCards.add(new CardIdentity("Consecrated Sphinx", "")); - cubeCards.add(new CardIdentity("Frost Titan", "")); - cubeCards.add(new CardIdentity("Keiga, the Tide Star", "")); - cubeCards.add(new CardIdentity("Palinchron", "")); - cubeCards.add(new CardIdentity("Jace Beleren", "")); - cubeCards.add(new CardIdentity("Jace, Architect of Thought", "")); - cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", "")); - cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage", "")); - cubeCards.add(new CardIdentity("Phyrexian Metamorph", "")); - cubeCards.add(new CardIdentity("Ancestral Recall", "")); - cubeCards.add(new CardIdentity("Brainstorm", "")); - cubeCards.add(new CardIdentity("Mystical Tutor", "")); - cubeCards.add(new CardIdentity("Opt", "")); - cubeCards.add(new CardIdentity("Brain Freeze", "")); - cubeCards.add(new CardIdentity("Counterspell", "")); - cubeCards.add(new CardIdentity("Cyclonic Rift", "")); - cubeCards.add(new CardIdentity("Daze", "")); - cubeCards.add(new CardIdentity("Essence Scatter", "")); - cubeCards.add(new CardIdentity("Impulse", "")); - cubeCards.add(new CardIdentity("Into the Roil", "")); - cubeCards.add(new CardIdentity("Mana Drain", "")); - cubeCards.add(new CardIdentity("Mana Leak", "")); - cubeCards.add(new CardIdentity("Memory Lapse", "")); - cubeCards.add(new CardIdentity("Miscalculation", "")); - cubeCards.add(new CardIdentity("Negate", "")); - cubeCards.add(new CardIdentity("Remand", "")); - cubeCards.add(new CardIdentity("Capsize", "")); - cubeCards.add(new CardIdentity("Dissipate", "")); - cubeCards.add(new CardIdentity("Forbid", "")); - cubeCards.add(new CardIdentity("Forbidden Alchemy", "")); - cubeCards.add(new CardIdentity("Frantic Search", "")); - cubeCards.add(new CardIdentity("Intuition", "")); - cubeCards.add(new CardIdentity("Psionic Blast", "")); - cubeCards.add(new CardIdentity("Thirst for Knowledge", "")); - cubeCards.add(new CardIdentity("Careful Consideration", "")); - cubeCards.add(new CardIdentity("Cryptic Command", "")); - cubeCards.add(new CardIdentity("Fact or Fiction", "")); - cubeCards.add(new CardIdentity("Gifts Ungiven", "")); - cubeCards.add(new CardIdentity("Turnabout", "")); - cubeCards.add(new CardIdentity("Desertion", "")); - cubeCards.add(new CardIdentity("Force of Will", "")); - cubeCards.add(new CardIdentity("Gush", "")); - cubeCards.add(new CardIdentity("Pact of Negation", "")); - cubeCards.add(new CardIdentity("Opportunity", "")); - cubeCards.add(new CardIdentity("Repeal", "")); - cubeCards.add(new CardIdentity("Ancestral Vision", "")); - cubeCards.add(new CardIdentity("Gitaxian Probe", "")); - cubeCards.add(new CardIdentity("Ponder", "")); - cubeCards.add(new CardIdentity("Preordain", "")); - cubeCards.add(new CardIdentity("Ideas Unbound", "")); - cubeCards.add(new CardIdentity("Time Walk", "")); - cubeCards.add(new CardIdentity("Compulsive Research", "")); - cubeCards.add(new CardIdentity("Show and Tell", "")); - cubeCards.add(new CardIdentity("Timetwister", "")); - cubeCards.add(new CardIdentity("Tinker", "")); - cubeCards.add(new CardIdentity("Deep Analysis", "")); - cubeCards.add(new CardIdentity("Bribery", "")); - cubeCards.add(new CardIdentity("Time Warp", "")); - cubeCards.add(new CardIdentity("Mind's Desire", "")); - cubeCards.add(new CardIdentity("Time Spiral", "")); - cubeCards.add(new CardIdentity("Upheaval", "")); - cubeCards.add(new CardIdentity("Legacy's Allure", "")); - cubeCards.add(new CardIdentity("Narcolepsy", "")); - cubeCards.add(new CardIdentity("Control Magic", "")); - cubeCards.add(new CardIdentity("Opposition", "")); - cubeCards.add(new CardIdentity("Future Sight", "")); - cubeCards.add(new CardIdentity("Treachery", "")); - cubeCards.add(new CardIdentity("Omniscience", "")); - cubeCards.add(new CardIdentity("Academy Ruins", "")); - cubeCards.add(new CardIdentity("Shelldock Isle", "")); - cubeCards.add(new CardIdentity("Carnophage", "")); - cubeCards.add(new CardIdentity("Diregraf Ghoul", "")); - cubeCards.add(new CardIdentity("Gravecrawler", "")); - cubeCards.add(new CardIdentity("Guul Draz Assassin", "")); - cubeCards.add(new CardIdentity("Tormented Hero", "")); - cubeCards.add(new CardIdentity("Vampire Lacerator", "")); - cubeCards.add(new CardIdentity("Blood Scrivener", "")); - cubeCards.add(new CardIdentity("Bloodghast", "")); - cubeCards.add(new CardIdentity("Dark Confidant", "")); - cubeCards.add(new CardIdentity("Dauthi Horror", "")); - cubeCards.add(new CardIdentity("Gatekeeper of Malakir", "")); - cubeCards.add(new CardIdentity("Knight of Infamy", "")); - cubeCards.add(new CardIdentity("Mesmeric Fiend", "")); - cubeCards.add(new CardIdentity("Nantuko Shade", "")); - cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); - cubeCards.add(new CardIdentity("Nezumi Shortfang", "")); - cubeCards.add(new CardIdentity("Nightscape Familiar", "")); - cubeCards.add(new CardIdentity("Oona's Prowler", "")); - cubeCards.add(new CardIdentity("Pack Rat", "")); - cubeCards.add(new CardIdentity("Vampire Hexmage", "")); - cubeCards.add(new CardIdentity("Bone Shredder", "")); - cubeCards.add(new CardIdentity("Geralf's Messenger", "")); - cubeCards.add(new CardIdentity("Hypnotic Specter", "")); - cubeCards.add(new CardIdentity("Phyrexian Rager", "")); - cubeCards.add(new CardIdentity("Vampire Nighthawk", "")); + cubeCards.add(new CardIdentity("Abrupt Decay", "")); cubeCards.add(new CardIdentity("Abyssal Persecutor", "")); - cubeCards.add(new CardIdentity("Bloodline Keeper", "")); - cubeCards.add(new CardIdentity("Braids, Cabal Minion", "")); - cubeCards.add(new CardIdentity("Crypt Ghast", "")); - cubeCards.add(new CardIdentity("Desecration Demon", "")); - cubeCards.add(new CardIdentity("Disciple of Bolas", "")); - cubeCards.add(new CardIdentity("Graveborn Muse", "")); - cubeCards.add(new CardIdentity("Nekrataal", "")); - cubeCards.add(new CardIdentity("Phyrexian Obliterator", "")); - cubeCards.add(new CardIdentity("Skinrender", "")); - cubeCards.add(new CardIdentity("Bloodgift Demon", "")); - cubeCards.add(new CardIdentity("Puppeteer Clique", "")); - cubeCards.add(new CardIdentity("Shriekmaw", "")); - cubeCards.add(new CardIdentity("Skithiryx, the Blight Dragon", "")); - cubeCards.add(new CardIdentity("Grave Titan", "")); - cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni", "")); - cubeCards.add(new CardIdentity("Kokusho, the Evening Star", "")); - cubeCards.add(new CardIdentity("Sheoldred, Whispering One", "")); - cubeCards.add(new CardIdentity("Griselbrand", "")); - cubeCards.add(new CardIdentity("Tombstalker", "")); - cubeCards.add(new CardIdentity("Liliana of the Veil", "")); - cubeCards.add(new CardIdentity("Liliana Vess", "")); - cubeCards.add(new CardIdentity("Sorin Markov", "")); - cubeCards.add(new CardIdentity("Booster Tutor", "")); - cubeCards.add(new CardIdentity("Dark Ritual", "")); - cubeCards.add(new CardIdentity("Disfigure", "")); - cubeCards.add(new CardIdentity("Entomb", "")); - cubeCards.add(new CardIdentity("Vampiric Tutor", "")); - cubeCards.add(new CardIdentity("Doom Blade", "")); - cubeCards.add(new CardIdentity("Go for the Throat", "")); - cubeCards.add(new CardIdentity("Tainted Pact", "")); - cubeCards.add(new CardIdentity("Terror", "")); - cubeCards.add(new CardIdentity("Ultimate Price", "")); - cubeCards.add(new CardIdentity("Corpse Dance", "")); - cubeCards.add(new CardIdentity("Dismember", "")); - cubeCards.add(new CardIdentity("Hero's Downfall", "")); - cubeCards.add(new CardIdentity("Slaughter Pact", "")); - cubeCards.add(new CardIdentity("Makeshift Mannequin", "")); - cubeCards.add(new CardIdentity("Snuff Out", "")); - cubeCards.add(new CardIdentity("Duress", "")); - cubeCards.add(new CardIdentity("Innocent Blood", "")); - cubeCards.add(new CardIdentity("Inquisition of Kozilek", "")); - cubeCards.add(new CardIdentity("Reanimate", "")); - cubeCards.add(new CardIdentity("Thoughtseize", "")); - cubeCards.add(new CardIdentity("Chainer's Edict", "")); - cubeCards.add(new CardIdentity("Demonic Tutor", "")); - cubeCards.add(new CardIdentity("Exhume", "")); - cubeCards.add(new CardIdentity("Hymn to Tourach", "")); - cubeCards.add(new CardIdentity("Night's Whisper", "")); - cubeCards.add(new CardIdentity("Sign in Blood", "")); - cubeCards.add(new CardIdentity("Sinkhole", "")); - cubeCards.add(new CardIdentity("Buried Alive", "")); - cubeCards.add(new CardIdentity("Yawgmoth's Will", "")); + cubeCards.add(new CardIdentity("Academy Rector", "")); + cubeCards.add(new CardIdentity("Academy Ruins", "")); + cubeCards.add(new CardIdentity("Accorder Paladin", "")); + cubeCards.add(new CardIdentity("Acidic Slime", "")); + cubeCards.add(new CardIdentity("AEther Adept", "")); + cubeCards.add(new CardIdentity("AEther Vial", "")); + cubeCards.add(new CardIdentity("AEtherling", "")); + cubeCards.add(new CardIdentity("Aftershock", "")); + cubeCards.add(new CardIdentity("Agony Warp", "")); + cubeCards.add(new CardIdentity("Ajani Goldmane", "")); + cubeCards.add(new CardIdentity("Ajani Vengeant", "")); + cubeCards.add(new CardIdentity("Ajani, Caller of the Pride", "")); + cubeCards.add(new CardIdentity("Akroma, Angel of Wrath", "")); + cubeCards.add(new CardIdentity("Akroma's Vengeance", "")); + cubeCards.add(new CardIdentity("All Is Dust", "")); cubeCards.add(new CardIdentity("Ambition's Cost", "")); - cubeCards.add(new CardIdentity("Consuming Vapors", "")); - cubeCards.add(new CardIdentity("Damnation", "")); - cubeCards.add(new CardIdentity("Tendrils of Agony", "")); - cubeCards.add(new CardIdentity("Living Death", "")); - cubeCards.add(new CardIdentity("Black Sun's Zenith", "")); - cubeCards.add(new CardIdentity("Mind Shatter", "")); - cubeCards.add(new CardIdentity("Profane Command", "")); - cubeCards.add(new CardIdentity("Animate Dead", "")); - cubeCards.add(new CardIdentity("Bitterblossom", "")); - cubeCards.add(new CardIdentity("Necromancy", "")); - cubeCards.add(new CardIdentity("Necropotence", "")); - cubeCards.add(new CardIdentity("Phyrexian Arena", "")); - cubeCards.add(new CardIdentity("Recurring Nightmare", "")); - cubeCards.add(new CardIdentity("Diabolic Servitude", "")); - cubeCards.add(new CardIdentity("Nether Void", "")); - cubeCards.add(new CardIdentity("The Abyss", "")); - cubeCards.add(new CardIdentity("Yawgmoth's Bargain", "")); - cubeCards.add(new CardIdentity("Gnarled Scarhide", "")); - cubeCards.add(new CardIdentity("Herald of Torment", "")); - cubeCards.add(new CardIdentity("Master of the Feast", "")); - cubeCards.add(new CardIdentity("Cabal Coffers", "")); - cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth", "")); - cubeCards.add(new CardIdentity("Volrath's Stronghold", "")); - cubeCards.add(new CardIdentity("Firedrinker Satyr", "")); - cubeCards.add(new CardIdentity("Frenzied Goblin", "")); - cubeCards.add(new CardIdentity("Goblin Bushwhacker", "")); - cubeCards.add(new CardIdentity("Goblin Guide", "")); - cubeCards.add(new CardIdentity("Goblin Welder", "")); - cubeCards.add(new CardIdentity("Greater Gargadon", "")); - cubeCards.add(new CardIdentity("Grim Lavamancer", "")); - cubeCards.add(new CardIdentity("Jackal Pup", "")); - cubeCards.add(new CardIdentity("Reckless Waif", "")); - cubeCards.add(new CardIdentity("Spikeshot Elder", "")); - cubeCards.add(new CardIdentity("Stromkirk Noble", "")); - cubeCards.add(new CardIdentity("Vexing Devil", "")); - cubeCards.add(new CardIdentity("Ash Zealot", "")); - cubeCards.add(new CardIdentity("Ember Hauler", "")); - cubeCards.add(new CardIdentity("Firefist Striker", "")); - cubeCards.add(new CardIdentity("Goblin Wardriver", "")); - cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); - cubeCards.add(new CardIdentity("Hellspark Elemental", "")); - cubeCards.add(new CardIdentity("Kargan Dragonlord", "")); - cubeCards.add(new CardIdentity("Keldon Marauders", "")); - cubeCards.add(new CardIdentity("Lightning Mauler", "")); - cubeCards.add(new CardIdentity("Mogg Flunkies", "")); - cubeCards.add(new CardIdentity("Mogg War Marshal", "")); - cubeCards.add(new CardIdentity("Plated Geopede", "")); - cubeCards.add(new CardIdentity("Slith Firewalker", "")); - cubeCards.add(new CardIdentity("Stormblood Berserker", "")); - cubeCards.add(new CardIdentity("Torch Fiend", "")); - cubeCards.add(new CardIdentity("Young Pyromancer", "")); - cubeCards.add(new CardIdentity("Ball Lightning", "")); - cubeCards.add(new CardIdentity("Chandra's Phoenix", "")); - cubeCards.add(new CardIdentity("Countryside Crusher", "")); - cubeCards.add(new CardIdentity("Goblin Ruinblaster", "")); - cubeCards.add(new CardIdentity("Hell's Thunder", "")); - cubeCards.add(new CardIdentity("Imperial Recruiter", "")); - cubeCards.add(new CardIdentity("Squee, Goblin Nabob", "")); - cubeCards.add(new CardIdentity("Thunderscape Battlemage", "")); - cubeCards.add(new CardIdentity("Zo-Zu the Punisher", "")); - cubeCards.add(new CardIdentity("Avalanche Riders", "")); - cubeCards.add(new CardIdentity("Blistering Firecat", "")); - cubeCards.add(new CardIdentity("Flametongue Kavu", "")); - cubeCards.add(new CardIdentity("Hellrider", "")); - cubeCards.add(new CardIdentity("Hero of Oxid Ridge", "")); - cubeCards.add(new CardIdentity("Keldon Champion", "")); - cubeCards.add(new CardIdentity("Ravenous Baboons", "")); - cubeCards.add(new CardIdentity("Skizzik", "")); - cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker", "")); - cubeCards.add(new CardIdentity("Siege-Gang Commander", "")); - cubeCards.add(new CardIdentity("Thundermaw Hellkite", "")); - cubeCards.add(new CardIdentity("Urabrask the Hidden", "")); - cubeCards.add(new CardIdentity("Zealous Conscripts", "")); - cubeCards.add(new CardIdentity("Inferno Titan", "")); - cubeCards.add(new CardIdentity("Bogardan Hellkite", "")); - cubeCards.add(new CardIdentity("Chandra, the Firebrand", "")); - cubeCards.add(new CardIdentity("Koth of the Hammer", "")); - cubeCards.add(new CardIdentity("Chandra Nalaar", "")); - cubeCards.add(new CardIdentity("Burst Lightning", "")); - cubeCards.add(new CardIdentity("Lightning Bolt", "")); + cubeCards.add(new CardIdentity("Ancestral Recall", "")); + cubeCards.add(new CardIdentity("Ancestral Vision", "")); cubeCards.add(new CardIdentity("Ancient Grudge", "")); - cubeCards.add(new CardIdentity("Incinerate", "")); - cubeCards.add(new CardIdentity("Lightning Strike", "")); - cubeCards.add(new CardIdentity("Magma Jet", "")); - cubeCards.add(new CardIdentity("Searing Blaze", "")); - cubeCards.add(new CardIdentity("Searing Spear", "")); + cubeCards.add(new CardIdentity("Ancient Tomb", "")); + cubeCards.add(new CardIdentity("Angel of Serenity", "")); + cubeCards.add(new CardIdentity("Angelic Destiny", "")); + cubeCards.add(new CardIdentity("Anger of the Gods", "")); + cubeCards.add(new CardIdentity("Animate Dead", "")); + cubeCards.add(new CardIdentity("Ankh of Mishra", "")); + cubeCards.add(new CardIdentity("Arbor Elf", "")); + cubeCards.add(new CardIdentity("Arc Lightning", "")); + cubeCards.add(new CardIdentity("Arc Trail", "")); + cubeCards.add(new CardIdentity("Archangel of Thune", "")); + cubeCards.add(new CardIdentity("Arid Mesa", "")); + cubeCards.add(new CardIdentity("Armageddon", "")); + cubeCards.add(new CardIdentity("Ash Zealot", "")); + cubeCards.add(new CardIdentity("Ashen Rider", "")); + cubeCards.add(new CardIdentity("Augur of Bolas", "")); + cubeCards.add(new CardIdentity("Aurelia's Fury", "")); + cubeCards.add(new CardIdentity("Avacyn, Angel of Hope", "")); + cubeCards.add(new CardIdentity("Avacyn's Pilgrim", "")); + cubeCards.add(new CardIdentity("Avalanche Riders", "")); + cubeCards.add(new CardIdentity("Aven Mindcensor", "")); + cubeCards.add(new CardIdentity("Avenger of Zendikar", "")); + cubeCards.add(new CardIdentity("Awakening Zone", "")); + cubeCards.add(new CardIdentity("Badlands", "")); + cubeCards.add(new CardIdentity("Balance", "")); + cubeCards.add(new CardIdentity("Baleful Strix", "")); + cubeCards.add(new CardIdentity("Ball Lightning", "")); + cubeCards.add(new CardIdentity("Banefire", "")); + cubeCards.add(new CardIdentity("Baneslayer Angel", "")); + cubeCards.add(new CardIdentity("Basalt Monolith", "")); + cubeCards.add(new CardIdentity("Basilisk Collar", "")); + cubeCards.add(new CardIdentity("Batterskull", "")); + cubeCards.add(new CardIdentity("Bayou", "")); + cubeCards.add(new CardIdentity("Beacon of Destruction", "")); + cubeCards.add(new CardIdentity("Beast Within", "")); + cubeCards.add(new CardIdentity("Birds of Paradise", "")); + cubeCards.add(new CardIdentity("Birthing Pod", "")); + cubeCards.add(new CardIdentity("Bitterblossom", "")); + cubeCards.add(new CardIdentity("Bituminous Blast", "")); + cubeCards.add(new CardIdentity("Black Lotus", "")); + cubeCards.add(new CardIdentity("Black Sun's Zenith", "")); + cubeCards.add(new CardIdentity("Blade Splicer", "")); + cubeCards.add(new CardIdentity("Blastoderm", "")); + cubeCards.add(new CardIdentity("Blistering Firecat", "")); + cubeCards.add(new CardIdentity("Blood Crypt", "")); + cubeCards.add(new CardIdentity("Blood Scrivener", "")); + cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); + cubeCards.add(new CardIdentity("Bloodghast", "")); + cubeCards.add(new CardIdentity("Bloodgift Demon", "")); + cubeCards.add(new CardIdentity("Bloodline Keeper", "")); + cubeCards.add(new CardIdentity("Bloodstained Mire", "")); + cubeCards.add(new CardIdentity("Bogardan Hellkite", "")); + cubeCards.add(new CardIdentity("Boggart Ram-Gang", "")); + cubeCards.add(new CardIdentity("Bone Shredder", "")); + cubeCards.add(new CardIdentity("Bonesplitter", "")); + cubeCards.add(new CardIdentity("Bonfire of the Damned", "")); + cubeCards.add(new CardIdentity("Booster Tutor", "")); + cubeCards.add(new CardIdentity("Boros Charm", "")); + cubeCards.add(new CardIdentity("Boros Reckoner", "")); + cubeCards.add(new CardIdentity("Braids, Cabal Minion", "")); + cubeCards.add(new CardIdentity("Brain Freeze", "")); + cubeCards.add(new CardIdentity("Brainstorm", "")); + cubeCards.add(new CardIdentity("Breeding Pool", "")); + cubeCards.add(new CardIdentity("Bribery", "")); + cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", "")); cubeCards.add(new CardIdentity("Brimstone Volley", "")); + cubeCards.add(new CardIdentity("Brine Elemental", "")); + cubeCards.add(new CardIdentity("Buried Alive", "")); + cubeCards.add(new CardIdentity("Burning-Tree Emissary", "")); + cubeCards.add(new CardIdentity("Burst Lightning", "")); + cubeCards.add(new CardIdentity("Cabal Coffers", "")); + cubeCards.add(new CardIdentity("Call of the Herd", "")); + cubeCards.add(new CardIdentity("Capsize", "")); + cubeCards.add(new CardIdentity("Careful Consideration", "")); + cubeCards.add(new CardIdentity("Carnophage", "")); + cubeCards.add(new CardIdentity("Cataclysm", "")); + cubeCards.add(new CardIdentity("Celestial Colonnade", "")); + cubeCards.add(new CardIdentity("Chain Lightning", "")); + cubeCards.add(new CardIdentity("Chained to the Rocks", "")); + cubeCards.add(new CardIdentity("Chainer's Edict", "")); + cubeCards.add(new CardIdentity("Chameleon Colossus", "")); + cubeCards.add(new CardIdentity("Chandra Nalaar", "")); + cubeCards.add(new CardIdentity("Chandra, the Firebrand", "")); + cubeCards.add(new CardIdentity("Chandra's Phoenix", "")); + cubeCards.add(new CardIdentity("Channel", "")); + cubeCards.add(new CardIdentity("Chaos Orb", "")); cubeCards.add(new CardIdentity("Chaos Warp", "")); cubeCards.add(new CardIdentity("Char", "")); - cubeCards.add(new CardIdentity("Staggershock", "")); - cubeCards.add(new CardIdentity("Volcanic Fallout", "")); - cubeCards.add(new CardIdentity("Beacon of Destruction", "")); - cubeCards.add(new CardIdentity("Fireblast", "")); - cubeCards.add(new CardIdentity("Pyrokinesis", "")); - cubeCards.add(new CardIdentity("Chain Lightning", "")); - cubeCards.add(new CardIdentity("Faithless Looting", "")); - cubeCards.add(new CardIdentity("Firebolt", "")); - cubeCards.add(new CardIdentity("Gamble", "")); - cubeCards.add(new CardIdentity("Reckless Charge", "")); - cubeCards.add(new CardIdentity("Arc Trail", "")); - cubeCards.add(new CardIdentity("Pyroclasm", "")); - cubeCards.add(new CardIdentity("Anger of the Gods", "")); - cubeCards.add(new CardIdentity("Arc Lightning", "")); - cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); - cubeCards.add(new CardIdentity("Molten Rain", "")); - cubeCards.add(new CardIdentity("Pillage", "")); - cubeCards.add(new CardIdentity("Rift Bolt", "")); - cubeCards.add(new CardIdentity("Slagstorm", "")); - cubeCards.add(new CardIdentity("Stone Rain", "")); - cubeCards.add(new CardIdentity("Wheel of Fortune", "")); - cubeCards.add(new CardIdentity("Aftershock", "")); - cubeCards.add(new CardIdentity("Empty the Warrens", "")); - cubeCards.add(new CardIdentity("Banefire", "")); + cubeCards.add(new CardIdentity("Chrome Mox", "")); + cubeCards.add(new CardIdentity("City of Brass", "")); + cubeCards.add(new CardIdentity("City of Traitors", "")); + cubeCards.add(new CardIdentity("Clifftop Retreat", "")); + cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); + cubeCards.add(new CardIdentity("Cloudshift", "")); + cubeCards.add(new CardIdentity("Cloudthresher", "")); + cubeCards.add(new CardIdentity("Coalition Relic", "")); + cubeCards.add(new CardIdentity("Coiling Oracle", "")); + cubeCards.add(new CardIdentity("Cold-Eyed Selkie", "")); + cubeCards.add(new CardIdentity("Coldsteel Heart", "")); + cubeCards.add(new CardIdentity("Compulsive Research", "")); + cubeCards.add(new CardIdentity("Condemn", "")); + cubeCards.add(new CardIdentity("Consecrated Sphinx", "")); + cubeCards.add(new CardIdentity("Consuming Vapors", "")); + cubeCards.add(new CardIdentity("Control Magic", "")); + cubeCards.add(new CardIdentity("Corpse Dance", "")); + cubeCards.add(new CardIdentity("Counterspell", "")); + cubeCards.add(new CardIdentity("Countryside Crusher", "")); + cubeCards.add(new CardIdentity("Courser of Kruphix", "")); + cubeCards.add(new CardIdentity("Craterhoof Behemoth", "")); + cubeCards.add(new CardIdentity("Creeping Tar Pit", "")); + cubeCards.add(new CardIdentity("Crucible of Worlds", "")); + cubeCards.add(new CardIdentity("Crypt Ghast", "")); + cubeCards.add(new CardIdentity("Cryptic Command", "")); + cubeCards.add(new CardIdentity("Crystal Shard", "")); + cubeCards.add(new CardIdentity("Cultivate", "")); + cubeCards.add(new CardIdentity("Cursecatcher", "")); + cubeCards.add(new CardIdentity("Cursed Scroll", "")); + cubeCards.add(new CardIdentity("Cyclonic Rift", "")); + cubeCards.add(new CardIdentity("Damnation", "")); + cubeCards.add(new CardIdentity("Dark Confidant", "")); + cubeCards.add(new CardIdentity("Dark Ritual", "")); + cubeCards.add(new CardIdentity("Dauthi Horror", "")); + cubeCards.add(new CardIdentity("Day of Judgment", "")); + cubeCards.add(new CardIdentity("Daze", "")); + cubeCards.add(new CardIdentity("Deathrite Shaman", "")); + cubeCards.add(new CardIdentity("Decree of Justice", "")); + cubeCards.add(new CardIdentity("Deep Analysis", "")); + cubeCards.add(new CardIdentity("Defense of the Heart", "")); + cubeCards.add(new CardIdentity("Demonic Tutor", "")); + cubeCards.add(new CardIdentity("Deranged Hermit", "")); + cubeCards.add(new CardIdentity("Desecration Demon", "")); + cubeCards.add(new CardIdentity("Desertion", "")); + cubeCards.add(new CardIdentity("Detention Sphere", "")); cubeCards.add(new CardIdentity("Devil's Play", "")); + cubeCards.add(new CardIdentity("Devoted Druid", "")); + cubeCards.add(new CardIdentity("Diabolic Servitude", "")); + cubeCards.add(new CardIdentity("Diregraf Ghoul", "")); + cubeCards.add(new CardIdentity("Disciple of Bolas", "")); + cubeCards.add(new CardIdentity("Disenchant", "")); + cubeCards.add(new CardIdentity("Disfigure", "")); + cubeCards.add(new CardIdentity("Dismember", "")); + cubeCards.add(new CardIdentity("Dissipate", "")); + cubeCards.add(new CardIdentity("Domri Rade", "")); + cubeCards.add(new CardIdentity("Doom Blade", "")); + cubeCards.add(new CardIdentity("Dragonskull Summit", "")); + cubeCards.add(new CardIdentity("Dreadbore", "")); + cubeCards.add(new CardIdentity("Drowned Catacomb", "")); + cubeCards.add(new CardIdentity("Dryad Militant", "")); + cubeCards.add(new CardIdentity("Duress", "")); + cubeCards.add(new CardIdentity("Duskmantle Seer", "")); cubeCards.add(new CardIdentity("Earthquake", "")); - cubeCards.add(new CardIdentity("Jokulhaups", "")); - cubeCards.add(new CardIdentity("Rolling Earthquake", "")); - cubeCards.add(new CardIdentity("Wildfire", "")); - cubeCards.add(new CardIdentity("Bonfire of the Damned", "")); - cubeCards.add(new CardIdentity("Sulfuric Vortex", "")); - cubeCards.add(new CardIdentity("Sneak Attack", "")); - cubeCards.add(new CardIdentity("Purphoros, God of the Forge", "")); - cubeCards.add(new CardIdentity("Ghitu Encampment", "")); - cubeCards.add(new CardIdentity("Teetering Peaks", "")); - cubeCards.add(new CardIdentity("Avacyn's Pilgrim", "")); - cubeCards.add(new CardIdentity("Birds of Paradise", "")); + cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", "")); + cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails", "")); + cubeCards.add(new CardIdentity("Eldrazi Monument", "")); + cubeCards.add(new CardIdentity("Electrolyze", "")); + cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", "")); + cubeCards.add(new CardIdentity("Elite Vanguard", "")); + cubeCards.add(new CardIdentity("Elspeth, Knight-Errant", "")); + cubeCards.add(new CardIdentity("Elspeth, Sun's Champion", "")); cubeCards.add(new CardIdentity("Elves of Deep Shadow", "")); cubeCards.add(new CardIdentity("Elvish Mystic", "")); - cubeCards.add(new CardIdentity("Experiment One", "")); - cubeCards.add(new CardIdentity("Fyndhorn Elves", "")); - cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); - cubeCards.add(new CardIdentity("Llanowar Elves", "")); - cubeCards.add(new CardIdentity("Noble Hierarch", "")); - cubeCards.add(new CardIdentity("Ulvenwald Tracker", "")); - cubeCards.add(new CardIdentity("Devoted Druid", "")); - cubeCards.add(new CardIdentity("Fauna Shaman", "")); - cubeCards.add(new CardIdentity("Lotus Cobra", "")); - cubeCards.add(new CardIdentity("Mayor of Avabruck", "")); - cubeCards.add(new CardIdentity("Overgrown Battlement", "")); - cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", "")); - cubeCards.add(new CardIdentity("Sakura-Tribe Elder", "")); - cubeCards.add(new CardIdentity("Scavenging Ooze", "")); - cubeCards.add(new CardIdentity("Scorned Villager", "")); - cubeCards.add(new CardIdentity("Strangleroot Geist", "")); - cubeCards.add(new CardIdentity("Sylvan Caryatid", "")); - cubeCards.add(new CardIdentity("Tarmogoyf", "")); - cubeCards.add(new CardIdentity("Wall of Blossoms", "")); - cubeCards.add(new CardIdentity("Wall of Roots", "")); - cubeCards.add(new CardIdentity("Werebear", "")); + cubeCards.add(new CardIdentity("Ember Hauler", "")); + cubeCards.add(new CardIdentity("Emeria Angel", "")); + cubeCards.add(new CardIdentity("Empty the Warrens", "")); + cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", "")); + cubeCards.add(new CardIdentity("Enclave Cryptologist", "")); + cubeCards.add(new CardIdentity("Engineered Explosives", "")); + cubeCards.add(new CardIdentity("Enlightened Tutor", "")); + cubeCards.add(new CardIdentity("Entomb", "")); + cubeCards.add(new CardIdentity("Entreat the Angels", "")); + cubeCards.add(new CardIdentity("Epochrasite", "")); + cubeCards.add(new CardIdentity("Essence Scatter", "")); + cubeCards.add(new CardIdentity("Eternal Dragon", "")); cubeCards.add(new CardIdentity("Eternal Witness", "")); - cubeCards.add(new CardIdentity("Ohran Viper", "")); - cubeCards.add(new CardIdentity("Wolfir Avenger", "")); - cubeCards.add(new CardIdentity("Wood Elves", "")); - cubeCards.add(new CardIdentity("Yavimaya Elder", "")); - cubeCards.add(new CardIdentity("Blastoderm", "")); - cubeCards.add(new CardIdentity("Chameleon Colossus", "")); - cubeCards.add(new CardIdentity("Master of the Wild Hunt", "")); - cubeCards.add(new CardIdentity("Mold Shambler", "")); - cubeCards.add(new CardIdentity("Nantuko Vigilante", "")); - cubeCards.add(new CardIdentity("Obstinate Baloth", "")); - cubeCards.add(new CardIdentity("Oracle of Mul Daya", "")); - cubeCards.add(new CardIdentity("Polukranos, World Eater", "")); - cubeCards.add(new CardIdentity("Thelonite Hermit", "")); - cubeCards.add(new CardIdentity("Thrun, the Last Troll", "")); - cubeCards.add(new CardIdentity("Vengevine", "")); - cubeCards.add(new CardIdentity("Wickerbough Elder", "")); - cubeCards.add(new CardIdentity("Yeva, Nature's Herald", "")); - cubeCards.add(new CardIdentity("Acidic Slime", "")); - cubeCards.add(new CardIdentity("Deranged Hermit", "")); - cubeCards.add(new CardIdentity("Genesis", "")); - cubeCards.add(new CardIdentity("Indrik Stomphowler", "")); - cubeCards.add(new CardIdentity("Thornling", "")); - cubeCards.add(new CardIdentity("Thragtusk", "")); - cubeCards.add(new CardIdentity("Vorapede", "")); - cubeCards.add(new CardIdentity("Cloudthresher", "")); - cubeCards.add(new CardIdentity("Primeval Titan", "")); - cubeCards.add(new CardIdentity("Avenger of Zendikar", "")); - cubeCards.add(new CardIdentity("Primordial Hydra", "")); - cubeCards.add(new CardIdentity("Craterhoof Behemoth", "")); - cubeCards.add(new CardIdentity("Terastodon", "")); - cubeCards.add(new CardIdentity("Woodfall Primus", "")); + cubeCards.add(new CardIdentity("Everflowing Chalice", "")); + cubeCards.add(new CardIdentity("Evolving Wilds", "")); + cubeCards.add(new CardIdentity("Exhume", "")); + cubeCards.add(new CardIdentity("Experiment One", "")); + cubeCards.add(new CardIdentity("Explore", "")); + cubeCards.add(new CardIdentity("Fact or Fiction", "")); + cubeCards.add(new CardIdentity("Faithless Looting", "")); + cubeCards.add(new CardIdentity("Faith's Fetters", "")); + cubeCards.add(new CardIdentity("Falkenrath Aristocrat", "")); + cubeCards.add(new CardIdentity("Far // Away", "")); + cubeCards.add(new CardIdentity("Farseek", "")); + cubeCards.add(new CardIdentity("Fathom Seer", "")); + cubeCards.add(new CardIdentity("Fauna Shaman", "")); + cubeCards.add(new CardIdentity("Fellwar Stone", "")); + cubeCards.add(new CardIdentity("Fiend Hunter", "")); + cubeCards.add(new CardIdentity("Figure of Destiny", "")); + cubeCards.add(new CardIdentity("Fire // Ice", "")); + cubeCards.add(new CardIdentity("Fireblast", "")); + cubeCards.add(new CardIdentity("Firebolt", "")); + cubeCards.add(new CardIdentity("Firedrinker Satyr", "")); + cubeCards.add(new CardIdentity("Firefist Striker", "")); + cubeCards.add(new CardIdentity("Flames of the Firebrand", "")); + cubeCards.add(new CardIdentity("Flametongue Kavu", "")); + cubeCards.add(new CardIdentity("Flickerwisp", "")); + cubeCards.add(new CardIdentity("Flooded Strand", "")); + cubeCards.add(new CardIdentity("Forbid", "")); + cubeCards.add(new CardIdentity("Forbidden Alchemy", "")); + cubeCards.add(new CardIdentity("Force of Will", "")); + cubeCards.add(new CardIdentity("Frantic Search", "")); + cubeCards.add(new CardIdentity("Frenzied Goblin", "")); + cubeCards.add(new CardIdentity("Frost Titan", "")); + cubeCards.add(new CardIdentity("Future Sight", "")); + cubeCards.add(new CardIdentity("Fyndhorn Elves", "")); + cubeCards.add(new CardIdentity("Gaea's Cradle", "")); + cubeCards.add(new CardIdentity("Gamble", "")); cubeCards.add(new CardIdentity("Garruk Relentless", "")); cubeCards.add(new CardIdentity("Garruk Wildspeaker", "")); cubeCards.add(new CardIdentity("Garruk, Primal Hunter", "")); - cubeCards.add(new CardIdentity("Arbor Elf", "")); - cubeCards.add(new CardIdentity("Birthing Pod", "")); - cubeCards.add(new CardIdentity("Vines of Vastwood", "")); - cubeCards.add(new CardIdentity("Moment's Peace", "")); - cubeCards.add(new CardIdentity("Naturalize", "")); - cubeCards.add(new CardIdentity("Beast Within", "")); - cubeCards.add(new CardIdentity("Harrow", "")); - cubeCards.add(new CardIdentity("Stonewood Invocation", "")); - cubeCards.add(new CardIdentity("Summoning Trap", "")); - cubeCards.add(new CardIdentity("Channel", "")); - cubeCards.add(new CardIdentity("Explore", "")); - cubeCards.add(new CardIdentity("Farseek", "")); - cubeCards.add(new CardIdentity("Life from the Loam", "")); - cubeCards.add(new CardIdentity("Rampant Growth", "")); - cubeCards.add(new CardIdentity("Regrowth", "")); - cubeCards.add(new CardIdentity("Call of the Herd", "")); - cubeCards.add(new CardIdentity("Cultivate", "")); - cubeCards.add(new CardIdentity("Kodama's Reach", "")); - cubeCards.add(new CardIdentity("Search for Tomorrow", "")); - cubeCards.add(new CardIdentity("Harmonize", "")); - cubeCards.add(new CardIdentity("Natural Order", "")); - cubeCards.add(new CardIdentity("Overrun", "")); - cubeCards.add(new CardIdentity("Plow Under", "")); - cubeCards.add(new CardIdentity("Primal Command", "")); - cubeCards.add(new CardIdentity("Restock", "")); - cubeCards.add(new CardIdentity("Rude Awakening", "")); - cubeCards.add(new CardIdentity("Stunted Growth", "")); - cubeCards.add(new CardIdentity("Green Sun's Zenith", "")); - cubeCards.add(new CardIdentity("Tooth and Nail", "")); - cubeCards.add(new CardIdentity("Genesis Wave", "")); - cubeCards.add(new CardIdentity("Rancor", "")); - cubeCards.add(new CardIdentity("Oath of Druids", "")); - cubeCards.add(new CardIdentity("Survival of the Fittest", "")); - cubeCards.add(new CardIdentity("Sylvan Library", "")); - cubeCards.add(new CardIdentity("Awakening Zone", "")); - cubeCards.add(new CardIdentity("Heartbeat of Spring", "")); - cubeCards.add(new CardIdentity("Defense of the Heart", "")); - cubeCards.add(new CardIdentity("Courser of Kruphix", "")); - cubeCards.add(new CardIdentity("Gaea's Cradle", "")); - cubeCards.add(new CardIdentity("Treetop Village", "")); - cubeCards.add(new CardIdentity("Yavimaya Hollow", "")); - cubeCards.add(new CardIdentity("Geist of Saint Traft", "")); - cubeCards.add(new CardIdentity("Plumeveil", "")); - cubeCards.add(new CardIdentity("Wall of Denial", "")); - cubeCards.add(new CardIdentity("Grand Arbiter Augustin IV", "")); - cubeCards.add(new CardIdentity("Venser, the Sojourner", "")); - cubeCards.add(new CardIdentity("Supreme Verdict", "")); - cubeCards.add(new CardIdentity("Detention Sphere", "")); - cubeCards.add(new CardIdentity("Celestial Colonnade", "")); - cubeCards.add(new CardIdentity("Glacial Fortress", "")); - cubeCards.add(new CardIdentity("Hallowed Fountain", "")); - cubeCards.add(new CardIdentity("Tundra", "")); - cubeCards.add(new CardIdentity("Psychatog", "")); - cubeCards.add(new CardIdentity("Shadowmage Infiltrator", "")); - cubeCards.add(new CardIdentity("Duskmantle Seer", "")); - cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", "")); - cubeCards.add(new CardIdentity("Baleful Strix", "")); - cubeCards.add(new CardIdentity("Agony Warp", "")); - cubeCards.add(new CardIdentity("Far // Away", "")); - cubeCards.add(new CardIdentity("Creeping Tar Pit", "")); - cubeCards.add(new CardIdentity("Drowned Catacomb", "")); - cubeCards.add(new CardIdentity("Underground Sea", "")); - cubeCards.add(new CardIdentity("Watery Grave", "")); - cubeCards.add(new CardIdentity("Rakdos Cackler", "")); - cubeCards.add(new CardIdentity("Falkenrath Aristocrat", "")); - cubeCards.add(new CardIdentity("Murderous Redcap", "")); - cubeCards.add(new CardIdentity("Olivia Voldaren", "")); - cubeCards.add(new CardIdentity("Sarkhan the Mad", "")); - cubeCards.add(new CardIdentity("Bituminous Blast", "")); - cubeCards.add(new CardIdentity("Dreadbore", "")); - cubeCards.add(new CardIdentity("Badlands", "")); - cubeCards.add(new CardIdentity("Blood Crypt", "")); - cubeCards.add(new CardIdentity("Dragonskull Summit", "")); - cubeCards.add(new CardIdentity("Lavaclaw Reaches", "")); - cubeCards.add(new CardIdentity("Tattermunge Maniac", "")); - cubeCards.add(new CardIdentity("Burning-Tree Emissary", "")); - cubeCards.add(new CardIdentity("Boggart Ram-Gang", "")); - cubeCards.add(new CardIdentity("Bloodbraid Elf", "")); - cubeCards.add(new CardIdentity("Huntmaster of the Fells", "")); - cubeCards.add(new CardIdentity("Domri Rade", "")); - cubeCards.add(new CardIdentity("Manamorphose", "")); - cubeCards.add(new CardIdentity("Raging Ravine", "")); - cubeCards.add(new CardIdentity("Rootbound Crag", "")); - cubeCards.add(new CardIdentity("Stomping Ground", "")); - cubeCards.add(new CardIdentity("Taiga", "")); - cubeCards.add(new CardIdentity("Dryad Militant", "")); - cubeCards.add(new CardIdentity("Qasali Pridemage", "")); - cubeCards.add(new CardIdentity("Voice of Resurgence", "")); - cubeCards.add(new CardIdentity("Kitchen Finks", "")); - cubeCards.add(new CardIdentity("Knight of the Reliquary", "")); - cubeCards.add(new CardIdentity("Mirari's Wake", "")); + cubeCards.add(new CardIdentity("Gatekeeper of Malakir", "")); cubeCards.add(new CardIdentity("Gavony Township", "")); - cubeCards.add(new CardIdentity("Savannah", "")); - cubeCards.add(new CardIdentity("Stirring Wildwood", "")); - cubeCards.add(new CardIdentity("Sunpetal Grove", "")); - cubeCards.add(new CardIdentity("Temple Garden", "")); - cubeCards.add(new CardIdentity("Stillmoon Cavalier", "")); - cubeCards.add(new CardIdentity("Obzedat, Ghost Council", "")); - cubeCards.add(new CardIdentity("Ashen Rider", "")); - cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", "")); - cubeCards.add(new CardIdentity("Tidehollow Sculler", "")); - cubeCards.add(new CardIdentity("Vindicate", "")); + cubeCards.add(new CardIdentity("Geist of Saint Traft", "")); + cubeCards.add(new CardIdentity("Genesis Wave", "")); + cubeCards.add(new CardIdentity("Genesis", "")); + cubeCards.add(new CardIdentity("Geralf's Messenger", "")); + cubeCards.add(new CardIdentity("Ghitu Encampment", "")); + cubeCards.add(new CardIdentity("Gideon Jura", "")); + cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); + cubeCards.add(new CardIdentity("Gifts Ungiven", "")); + cubeCards.add(new CardIdentity("Gilded Drake", "")); + cubeCards.add(new CardIdentity("Gilded Lotus", "")); + cubeCards.add(new CardIdentity("Gitaxian Probe", "")); + cubeCards.add(new CardIdentity("Glacial Fortress", "")); + cubeCards.add(new CardIdentity("Glen Elendra Archmage", "")); + cubeCards.add(new CardIdentity("Gnarled Scarhide", "")); + cubeCards.add(new CardIdentity("Go for the Throat", "")); + cubeCards.add(new CardIdentity("Goblin Bushwhacker", "")); + cubeCards.add(new CardIdentity("Goblin Guide", "")); + cubeCards.add(new CardIdentity("Goblin Ruinblaster", "")); + cubeCards.add(new CardIdentity("Goblin Wardriver", "")); + cubeCards.add(new CardIdentity("Goblin Welder", "")); cubeCards.add(new CardIdentity("Godless Shrine", "")); - cubeCards.add(new CardIdentity("Isolated Chapel", "")); - cubeCards.add(new CardIdentity("Scrubland", "")); - cubeCards.add(new CardIdentity("Vault of the Archangel", "")); - cubeCards.add(new CardIdentity("Deathrite Shaman", "")); - cubeCards.add(new CardIdentity("Putrid Leech", "")); - cubeCards.add(new CardIdentity("Varolz, the Scar-Striped", "")); - cubeCards.add(new CardIdentity("Vraska the Unseen", "")); - cubeCards.add(new CardIdentity("Putrefy", "")); - cubeCards.add(new CardIdentity("Abrupt Decay", "")); - cubeCards.add(new CardIdentity("Maelstrom Pulse", "")); - cubeCards.add(new CardIdentity("Pernicious Deed", "")); - cubeCards.add(new CardIdentity("Bayou", "")); - cubeCards.add(new CardIdentity("Overgrown Tomb", "")); - cubeCards.add(new CardIdentity("Woodland Cemetery", "")); - cubeCards.add(new CardIdentity("Coiling Oracle", "")); - cubeCards.add(new CardIdentity("Cold-Eyed Selkie", "")); - cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", "")); - cubeCards.add(new CardIdentity("Trygon Predator", "")); - cubeCards.add(new CardIdentity("Mystic Snake", "")); - cubeCards.add(new CardIdentity("Simic Sky Swallower", "")); - cubeCards.add(new CardIdentity("Kiora, the Crashing Wave", "")); - cubeCards.add(new CardIdentity("Voidslime", "")); - cubeCards.add(new CardIdentity("Breeding Pool", "")); + cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); + cubeCards.add(new CardIdentity("Grafted Wargear", "")); + cubeCards.add(new CardIdentity("Grand Arbiter Augustin IV", "")); + cubeCards.add(new CardIdentity("Grave Titan", "")); + cubeCards.add(new CardIdentity("Graveborn Muse", "")); + cubeCards.add(new CardIdentity("Gravecrawler", "")); + cubeCards.add(new CardIdentity("Greater Gargadon", "")); + cubeCards.add(new CardIdentity("Green Sun's Zenith", "")); + cubeCards.add(new CardIdentity("Grim Lavamancer", "")); + cubeCards.add(new CardIdentity("Grim Monolith", "")); + cubeCards.add(new CardIdentity("Griselbrand", "")); + cubeCards.add(new CardIdentity("Gush", "")); + cubeCards.add(new CardIdentity("Guul Draz Assassin", "")); + cubeCards.add(new CardIdentity("Hallowed Burial", "")); + cubeCards.add(new CardIdentity("Hallowed Fountain", "")); + cubeCards.add(new CardIdentity("Harmonize", "")); + cubeCards.add(new CardIdentity("Harrow", "")); + cubeCards.add(new CardIdentity("Heartbeat of Spring", "")); + cubeCards.add(new CardIdentity("Hellrider", "")); + cubeCards.add(new CardIdentity("Hell's Thunder", "")); + cubeCards.add(new CardIdentity("Hellspark Elemental", "")); + cubeCards.add(new CardIdentity("Herald of Torment", "")); + cubeCards.add(new CardIdentity("Hero of Bladehold", "")); + cubeCards.add(new CardIdentity("Hero of Oxid Ridge", "")); + cubeCards.add(new CardIdentity("Hero's Downfall", "")); cubeCards.add(new CardIdentity("Hinterland Harbor", "")); - cubeCards.add(new CardIdentity("Tropical Island", "")); - cubeCards.add(new CardIdentity("Niv-Mizzet, Dracogenius", "")); - cubeCards.add(new CardIdentity("Nucklavee", "")); - cubeCards.add(new CardIdentity("Ral Zarek", "")); - cubeCards.add(new CardIdentity("Fire // Ice", "")); + cubeCards.add(new CardIdentity("Hokori, Dust Drinker", "")); + cubeCards.add(new CardIdentity("Honor of the Pure", "")); + cubeCards.add(new CardIdentity("Huntmaster of the Fells", "")); + cubeCards.add(new CardIdentity("Hymn to Tourach", "")); + cubeCards.add(new CardIdentity("Hypnotic Specter", "")); + cubeCards.add(new CardIdentity("Ideas Unbound", "")); + cubeCards.add(new CardIdentity("Imperial Recruiter", "")); + cubeCards.add(new CardIdentity("Imposing Sovereign", "")); + cubeCards.add(new CardIdentity("Impulse", "")); + cubeCards.add(new CardIdentity("Incinerate", "")); + cubeCards.add(new CardIdentity("Increasing Devotion", "")); + cubeCards.add(new CardIdentity("Indrik Stomphowler", "")); + cubeCards.add(new CardIdentity("Inferno Titan", "")); + cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni", "")); + cubeCards.add(new CardIdentity("Innocent Blood", "")); + cubeCards.add(new CardIdentity("Inquisition of Kozilek", "")); + cubeCards.add(new CardIdentity("Into the Roil", "")); + cubeCards.add(new CardIdentity("Intuition", "")); + cubeCards.add(new CardIdentity("Iona, Shield of Emeria", "")); + cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", "")); + cubeCards.add(new CardIdentity("Isochron Scepter", "")); + cubeCards.add(new CardIdentity("Isolated Chapel", "")); cubeCards.add(new CardIdentity("Izzet Charm", "")); - cubeCards.add(new CardIdentity("Electrolyze", "")); - cubeCards.add(new CardIdentity("Steam Augury", "")); - cubeCards.add(new CardIdentity("Prophetic Bolt", "")); - cubeCards.add(new CardIdentity("Steam Vents", "")); - cubeCards.add(new CardIdentity("Sulfur Falls", "")); - cubeCards.add(new CardIdentity("Volcanic Island", "")); - cubeCards.add(new CardIdentity("Figure of Destiny", "")); - cubeCards.add(new CardIdentity("Boros Reckoner", "")); - cubeCards.add(new CardIdentity("Ajani Vengeant", "")); - cubeCards.add(new CardIdentity("Boros Charm", "")); - cubeCards.add(new CardIdentity("Lightning Helix", "")); - cubeCards.add(new CardIdentity("Aurelia's Fury", "")); - cubeCards.add(new CardIdentity("Chained to the Rocks", "")); - cubeCards.add(new CardIdentity("Clifftop Retreat", "")); - cubeCards.add(new CardIdentity("Plateau", "")); - cubeCards.add(new CardIdentity("Sacred Foundry", "")); - cubeCards.add(new CardIdentity("Sphinx of the Steel Wind", "")); - cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker", "")); - cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth", "")); - cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", "")); - cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", "")); + cubeCards.add(new CardIdentity("Jace Beleren", "")); + cubeCards.add(new CardIdentity("Jace, Architect of Thought", "")); + cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", "")); + cubeCards.add(new CardIdentity("Jackal Pup", "")); + cubeCards.add(new CardIdentity("Jokulhaups", "")); + cubeCards.add(new CardIdentity("Joraga Treespeaker", "")); + cubeCards.add(new CardIdentity("Journey to Nowhere", "")); + cubeCards.add(new CardIdentity("Kami of Ancient Law", "")); + cubeCards.add(new CardIdentity("Karakas", "")); + cubeCards.add(new CardIdentity("Kargan Dragonlord", "")); + cubeCards.add(new CardIdentity("Karmic Guide", "")); cubeCards.add(new CardIdentity("Karn Liberated", "")); - cubeCards.add(new CardIdentity("Epochrasite", "")); - cubeCards.add(new CardIdentity("Phyrexian Revoker", "")); - cubeCards.add(new CardIdentity("Spellskite", "")); - cubeCards.add(new CardIdentity("Palladium Myr", "")); + cubeCards.add(new CardIdentity("Keiga, the Tide Star", "")); + cubeCards.add(new CardIdentity("Keldon Champion", "")); + cubeCards.add(new CardIdentity("Keldon Marauders", "")); + cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker", "")); + cubeCards.add(new CardIdentity("Kiora, the Crashing Wave", "")); + cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", "")); + cubeCards.add(new CardIdentity("Kitchen Finks", "")); + cubeCards.add(new CardIdentity("Kjeldoran Outpost", "")); + cubeCards.add(new CardIdentity("Knight of Glory", "")); + cubeCards.add(new CardIdentity("Knight of Infamy", "")); + cubeCards.add(new CardIdentity("Knight of Meadowgrain", "")); + cubeCards.add(new CardIdentity("Knight of the Reliquary", "")); + cubeCards.add(new CardIdentity("Kodama's Reach", "")); + cubeCards.add(new CardIdentity("Kokusho, the Evening Star", "")); + cubeCards.add(new CardIdentity("Kor Sanctifiers", "")); + cubeCards.add(new CardIdentity("Kor Skyfisher", "")); + cubeCards.add(new CardIdentity("Koth of the Hammer", "")); + cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth", "")); + cubeCards.add(new CardIdentity("Land Tax", "")); + cubeCards.add(new CardIdentity("Lavaclaw Reaches", "")); + cubeCards.add(new CardIdentity("Legacy's Allure", "")); + cubeCards.add(new CardIdentity("Library of Alexandria", "")); + cubeCards.add(new CardIdentity("Life from the Loam", "")); + cubeCards.add(new CardIdentity("Lightning Bolt", "")); + cubeCards.add(new CardIdentity("Lightning Greaves", "")); + cubeCards.add(new CardIdentity("Lightning Helix", "")); + cubeCards.add(new CardIdentity("Lightning Mauler", "")); + cubeCards.add(new CardIdentity("Lightning Strike", "")); + cubeCards.add(new CardIdentity("Liliana of the Veil", "")); + cubeCards.add(new CardIdentity("Liliana Vess", "")); + cubeCards.add(new CardIdentity("Lingering Souls", "")); + cubeCards.add(new CardIdentity("Living Death", "")); + cubeCards.add(new CardIdentity("Llanowar Elves", "")); cubeCards.add(new CardIdentity("Lodestone Golem", "")); - cubeCards.add(new CardIdentity("Masticore", "")); - cubeCards.add(new CardIdentity("Molten-Tail Masticore", "")); - cubeCards.add(new CardIdentity("Solemn Simulacrum", "")); - cubeCards.add(new CardIdentity("Precursor Golem", "")); - cubeCards.add(new CardIdentity("Wurmcoil Engine", "")); - cubeCards.add(new CardIdentity("Myr Battlesphere", "")); - cubeCards.add(new CardIdentity("Platinum Angel", "")); - cubeCards.add(new CardIdentity("Sundering Titan", "")); - cubeCards.add(new CardIdentity("Black Lotus", "")); - cubeCards.add(new CardIdentity("Chrome Mox", "")); - cubeCards.add(new CardIdentity("Everflowing Chalice", "")); + cubeCards.add(new CardIdentity("Looter il-Kor", "")); cubeCards.add(new CardIdentity("Lotus Bloom", "")); + cubeCards.add(new CardIdentity("Lotus Cobra", "")); cubeCards.add(new CardIdentity("Lotus Petal", "")); + cubeCards.add(new CardIdentity("Loyal Cathar", "")); + cubeCards.add(new CardIdentity("Loyal Retainers", "")); + cubeCards.add(new CardIdentity("Luminarch Ascension", "")); + cubeCards.add(new CardIdentity("Maelstrom Pulse", "")); + cubeCards.add(new CardIdentity("Magma Jet", "")); + cubeCards.add(new CardIdentity("Makeshift Mannequin", "")); + cubeCards.add(new CardIdentity("Mana Confluence", "")); cubeCards.add(new CardIdentity("Mana Crypt", "")); + cubeCards.add(new CardIdentity("Mana Drain", "")); + cubeCards.add(new CardIdentity("Mana Leak", "")); + cubeCards.add(new CardIdentity("Mana Tithe", "")); + cubeCards.add(new CardIdentity("Mana Vault", "")); + cubeCards.add(new CardIdentity("Manamorphose", "")); + cubeCards.add(new CardIdentity("Man-o'-War", "")); + cubeCards.add(new CardIdentity("Marsh Flats", "")); + cubeCards.add(new CardIdentity("Martial Coup", "")); + cubeCards.add(new CardIdentity("Master of the Feast", "")); + cubeCards.add(new CardIdentity("Master of the Wild Hunt", "")); + cubeCards.add(new CardIdentity("Masticore", "")); + cubeCards.add(new CardIdentity("Mayor of Avabruck", "")); + cubeCards.add(new CardIdentity("Maze of Ith", "")); + cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", "")); + cubeCards.add(new CardIdentity("Memory Jar", "")); + cubeCards.add(new CardIdentity("Memory Lapse", "")); + cubeCards.add(new CardIdentity("Mentor of the Meek", "")); + cubeCards.add(new CardIdentity("Mesmeric Fiend", "")); + cubeCards.add(new CardIdentity("Mikaeus, the Lunarch", "")); + cubeCards.add(new CardIdentity("Mimic Vat", "")); + cubeCards.add(new CardIdentity("Mind Shatter", "")); + cubeCards.add(new CardIdentity("Mind Stone", "")); + cubeCards.add(new CardIdentity("Mind's Desire", "")); + cubeCards.add(new CardIdentity("Mindslaver", "")); + cubeCards.add(new CardIdentity("Mirari's Wake", "")); + cubeCards.add(new CardIdentity("Mirran Crusader", "")); + cubeCards.add(new CardIdentity("Mirror Entity", "")); + cubeCards.add(new CardIdentity("Miscalculation", "")); + cubeCards.add(new CardIdentity("Mishra's Factory", "")); + cubeCards.add(new CardIdentity("Misty Rainforest", "")); + cubeCards.add(new CardIdentity("Mogg Flunkies", "")); + cubeCards.add(new CardIdentity("Mogg War Marshal", "")); + cubeCards.add(new CardIdentity("Mold Shambler", "")); + cubeCards.add(new CardIdentity("Molten Rain", "")); + cubeCards.add(new CardIdentity("Molten-Tail Masticore", "")); + cubeCards.add(new CardIdentity("Momentary Blink", "")); + cubeCards.add(new CardIdentity("Moment's Peace", "")); + cubeCards.add(new CardIdentity("Mortarpod", "")); + cubeCards.add(new CardIdentity("Mother of Runes", "")); cubeCards.add(new CardIdentity("Mox Diamond", "")); cubeCards.add(new CardIdentity("Mox Emerald", "")); cubeCards.add(new CardIdentity("Mox Jet", "")); cubeCards.add(new CardIdentity("Mox Pearl", "")); cubeCards.add(new CardIdentity("Mox Ruby", "")); cubeCards.add(new CardIdentity("Mox Sapphire", "")); - cubeCards.add(new CardIdentity("AEther Vial", "")); - cubeCards.add(new CardIdentity("Basilisk Collar", "")); - cubeCards.add(new CardIdentity("Bonesplitter", "")); - cubeCards.add(new CardIdentity("Cursed Scroll", "")); - cubeCards.add(new CardIdentity("Mana Vault", "")); + cubeCards.add(new CardIdentity("Mulldrifter", "")); + cubeCards.add(new CardIdentity("Murderous Redcap", "")); + cubeCards.add(new CardIdentity("Mutavault", "")); + cubeCards.add(new CardIdentity("Myr Battlesphere", "")); + cubeCards.add(new CardIdentity("Mystic Snake", "")); + cubeCards.add(new CardIdentity("Mystical Tutor", "")); + cubeCards.add(new CardIdentity("Nantuko Shade", "")); + cubeCards.add(new CardIdentity("Nantuko Vigilante", "")); + cubeCards.add(new CardIdentity("Narcolepsy", "")); + cubeCards.add(new CardIdentity("Natural Order", "")); + cubeCards.add(new CardIdentity("Naturalize", "")); + cubeCards.add(new CardIdentity("Necromancy", "")); + cubeCards.add(new CardIdentity("Necropotence", "")); + cubeCards.add(new CardIdentity("Negate", "")); + cubeCards.add(new CardIdentity("Nekrataal", "")); + cubeCards.add(new CardIdentity("Nether Void", "")); + cubeCards.add(new CardIdentity("Nevinyrral's Disk", "")); + cubeCards.add(new CardIdentity("Nezumi Graverobber", "")); + cubeCards.add(new CardIdentity("Nezumi Shortfang", "")); + cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker", "")); + cubeCards.add(new CardIdentity("Night's Whisper", "")); + cubeCards.add(new CardIdentity("Nightscape Familiar", "")); + cubeCards.add(new CardIdentity("Niv-Mizzet, Dracogenius", "")); + cubeCards.add(new CardIdentity("Noble Hierarch", "")); + cubeCards.add(new CardIdentity("Nucklavee", "")); + cubeCards.add(new CardIdentity("Oath of Druids", "")); + cubeCards.add(new CardIdentity("Oblivion Ring", "")); + cubeCards.add(new CardIdentity("Obstinate Baloth", "")); + cubeCards.add(new CardIdentity("Obzedat, Ghost Council", "")); + cubeCards.add(new CardIdentity("Ohran Viper", "")); + cubeCards.add(new CardIdentity("Olivia Voldaren", "")); + cubeCards.add(new CardIdentity("Omenspeaker", "")); + cubeCards.add(new CardIdentity("Omniscience", "")); + cubeCards.add(new CardIdentity("Oona's Prowler", "")); + cubeCards.add(new CardIdentity("Opportunity", "")); + cubeCards.add(new CardIdentity("Opposition", "")); + cubeCards.add(new CardIdentity("Opt", "")); + cubeCards.add(new CardIdentity("Oracle of Mul Daya", "")); + cubeCards.add(new CardIdentity("Overgrown Battlement", "")); + cubeCards.add(new CardIdentity("Overgrown Tomb", "")); + cubeCards.add(new CardIdentity("Overrun", "")); + cubeCards.add(new CardIdentity("Pack Rat", "")); + cubeCards.add(new CardIdentity("Pact of Negation", "")); + cubeCards.add(new CardIdentity("Palinchron", "")); + cubeCards.add(new CardIdentity("Palladium Myr", "")); + cubeCards.add(new CardIdentity("Parallax Wave", "")); + cubeCards.add(new CardIdentity("Path to Exile", "")); + cubeCards.add(new CardIdentity("Pernicious Deed", "")); + cubeCards.add(new CardIdentity("Phantasmal Image", "")); + cubeCards.add(new CardIdentity("Phyrexian Arena", "")); + cubeCards.add(new CardIdentity("Phyrexian Metamorph", "")); + cubeCards.add(new CardIdentity("Phyrexian Obliterator", "")); + cubeCards.add(new CardIdentity("Phyrexian Rager", "")); + cubeCards.add(new CardIdentity("Phyrexian Revoker", "")); + cubeCards.add(new CardIdentity("Pillage", "")); cubeCards.add(new CardIdentity("Pithing Needle", "")); - cubeCards.add(new CardIdentity("Relic of Progenitus", "")); - cubeCards.add(new CardIdentity("Sensei's Divining Top", "")); - cubeCards.add(new CardIdentity("Skullclamp", "")); - cubeCards.add(new CardIdentity("Sol Ring", "")); - cubeCards.add(new CardIdentity("Ankh of Mishra", "")); - cubeCards.add(new CardIdentity("Chaos Orb", "")); - cubeCards.add(new CardIdentity("Coldsteel Heart", "")); - cubeCards.add(new CardIdentity("Fellwar Stone", "")); - cubeCards.add(new CardIdentity("Grim Monolith", "")); - cubeCards.add(new CardIdentity("Isochron Scepter", "")); - cubeCards.add(new CardIdentity("Lightning Greaves", "")); - cubeCards.add(new CardIdentity("Mind Stone", "")); - cubeCards.add(new CardIdentity("Mortarpod", "")); + cubeCards.add(new CardIdentity("Plateau", "")); + cubeCards.add(new CardIdentity("Plated Geopede", "")); + cubeCards.add(new CardIdentity("Platinum Angel", "")); + cubeCards.add(new CardIdentity("Plow Under", "")); + cubeCards.add(new CardIdentity("Plumeveil", "")); + cubeCards.add(new CardIdentity("Polluted Delta", "")); + cubeCards.add(new CardIdentity("Polukranos, World Eater", "")); + cubeCards.add(new CardIdentity("Ponder", "")); + cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); cubeCards.add(new CardIdentity("Powder Keg", "")); + cubeCards.add(new CardIdentity("Precursor Golem", "")); + cubeCards.add(new CardIdentity("Preordain", "")); + cubeCards.add(new CardIdentity("Primal Command", "")); + cubeCards.add(new CardIdentity("Primeval Titan", "")); + cubeCards.add(new CardIdentity("Primordial Hydra", "")); cubeCards.add(new CardIdentity("Prismatic Lens", "")); - cubeCards.add(new CardIdentity("Scroll Rack", "")); - cubeCards.add(new CardIdentity("Shrine of Burning Rage", "")); - cubeCards.add(new CardIdentity("Sphere of the Suns", "")); - cubeCards.add(new CardIdentity("Umezawa's Jitte", "")); - cubeCards.add(new CardIdentity("Basalt Monolith", "")); - cubeCards.add(new CardIdentity("Coalition Relic", "")); - cubeCards.add(new CardIdentity("Crucible of Worlds", "")); - cubeCards.add(new CardIdentity("Crystal Shard", "")); - cubeCards.add(new CardIdentity("Grafted Wargear", "")); - cubeCards.add(new CardIdentity("Mimic Vat", "")); cubeCards.add(new CardIdentity("Pristine Talisman", "")); + cubeCards.add(new CardIdentity("Profane Command", "")); + cubeCards.add(new CardIdentity("Prognostic Sphinx", "")); + cubeCards.add(new CardIdentity("Prophetic Bolt", "")); + cubeCards.add(new CardIdentity("Psionic Blast", "")); + cubeCards.add(new CardIdentity("Psychatog", "")); + cubeCards.add(new CardIdentity("Puppeteer Clique", "")); + cubeCards.add(new CardIdentity("Purphoros, God of the Forge", "")); + cubeCards.add(new CardIdentity("Putrefy", "")); + cubeCards.add(new CardIdentity("Putrid Leech", "")); + cubeCards.add(new CardIdentity("Pyroclasm", "")); + cubeCards.add(new CardIdentity("Pyrokinesis", "")); + cubeCards.add(new CardIdentity("Qasali Pridemage", "")); + cubeCards.add(new CardIdentity("Raging Ravine", "")); + cubeCards.add(new CardIdentity("Rakdos Cackler", "")); + cubeCards.add(new CardIdentity("Ral Zarek", "")); + cubeCards.add(new CardIdentity("Rampant Growth", "")); + cubeCards.add(new CardIdentity("Rancor", "")); + cubeCards.add(new CardIdentity("Ranger of Eos", "")); + cubeCards.add(new CardIdentity("Ravages of War", "")); + cubeCards.add(new CardIdentity("Ravenous Baboons", "")); + cubeCards.add(new CardIdentity("Reanimate", "")); + cubeCards.add(new CardIdentity("Reckless Charge", "")); + cubeCards.add(new CardIdentity("Reckless Waif", "")); + cubeCards.add(new CardIdentity("Recurring Nightmare", "")); + cubeCards.add(new CardIdentity("Regrowth", "")); + cubeCards.add(new CardIdentity("Relic of Progenitus", "")); + cubeCards.add(new CardIdentity("Remand", "")); + cubeCards.add(new CardIdentity("Repeal", "")); + cubeCards.add(new CardIdentity("Restock", "")); + cubeCards.add(new CardIdentity("Restoration Angel", "")); + cubeCards.add(new CardIdentity("Reveillark", "")); + cubeCards.add(new CardIdentity("Rift Bolt", "")); + cubeCards.add(new CardIdentity("Riftwing Cloudskate", "")); + cubeCards.add(new CardIdentity("Rishadan Port", "")); + cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", "")); + cubeCards.add(new CardIdentity("Rolling Earthquake", "")); + cubeCards.add(new CardIdentity("Rootbound Crag", "")); + cubeCards.add(new CardIdentity("Rout", "")); + cubeCards.add(new CardIdentity("Rude Awakening", "")); + cubeCards.add(new CardIdentity("Sacred Foundry", "")); + cubeCards.add(new CardIdentity("Sakura-Tribe Elder", "")); + cubeCards.add(new CardIdentity("Sarkhan the Mad", "")); + cubeCards.add(new CardIdentity("Savannah", "")); + cubeCards.add(new CardIdentity("Scalding Tarn", "")); + cubeCards.add(new CardIdentity("Scavenging Ooze", "")); + cubeCards.add(new CardIdentity("Scorned Villager", "")); + cubeCards.add(new CardIdentity("Scroll Rack", "")); + cubeCards.add(new CardIdentity("Scrubland", "")); + cubeCards.add(new CardIdentity("Sea Gate Oracle", "")); + cubeCards.add(new CardIdentity("Search for Tomorrow", "")); + cubeCards.add(new CardIdentity("Searing Blaze", "")); + cubeCards.add(new CardIdentity("Searing Spear", "")); + cubeCards.add(new CardIdentity("Sensei's Divining Top", "")); + cubeCards.add(new CardIdentity("Serendib Efreet", "")); + cubeCards.add(new CardIdentity("Shadowmage Infiltrator", "")); + cubeCards.add(new CardIdentity("Shelldock Isle", "")); + cubeCards.add(new CardIdentity("Sheoldred, Whispering One", "")); + cubeCards.add(new CardIdentity("Show and Tell", "")); + cubeCards.add(new CardIdentity("Shriekmaw", "")); + cubeCards.add(new CardIdentity("Shrine of Burning Rage", "")); + cubeCards.add(new CardIdentity("Siege-Gang Commander", "")); + cubeCards.add(new CardIdentity("Sign in Blood", "")); + cubeCards.add(new CardIdentity("Silverblade Paladin", "")); + cubeCards.add(new CardIdentity("Simic Sky Swallower", "")); + cubeCards.add(new CardIdentity("Sinkhole", "")); + cubeCards.add(new CardIdentity("Skinrender", "")); + cubeCards.add(new CardIdentity("Skithiryx, the Blight Dragon", "")); + cubeCards.add(new CardIdentity("Skizzik", "")); + cubeCards.add(new CardIdentity("Skullclamp", "")); + cubeCards.add(new CardIdentity("Slagstorm", "")); + cubeCards.add(new CardIdentity("Slaughter Pact", "")); + cubeCards.add(new CardIdentity("Slith Firewalker", "")); + cubeCards.add(new CardIdentity("Smokestack", "")); + cubeCards.add(new CardIdentity("Snapcaster Mage", "")); + cubeCards.add(new CardIdentity("Sneak Attack", "")); + cubeCards.add(new CardIdentity("Snuff Out", "")); + cubeCards.add(new CardIdentity("Sol Ring", "")); + cubeCards.add(new CardIdentity("Soldier of the Pantheon", "")); + cubeCards.add(new CardIdentity("Solemn Simulacrum", "")); + cubeCards.add(new CardIdentity("Soltari Champion", "")); + cubeCards.add(new CardIdentity("Soltari Monk", "")); + cubeCards.add(new CardIdentity("Soltari Priest", "")); + cubeCards.add(new CardIdentity("Sorin Markov", "")); + cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", "")); + cubeCards.add(new CardIdentity("Sower of Temptation", "")); + cubeCards.add(new CardIdentity("Spear of Heliod", "")); + cubeCards.add(new CardIdentity("Spectral Procession", "")); + cubeCards.add(new CardIdentity("Spellskite", "")); + cubeCards.add(new CardIdentity("Sphere of the Suns", "")); + cubeCards.add(new CardIdentity("Sphinx of the Steel Wind", "")); + cubeCards.add(new CardIdentity("Spikeshot Elder", "")); + cubeCards.add(new CardIdentity("Spirit of the Labyrinth", "")); + cubeCards.add(new CardIdentity("Squee, Goblin Nabob", "")); + cubeCards.add(new CardIdentity("Staggershock", "")); + cubeCards.add(new CardIdentity("Steam Augury", "")); + cubeCards.add(new CardIdentity("Steam Vents", "")); + cubeCards.add(new CardIdentity("Steppe Lynx", "")); + cubeCards.add(new CardIdentity("Stillmoon Cavalier", "")); + cubeCards.add(new CardIdentity("Stirring Wildwood", "")); + cubeCards.add(new CardIdentity("Stomping Ground", "")); + cubeCards.add(new CardIdentity("Stone Rain", "")); + cubeCards.add(new CardIdentity("Stonecloaker", "")); + cubeCards.add(new CardIdentity("Stoneforge Mystic", "")); + cubeCards.add(new CardIdentity("Stonewood Invocation", "")); + cubeCards.add(new CardIdentity("Stormblood Berserker", "")); + cubeCards.add(new CardIdentity("Strangleroot Geist", "")); + cubeCards.add(new CardIdentity("Strip Mine", "")); + cubeCards.add(new CardIdentity("Stromkirk Noble", "")); + cubeCards.add(new CardIdentity("Student of Warfare", "")); + cubeCards.add(new CardIdentity("Stunted Growth", "")); + cubeCards.add(new CardIdentity("Sublime Archangel", "")); + cubeCards.add(new CardIdentity("Sulfur Falls", "")); + cubeCards.add(new CardIdentity("Sulfuric Vortex", "")); + cubeCards.add(new CardIdentity("Summoning Trap", "")); + cubeCards.add(new CardIdentity("Sun Titan", "")); + cubeCards.add(new CardIdentity("Sundering Titan", "")); + cubeCards.add(new CardIdentity("Sunpetal Grove", "")); + cubeCards.add(new CardIdentity("Supreme Verdict", "")); + cubeCards.add(new CardIdentity("Survival of the Fittest", "")); cubeCards.add(new CardIdentity("Sword of Body and Mind", "")); cubeCards.add(new CardIdentity("Sword of Feast and Famine", "")); cubeCards.add(new CardIdentity("Sword of Fire and Ice", "")); cubeCards.add(new CardIdentity("Sword of Light and Shadow", "")); cubeCards.add(new CardIdentity("Sword of War and Peace", "")); + cubeCards.add(new CardIdentity("Swords to Plowshares", "")); + cubeCards.add(new CardIdentity("Sylvan Caryatid", "")); + cubeCards.add(new CardIdentity("Sylvan Library", "")); + cubeCards.add(new CardIdentity("Taiga", "")); + cubeCards.add(new CardIdentity("Tainted Pact", "")); + cubeCards.add(new CardIdentity("Talrand, Sky Summoner", "")); + cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage", "")); cubeCards.add(new CardIdentity("Tangle Wire", "")); - cubeCards.add(new CardIdentity("Vedalken Shackles", "")); - cubeCards.add(new CardIdentity("Worn Powerstone", "")); - cubeCards.add(new CardIdentity("Nevinyrral's Disk", "")); - cubeCards.add(new CardIdentity("Smokestack", "")); - cubeCards.add(new CardIdentity("Thran Dynamo", "")); - cubeCards.add(new CardIdentity("Batterskull", "")); - cubeCards.add(new CardIdentity("Eldrazi Monument", "")); - cubeCards.add(new CardIdentity("Engineered Explosives", "")); - cubeCards.add(new CardIdentity("Gilded Lotus", "")); - cubeCards.add(new CardIdentity("Memory Jar", "")); - cubeCards.add(new CardIdentity("Mindslaver", "")); - cubeCards.add(new CardIdentity("All Is Dust", "")); - cubeCards.add(new CardIdentity("Ancient Tomb", "")); - cubeCards.add(new CardIdentity("Arid Mesa", "")); - cubeCards.add(new CardIdentity("Bloodstained Mire", "")); - cubeCards.add(new CardIdentity("City of Brass", "")); - cubeCards.add(new CardIdentity("City of Traitors", "")); - cubeCards.add(new CardIdentity("Evolving Wilds", "")); - cubeCards.add(new CardIdentity("Flooded Strand", "")); - cubeCards.add(new CardIdentity("Library of Alexandria", "")); - cubeCards.add(new CardIdentity("Mana Confluence", "")); - cubeCards.add(new CardIdentity("Marsh Flats", "")); - cubeCards.add(new CardIdentity("Maze of Ith", "")); - cubeCards.add(new CardIdentity("Mishra's Factory", "")); - cubeCards.add(new CardIdentity("Misty Rainforest", "")); - cubeCards.add(new CardIdentity("Mutavault", "")); - cubeCards.add(new CardIdentity("Polluted Delta", "")); - cubeCards.add(new CardIdentity("Rishadan Port", "")); - cubeCards.add(new CardIdentity("Scalding Tarn", "")); - cubeCards.add(new CardIdentity("Strip Mine", "")); + cubeCards.add(new CardIdentity("Tarmogoyf", "")); + cubeCards.add(new CardIdentity("Tattermunge Maniac", "")); cubeCards.add(new CardIdentity("Tectonic Edge", "")); + cubeCards.add(new CardIdentity("Teetering Peaks", "")); + cubeCards.add(new CardIdentity("Temple Garden", "")); + cubeCards.add(new CardIdentity("Temporal Isolation", "")); + cubeCards.add(new CardIdentity("Tendrils of Agony", "")); + cubeCards.add(new CardIdentity("Terastodon", "")); + cubeCards.add(new CardIdentity("Terminus", "")); cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); + cubeCards.add(new CardIdentity("Terror", "")); + cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", "")); + cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", "")); + cubeCards.add(new CardIdentity("The Abyss", "")); cubeCards.add(new CardIdentity("The Tabernacle at Pendrell Vale", "")); + cubeCards.add(new CardIdentity("Thelonite Hermit", "")); + cubeCards.add(new CardIdentity("Thirst for Knowledge", "")); + cubeCards.add(new CardIdentity("Thornling", "")); + cubeCards.add(new CardIdentity("Thoughtseize", "")); + cubeCards.add(new CardIdentity("Thragtusk", "")); + cubeCards.add(new CardIdentity("Thran Dynamo", "")); + cubeCards.add(new CardIdentity("Thrun, the Last Troll", "")); + cubeCards.add(new CardIdentity("Thundermaw Hellkite", "")); + cubeCards.add(new CardIdentity("Thunderscape Battlemage", "")); + cubeCards.add(new CardIdentity("Tidehollow Sculler", "")); + cubeCards.add(new CardIdentity("Time Spiral", "")); + cubeCards.add(new CardIdentity("Time Walk", "")); + cubeCards.add(new CardIdentity("Time Warp", "")); + cubeCards.add(new CardIdentity("Timetwister", "")); + cubeCards.add(new CardIdentity("Tinker", "")); + cubeCards.add(new CardIdentity("Tombstalker", "")); + cubeCards.add(new CardIdentity("Tooth and Nail", "")); + cubeCards.add(new CardIdentity("Torch Fiend", "")); + cubeCards.add(new CardIdentity("Tormented Hero", "")); + cubeCards.add(new CardIdentity("Tradewind Rider", "")); + cubeCards.add(new CardIdentity("Treachery", "")); + cubeCards.add(new CardIdentity("Treetop Village", "")); + cubeCards.add(new CardIdentity("Trinket Mage", "")); + cubeCards.add(new CardIdentity("Tropical Island", "")); + cubeCards.add(new CardIdentity("Trygon Predator", "")); + cubeCards.add(new CardIdentity("Tundra", "")); + cubeCards.add(new CardIdentity("Turnabout", "")); + cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", "")); + cubeCards.add(new CardIdentity("Ultimate Price", "")); + cubeCards.add(new CardIdentity("Ulvenwald Tracker", "")); + cubeCards.add(new CardIdentity("Umezawa's Jitte", "")); + cubeCards.add(new CardIdentity("Underground Sea", "")); + cubeCards.add(new CardIdentity("Upheaval", "")); + cubeCards.add(new CardIdentity("Urabrask the Hidden", "")); + cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth", "")); + cubeCards.add(new CardIdentity("Vampire Hexmage", "")); + cubeCards.add(new CardIdentity("Vampire Lacerator", "")); + cubeCards.add(new CardIdentity("Vampire Nighthawk", "")); + cubeCards.add(new CardIdentity("Vampiric Tutor", "")); + cubeCards.add(new CardIdentity("Varolz, the Scar-Striped", "")); + cubeCards.add(new CardIdentity("Vault of the Archangel", "")); + cubeCards.add(new CardIdentity("Vedalken Shackles", "")); + cubeCards.add(new CardIdentity("Vendilion Clique", "")); + cubeCards.add(new CardIdentity("Vengevine", "")); + cubeCards.add(new CardIdentity("Venser, Shaper Savant", "")); + cubeCards.add(new CardIdentity("Venser, the Sojourner", "")); cubeCards.add(new CardIdentity("Verdant Catacombs", "")); + cubeCards.add(new CardIdentity("Vesuvan Shapeshifter", "")); + cubeCards.add(new CardIdentity("Vexing Devil", "")); + cubeCards.add(new CardIdentity("Vindicate", "")); + cubeCards.add(new CardIdentity("Vines of Vastwood", "")); + cubeCards.add(new CardIdentity("Voice of Resurgence", "")); + cubeCards.add(new CardIdentity("Voidslime", "")); + cubeCards.add(new CardIdentity("Volcanic Fallout", "")); + cubeCards.add(new CardIdentity("Volcanic Island", "")); + cubeCards.add(new CardIdentity("Volrath's Stronghold", "")); + cubeCards.add(new CardIdentity("Vorapede", "")); + cubeCards.add(new CardIdentity("Vraska the Unseen", "")); + cubeCards.add(new CardIdentity("Wake Thrasher", "")); + cubeCards.add(new CardIdentity("Wall of Blossoms", "")); + cubeCards.add(new CardIdentity("Wall of Denial", "")); + cubeCards.add(new CardIdentity("Wall of Omens", "")); + cubeCards.add(new CardIdentity("Wall of Reverence", "")); + cubeCards.add(new CardIdentity("Wall of Roots", "")); cubeCards.add(new CardIdentity("Wasteland", "")); + cubeCards.add(new CardIdentity("Waterfront Bouncer", "")); + cubeCards.add(new CardIdentity("Watery Grave", "")); + cubeCards.add(new CardIdentity("Weathered Wayfarer", "")); + cubeCards.add(new CardIdentity("Werebear", "")); + cubeCards.add(new CardIdentity("Wheel of Fortune", "")); + cubeCards.add(new CardIdentity("Wickerbough Elder", "")); + cubeCards.add(new CardIdentity("Wildfire", "")); + cubeCards.add(new CardIdentity("Windbrisk Heights", "")); cubeCards.add(new CardIdentity("Windswept Heath", "")); + cubeCards.add(new CardIdentity("Wolfir Avenger", "")); + cubeCards.add(new CardIdentity("Wood Elves", "")); cubeCards.add(new CardIdentity("Wooded Foothills", "")); - + cubeCards.add(new CardIdentity("Woodfall Primus", "")); + cubeCards.add(new CardIdentity("Woodland Cemetery", "")); + cubeCards.add(new CardIdentity("Worn Powerstone", "")); + cubeCards.add(new CardIdentity("Worship", "")); + cubeCards.add(new CardIdentity("Wrath of God", "")); + cubeCards.add(new CardIdentity("Wurmcoil Engine", "")); + cubeCards.add(new CardIdentity("Yavimaya Elder", "")); + cubeCards.add(new CardIdentity("Yavimaya Hollow", "")); + cubeCards.add(new CardIdentity("Yawgmoth's Bargain", "")); + cubeCards.add(new CardIdentity("Yawgmoth's Will", "")); + cubeCards.add(new CardIdentity("Yeva, Nature's Herald", "")); + cubeCards.add(new CardIdentity("Yosei, the Morning Star", "")); + cubeCards.add(new CardIdentity("Young Pyromancer", "")); + cubeCards.add(new CardIdentity("Zealous Conscripts", "")); + cubeCards.add(new CardIdentity("Zo-Zu the Punisher", "")); } } From 540f1f2eacb5edcdcbb16d98f80969eb34e8e81a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 16 Jul 2015 22:21:18 +0200 Subject: [PATCH 080/375] * Touch of Moonglove - Fixed that the dealayed trigger only worked for one creature instead of for all damaged creatures. --- .../sets/magicorigins/TouchOfMoonglove.java | 3 +- .../triggers/dies/TouchOfMoongloveTest.java | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/TouchOfMoongloveTest.java diff --git a/Mage.Sets/src/mage/sets/magicorigins/TouchOfMoonglove.java b/Mage.Sets/src/mage/sets/magicorigins/TouchOfMoonglove.java index b5faf222d09..07c52503d96 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/TouchOfMoonglove.java +++ b/Mage.Sets/src/mage/sets/magicorigins/TouchOfMoonglove.java @@ -69,7 +69,6 @@ public class TouchOfMoonglove extends CardImpl { DeathtouchAbility.getInstance(), Duration.EndOfTurn, "and gains deathtouch until end of turn")); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); // Whenever a creature dealt damage by that creature this turn dies, its controller loses 2 life. - // this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(null)); this.getSpellAbility().addEffect(new TouchOfMoongloveAddTriggerEffect()); } @@ -119,7 +118,7 @@ class TouchOfMoongloveDelayedTriggeredAbility extends DelayedTriggeredAbility { private final MageObjectReference creatureToCheck; public TouchOfMoongloveDelayedTriggeredAbility(MageObjectReference creatureToCheck) { - super(new DamageTargetEffect(2), Duration.EndOfTurn); + super(new DamageTargetEffect(2), Duration.EndOfTurn, false); this.creatureToCheck = creatureToCheck; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/TouchOfMoongloveTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/TouchOfMoongloveTest.java new file mode 100644 index 00000000000..432d69d6c9b --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/TouchOfMoongloveTest.java @@ -0,0 +1,83 @@ +/* + * 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 org.mage.test.cards.triggers.dies; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class TouchOfMoongloveTest extends CardTestPlayerBase { + + /** + * I blocked my opponent's Pharika's Disciple with a Cleric of the Forward + * Order and Guardian Automaton. He cast Touch of Moonglove on his Pharika's + * Disciple and both of my creatures were killed, but I only lost 2 life + * instead of 4.(and gained 3 from Guardian Automaton dying). + * + */ + @Test + public void testDiesAndControllerDamage() { + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + // When Cleric of the Forward Order enters the battlefield, you gain 2 life for each creature you control named Cleric of the Forward Order. + addCard(Zone.HAND, playerA, "Cleric of the Forward Order", 1); + // When Guardian Automaton dies, you gain 3 life. + addCard(Zone.BATTLEFIELD, playerA, "Guardian Automaton", 1); // 3/3 + + addCard(Zone.BATTLEFIELD, playerB, "Swamp", 1); + // Target creature you control gets +1/+0 and gains deathtouch until end of turn. + // Whenever a creature dealt damage by that creature this turn dies, its controller loses 2 life. + addCard(Zone.HAND, playerB, "Touch of Moonglove"); // {B} + addCard(Zone.BATTLEFIELD, playerB, "Pharika's Disciple", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cleric of the Forward Order"); + attack(2, playerB, "Pharika's Disciple"); + block(2, playerA, "Cleric of the Forward Order", "Pharika's Disciple"); + block(2, playerA, "Guardian Automaton", "Pharika's Disciple"); + + castSpell(2, PhaseStep.DECLARE_BLOCKERS, playerB, "Touch of Moonglove", "Pharika's Disciple"); + + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, "Touch of Moonglove", 1); + assertGraveyardCount(playerA, "Cleric of the Forward Order", 1); + assertGraveyardCount(playerB, "Pharika's Disciple", 1); + + assertGraveyardCount(playerA, "Guardian Automaton", 1); + + assertLife(playerA, 21); // +2 by Cleric + 2x -2 by Touch +3 by Guardian Automation + assertLife(playerB, 20); + + } + +} From e209114a2634cb89e2387e7965f77c26a4d24951 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 16 Jul 2015 23:15:11 +0200 Subject: [PATCH 081/375] * KickerAbility - Fixed that KickerCondition did not work coorectly for kicker cards with multiple kicker options. --- .../cards/abilities/keywords/KickerTest.java | 35 +++++++++++++++++++ .../mage/abilities/keyword/KickerAbility.java | 13 +++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/KickerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/KickerTest.java index 2e7f90fdfa0..d669602b0bd 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/KickerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/KickerTest.java @@ -328,4 +328,39 @@ public class KickerTest extends CardTestPlayerBase { } + /** + * Check that kicker condition does also work for kicker cards with multiple + * kicker options + * + */ + @Test + public void testKickerCondition() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + + // Kicker {1}{G} and/or {2}{U} + // When {this} enters the battlefield, if it was kicked with its {1}{G} kicker, destroy target creature with flying. + // When {this} enters the battlefield, if it was kicked with its {2}{U} kicker, draw two cards. + addCard(Zone.HAND, playerA, "Sunscape Battlemage", 1); // 2/2 {2}{W} + + addCard(Zone.BATTLEFIELD, playerB, "Birds of Paradise", 1); + addCard(Zone.BATTLEFIELD, playerB, "Island", 1); + // Counter target spell if it was kicked. + addCard(Zone.HAND, playerB, "Ertai's Trickery", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sunscape Battlemage"); + addTarget(playerA, "Birds of Paradise"); + setChoice(playerA, "Yes"); // {1}{G} destroy target creature with flying + setChoice(playerA, "Yes"); // {2}{U} draw two cards + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Ertai's Trickery", "Sunscape Battlemage"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerB, "Birds of Paradise", 1); + assertGraveyardCount(playerB, "Ertai's Trickery", 1); + assertGraveyardCount(playerA, "Sunscape Battlemage", 1); + + } } diff --git a/Mage/src/mage/abilities/keyword/KickerAbility.java b/Mage/src/mage/abilities/keyword/KickerAbility.java index 48d33e124b9..bab41782814 100644 --- a/Mage/src/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/mage/abilities/keyword/KickerAbility.java @@ -158,8 +158,17 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo public boolean isKicked(Game game, Ability source, String costText) { String key = getActivationKey(source, costText, game); - if (activations.containsKey(key)) { - return activations.get(key) > 0; + if (kickerCosts.size() > 1) { + for (String activationKey : activations.keySet()) { + if (activationKey.startsWith(key) && activations.get(activationKey) > 0) { + return true; + } + } + } else { + if (activations.containsKey(key)) { + return activations.get(key) > 0; + + } } return false; } From 6804ba1f2fb0288f41d59699711b3fe3cf6429dd Mon Sep 17 00:00:00 2001 From: emerald000 Date: Fri, 17 Jul 2015 00:04:32 -0400 Subject: [PATCH 082/375] Magic Origins Update Bulletin changes. --- .../mage/sets/alliances/SoldeviExcavations.java | 12 +++++------- .../mage/sets/darksteel/DarksteelPendant.java | 6 +++--- .../mage/sets/gatecrash/BiomassMutation.java | 7 +++---- Mage.Sets/src/mage/sets/invasion/Opt.java | 7 +++---- .../src/mage/sets/magic2014/DarkProphecy.java | 11 ++++++++--- .../mage/sets/modernmasters/TestOfFaith.java | 6 ++---- .../sets/saviorsofkamigawa/ShapeStealer.java | 6 +++--- .../sets/scarsofmirrodin/MoriokReplica.java | 17 ++++++++++++----- .../mage/abilities/keyword/BushidoAbility.java | 2 +- .../abilities/keyword/ChangelingAbility.java | 4 ++-- .../mage/abilities/keyword/ProvokeAbility.java | 2 +- Utils/mtg-cards-data.txt | 4 ++-- 12 files changed, 45 insertions(+), 39 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alliances/SoldeviExcavations.java b/Mage.Sets/src/mage/sets/alliances/SoldeviExcavations.java index cbf814751bb..a4705db82e3 100644 --- a/Mage.Sets/src/mage/sets/alliances/SoldeviExcavations.java +++ b/Mage.Sets/src/mage/sets/alliances/SoldeviExcavations.java @@ -30,14 +30,13 @@ package mage.sets.alliances; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.EnterBattlefieldPayCostOrPutGraveyardEffect; -import mage.abilities.effects.common.LookLibraryMayPutToBottomEffect; +import mage.abilities.effects.keyword.ScryEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.constants.CardType; @@ -70,13 +69,12 @@ public class SoldeviExcavations extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.ALL, new EnterBattlefieldPayCostOrPutGraveyardEffect(new SacrificeTargetCost(new TargetControlledPermanent(filter))))); // {tap}: Add {1}{U} to your mana pool. - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 0, 0, 1,0 ), new TapSourceCost())); - // {1}, {tap}: Look at the top card of your library. You may put that card on the bottom of your library. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LookLibraryMayPutToBottomEffect(), new GenericManaCost(1)); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 0, 0, 1, 0), new TapSourceCost())); + + // {1}, {tap}: Scry 1. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScryEffect(1), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); this.addAbility(ability); - - } public SoldeviExcavations(final SoldeviExcavations card) { diff --git a/Mage.Sets/src/mage/sets/darksteel/DarksteelPendant.java b/Mage.Sets/src/mage/sets/darksteel/DarksteelPendant.java index c6bb0a5889c..f3e93931423 100644 --- a/Mage.Sets/src/mage/sets/darksteel/DarksteelPendant.java +++ b/Mage.Sets/src/mage/sets/darksteel/DarksteelPendant.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.LookLibraryMayPutToBottomEffect; +import mage.abilities.effects.keyword.ScryEffect; import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.constants.CardType; @@ -51,8 +51,8 @@ public class DarksteelPendant extends CardImpl { // Darksteel Pendant is indestructible. this.addAbility(IndestructibleAbility.getInstance()); - // {1}, {tap}: Look at the top card of your library. You may put that card on the bottom of your library. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LookLibraryMayPutToBottomEffect(), new GenericManaCost(1)); + // {1}, {tap}: Scry 1. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScryEffect(1), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/gatecrash/BiomassMutation.java b/Mage.Sets/src/mage/sets/gatecrash/BiomassMutation.java index 434c10e426b..051d2268d04 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/BiomassMutation.java +++ b/Mage.Sets/src/mage/sets/gatecrash/BiomassMutation.java @@ -28,14 +28,13 @@ package mage.sets.gatecrash; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.continuous.SetPowerToughnessAllEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Rarity; import mage.filter.common.FilterControlledCreaturePermanent; /** @@ -49,7 +48,7 @@ public class BiomassMutation extends CardImpl { this.expansionSetCode = "GTC"; - // Creatures you control become X/X until end of turn. + // Creatures you control have base power and toughness X/X until end of turn. DynamicValue variableMana = new ManacostVariableValue(); this.getSpellAbility().addEffect(new SetPowerToughnessAllEffect(variableMana, variableMana, Duration.EndOfTurn, new FilterControlledCreaturePermanent("Creatures you control"), true)); } diff --git a/Mage.Sets/src/mage/sets/invasion/Opt.java b/Mage.Sets/src/mage/sets/invasion/Opt.java index 00a8fe58780..132c5a085a8 100644 --- a/Mage.Sets/src/mage/sets/invasion/Opt.java +++ b/Mage.Sets/src/mage/sets/invasion/Opt.java @@ -29,7 +29,7 @@ package mage.sets.invasion; import java.util.UUID; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.LookLibraryMayPutToBottomEffect; +import mage.abilities.effects.keyword.ScryEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; @@ -44,9 +44,8 @@ public class Opt extends CardImpl { super(ownerId, 64, "Opt", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{U}"); this.expansionSetCode = "INV"; - - // Look at the top card of your library. You may put that card on the bottom of your library. - this.getSpellAbility().addEffect(new LookLibraryMayPutToBottomEffect()); + // Scry 1. + this.getSpellAbility().addEffect(new ScryEffect(1)); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/sets/magic2014/DarkProphecy.java b/Mage.Sets/src/mage/sets/magic2014/DarkProphecy.java index 416208588f3..fcd3c1e9aa5 100644 --- a/Mage.Sets/src/mage/sets/magic2014/DarkProphecy.java +++ b/Mage.Sets/src/mage/sets/magic2014/DarkProphecy.java @@ -30,6 +30,7 @@ package mage.sets.magic2014; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.cards.CardImpl; @@ -55,9 +56,13 @@ public class DarkProphecy extends CardImpl { this.expansionSetCode = "M14"; - // Whenever a creature you control dies, you draw a card and lose 1 life. - Ability ability = new DiesCreatureTriggeredAbility(new DrawCardSourceControllerEffect(1), false, filter); - ability.addEffect(new LoseLifeSourceControllerEffect(1)); + // Whenever a creature you control dies, you draw a card and you lose 1 life. + Effect effect = new DrawCardSourceControllerEffect(1); + effect.setText("you draw a card"); + Ability ability = new DiesCreatureTriggeredAbility(effect, false, filter); + effect = new LoseLifeSourceControllerEffect(1); + effect.setText("and you lose 1 life"); + ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/modernmasters/TestOfFaith.java b/Mage.Sets/src/mage/sets/modernmasters/TestOfFaith.java index 4baaf12bab9..40a9ea2a357 100644 --- a/Mage.Sets/src/mage/sets/modernmasters/TestOfFaith.java +++ b/Mage.Sets/src/mage/sets/modernmasters/TestOfFaith.java @@ -50,11 +50,9 @@ public class TestOfFaith extends CardImpl { super(ownerId, 33, "Test of Faith", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); this.expansionSetCode = "MMA"; - - // Prevent the next 3 damage that would be dealt to target creature this turn, and put a +1/+1 counter on that creature for each 1 damage prevented this way. + // Prevent the next 3 damage that would be dealt to target creature this turn. For each 1 damage prevented this way, put a +1/+1 counter on that creature. this.getSpellAbility().addEffect(new TestOfFaithPreventDamageTargetEffect(Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - } public TestOfFaith(final TestOfFaith card) { @@ -73,7 +71,7 @@ class TestOfFaithPreventDamageTargetEffect extends PreventionEffectImpl { public TestOfFaithPreventDamageTargetEffect(Duration duration) { super(duration); - staticText = "Prevent the next 3 damage that would be dealt to target creature this turn, and put a +1/+1 counter on that creature for each 1 damage prevented this way"; + staticText = "Prevent the next 3 damage that would be dealt to target creature this turn. For each 1 damage prevented this way, put a +1/+1 counter on that creature"; } public TestOfFaithPreventDamageTargetEffect(final TestOfFaithPreventDamageTargetEffect effect) { diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java index f0384b087dd..51cddc6978c 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/ShapeStealer.java @@ -56,13 +56,13 @@ public class ShapeStealer extends CardImpl { this.subtype.add("Spirit"); this.power = new MageInt(1); this.toughness = new MageInt(1); - // This ability triggers once for each creature blocked by or blocking Shape Stealer. // If multiple creatures block it, Shape Stealer's power and toughness will change for // each one in succession. The first trigger put on the stack will be the last to resolve, // so that will set Shape Stealer's final power and toughness. - // Whenever Shape Stealer blocks or becomes blocked by a creature, change Shape Stealer's power and toughness to that creature's power and toughness until end of turn. + + // Whenever Shape Stealer blocks or becomes blocked by a creature, change Shape Stealer's base power and toughness to that creature's power and toughness until end of turn. this.addAbility(new BlocksOrBecomesBlockedByCreatureTriggeredAbility(new ShapeStealerEffect(), false)); } @@ -80,7 +80,7 @@ class ShapeStealerEffect extends OneShotEffect { public ShapeStealerEffect() { super(Outcome.Detriment); - this.staticText = "change {this}'s power and toughness to that creature's power and toughness until end of turn"; + this.staticText = "change {this}'s base power and toughness to that creature's power and toughness until end of turn"; } public ShapeStealerEffect(final ShapeStealerEffect effect) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MoriokReplica.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MoriokReplica.java index d8919a383a6..2c94a0706da 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MoriokReplica.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MoriokReplica.java @@ -29,17 +29,18 @@ package mage.sets.scarsofmirrodin; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; 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; /** * @@ -53,9 +54,15 @@ public class MoriokReplica extends CardImpl { this.subtype.add("Warrior"); this.power = new MageInt(2); this.toughness = new MageInt(2); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl("{1}{B}")); + + // {1}{B}, Sacrifice Moriok Replica: You draw two cards and you lose 2 life. + Effect effect = new DrawCardSourceControllerEffect(2); + effect.setText("You draw two cards"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{B}")); + effect = new LoseLifeSourceControllerEffect(2); + effect.setText("and you lose 2 life"); ability.addCost(new SacrificeSourceCost()); - ability.addEffect(new LoseLifeSourceControllerEffect(2)); + ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage/src/mage/abilities/keyword/BushidoAbility.java b/Mage/src/mage/abilities/keyword/BushidoAbility.java index 30b239ece1a..3d51c036986 100644 --- a/Mage/src/mage/abilities/keyword/BushidoAbility.java +++ b/Mage/src/mage/abilities/keyword/BushidoAbility.java @@ -55,7 +55,7 @@ public class BushidoAbility extends BlocksOrBecomesBlockedTriggeredAbility { } static String getReminder(String xValue) { - return " (When this blocks or becomes blocked, it gets +" + xValue+ "/+" + xValue + " until end of turn.)"; + return " (Whenever this creature blocks or becomes blocked, it gets +" + xValue+ "/+" + xValue + " until end of turn.)"; } public BushidoAbility(final BushidoAbility ability) { diff --git a/Mage/src/mage/abilities/keyword/ChangelingAbility.java b/Mage/src/mage/abilities/keyword/ChangelingAbility.java index f36020d1bf6..94fb1debb65 100644 --- a/Mage/src/mage/abilities/keyword/ChangelingAbility.java +++ b/Mage/src/mage/abilities/keyword/ChangelingAbility.java @@ -29,9 +29,9 @@ package mage.abilities.keyword; import java.io.ObjectStreamException; -import mage.constants.Zone; import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import mage.constants.Zone; /** @@ -61,7 +61,7 @@ public class ChangelingAbility extends StaticAbility implements MageSingleton { @Override public String getRule() { - return "Changeling (This card is every creature type at all times.)"; + return "Changeling (This card is every creature type.)"; } @Override diff --git a/Mage/src/mage/abilities/keyword/ProvokeAbility.java b/Mage/src/mage/abilities/keyword/ProvokeAbility.java index 595d85a4a49..94b4c53f65d 100644 --- a/Mage/src/mage/abilities/keyword/ProvokeAbility.java +++ b/Mage/src/mage/abilities/keyword/ProvokeAbility.java @@ -55,7 +55,7 @@ import mage.target.common.TargetCreaturePermanent; public class ProvokeAbility extends AttacksTriggeredAbility { public ProvokeAbility() { - super(new UntapTargetEffect(), true, "Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.)"); + super(new UntapTargetEffect(), true, "Provoke (Whenever this attacks, you may have target creature defending player controls untap and block it if able.)"); this.addEffect(new ProvokeRequirementEffect()); } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index c0b550a7c16..66cd2ae3041 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -12513,7 +12513,7 @@ Override|Mirrodin|45|C|{2}{U}|Instant|||Counter target spell unless its controll Psychic Membrane|Mirrodin|46|U|{2}{U}|Creature - Wall|0|3|Defender (This creature can't attack.)$Whenever Psychic Membrane blocks, you may draw a card.| Quicksilver Elemental|Mirrodin|47|R|{3}{U}{U}|Creature - Elemental|3|4|{U}: Quicksilver Elemental gains all activated abilities of target creature until end of turn. (If any of the abilities use that creature's name, use this creature's name instead.)$You may spend blue mana as though it were mana of any color to pay the activation costs of Quicksilver Elemental's abilities.| Regress|Mirrodin|48|C|{2}{U}|Instant|||Return target permanent to its owner's hand.| -Shared Fate|Mirrodin|49|R|{4}{U}|Enchantment|||If a player would draw a card, that player exiles the top card of an opponent's library face down instead.$Each player may look at and play cards he or she exiled with Shared Fate.| +Shared Fate|Mirrodin|49|R|{4}{U}|Enchantment|||If a player would draw a card, that player exiles the top card of one of his or her opponents' libraries face down instead.$Each player may look at and play cards he or she exiled with Shared Fate.| Auriok Transfixer|Mirrodin|5|C|{W}|Creature - Human Scout|1|1|{W}, {tap}: Tap target artifact.| Slith Strider|Mirrodin|50|U|{1}{U}{U}|Creature - Slith|1|1|Whenever Slith Strider becomes blocked, draw a card.$Whenever Slith Strider deals combat damage to a player, put a +1/+1 counter on it.| Somber Hoverguard|Mirrodin|51|C|{5}{U}|Creature - Drone|3|2|Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)$Flying| @@ -15733,7 +15733,7 @@ Zephyr Spirit|Ravnica: City of Guilds|76|C|{5}{U}|Creature - Spirit|0|6|When Zep Blood Funnel|Ravnica: City of Guilds|77|R|{1}{B}|Enchantment|||Noncreature spells you cast cost {2} less to cast.$Whenever you cast a noncreature spell, counter that spell unless you sacrifice a creature.| Brainspoil|Ravnica: City of Guilds|78|C|{3}{B}{B}|Sorcery|||Destroy target creature that isn't enchanted. It can't be regenerated.$Transmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.)| Carrion Howler|Ravnica: City of Guilds|79|U|{3}{B}|Creature - Zombie Wolf|2|2|Pay 1 life: Carrion Howler gets +2/-1 until end of turn.| -Concerted Effort|Ravnica: City of Guilds|8|R|{2}{W}{W}|Enchantment|||At the beginning of each upkeep, all creatures you control gain flying until end of turn if a creature you control has flying. The same is true for fear, first strike, double strike, landwalk, protection, trample, and vigilance.| +Concerted Effort|Ravnica: City of Guilds|8|R|{2}{W}{W}|Enchantment|||At the beginning of each upkeep, creatures you control gain flying until end of turn if a creature you control has flying. The same is true for fear, first strike, double strike, landwalk, protection, trample, and vigilance.| Clinging Darkness|Ravnica: City of Guilds|80|C|{1}{B}|Enchantment - Aura|||Enchant creature$Enchanted creature gets -4/-1.| Dark Confidant|Ravnica: City of Guilds|81|R|{1}{B}|Creature - Human Wizard|2|1|At the beginning of your upkeep, reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost.| Darkblast|Ravnica: City of Guilds|82|U|{B}|Instant|||Target creature gets -1/-1 until end of turn.$Dredge 3 (If you would draw a card, instead you may put exactly three cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.)| From 5ed37420b58c382ae70b62cfaa7b42cfd87ab10e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 17 Jul 2015 08:08:50 +0200 Subject: [PATCH 083/375] [ORI] Fixed booster generation to include double faced creature/planeswalker cards. --- Mage.Sets/src/mage/sets/MagicOrigins.java | 1 + Mage/src/mage/cards/ExpansionSet.java | 72 ++++++++++++----------- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/Mage.Sets/src/mage/sets/MagicOrigins.java b/Mage.Sets/src/mage/sets/MagicOrigins.java index d9d75e78dd0..63cfc6f55d5 100644 --- a/Mage.Sets/src/mage/sets/MagicOrigins.java +++ b/Mage.Sets/src/mage/sets/MagicOrigins.java @@ -51,6 +51,7 @@ public class MagicOrigins extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 8; + this.numBoosterDoubleFaced = -1; // use by rarity /* There are additional cards, numbered 273–288, that don't appear in Magic Origin booster packs. These are reprints from earlier sets that are present in some supplemental products, including sample decks and the Deck Builder's Toolkit. diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index 17aee8cbb9b..4c5b9249fcc 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.cards; import java.io.Serializable; @@ -61,7 +60,7 @@ public abstract class ExpansionSet implements Serializable { protected int numBoosterCommon; protected int numBoosterUncommon; protected int numBoosterRare; - protected int numBoosterDoubleFaced; + protected int numBoosterDoubleFaced; // -1 = include normally 0 = exclude 1-n = include explicit protected int ratioBoosterMythic; protected String packageName; @@ -113,7 +112,7 @@ public abstract class ExpansionSet implements Serializable { } public List create15CardBooster() { - // Forces 15 card booster packs. + // Forces 15 card booster packs. // if the packs are too small, it adds commons to fill it out. // if the packs are too big, it removes the first cards. // since it adds lands then commons before uncommons @@ -137,13 +136,13 @@ public abstract class ExpansionSet implements Serializable { if (!hasBoosters) { return booster; } - + if (numBoosterLands > 0) { List basicLands = getCardsByRarity(Rarity.LAND); for (int i = 0; i < numBoosterLands; i++) { addToBooster(booster, basicLands); } - } + } List commons = getCardsByRarity(Rarity.COMMON); for (int i = 0; i < numBoosterCommon; i++) { addToBooster(booster, commons); @@ -237,7 +236,7 @@ public abstract class ExpansionSet implements Serializable { return booster; } - /* add double faced card for Innistrad booster + /* add double faced card for Innistrad booster * rarity near as the normal distribution */ private void addDoubleFace(List booster) { @@ -269,11 +268,11 @@ public abstract class ExpansionSet implements Serializable { } } } - + public boolean hasBoosters() { return hasBoosters; } - + public boolean hasBasicLands() { return hasBasicLands; } @@ -287,7 +286,10 @@ public abstract class ExpansionSet implements Serializable { } else { criteria.setCodes(this.code); } - criteria.rarities(rarity).doubleFaced(false); + criteria.rarities(rarity); + if (numBoosterDoubleFaced > -1) { + criteria.doubleFaced(false); + } if (maxCardNumberInBooster != Integer.MAX_VALUE) { criteria.maxCardNumber(maxCardNumberInBooster); } From 2931ea4c26a154372a07e942b52575171d78f55c Mon Sep 17 00:00:00 2001 From: fireshoes Date: Fri, 17 Jul 2015 01:23:33 -0500 Subject: [PATCH 084/375] Updated Ben's Cube. Implemented Blood Funnel, Mizzium Transreliquat, Jilt, Stand Together, Torpid Moloch, Tidewater Minion --- .../src/mage/tournament/cubes/BensCube.java | 83 +++---- Mage.Sets/src/mage/sets/apocalypse/Jilt.java | 111 +++++++++ .../mage/sets/darksteel/StandTogether.java | 66 +++++ .../sets/guildpact/MizziumTransreliquat.java | 134 ++++++++++ .../mage/sets/planeshift/RushingRiver.java | 231 +++++++++--------- .../src/mage/sets/ravnica/BloodFunnel.java | 86 +++++++ .../mage/sets/ravnica/TidewaterMinion.java | 83 +++++++ .../src/mage/sets/ravnica/TorpidMoloch.java | 75 ++++++ 8 files changed, 712 insertions(+), 157 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/Jilt.java create mode 100644 Mage.Sets/src/mage/sets/darksteel/StandTogether.java create mode 100644 Mage.Sets/src/mage/sets/guildpact/MizziumTransreliquat.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/BloodFunnel.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/TidewaterMinion.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/TorpidMoloch.java diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java index 8ab2768632f..a22b0b7e2d0 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/BensCube.java @@ -38,6 +38,7 @@ public class BensCube extends DraftCube { public BensCube() { super("Ben's Cube (720 cards)"); // http://cubetutor.com/viewcube/1 + cubeCards.add(new CardIdentity("Abrupt Decay", "")); cubeCards.add(new CardIdentity("Abyssal Persecutor", "")); cubeCards.add(new CardIdentity("Academy Rector", "")); @@ -47,9 +48,9 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("AEther Adept", "")); cubeCards.add(new CardIdentity("AEther Vial", "")); cubeCards.add(new CardIdentity("AEtherling", "")); - cubeCards.add(new CardIdentity("Aftershock", "")); cubeCards.add(new CardIdentity("Agony Warp", "")); cubeCards.add(new CardIdentity("Ajani Goldmane", "")); + cubeCards.add(new CardIdentity("Ajani Steadfast", "")); cubeCards.add(new CardIdentity("Ajani Vengeant", "")); cubeCards.add(new CardIdentity("Ajani, Caller of the Pride", "")); cubeCards.add(new CardIdentity("Akroma, Angel of Wrath", "")); @@ -61,7 +62,6 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Ancient Grudge", "")); cubeCards.add(new CardIdentity("Ancient Tomb", "")); cubeCards.add(new CardIdentity("Angel of Serenity", "")); - cubeCards.add(new CardIdentity("Angelic Destiny", "")); cubeCards.add(new CardIdentity("Anger of the Gods", "")); cubeCards.add(new CardIdentity("Animate Dead", "")); cubeCards.add(new CardIdentity("Ankh of Mishra", "")); @@ -84,14 +84,12 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Badlands", "")); cubeCards.add(new CardIdentity("Balance", "")); cubeCards.add(new CardIdentity("Baleful Strix", "")); - cubeCards.add(new CardIdentity("Ball Lightning", "")); cubeCards.add(new CardIdentity("Banefire", "")); cubeCards.add(new CardIdentity("Baneslayer Angel", "")); cubeCards.add(new CardIdentity("Basalt Monolith", "")); cubeCards.add(new CardIdentity("Basilisk Collar", "")); cubeCards.add(new CardIdentity("Batterskull", "")); cubeCards.add(new CardIdentity("Bayou", "")); - cubeCards.add(new CardIdentity("Beacon of Destruction", "")); cubeCards.add(new CardIdentity("Beast Within", "")); cubeCards.add(new CardIdentity("Birds of Paradise", "")); cubeCards.add(new CardIdentity("Birthing Pod", "")); @@ -101,6 +99,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Black Sun's Zenith", "")); cubeCards.add(new CardIdentity("Blade Splicer", "")); cubeCards.add(new CardIdentity("Blastoderm", "")); + cubeCards.add(new CardIdentity("Blightsteel Colossus", "")); cubeCards.add(new CardIdentity("Blistering Firecat", "")); cubeCards.add(new CardIdentity("Blood Crypt", "")); cubeCards.add(new CardIdentity("Blood Scrivener", "")); @@ -108,6 +107,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Bloodghast", "")); cubeCards.add(new CardIdentity("Bloodgift Demon", "")); cubeCards.add(new CardIdentity("Bloodline Keeper", "")); + cubeCards.add(new CardIdentity("Bloodsoaked Champion", "")); cubeCards.add(new CardIdentity("Bloodstained Mire", "")); cubeCards.add(new CardIdentity("Bogardan Hellkite", "")); cubeCards.add(new CardIdentity("Boggart Ram-Gang", "")); @@ -115,6 +115,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Bonesplitter", "")); cubeCards.add(new CardIdentity("Bonfire of the Damned", "")); cubeCards.add(new CardIdentity("Booster Tutor", "")); + cubeCards.add(new CardIdentity("Borderland Marauder", "")); cubeCards.add(new CardIdentity("Boros Charm", "")); cubeCards.add(new CardIdentity("Boros Reckoner", "")); cubeCards.add(new CardIdentity("Braids, Cabal Minion", "")); @@ -124,7 +125,6 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Bribery", "")); cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", "")); cubeCards.add(new CardIdentity("Brimstone Volley", "")); - cubeCards.add(new CardIdentity("Brine Elemental", "")); cubeCards.add(new CardIdentity("Buried Alive", "")); cubeCards.add(new CardIdentity("Burning-Tree Emissary", "")); cubeCards.add(new CardIdentity("Burst Lightning", "")); @@ -139,7 +139,6 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Chained to the Rocks", "")); cubeCards.add(new CardIdentity("Chainer's Edict", "")); cubeCards.add(new CardIdentity("Chameleon Colossus", "")); - cubeCards.add(new CardIdentity("Chandra Nalaar", "")); cubeCards.add(new CardIdentity("Chandra, the Firebrand", "")); cubeCards.add(new CardIdentity("Chandra's Phoenix", "")); cubeCards.add(new CardIdentity("Channel", "")); @@ -151,18 +150,18 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("City of Traitors", "")); cubeCards.add(new CardIdentity("Clifftop Retreat", "")); cubeCards.add(new CardIdentity("Cloudgoat Ranger", "")); - cubeCards.add(new CardIdentity("Cloudshift", "")); cubeCards.add(new CardIdentity("Cloudthresher", "")); cubeCards.add(new CardIdentity("Coalition Relic", "")); cubeCards.add(new CardIdentity("Coiling Oracle", "")); - cubeCards.add(new CardIdentity("Cold-Eyed Selkie", "")); cubeCards.add(new CardIdentity("Coldsteel Heart", "")); cubeCards.add(new CardIdentity("Compulsive Research", "")); cubeCards.add(new CardIdentity("Condemn", "")); cubeCards.add(new CardIdentity("Consecrated Sphinx", "")); cubeCards.add(new CardIdentity("Consuming Vapors", "")); + cubeCards.add(new CardIdentity("Containment Priest", "")); cubeCards.add(new CardIdentity("Control Magic", "")); cubeCards.add(new CardIdentity("Corpse Dance", "")); + cubeCards.add(new CardIdentity("Council's Judgment", "")); cubeCards.add(new CardIdentity("Counterspell", "")); cubeCards.add(new CardIdentity("Countryside Crusher", "")); cubeCards.add(new CardIdentity("Courser of Kruphix", "")); @@ -173,16 +172,19 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Cryptic Command", "")); cubeCards.add(new CardIdentity("Crystal Shard", "")); cubeCards.add(new CardIdentity("Cultivate", "")); - cubeCards.add(new CardIdentity("Cursecatcher", "")); cubeCards.add(new CardIdentity("Cursed Scroll", "")); cubeCards.add(new CardIdentity("Cyclonic Rift", "")); + cubeCards.add(new CardIdentity("Dack Fayden", "")); + cubeCards.add(new CardIdentity("Dack's Duplicate", "")); cubeCards.add(new CardIdentity("Damnation", "")); + cubeCards.add(new CardIdentity("Daretti, Scrap Savant", "")); cubeCards.add(new CardIdentity("Dark Confidant", "")); cubeCards.add(new CardIdentity("Dark Ritual", "")); cubeCards.add(new CardIdentity("Dauthi Horror", "")); cubeCards.add(new CardIdentity("Day of Judgment", "")); cubeCards.add(new CardIdentity("Daze", "")); cubeCards.add(new CardIdentity("Deathrite Shaman", "")); + cubeCards.add(new CardIdentity("Deceiver Exarch", "")); cubeCards.add(new CardIdentity("Decree of Justice", "")); cubeCards.add(new CardIdentity("Deep Analysis", "")); cubeCards.add(new CardIdentity("Defense of the Heart", "")); @@ -194,6 +196,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Devil's Play", "")); cubeCards.add(new CardIdentity("Devoted Druid", "")); cubeCards.add(new CardIdentity("Diabolic Servitude", "")); + cubeCards.add(new CardIdentity("Dig Through Time", "")); cubeCards.add(new CardIdentity("Diregraf Ghoul", "")); cubeCards.add(new CardIdentity("Disciple of Bolas", "")); cubeCards.add(new CardIdentity("Disenchant", "")); @@ -202,19 +205,20 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Dissipate", "")); cubeCards.add(new CardIdentity("Domri Rade", "")); cubeCards.add(new CardIdentity("Doom Blade", "")); + cubeCards.add(new CardIdentity("Dragon Hunter", "")); cubeCards.add(new CardIdentity("Dragonskull Summit", "")); cubeCards.add(new CardIdentity("Dreadbore", "")); cubeCards.add(new CardIdentity("Drowned Catacomb", "")); cubeCards.add(new CardIdentity("Dryad Militant", "")); + cubeCards.add(new CardIdentity("Dualcaster Mage", "")); cubeCards.add(new CardIdentity("Duress", "")); cubeCards.add(new CardIdentity("Duskmantle Seer", "")); cubeCards.add(new CardIdentity("Earthquake", "")); cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", "")); + cubeCards.add(new CardIdentity("Eidolon of the Great Revel", "")); cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails", "")); - cubeCards.add(new CardIdentity("Eldrazi Monument", "")); cubeCards.add(new CardIdentity("Electrolyze", "")); cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", "")); - cubeCards.add(new CardIdentity("Elite Vanguard", "")); cubeCards.add(new CardIdentity("Elspeth, Knight-Errant", "")); cubeCards.add(new CardIdentity("Elspeth, Sun's Champion", "")); cubeCards.add(new CardIdentity("Elves of Deep Shadow", "")); @@ -243,6 +247,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Falkenrath Aristocrat", "")); cubeCards.add(new CardIdentity("Far // Away", "")); cubeCards.add(new CardIdentity("Farseek", "")); + cubeCards.add(new CardIdentity("Fastbond", "")); cubeCards.add(new CardIdentity("Fathom Seer", "")); cubeCards.add(new CardIdentity("Fauna Shaman", "")); cubeCards.add(new CardIdentity("Fellwar Stone", "")); @@ -275,7 +280,6 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Geist of Saint Traft", "")); cubeCards.add(new CardIdentity("Genesis Wave", "")); cubeCards.add(new CardIdentity("Genesis", "")); - cubeCards.add(new CardIdentity("Geralf's Messenger", "")); cubeCards.add(new CardIdentity("Ghitu Encampment", "")); cubeCards.add(new CardIdentity("Gideon Jura", "")); cubeCards.add(new CardIdentity("Gideon's Lawkeeper", "")); @@ -289,15 +293,14 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Go for the Throat", "")); cubeCards.add(new CardIdentity("Goblin Bushwhacker", "")); cubeCards.add(new CardIdentity("Goblin Guide", "")); + cubeCards.add(new CardIdentity("Goblin Rabblemaster", "")); cubeCards.add(new CardIdentity("Goblin Ruinblaster", "")); cubeCards.add(new CardIdentity("Goblin Wardriver", "")); cubeCards.add(new CardIdentity("Goblin Welder", "")); cubeCards.add(new CardIdentity("Godless Shrine", "")); cubeCards.add(new CardIdentity("Gore-House Chainwalker", "")); cubeCards.add(new CardIdentity("Grafted Wargear", "")); - cubeCards.add(new CardIdentity("Grand Arbiter Augustin IV", "")); cubeCards.add(new CardIdentity("Grave Titan", "")); - cubeCards.add(new CardIdentity("Graveborn Muse", "")); cubeCards.add(new CardIdentity("Gravecrawler", "")); cubeCards.add(new CardIdentity("Greater Gargadon", "")); cubeCards.add(new CardIdentity("Green Sun's Zenith", "")); @@ -324,12 +327,10 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Huntmaster of the Fells", "")); cubeCards.add(new CardIdentity("Hymn to Tourach", "")); cubeCards.add(new CardIdentity("Hypnotic Specter", "")); - cubeCards.add(new CardIdentity("Ideas Unbound", "")); cubeCards.add(new CardIdentity("Imperial Recruiter", "")); cubeCards.add(new CardIdentity("Imposing Sovereign", "")); cubeCards.add(new CardIdentity("Impulse", "")); cubeCards.add(new CardIdentity("Incinerate", "")); - cubeCards.add(new CardIdentity("Increasing Devotion", "")); cubeCards.add(new CardIdentity("Indrik Stomphowler", "")); cubeCards.add(new CardIdentity("Inferno Titan", "")); cubeCards.add(new CardIdentity("Ink-Eyes, Servant of Oni", "")); @@ -354,20 +355,20 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Kargan Dragonlord", "")); cubeCards.add(new CardIdentity("Karmic Guide", "")); cubeCards.add(new CardIdentity("Karn Liberated", "")); - cubeCards.add(new CardIdentity("Keiga, the Tide Star", "")); cubeCards.add(new CardIdentity("Keldon Champion", "")); cubeCards.add(new CardIdentity("Keldon Marauders", "")); cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker", "")); cubeCards.add(new CardIdentity("Kiora, the Crashing Wave", "")); + cubeCards.add(new CardIdentity("Kiora's Follower", "")); cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", "")); cubeCards.add(new CardIdentity("Kitchen Finks", "")); cubeCards.add(new CardIdentity("Kjeldoran Outpost", "")); - cubeCards.add(new CardIdentity("Knight of Glory", "")); cubeCards.add(new CardIdentity("Knight of Infamy", "")); cubeCards.add(new CardIdentity("Knight of Meadowgrain", "")); cubeCards.add(new CardIdentity("Knight of the Reliquary", "")); cubeCards.add(new CardIdentity("Kodama's Reach", "")); cubeCards.add(new CardIdentity("Kokusho, the Evening Star", "")); + cubeCards.add(new CardIdentity("Kolaghan's Command", "")); cubeCards.add(new CardIdentity("Kor Sanctifiers", "")); cubeCards.add(new CardIdentity("Kor Skyfisher", "")); cubeCards.add(new CardIdentity("Koth of the Hammer", "")); @@ -402,10 +403,10 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Mana Crypt", "")); cubeCards.add(new CardIdentity("Mana Drain", "")); cubeCards.add(new CardIdentity("Mana Leak", "")); - cubeCards.add(new CardIdentity("Mana Tithe", "")); cubeCards.add(new CardIdentity("Mana Vault", "")); cubeCards.add(new CardIdentity("Manamorphose", "")); cubeCards.add(new CardIdentity("Man-o'-War", "")); + cubeCards.add(new CardIdentity("Mardu Woe-Reaper", "")); cubeCards.add(new CardIdentity("Marsh Flats", "")); cubeCards.add(new CardIdentity("Martial Coup", "")); cubeCards.add(new CardIdentity("Master of the Feast", "")); @@ -430,6 +431,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Miscalculation", "")); cubeCards.add(new CardIdentity("Mishra's Factory", "")); cubeCards.add(new CardIdentity("Misty Rainforest", "")); + cubeCards.add(new CardIdentity("Moat", "")); cubeCards.add(new CardIdentity("Mogg Flunkies", "")); cubeCards.add(new CardIdentity("Mogg War Marshal", "")); cubeCards.add(new CardIdentity("Mold Shambler", "")); @@ -437,6 +439,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Molten-Tail Masticore", "")); cubeCards.add(new CardIdentity("Momentary Blink", "")); cubeCards.add(new CardIdentity("Moment's Peace", "")); + cubeCards.add(new CardIdentity("Monastery Mentor", "")); cubeCards.add(new CardIdentity("Mortarpod", "")); cubeCards.add(new CardIdentity("Mother of Runes", "")); cubeCards.add(new CardIdentity("Mox Diamond", "")); @@ -446,13 +449,13 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Mox Ruby", "")); cubeCards.add(new CardIdentity("Mox Sapphire", "")); cubeCards.add(new CardIdentity("Mulldrifter", "")); + cubeCards.add(new CardIdentity("Murderous Cut", "")); cubeCards.add(new CardIdentity("Murderous Redcap", "")); cubeCards.add(new CardIdentity("Mutavault", "")); cubeCards.add(new CardIdentity("Myr Battlesphere", "")); cubeCards.add(new CardIdentity("Mystic Snake", "")); cubeCards.add(new CardIdentity("Mystical Tutor", "")); cubeCards.add(new CardIdentity("Nantuko Shade", "")); - cubeCards.add(new CardIdentity("Nantuko Vigilante", "")); cubeCards.add(new CardIdentity("Narcolepsy", "")); cubeCards.add(new CardIdentity("Natural Order", "")); cubeCards.add(new CardIdentity("Naturalize", "")); @@ -467,19 +470,16 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker", "")); cubeCards.add(new CardIdentity("Night's Whisper", "")); cubeCards.add(new CardIdentity("Nightscape Familiar", "")); - cubeCards.add(new CardIdentity("Niv-Mizzet, Dracogenius", "")); + cubeCards.add(new CardIdentity("Nissa, Worldwaker", "")); cubeCards.add(new CardIdentity("Noble Hierarch", "")); - cubeCards.add(new CardIdentity("Nucklavee", "")); cubeCards.add(new CardIdentity("Oath of Druids", "")); cubeCards.add(new CardIdentity("Oblivion Ring", "")); cubeCards.add(new CardIdentity("Obstinate Baloth", "")); cubeCards.add(new CardIdentity("Obzedat, Ghost Council", "")); cubeCards.add(new CardIdentity("Ohran Viper", "")); - cubeCards.add(new CardIdentity("Olivia Voldaren", "")); cubeCards.add(new CardIdentity("Omenspeaker", "")); cubeCards.add(new CardIdentity("Omniscience", "")); cubeCards.add(new CardIdentity("Oona's Prowler", "")); - cubeCards.add(new CardIdentity("Opportunity", "")); cubeCards.add(new CardIdentity("Opposition", "")); cubeCards.add(new CardIdentity("Opt", "")); cubeCards.add(new CardIdentity("Oracle of Mul Daya", "")); @@ -490,9 +490,9 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Pact of Negation", "")); cubeCards.add(new CardIdentity("Palinchron", "")); cubeCards.add(new CardIdentity("Palladium Myr", "")); - cubeCards.add(new CardIdentity("Parallax Wave", "")); cubeCards.add(new CardIdentity("Path to Exile", "")); cubeCards.add(new CardIdentity("Pernicious Deed", "")); + cubeCards.add(new CardIdentity("Pestermite", "")); cubeCards.add(new CardIdentity("Phantasmal Image", "")); cubeCards.add(new CardIdentity("Phyrexian Arena", "")); cubeCards.add(new CardIdentity("Phyrexian Metamorph", "")); @@ -503,14 +503,12 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Pithing Needle", "")); cubeCards.add(new CardIdentity("Plateau", "")); cubeCards.add(new CardIdentity("Plated Geopede", "")); - cubeCards.add(new CardIdentity("Platinum Angel", "")); cubeCards.add(new CardIdentity("Plow Under", "")); cubeCards.add(new CardIdentity("Plumeveil", "")); cubeCards.add(new CardIdentity("Polluted Delta", "")); cubeCards.add(new CardIdentity("Polukranos, World Eater", "")); cubeCards.add(new CardIdentity("Ponder", "")); cubeCards.add(new CardIdentity("Porcelain Legionnaire", "")); - cubeCards.add(new CardIdentity("Powder Keg", "")); cubeCards.add(new CardIdentity("Precursor Golem", "")); cubeCards.add(new CardIdentity("Preordain", "")); cubeCards.add(new CardIdentity("Primal Command", "")); @@ -528,7 +526,6 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Putrefy", "")); cubeCards.add(new CardIdentity("Putrid Leech", "")); cubeCards.add(new CardIdentity("Pyroclasm", "")); - cubeCards.add(new CardIdentity("Pyrokinesis", "")); cubeCards.add(new CardIdentity("Qasali Pridemage", "")); cubeCards.add(new CardIdentity("Raging Ravine", "")); cubeCards.add(new CardIdentity("Rakdos Cackler", "")); @@ -541,12 +538,12 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Reanimate", "")); cubeCards.add(new CardIdentity("Reckless Charge", "")); cubeCards.add(new CardIdentity("Reckless Waif", "")); + cubeCards.add(new CardIdentity("Reclamation Sage", "")); cubeCards.add(new CardIdentity("Recurring Nightmare", "")); cubeCards.add(new CardIdentity("Regrowth", "")); cubeCards.add(new CardIdentity("Relic of Progenitus", "")); cubeCards.add(new CardIdentity("Remand", "")); cubeCards.add(new CardIdentity("Repeal", "")); - cubeCards.add(new CardIdentity("Restock", "")); cubeCards.add(new CardIdentity("Restoration Angel", "")); cubeCards.add(new CardIdentity("Reveillark", "")); cubeCards.add(new CardIdentity("Rift Bolt", "")); @@ -559,7 +556,7 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Rude Awakening", "")); cubeCards.add(new CardIdentity("Sacred Foundry", "")); cubeCards.add(new CardIdentity("Sakura-Tribe Elder", "")); - cubeCards.add(new CardIdentity("Sarkhan the Mad", "")); + cubeCards.add(new CardIdentity("Sarkhan, the Dragonspeaker", "")); cubeCards.add(new CardIdentity("Savannah", "")); cubeCards.add(new CardIdentity("Scalding Tarn", "")); cubeCards.add(new CardIdentity("Scavenging Ooze", "")); @@ -585,38 +582,38 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Sinkhole", "")); cubeCards.add(new CardIdentity("Skinrender", "")); cubeCards.add(new CardIdentity("Skithiryx, the Blight Dragon", "")); - cubeCards.add(new CardIdentity("Skizzik", "")); cubeCards.add(new CardIdentity("Skullclamp", "")); cubeCards.add(new CardIdentity("Slagstorm", "")); cubeCards.add(new CardIdentity("Slaughter Pact", "")); - cubeCards.add(new CardIdentity("Slith Firewalker", "")); cubeCards.add(new CardIdentity("Smokestack", "")); cubeCards.add(new CardIdentity("Snapcaster Mage", "")); cubeCards.add(new CardIdentity("Sneak Attack", "")); - cubeCards.add(new CardIdentity("Snuff Out", "")); cubeCards.add(new CardIdentity("Sol Ring", "")); cubeCards.add(new CardIdentity("Soldier of the Pantheon", "")); cubeCards.add(new CardIdentity("Solemn Simulacrum", "")); cubeCards.add(new CardIdentity("Soltari Champion", "")); - cubeCards.add(new CardIdentity("Soltari Monk", "")); cubeCards.add(new CardIdentity("Soltari Priest", "")); + cubeCards.add(new CardIdentity("Song of the Dryads", "")); cubeCards.add(new CardIdentity("Sorin Markov", "")); cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", "")); + cubeCards.add(new CardIdentity("Soulfire Grand Master", "")); cubeCards.add(new CardIdentity("Sower of Temptation", "")); cubeCards.add(new CardIdentity("Spear of Heliod", "")); cubeCards.add(new CardIdentity("Spectral Procession", "")); cubeCards.add(new CardIdentity("Spellskite", "")); cubeCards.add(new CardIdentity("Sphere of the Suns", "")); cubeCards.add(new CardIdentity("Sphinx of the Steel Wind", "")); + cubeCards.add(new CardIdentity("Sphinx's Revelation", "")); cubeCards.add(new CardIdentity("Spikeshot Elder", "")); cubeCards.add(new CardIdentity("Spirit of the Labyrinth", "")); + cubeCards.add(new CardIdentity("Splinter Twin", "")); cubeCards.add(new CardIdentity("Squee, Goblin Nabob", "")); cubeCards.add(new CardIdentity("Staggershock", "")); cubeCards.add(new CardIdentity("Steam Augury", "")); cubeCards.add(new CardIdentity("Steam Vents", "")); - cubeCards.add(new CardIdentity("Steppe Lynx", "")); cubeCards.add(new CardIdentity("Stillmoon Cavalier", "")); cubeCards.add(new CardIdentity("Stirring Wildwood", "")); + cubeCards.add(new CardIdentity("Stoke the Flames", "")); cubeCards.add(new CardIdentity("Stomping Ground", "")); cubeCards.add(new CardIdentity("Stone Rain", "")); cubeCards.add(new CardIdentity("Stonecloaker", "")); @@ -624,10 +621,10 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Stonewood Invocation", "")); cubeCards.add(new CardIdentity("Stormblood Berserker", "")); cubeCards.add(new CardIdentity("Strangleroot Geist", "")); + cubeCards.add(new CardIdentity("Stratus Dancer", "")); cubeCards.add(new CardIdentity("Strip Mine", "")); cubeCards.add(new CardIdentity("Stromkirk Noble", "")); cubeCards.add(new CardIdentity("Student of Warfare", "")); - cubeCards.add(new CardIdentity("Stunted Growth", "")); cubeCards.add(new CardIdentity("Sublime Archangel", "")); cubeCards.add(new CardIdentity("Sulfur Falls", "")); cubeCards.add(new CardIdentity("Sulfuric Vortex", "")); @@ -651,16 +648,17 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage", "")); cubeCards.add(new CardIdentity("Tangle Wire", "")); cubeCards.add(new CardIdentity("Tarmogoyf", "")); - cubeCards.add(new CardIdentity("Tattermunge Maniac", "")); cubeCards.add(new CardIdentity("Tectonic Edge", "")); cubeCards.add(new CardIdentity("Teetering Peaks", "")); cubeCards.add(new CardIdentity("Temple Garden", "")); cubeCards.add(new CardIdentity("Temporal Isolation", "")); cubeCards.add(new CardIdentity("Tendrils of Agony", "")); cubeCards.add(new CardIdentity("Terastodon", "")); + cubeCards.add(new CardIdentity("Terminate", "")); cubeCards.add(new CardIdentity("Terminus", "")); cubeCards.add(new CardIdentity("Terramorphic Expanse", "")); cubeCards.add(new CardIdentity("Terror", "")); + cubeCards.add(new CardIdentity("Tezzeret the Seeker", "")); cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", "")); cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", "")); cubeCards.add(new CardIdentity("The Abyss", "")); @@ -671,11 +669,12 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Thoughtseize", "")); cubeCards.add(new CardIdentity("Thragtusk", "")); cubeCards.add(new CardIdentity("Thran Dynamo", "")); + cubeCards.add(new CardIdentity("Through the Breach", "")); cubeCards.add(new CardIdentity("Thrun, the Last Troll", "")); cubeCards.add(new CardIdentity("Thundermaw Hellkite", "")); - cubeCards.add(new CardIdentity("Thunderscape Battlemage", "")); cubeCards.add(new CardIdentity("Tidehollow Sculler", "")); cubeCards.add(new CardIdentity("Time Spiral", "")); + cubeCards.add(new CardIdentity("Time Vault", "")); cubeCards.add(new CardIdentity("Time Walk", "")); cubeCards.add(new CardIdentity("Time Warp", "")); cubeCards.add(new CardIdentity("Timetwister", "")); @@ -686,12 +685,15 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Tormented Hero", "")); cubeCards.add(new CardIdentity("Tradewind Rider", "")); cubeCards.add(new CardIdentity("Treachery", "")); + cubeCards.add(new CardIdentity("Treasure Cruise", "")); cubeCards.add(new CardIdentity("Treetop Village", "")); cubeCards.add(new CardIdentity("Trinket Mage", "")); + cubeCards.add(new CardIdentity("Triplicate Spirits", "")); cubeCards.add(new CardIdentity("Tropical Island", "")); cubeCards.add(new CardIdentity("Trygon Predator", "")); cubeCards.add(new CardIdentity("Tundra", "")); cubeCards.add(new CardIdentity("Turnabout", "")); + cubeCards.add(new CardIdentity("Ugin, the Spirit Dragon", "")); cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", "")); cubeCards.add(new CardIdentity("Ultimate Price", "")); cubeCards.add(new CardIdentity("Ulvenwald Tracker", "")); @@ -712,15 +714,13 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Venser, Shaper Savant", "")); cubeCards.add(new CardIdentity("Venser, the Sojourner", "")); cubeCards.add(new CardIdentity("Verdant Catacombs", "")); - cubeCards.add(new CardIdentity("Vesuvan Shapeshifter", "")); cubeCards.add(new CardIdentity("Vexing Devil", "")); cubeCards.add(new CardIdentity("Vindicate", "")); - cubeCards.add(new CardIdentity("Vines of Vastwood", "")); cubeCards.add(new CardIdentity("Voice of Resurgence", "")); cubeCards.add(new CardIdentity("Voidslime", "")); - cubeCards.add(new CardIdentity("Volcanic Fallout", "")); cubeCards.add(new CardIdentity("Volcanic Island", "")); cubeCards.add(new CardIdentity("Volrath's Stronghold", "")); + cubeCards.add(new CardIdentity("Voltaic Key", "")); cubeCards.add(new CardIdentity("Vorapede", "")); cubeCards.add(new CardIdentity("Vraska the Unseen", "")); cubeCards.add(new CardIdentity("Wake Thrasher", "")); @@ -757,5 +757,6 @@ public class BensCube extends DraftCube { cubeCards.add(new CardIdentity("Young Pyromancer", "")); cubeCards.add(new CardIdentity("Zealous Conscripts", "")); cubeCards.add(new CardIdentity("Zo-Zu the Punisher", "")); + cubeCards.add(new CardIdentity("Zurgo Bellstriker", "")); } } diff --git a/Mage.Sets/src/mage/sets/apocalypse/Jilt.java b/Mage.Sets/src/mage/sets/apocalypse/Jilt.java new file mode 100644 index 00000000000..1dc7fa14ae4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/Jilt.java @@ -0,0 +1,111 @@ +/* + * 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.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; + +/** + * + * @author fireshoes + */ +public class Jilt extends CardImpl { + + public Jilt(UUID ownerId) { + super(ownerId, 27, "Jilt", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "APC"; + + // Kicker {1}{R} + this.addAbility(new KickerAbility("{1}{R}")); + + // Return target creature to its owner's hand. If Jilt was kicked, it deals 2 damage to another target creature. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + Effect effect = new ConditionalOneShotEffect( + new DamageTargetEffect(2), + KickedCondition.getInstance(), + "If {this} was kicked, it deals 2 damage to another target creature"); + effect.setTargetPointer(new SecondTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability instanceof SpellAbility && KickedCondition.getInstance().apply(game, ability)) { + ability.addTarget(new TargetOtherCreaturePermanent(new FilterCreaturePermanent("another target creature"))); + } + + } + + public Jilt(final Jilt card) { + super(card); + } + + @Override + public Jilt copy() { + return new Jilt(this); + } +} + +class TargetOtherCreaturePermanent extends TargetCreaturePermanent { + + public TargetOtherCreaturePermanent(FilterCreaturePermanent filter) { + super(filter); + } + + public TargetOtherCreaturePermanent(final TargetOtherCreaturePermanent target) { + super(target); + } + + @Override + public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { + if (source.getTargets().get(0).getTargets().contains(id)) { + return false; + } + return super.canTarget(controllerId, id, source, game); + } + + @Override + public TargetOtherCreaturePermanent copy() { + return new TargetOtherCreaturePermanent(this); + } +} diff --git a/Mage.Sets/src/mage/sets/darksteel/StandTogether.java b/Mage.Sets/src/mage/sets/darksteel/StandTogether.java new file mode 100644 index 00000000000..6295029d68a --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/StandTogether.java @@ -0,0 +1,66 @@ +/* + * 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.darksteel; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class StandTogether extends CardImpl { + + public StandTogether(UUID ownerId) { + super(ownerId, 84, "Stand Together", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{G}{G}"); + this.expansionSetCode = "DST"; + + // Put two +1/+1 counters on target creature and two +1/+1 counters on another target creature. + Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)); + effect.setText("Put two +1/+1 counters on target creature and two +1/+1 counters on another target creature"); + this.getSpellAbility().addEffect(effect); + Target target = new TargetCreaturePermanent(2,2); + this.getSpellAbility().addTarget(target); + } + + public StandTogether(final StandTogether card) { + super(card); + } + + @Override + public StandTogether copy() { + return new StandTogether(this); + } +} diff --git a/Mage.Sets/src/mage/sets/guildpact/MizziumTransreliquat.java b/Mage.Sets/src/mage/sets/guildpact/MizziumTransreliquat.java new file mode 100644 index 00000000000..c1c75827a9b --- /dev/null +++ b/Mage.Sets/src/mage/sets/guildpact/MizziumTransreliquat.java @@ -0,0 +1,134 @@ +/* + * 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.guildpact; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetArtifactPermanent; +import mage.util.functions.EmptyApplyToPermanent; + +/** + * + * @author fireshoes + */ +public class MizziumTransreliquat extends CardImpl { + + public MizziumTransreliquat(UUID ownerId) { + super(ownerId, 153, "Mizzium Transreliquat", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "GPT"; + + // {3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MizziumTransreliquatCopyEffect(), new ManaCostsImpl("{3}")); + ability.addTarget(new TargetArtifactPermanent()); + this.addAbility(ability); + + // {1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact and gains this ability. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MizziumTransreliquatCopyAndGainAbilityEffect(), new ManaCostsImpl("{1}{U}{R}")); + ability.addTarget(new TargetArtifactPermanent()); + this.addAbility(ability); + } + + public MizziumTransreliquat(final MizziumTransreliquat card) { + super(card); + } + + @Override + public MizziumTransreliquat copy() { + return new MizziumTransreliquat(this); + } +} + + +class MizziumTransreliquatCopyEffect extends OneShotEffect { + + public MizziumTransreliquatCopyEffect() { + super(Outcome.Copy); + this.staticText = "Mizzium Transreliquat becomes a copy of target artifact until end of turn"; + } + + public MizziumTransreliquatCopyEffect(final MizziumTransreliquatCopyEffect effect) { + super(effect); + } + + @Override + public MizziumTransreliquatCopyEffect copy() { + return new MizziumTransreliquatCopyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + Permanent copyFromPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (sourcePermanent != null && copyFromPermanent != null) { + game.copyPermanent(Duration.EndOfTurn, copyFromPermanent, sourcePermanent, source, new EmptyApplyToPermanent()); + return true; + } + return false; + } +} +class MizziumTransreliquatCopyAndGainAbilityEffect extends OneShotEffect { + + public MizziumTransreliquatCopyAndGainAbilityEffect() { + super(Outcome.Benefit); + this.staticText = "Mizzium Transreliquat becomes a copy of target artifact and gains this ability"; + } + + public MizziumTransreliquatCopyAndGainAbilityEffect(final MizziumTransreliquatCopyAndGainAbilityEffect effect) { + super(effect); + } + + @Override + public MizziumTransreliquatCopyAndGainAbilityEffect copy() { + return new MizziumTransreliquatCopyAndGainAbilityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + Permanent copyFromPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (sourcePermanent != null && copyFromPermanent != null) { + Permanent newPermanent = game.copyPermanent(copyFromPermanent, sourcePermanent, source, new EmptyApplyToPermanent()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MizziumTransreliquatCopyAndGainAbilityEffect(), new ManaCostsImpl("{1}{U}{R}")); + ability.addTarget(new TargetArtifactPermanent()); + newPermanent.addAbility(ability, source.getSourceId(), game); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/planeshift/RushingRiver.java b/Mage.Sets/src/mage/sets/planeshift/RushingRiver.java index ce6d9e7473d..34b0cee256e 100644 --- a/Mage.Sets/src/mage/sets/planeshift/RushingRiver.java +++ b/Mage.Sets/src/mage/sets/planeshift/RushingRiver.java @@ -1,116 +1,115 @@ -/* - * 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.planeshift; - -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.SpellAbility; -import mage.abilities.condition.common.KickedCondition; -import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.ReturnToHandTargetEffect; -import mage.abilities.keyword.KickerAbility; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.filter.Filter; -import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.common.FilterNonlandPermanent; -import mage.game.Game; -import mage.target.common.TargetControlledPermanent; -import mage.target.common.TargetNonlandPermanent; -import mage.target.targetpointer.SecondTargetPointer; - -/** - * - * @author LevelX2 - */ -public class RushingRiver extends CardImpl { - - public RushingRiver(UUID ownerId) { - super(ownerId, 30, "Rushing River", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{U}"); - this.expansionSetCode = "PLS"; - - - // Kicker-Sacrifice a land. - this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land"))))); - - // Return target nonland permanent to its owner's hand. If Rushing River was kicked, return another target nonland permanent to its owner's hand. - this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); - Effect effect = new ConditionalOneShotEffect( - new ReturnToHandTargetEffect(), - KickedCondition.getInstance(), - "If {this} was kicked, return another target nonland permanent to its owner's hand"); - effect.setTargetPointer(new SecondTargetPointer()); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetNonlandPermanent()); - - } - - @Override - public void adjustTargets(Ability ability, Game game) { - if (ability instanceof SpellAbility && KickedCondition.getInstance().apply(game, ability)) { - ability.addTarget(new TargetOtherNonlandPermanent(new FilterNonlandPermanent("another target nonland permanent"))); - } - - } - - public RushingRiver(final RushingRiver card) { - super(card); - } - - @Override - public RushingRiver copy() { - return new RushingRiver(this); - } -} - -class TargetOtherNonlandPermanent extends TargetNonlandPermanent { - - public TargetOtherNonlandPermanent(FilterNonlandPermanent filter) { - super(filter); - } - - public TargetOtherNonlandPermanent(final TargetOtherNonlandPermanent target) { - super(target); - } - - @Override - public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { - if (source.getTargets().get(0).getTargets().contains(id)) { - return false; - } - return super.canTarget(controllerId, id, source, game); - } - - @Override - public TargetOtherNonlandPermanent copy() { - return new TargetOtherNonlandPermanent(this); - } -} +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterNonlandPermanent; +import mage.game.Game; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetNonlandPermanent; +import mage.target.targetpointer.SecondTargetPointer; + +/** + * + * @author LevelX2 + */ +public class RushingRiver extends CardImpl { + + public RushingRiver(UUID ownerId) { + super(ownerId, 30, "Rushing River", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{U}"); + this.expansionSetCode = "PLS"; + + + // Kicker-Sacrifice a land. + this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land"))))); + + // Return target nonland permanent to its owner's hand. If Rushing River was kicked, return another target nonland permanent to its owner's hand. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + Effect effect = new ConditionalOneShotEffect( + new ReturnToHandTargetEffect(), + KickedCondition.getInstance(), + "If {this} was kicked, return another target nonland permanent to its owner's hand"); + effect.setTargetPointer(new SecondTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetNonlandPermanent()); + + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability instanceof SpellAbility && KickedCondition.getInstance().apply(game, ability)) { + ability.addTarget(new TargetOtherNonlandPermanent(new FilterNonlandPermanent("another target nonland permanent"))); + } + + } + + public RushingRiver(final RushingRiver card) { + super(card); + } + + @Override + public RushingRiver copy() { + return new RushingRiver(this); + } +} + +class TargetOtherNonlandPermanent extends TargetNonlandPermanent { + + public TargetOtherNonlandPermanent(FilterNonlandPermanent filter) { + super(filter); + } + + public TargetOtherNonlandPermanent(final TargetOtherNonlandPermanent target) { + super(target); + } + + @Override + public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { + if (source.getTargets().get(0).getTargets().contains(id)) { + return false; + } + return super.canTarget(controllerId, id, source, game); + } + + @Override + public TargetOtherNonlandPermanent copy() { + return new TargetOtherNonlandPermanent(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/BloodFunnel.java b/Mage.Sets/src/mage/sets/ravnica/BloodFunnel.java new file mode 100644 index 00000000000..54aacd10457 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/BloodFunnel.java @@ -0,0 +1,86 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class BloodFunnel extends CardImpl { + + private static final FilterCard filter = new FilterCard("Noncreature spells"); + private static final FilterSpell filterNoncreature = new FilterSpell("a noncreature spell"); + + static { + filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + filterNoncreature.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + } + + public BloodFunnel(UUID ownerId) { + super(ownerId, 77, "Blood Funnel", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + this.expansionSetCode = "RAV"; + + // Noncreature spells you cast cost {2} less to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 2))); + + // Whenever you cast a noncreature spell, counter that spell unless you sacrifice a creature. + Effect effect = new CounterUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + effect.setText("counter that spell unless you sacrifice a creature"); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, + effect, + filterNoncreature, + false, + true)); + } + + public BloodFunnel(final BloodFunnel card) { + super(card); + } + + @Override + public BloodFunnel copy() { + return new BloodFunnel(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ravnica/TidewaterMinion.java b/Mage.Sets/src/mage/sets/ravnica/TidewaterMinion.java new file mode 100644 index 00000000000..7f4c692ce14 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/TidewaterMinion.java @@ -0,0 +1,83 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.LoseAbilitySourceEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class TidewaterMinion extends CardImpl { + + public TidewaterMinion(UUID ownerId) { + super(ownerId, 71, "Tidewater Minion", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Elemental"); + this.subtype.add("Minion"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {4}: Tidewater Minion loses defender until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new LoseAbilitySourceEffect(DefenderAbility.getInstance(), Duration.EndOfTurn), + new ManaCostsImpl("{4}"))); + + // {tap}: Untap target permanent. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new TapSourceCost()); + ability.addTarget(new TargetPermanent()); + this.addAbility(ability); + } + + public TidewaterMinion(final TidewaterMinion card) { + super(card); + } + + @Override + public TidewaterMinion copy() { + return new TidewaterMinion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/TorpidMoloch.java b/Mage.Sets/src/mage/sets/ravnica/TorpidMoloch.java new file mode 100644 index 00000000000..fe25ccf895b --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/TorpidMoloch.java @@ -0,0 +1,75 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.continuous.LoseAbilitySourceEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class TorpidMoloch extends CardImpl { + + public TorpidMoloch(UUID ownerId) { + super(ownerId, 147, "Torpid Moloch", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Lizard"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // Sacrifice three lands: Torpid Moloch loses defender until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new LoseAbilitySourceEffect(DefenderAbility.getInstance(), Duration.EndOfTurn), + new SacrificeTargetCost(new TargetControlledPermanent(3, 3, new FilterControlledLandPermanent("three lands"), true)))); + } + + public TorpidMoloch(final TorpidMoloch card) { + super(card); + } + + @Override + public TorpidMoloch copy() { + return new TorpidMoloch(this); + } +} From 08cc5560c4cc9fec65664dfd4ac4053e650d3acd Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 17 Jul 2015 12:20:32 +0200 Subject: [PATCH 085/375] * Gideon's Phalanx - Fixed wrong token name from Soldier to Knight. --- Mage.Sets/src/mage/sets/magicorigins/GideonsPhalanx.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/GideonsPhalanx.java b/Mage.Sets/src/mage/sets/magicorigins/GideonsPhalanx.java index fe0af645a1a..58afd8bc82e 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/GideonsPhalanx.java +++ b/Mage.Sets/src/mage/sets/magicorigins/GideonsPhalanx.java @@ -79,7 +79,7 @@ public class GideonsPhalanx extends CardImpl { class GideonsPhalanxKnightToken extends Token { public GideonsPhalanxKnightToken() { - super("Soldier", "2/2 white Knight creature tokens with vigilance"); + super("Knight", "2/2 white Knight creature tokens with vigilance"); this.setOriginalExpansionSetCode("ORI"); cardType.add(CardType.CREATURE); color.setColor(ObjectColor.WHITE); From 130ec77df1cc672955731a5db51cbf2e84538276 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 17 Jul 2015 14:07:17 +0200 Subject: [PATCH 086/375] * ORI-Transform-Planeswalker - Fixed that a additional effect only happens if the planeswalker was actually exiled and returned from the effect (fixes #1123). --- .../effects/common/ExileAndReturnTransformedSourceEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java b/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java index 6fe7a0a697c..6e99909a49e 100644 --- a/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/ExileAndReturnTransformedSourceEffect.java @@ -60,7 +60,7 @@ public class ExileAndReturnTransformedSourceEffect extends OneShotEffect { // Creature has to be on the battlefield to get exiled and be able to return transformed Permanent sourceObject = game.getPermanent(source.getSourceId()); Player controller = game.getPlayer(source.getControllerId()); - if (sourceObject != null && controller != null) { + if (sourceObject != null && controller != null && sourceObject.getZoneChangeCounter(game) == source.getSourceObjectZoneChangeCounter()) { Card card = (Card) sourceObject; if (controller.moveCards(card, Zone.BATTLEFIELD, Zone.EXILED, source, game)) { Player owner = game.getPlayer(card.getOwnerId()); From 7bfac64af2fabb2555fb114d11fc3cc1e83d8d7e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 17 Jul 2015 15:31:06 +0200 Subject: [PATCH 087/375] * Jace, Telepath Unbound - Fixed that the ability of his emblem did not work. --- Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java b/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java index a90cad9b16b..32b4489ce85 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java +++ b/Mage.Sets/src/mage/sets/magicorigins/JaceTelepathUnbound.java @@ -50,6 +50,7 @@ import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.counters.CounterType; +import mage.filter.FilterSpell; import mage.filter.common.FilterInstantOrSorceryCard; import mage.game.Game; import mage.game.command.Emblem; @@ -212,7 +213,7 @@ class JaceTelepathUnboundEmblem extends Emblem { this.setName("Emblem - Jace"); Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5); effect.setText("target opponent puts the top five cards of his or her library into his or her graveyard"); - Ability ability = new SpellCastControllerTriggeredAbility(effect, false); + Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false); ability.addTarget(new TargetOpponent()); getAbilities().add(ability); } From 90c5c3c2f388928887082744ef1b17adb952b09f Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 17 Jul 2015 15:32:31 +0200 Subject: [PATCH 088/375] * Fixed that the emblem token images of the Origins Planeswalker were not shown. --- Mage.Common/src/mage/view/CardsView.java | 86 +++++++------- Mage.Common/src/mage/view/GameView.java | 130 +++++++++++----------- Mage.Common/src/mage/view/PlayerView.java | 6 + Mage/src/mage/game/command/Emblem.java | 71 ++++++------ 4 files changed, 157 insertions(+), 136 deletions(-) diff --git a/Mage.Common/src/mage/view/CardsView.java b/Mage.Common/src/mage/view/CardsView.java index a39a9d6e007..a4400c5faad 100644 --- a/Mage.Common/src/mage/view/CardsView.java +++ b/Mage.Common/src/mage/view/CardsView.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.view; import java.util.ArrayList; @@ -37,6 +36,7 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.cards.Card; +import mage.constants.CardType; import mage.constants.Zone; import static mage.constants.Zone.ALL; import static mage.constants.Zone.BATTLEFIELD; @@ -56,27 +56,28 @@ import mage.target.targetpointer.TargetPointer; */ public class CardsView extends LinkedHashMap { - public CardsView() {} + public CardsView() { + } public CardsView(Collection cards) { - for (Card card: cards) { + for (Card card : cards) { this.put(card.getId(), new CardView(card)); } } public CardsView(Game game, Collection cards) { - for (Card card: cards) { + for (Card card : cards) { this.put(card.getId(), new CardView(card, game, false)); } } - public CardsView ( Collection abilities, Game game ) { - for ( Ability ability : abilities ) { + public CardsView(Collection abilities, Game game) { + for (Ability ability : abilities) { MageObject sourceObject = null; AbilityView abilityView = null; boolean isCard = false; boolean isPermanent = false; - switch ( ability.getZone() ) { + switch (ability.getZone()) { case ALL: case EXILED: case GRAVEYARD: @@ -86,7 +87,7 @@ public class CardsView extends LinkedHashMap { case BATTLEFIELD: sourceObject = game.getPermanent(ability.getSourceId()); if (sourceObject == null) { - sourceObject = (Permanent)game.getLastKnownInformation(ability.getSourceId(), Zone.BATTLEFIELD); + sourceObject = (Permanent) game.getLastKnownInformation(ability.getSourceId(), Zone.BATTLEFIELD); } isPermanent = true; break; @@ -99,14 +100,19 @@ public class CardsView extends LinkedHashMap { case COMMAND: sourceObject = game.getObject(ability.getSourceId()); if (sourceObject instanceof Emblem) { - Card planeswalkerCard = game.getCard(((Emblem)sourceObject).getSourceId()); + Card planeswalkerCard = game.getCard(((Emblem) sourceObject).getSourceId()); if (planeswalkerCard != null) { - abilityView = new AbilityView(ability, "Emblem " + planeswalkerCard.getName(), new CardView(new EmblemView((Emblem)sourceObject, planeswalkerCard))); + if (!planeswalkerCard.getCardType().contains(CardType.PLANESWALKER)) { + if (planeswalkerCard.getSecondCardFace() != null) { + planeswalkerCard = planeswalkerCard.getSecondCardFace(); + } + } + abilityView = new AbilityView(ability, "Emblem " + planeswalkerCard.getName(), new CardView(new EmblemView((Emblem) sourceObject, planeswalkerCard))); abilityView.setName("Emblem " + planeswalkerCard.getName()); abilityView.setExpansionSetCode(planeswalkerCard.getExpansionSetCode()); } else { throw new IllegalArgumentException("Source card for emblem not found."); - } + } } break; } @@ -114,9 +120,9 @@ public class CardsView extends LinkedHashMap { if (abilityView == null) { CardView sourceCardView; if (isPermanent) { - sourceCardView = new CardView((Permanent)sourceObject); + sourceCardView = new CardView((Permanent) sourceObject); } else if (isCard) { - sourceCardView = new CardView((Card)sourceObject); + sourceCardView = new CardView((Card) sourceObject); } else { sourceCardView = new CardView(sourceObject); } @@ -153,7 +159,7 @@ public class CardsView extends LinkedHashMap { } public CardsView(Collection abilities, GameState state) { - for (Ability ability: abilities) { + for (Ability ability : abilities) { Card sourceCard = state.getPermanent(ability.getSourceId()); if (sourceCard != null) { this.put(ability.getId(), new AbilityView(ability, sourceCard.getName(), new CardView(sourceCard))); diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java index b75d8045131..9f078a75b91 100644 --- a/Mage.Common/src/mage/view/GameView.java +++ b/Mage.Common/src/mage/view/GameView.java @@ -1,36 +1,42 @@ /* -* 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. -*/ - + * 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.view; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import mage.MageObject; import mage.abilities.costs.Cost; import mage.cards.Card; +import mage.constants.CardType; import mage.constants.PhaseStep; import mage.constants.TurnPhase; import mage.constants.Zone; @@ -45,18 +51,15 @@ import mage.game.stack.Spell; import mage.game.stack.StackAbility; import mage.game.stack.StackObject; import mage.players.Player; -import org.apache.log4j.Logger; - -import java.io.Serializable; -import java.util.*; import mage.watchers.common.CastSpellLastTurnWatcher; - +import org.apache.log4j.Logger; /** * * @author BetaSteward_at_googlemail.com */ public class GameView implements Serializable { + private static final long serialVersionUID = 1L; private static final transient Logger logger = Logger.getLogger(GameView.class); @@ -83,70 +86,73 @@ public class GameView implements Serializable { private final int spellsCastCurrentTurn; private final boolean rollbackTurnsAllowed; - public GameView(GameState state, Game game, UUID createdForPlayerId, UUID watcherUserId) { Player createdForPlayer = null; this.isPlayer = createdForPlayerId != null; this.priorityTime = game.getPriorityTime(); - for (Player player: state.getPlayers().values()) { + for (Player player : state.getPlayers().values()) { players.add(new PlayerView(player, state, game, createdForPlayerId, watcherUserId)); if (player.getId().equals(createdForPlayerId)) { createdForPlayer = player; } } - for (StackObject stackObject: state.getStack()) { + for (StackObject stackObject : state.getStack()) { if (stackObject instanceof StackAbility) { - // Stack Ability + // Stack Ability MageObject object = game.getObject(stackObject.getSourceId()); Card card = game.getCard(stackObject.getSourceId()); if (card != null) { if (object != null) { - stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility)stackObject, card.getName(), new CardView(card))); + stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, card.getName(), new CardView(card))); } else { - stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility)stackObject, "", new CardView(card))); + stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, "", new CardView(card))); } if (card.canTransform()) { updateLatestCardView(game, card, stackObject.getId()); } - checkPaid(stackObject.getId(), (StackAbility)stackObject); + checkPaid(stackObject.getId(), (StackAbility) stackObject); } else if (object != null) { if (object instanceof PermanentToken) { - PermanentToken token = (PermanentToken)object; - stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility)stackObject, token.getName(), new CardView(token))); - checkPaid(stackObject.getId(), (StackAbility)stackObject); + PermanentToken token = (PermanentToken) object; + stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, token.getName(), new CardView(token))); + checkPaid(stackObject.getId(), (StackAbility) stackObject); } else if (object instanceof Emblem) { - Card sourceCard = game.getCard(((Emblem)object).getSourceId()); + Card sourceCard = game.getCard(((Emblem) object).getSourceId()); if (sourceCard != null) { - ((StackAbility)stackObject).setName("Emblem " + sourceCard.getName()); - ((StackAbility)stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode()); + if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) { + if (sourceCard.getSecondCardFace() != null) { + sourceCard = sourceCard.getSecondCardFace(); + } + } + ((StackAbility) stackObject).setName("Emblem " + sourceCard.getName()); + ((StackAbility) stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode()); } else { throw new IllegalArgumentException("Source card for emblem not found."); } - stack.put(stackObject.getId(), - new StackAbilityView(game, (StackAbility)stackObject, object.getName(), new CardView(new EmblemView(((Emblem)object),sourceCard)))); - checkPaid(stackObject.getId(), ((StackAbility)stackObject)); + stack.put(stackObject.getId(), + new StackAbilityView(game, (StackAbility) stackObject, object.getName(), new CardView(new EmblemView(((Emblem) object), sourceCard)))); + checkPaid(stackObject.getId(), ((StackAbility) stackObject)); } else { - StackAbility stackAbility = ((StackAbility)object); + StackAbility stackAbility = ((StackAbility) object); stackAbility.newId(); - stack.put(stackObject.getId(), new CardView(((StackAbility)stackObject))); - checkPaid(stackObject.getId(), ((StackAbility)stackObject)); + stack.put(stackObject.getId(), new CardView(((StackAbility) stackObject))); + checkPaid(stackObject.getId(), ((StackAbility) stackObject)); } } else { logger.error("Stack Object for stack ability not found: " + stackObject.getStackAbility().getRule()); } - } - else { + } else { // Spell - stack.put(stackObject.getId(), new CardView((Spell)stackObject, game, stackObject.getControllerId().equals(createdForPlayerId))); - checkPaid(stackObject.getId(), (Spell)stackObject); + stack.put(stackObject.getId(), new CardView((Spell) stackObject, game, stackObject.getControllerId().equals(createdForPlayerId))); + checkPaid(stackObject.getId(), (Spell) stackObject); } //stackOrder.add(stackObject.getId()); } //Collections.reverse(stackOrder); - for (ExileZone exileZone: state.getExile().getExileZones()) { + for (ExileZone exileZone : state.getExile().getExileZones()) { exiles.add(new ExileView(exileZone, game)); } - for (String name: state.getRevealed().keySet()) { + for (String name : state.getRevealed().keySet()) { revealed.add(new RevealedView(name, state.getRevealed().get(name), game)); } this.phase = state.getTurn().getPhaseType(); @@ -163,7 +169,7 @@ public class GameView implements Serializable { } else { this.priorityPlayerName = ""; } - for (CombatGroup combatGroup: state.getCombat().getGroups()) { + for (CombatGroup combatGroup : state.getCombat().getGroups()) { combat.add(new CombatGroupView(combatGroup, game)); } if (isPlayer) { @@ -174,13 +180,13 @@ public class GameView implements Serializable { } else { this.special = false; } - + CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get("CastSpellLastTurnWatcher"); if (watcher != null) { spellsCastCurrentTurn = watcher.getAmountOfSpellsAllPlayersCastOnCurrentTurn(); } else { spellsCastCurrentTurn = 0; - } + } rollbackTurnsAllowed = game.getOptions().rollbackTurnsAllowed; } @@ -215,7 +221,7 @@ public class GameView implements Serializable { } Permanent permanent = game.getPermanent(card.getId()); if (permanent == null) { - permanent = (Permanent)game.getLastKnownInformation(card.getId(), Zone.BATTLEFIELD); + permanent = (Permanent) game.getLastKnownInformation(card.getId(), Zone.BATTLEFIELD); } if (permanent != null) { if (permanent.isTransformed()) { @@ -328,5 +334,5 @@ public class GameView implements Serializable { public boolean isRollbackTurnsAllowed() { return rollbackTurnsAllowed; } - + } diff --git a/Mage.Common/src/mage/view/PlayerView.java b/Mage.Common/src/mage/view/PlayerView.java index 14c3990eb38..ce66a5ffbe0 100644 --- a/Mage.Common/src/mage/view/PlayerView.java +++ b/Mage.Common/src/mage/view/PlayerView.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; import mage.cards.Card; +import mage.constants.CardType; import mage.counters.CounterType; import mage.game.ExileZone; import mage.game.Game; @@ -125,6 +126,11 @@ public class PlayerView implements Serializable { if (emblem.getControllerId().equals(this.playerId)) { Card sourceCard = game.getCard(((CommandObject) emblem).getSourceId()); if (sourceCard != null) { + if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) { + if (sourceCard.getSecondCardFace() != null) { + sourceCard = sourceCard.getSecondCardFace(); + } + } commandList.add(new EmblemView(emblem, sourceCard)); } } diff --git a/Mage/src/mage/game/command/Emblem.java b/Mage/src/mage/game/command/Emblem.java index 3321f3ead71..35b35b1a4c2 100644 --- a/Mage/src/mage/game/command/Emblem.java +++ b/Mage/src/mage/game/command/Emblem.java @@ -1,30 +1,30 @@ /* -* 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. -*/ + * 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.game.command; import java.util.ArrayList; @@ -86,7 +86,7 @@ public class Emblem implements CommandObject { } public void setControllerId(UUID controllerId) { - this.controllerId = controllerId; + this.controllerId = controllerId; this.abilites.setControllerId(controllerId); } @@ -101,9 +101,9 @@ public class Emblem implements CommandObject { @Override public String getIdName() { - return getName() + " ["+getId().toString().substring(0,3) +"]"; + return getName() + " [" + getId().toString().substring(0, 3) + "]"; } - + @Override public String getLogName() { return GameLog.getColoredObjectIdName(this); @@ -170,13 +170,16 @@ public class Emblem implements CommandObject { } @Override - public void adjustChoices(Ability ability, Game game) {} + public void adjustChoices(Ability ability, Game game) { + } @Override - public void adjustCosts(Ability ability, Game game) {} + public void adjustCosts(Ability ability, Game game) { + } @Override - public void adjustTargets(Ability ability, Game game) {} + public void adjustTargets(Ability ability, Game game) { + } @Override public UUID getId() { @@ -207,7 +210,7 @@ public class Emblem implements CommandObject { @Override public int getZoneChangeCounter(Game game) { - throw new UnsupportedOperationException("Unsupported operation"); + return 1; // Emblems can't move zones until now so return always 1 } @Override @@ -219,5 +222,5 @@ public class Emblem implements CommandObject { public void setZoneChangeCounter(int value, Game game) { throw new UnsupportedOperationException("Unsupported operation"); } - + } From dd7d57f574859a18e27f327e6169c8227297cb53 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 17 Jul 2015 15:34:45 +0200 Subject: [PATCH 089/375] * Fixed token image handling so that images from the set of the creating card are used if possible. Not all tokens already reworked. --- .../alarareborn/NecromancersCovenant.java | 19 +-- .../alarareborn/UnscytheKillerOfKings.java | 2 +- .../sets/avacynrestored/MaalfeldTwins.java | 6 +- .../sets/commander2014/GhoulcallerGisa.java | 4 +- .../commander2014/OverseerOfTheDamned.java | 2 +- .../mage/sets/conflux/GrixisSlavedriver.java | 10 +- .../darkascension/HavengulRunebinder.java | 8 +- .../sets/darkascension/ReapTheSeagraf.java | 3 +- .../mage/sets/darkascension/Wakedancer.java | 3 +- .../dragonsoftarkir/RakshasaGravecaller.java | 4 +- .../IbHalfheartGoblinTactician.java | 2 +- .../mage/sets/innistrad/ArmyOfTheDamned.java | 4 +- .../src/mage/sets/innistrad/CellarDoor.java | 10 +- .../sets/innistrad/EndlessRanksOfTheDead.java | 6 +- .../sets/innistrad/MoanOfTheUnhallowed.java | 3 +- .../mage/sets/innistrad/UndeadAlchemist.java | 4 +- .../sets/khansoftarkir/HordelingOutburst.java | 3 +- .../sets/khansoftarkir/MarduAscendancy.java | 3 +- .../sets/khansoftarkir/PonybackBrigade.java | 4 +- .../sets/khansoftarkir/SidisiBroodTyrant.java | 9 +- .../src/mage/sets/magic2011/GraveTitan.java | 15 +- .../mage/sets/magic2012/CemeteryReaper.java | 11 +- .../sets/magic2012/ZombieInfestation.java | 9 +- .../src/mage/sets/magic2013/VileRebirth.java | 5 +- .../mage/sets/magic2014/LilianasReaver.java | 4 +- .../sets/magic2014/XathridNecromancer.java | 3 +- .../sets/magic2015/NecromancersStockpile.java | 10 +- .../src/mage/sets/magic2015/WasteNot.java | 39 +++-- .../sets/magicorigins/AspiringAeronaut.java | 4 +- .../magicorigins/FoundryOfTheConsuls.java | 6 +- .../sets/magicorigins/HangarbackWalker.java | 52 +++---- .../magicorigins/LilianaHereticalHealer.java | 2 +- .../sets/magicorigins/NissaSageAnimist.java | 14 +- .../sets/magicorigins/PiaAndKiranNalaar.java | 8 +- .../sets/magicorigins/ThopterSpyNetwork.java | 22 +-- .../mage/sets/magicorigins/UndeadServant.java | 2 +- .../sets/mirrodinbesieged/NestedGhoul.java | 10 +- .../sets/planechase2012/BeetlebackChief.java | 6 +- .../sets/scarsofmirrodin/KuldothaRebirth.java | 15 +- .../sets/shardsofalara/ArchdemonOfUnx.java | 5 +- .../mage/sets/shardsofalara/DragonFodder.java | 4 +- .../mage/sets/stronghold/MoggInfestation.java | 5 +- .../mage/sets/timespiral/EmptyTheWarrens.java | 5 +- .../effects/common/CreateTokenEffect.java | 73 +++++---- Mage/src/mage/cards/CardImpl.java | 146 +++++++++--------- .../game/permanent/token/GoblinToken.java | 18 +-- .../token/ThopterColorlessToken.java | 15 +- Mage/src/mage/game/permanent/token/Token.java | 86 ++++++----- .../game/permanent/token/ZombieToken.java | 31 ++-- 49 files changed, 367 insertions(+), 367 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alarareborn/NecromancersCovenant.java b/Mage.Sets/src/mage/sets/alarareborn/NecromancersCovenant.java index df2dbbeadfa..9e5dcf9df74 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/NecromancersCovenant.java +++ b/Mage.Sets/src/mage/sets/alarareborn/NecromancersCovenant.java @@ -28,11 +28,6 @@ package mage.sets.alarareborn; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -41,6 +36,11 @@ import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.LifelinkAbility; import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.SubtypePredicate; @@ -54,9 +54,9 @@ import mage.target.TargetPlayer; * @author jeffwadsworth */ public class NecromancersCovenant extends CardImpl { - + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Zombies you control"); - + static { filter.add(new SubtypePredicate("Zombie")); } @@ -65,9 +65,6 @@ public class NecromancersCovenant extends CardImpl { super(ownerId, 82, "Necromancer's Covenant", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}{B}{B}"); this.expansionSetCode = "ARB"; - - - // When Necromancer's Covenant enters the battlefield, exile all creature cards from target player's graveyard, then put a 2/2 black Zombie creature token onto the battlefield for each card exiled this way. Ability ability = new EntersBattlefieldTriggeredAbility(new NecromancersConvenantEffect(), false); ability.addTarget(new TargetPlayer()); @@ -110,7 +107,7 @@ class NecromancersConvenantEffect extends OneShotEffect { count += 1; } } - ZombieToken zombieToken = new ZombieToken("ALA"); + ZombieToken zombieToken = new ZombieToken(); if (zombieToken.putOntoBattlefield(count, game, source.getSourceId(), source.getControllerId())) { return true; } diff --git a/Mage.Sets/src/mage/sets/alarareborn/UnscytheKillerOfKings.java b/Mage.Sets/src/mage/sets/alarareborn/UnscytheKillerOfKings.java index b89373ee45c..3400918c530 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/UnscytheKillerOfKings.java +++ b/Mage.Sets/src/mage/sets/alarareborn/UnscytheKillerOfKings.java @@ -163,7 +163,7 @@ class UnscytheEffect extends OneShotEffect { if (controller != null) { Card card = game.getCard(targetPointer.getFirst(game, source)); if (card != null && game.getState().getZone(card.getId()).equals(Zone.GRAVEYARD) && controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.GRAVEYARD, true)) { - ZombieToken zombie = new ZombieToken("ALA"); + ZombieToken zombie = new ZombieToken(); return zombie.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); } return true; diff --git a/Mage.Sets/src/mage/sets/avacynrestored/MaalfeldTwins.java b/Mage.Sets/src/mage/sets/avacynrestored/MaalfeldTwins.java index 72bcf6c1af0..503fc720b68 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/MaalfeldTwins.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/MaalfeldTwins.java @@ -28,12 +28,12 @@ package mage.sets.avacynrestored; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.permanent.token.ZombieToken; /** @@ -51,7 +51,7 @@ public class MaalfeldTwins extends CardImpl { this.toughness = new MageInt(4); // When Maalfeld Twins dies, put two 2/2 black Zombie creature tokens onto the battlefield. - this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new ZombieToken("ALA"), 2))); + this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 2))); } public MaalfeldTwins(final MaalfeldTwins card) { diff --git a/Mage.Sets/src/mage/sets/commander2014/GhoulcallerGisa.java b/Mage.Sets/src/mage/sets/commander2014/GhoulcallerGisa.java index 24e6fb4e5dd..00c32af9c7f 100644 --- a/Mage.Sets/src/mage/sets/commander2014/GhoulcallerGisa.java +++ b/Mage.Sets/src/mage/sets/commander2014/GhoulcallerGisa.java @@ -72,11 +72,11 @@ public class GhoulcallerGisa extends CardImpl { // {B}, {tap}, Sacrifice another creature: Put X 2/2 black Zombie creature tokens onto the battlefield, where X is the sacrificed creature's power. DynamicValue xValue = new SacrificeCostCreaturesPower(); - Token zombie = new ZombieToken("C14"); + Token zombie = new ZombieToken(); zombie.setTokenType(2); Effect effect = new CreateTokenEffect(zombie, xValue); effect.setText("Put X 2/2 black Zombie creature tokens onto the battlefield, where X is the sacrificed creature's power"); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{B}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{B}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter))); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/commander2014/OverseerOfTheDamned.java b/Mage.Sets/src/mage/sets/commander2014/OverseerOfTheDamned.java index d31d1267b93..b4f79d12684 100644 --- a/Mage.Sets/src/mage/sets/commander2014/OverseerOfTheDamned.java +++ b/Mage.Sets/src/mage/sets/commander2014/OverseerOfTheDamned.java @@ -75,7 +75,7 @@ public class OverseerOfTheDamned extends CardImpl { ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); // Whenever a nontoken creature an opponent controls dies, put a 2/2 black Zombie creature token onto the battlefield tapped. - Token zombie = new ZombieToken("C14"); + Token zombie = new ZombieToken(); zombie.setTokenType(2); this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(zombie, 1, true, false), false, filter)); diff --git a/Mage.Sets/src/mage/sets/conflux/GrixisSlavedriver.java b/Mage.Sets/src/mage/sets/conflux/GrixisSlavedriver.java index 3710c6ace36..9897aad58c2 100644 --- a/Mage.Sets/src/mage/sets/conflux/GrixisSlavedriver.java +++ b/Mage.Sets/src/mage/sets/conflux/GrixisSlavedriver.java @@ -25,21 +25,19 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.conflux; -import mage.constants.CardType; -import mage.constants.Rarity; +import java.util.UUID; import mage.MageInt; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.UnearthAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.permanent.token.ZombieToken; -import java.util.UUID; - /** * @author Loki */ @@ -53,7 +51,7 @@ public class GrixisSlavedriver extends CardImpl { this.subtype.add("Giant"); this.power = new MageInt(4); this.toughness = new MageInt(4); - this.addAbility(new LeavesBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken("ALA")), false)); + this.addAbility(new LeavesBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken()), false)); this.addAbility(new UnearthAbility(new ManaCostsImpl("{3}{B}"))); } diff --git a/Mage.Sets/src/mage/sets/darkascension/HavengulRunebinder.java b/Mage.Sets/src/mage/sets/darkascension/HavengulRunebinder.java index 44261789760..b4f746332cf 100644 --- a/Mage.Sets/src/mage/sets/darkascension/HavengulRunebinder.java +++ b/Mage.Sets/src/mage/sets/darkascension/HavengulRunebinder.java @@ -28,9 +28,6 @@ package mage.sets.darkascension; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ExileFromGraveCost; @@ -39,6 +36,9 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.counter.AddCountersAllEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreatureCard; @@ -71,7 +71,7 @@ public class HavengulRunebinder extends CardImpl { // {2}{U}, {tap}, Exile a creature card from your graveyard: Put a 2/2 black Zombie creature token onto the battlefield, // then put a +1/+1 counter on each Zombie creature you control. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new CreateTokenEffect(new ZombieToken("ISD")), + new CreateTokenEffect(new ZombieToken()), new ManaCostsImpl("{2}{U}")); ability.addCost(new TapSourceCost()); ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(filter))); diff --git a/Mage.Sets/src/mage/sets/darkascension/ReapTheSeagraf.java b/Mage.Sets/src/mage/sets/darkascension/ReapTheSeagraf.java index cd1d8070e61..7623e13224a 100644 --- a/Mage.Sets/src/mage/sets/darkascension/ReapTheSeagraf.java +++ b/Mage.Sets/src/mage/sets/darkascension/ReapTheSeagraf.java @@ -19,8 +19,7 @@ public class ReapTheSeagraf extends CardImpl { super(ownerId, 72, "Reap the Seagraf", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{B}"); this.expansionSetCode = "DKA"; - - this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken("ISD"))); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken())); this.addAbility(new FlashbackAbility(new ManaCostsImpl("{4}{U}"), TimingRule.SORCERY)); } diff --git a/Mage.Sets/src/mage/sets/darkascension/Wakedancer.java b/Mage.Sets/src/mage/sets/darkascension/Wakedancer.java index 2055a9ae024..1324ea54bd7 100644 --- a/Mage.Sets/src/mage/sets/darkascension/Wakedancer.java +++ b/Mage.Sets/src/mage/sets/darkascension/Wakedancer.java @@ -44,6 +44,7 @@ import mage.game.permanent.token.ZombieToken; * @author Loki */ public class Wakedancer extends CardImpl { + private static final String staticText = "Morbid - When {this} enters the battlefield, if a creature died this turn, put a 2/2 black Zombie creature token onto the battlefield."; public Wakedancer(UUID ownerId) { @@ -57,7 +58,7 @@ public class Wakedancer extends CardImpl { this.toughness = new MageInt(2); // Morbid - When Wakedancer enters the battlefield, if a creature died this turn, put a 2/2 black Zombie creature token onto the battlefield. - TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken("ISD"))); + TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken())); this.addAbility(new ConditionalTriggeredAbility(ability, MorbidCondition.getInstance(), staticText)); } diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/RakshasaGravecaller.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/RakshasaGravecaller.java index f30c57e4767..ca087c2729a 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/RakshasaGravecaller.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/RakshasaGravecaller.java @@ -53,9 +53,9 @@ public class RakshasaGravecaller extends CardImpl { // Exploit this.addAbility(new ExploitAbility()); - + // When Rakshasa Gravecaller exploits a creature, put two 2/2 black Zombie creature tokens onto the battlefield. - this.addAbility(new ExploitCreatureTriggeredAbility(new CreateTokenEffect(new ZombieToken("DTK"), 2), false)); + this.addAbility(new ExploitCreatureTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 2), false)); } public RakshasaGravecaller(final RakshasaGravecaller card) { diff --git a/Mage.Sets/src/mage/sets/elvesvsgoblins/IbHalfheartGoblinTactician.java b/Mage.Sets/src/mage/sets/elvesvsgoblins/IbHalfheartGoblinTactician.java index 095e9dc2bbc..44cfadd869f 100644 --- a/Mage.Sets/src/mage/sets/elvesvsgoblins/IbHalfheartGoblinTactician.java +++ b/Mage.Sets/src/mage/sets/elvesvsgoblins/IbHalfheartGoblinTactician.java @@ -86,7 +86,7 @@ public class IbHalfheartGoblinTactician extends CardImpl { // Sacrifice two Mountains: Put two 1/1 red Goblin creature tokens onto the battlefield. this.addAbility(new SimpleActivatedAbility( Zone.BATTLEFIELD, - new CreateTokenEffect(new GoblinToken(expansionSetCode), 2), + new CreateTokenEffect(new GoblinToken(), 2), new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, true)))); } diff --git a/Mage.Sets/src/mage/sets/innistrad/ArmyOfTheDamned.java b/Mage.Sets/src/mage/sets/innistrad/ArmyOfTheDamned.java index 1ab4ba853f5..a80ff5eac53 100644 --- a/Mage.Sets/src/mage/sets/innistrad/ArmyOfTheDamned.java +++ b/Mage.Sets/src/mage/sets/innistrad/ArmyOfTheDamned.java @@ -37,7 +37,6 @@ import mage.constants.Rarity; import mage.constants.TimingRule; import mage.game.permanent.token.ZombieToken; - /** * @author nantuko */ @@ -47,9 +46,8 @@ public class ArmyOfTheDamned extends CardImpl { super(ownerId, 87, "Army of the Damned", Rarity.MYTHIC, new CardType[]{CardType.SORCERY}, "{5}{B}{B}{B}"); this.expansionSetCode = "ISD"; - // Put thirteen 2/2 black Zombie creature tokens onto the battlefield tapped. - this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken("ISD"), 13, true, false)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken(), 13, true, false)); // Flashback {7}{B}{B}{B} this.addAbility(new FlashbackAbility(new ManaCostsImpl("{7}{B}{B}{B}"), TimingRule.SORCERY)); diff --git a/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java b/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java index e209ee7f2d4..869b49fbebc 100644 --- a/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java +++ b/Mage.Sets/src/mage/sets/innistrad/CellarDoor.java @@ -28,10 +28,6 @@ package mage.sets.innistrad; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -39,6 +35,10 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.token.ZombieToken; import mage.players.Player; @@ -95,7 +95,7 @@ class CellarDoorEffect extends OneShotEffect { if (card != null) { player.moveCards(card, Zone.LIBRARY, Zone.GRAVEYARD, source, game); if (card.getCardType().contains(CardType.CREATURE)) { - ZombieToken token = new ZombieToken("ISD"); + ZombieToken token = new ZombieToken(); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); } } diff --git a/Mage.Sets/src/mage/sets/innistrad/EndlessRanksOfTheDead.java b/Mage.Sets/src/mage/sets/innistrad/EndlessRanksOfTheDead.java index 28d7a191a35..dfc6815538f 100644 --- a/Mage.Sets/src/mage/sets/innistrad/EndlessRanksOfTheDead.java +++ b/Mage.Sets/src/mage/sets/innistrad/EndlessRanksOfTheDead.java @@ -27,6 +27,7 @@ */ package mage.sets.innistrad; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.OnEventTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; @@ -41,8 +42,6 @@ import mage.game.Game; import mage.game.events.GameEvent.EventType; import mage.game.permanent.token.ZombieToken; -import java.util.UUID; - /** * * @author BetaSteward @@ -53,11 +52,10 @@ public class EndlessRanksOfTheDead extends CardImpl { super(ownerId, 99, "Endless Ranks of the Dead", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}"); this.expansionSetCode = "ISD"; - // At the beginning of your upkeep, put X 2/2 black Zombie creature tokens onto the battlefield, // where X is half the number of Zombies you control, rounded down. this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, "beginning of your upkeep", - new CreateTokenEffect(new ZombieToken("ISD"), new HalfZombiesCount()))); + new CreateTokenEffect(new ZombieToken(), new HalfZombiesCount()))); } diff --git a/Mage.Sets/src/mage/sets/innistrad/MoanOfTheUnhallowed.java b/Mage.Sets/src/mage/sets/innistrad/MoanOfTheUnhallowed.java index a981392e93d..82b16d77bc2 100644 --- a/Mage.Sets/src/mage/sets/innistrad/MoanOfTheUnhallowed.java +++ b/Mage.Sets/src/mage/sets/innistrad/MoanOfTheUnhallowed.java @@ -47,9 +47,8 @@ public class MoanOfTheUnhallowed extends CardImpl { super(ownerId, 109, "Moan of the Unhallowed", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{B}{B}"); this.expansionSetCode = "ISD"; - // Put two 2/2 black Zombie creature tokens onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken("ISD"), 2)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken(), 2)); // Flashback {5}{B}{B} this.addAbility(new FlashbackAbility(new ManaCostsImpl("{5}{B}{B}"), TimingRule.SORCERY)); diff --git a/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java b/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java index 884fc9e016a..4e39289c8df 100644 --- a/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java +++ b/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java @@ -86,7 +86,7 @@ class UndeadAlchemistTriggeredAbility extends TriggeredAbilityImpl { public UndeadAlchemistTriggeredAbility() { super(Zone.BATTLEFIELD, new ExileTargetEffect(), true); - this.addEffect(new CreateTokenEffect(new ZombieToken("ISD"))); + this.addEffect(new CreateTokenEffect(new ZombieToken())); } public UndeadAlchemistTriggeredAbility(final UndeadAlchemistTriggeredAbility ability) { @@ -105,7 +105,7 @@ class UndeadAlchemistTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getFromZone() == Zone.LIBRARY && zEvent.getToZone() == Zone.GRAVEYARD && game.getOpponents(this.getControllerId()).contains(zEvent.getPlayerId())) { Card card = game.getCard(event.getTargetId()); if (card != null && card.getCardType().contains(CardType.CREATURE)) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/HordelingOutburst.java b/Mage.Sets/src/mage/sets/khansoftarkir/HordelingOutburst.java index 663895c7925..d812a84e0d4 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/HordelingOutburst.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/HordelingOutburst.java @@ -44,9 +44,8 @@ public class HordelingOutburst extends CardImpl { super(ownerId, 111, "Hordeling Outburst", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{R}{R}"); this.expansionSetCode = "KTK"; - // Put 3 1/1 red Goblin creature tokens onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(expansionSetCode), 3)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(), 3)); } public HordelingOutburst(final HordelingOutburst card) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduAscendancy.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduAscendancy.java index 86f5efc4b4e..13e222bca19 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduAscendancy.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduAscendancy.java @@ -64,9 +64,8 @@ public class MarduAscendancy extends CardImpl { super(ownerId, 185, "Mardu Ascendancy", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{R}{W}{B}"); this.expansionSetCode = "KTK"; - // Whenever a nontoken creature you control attacks, put a 1/1 red Goblin creature token onto the battlefield tapped and attacking. - this.addAbility(new AttacksCreatureYouControlTriggeredAbility(new CreateTokenEffect(new GoblinToken(expansionSetCode), 1, true, true), false, attackFilter)); + this.addAbility(new AttacksCreatureYouControlTriggeredAbility(new CreateTokenEffect(new GoblinToken(), 1, true, true), false, attackFilter)); // Sacrifice Mardu Ascendancy: Creatures you control get +0/+3 until end of turn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(0, 3, Duration.EndOfTurn, filter, false), diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java b/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java index f6f03ca9d0d..fde44d673ef 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java @@ -60,7 +60,7 @@ public class PonybackBrigade extends CardImpl { this.toughness = new MageInt(2); // When Ponyback Brigade enters the battlefield or is turned face up, put three 1/1 red Goblin creature tokens onto the battlefield. - this.addAbility(new PonybackBrigadeAbility(new GoblinToken(expansionSetCode))); + this.addAbility(new PonybackBrigadeAbility(new GoblinToken())); // Morph {2}{R}{W}{B} this.addAbility(new MorphAbility(this, new ManaCostsImpl("{2}{R}{W}{B}"))); @@ -102,7 +102,7 @@ class PonybackBrigadeAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.TURNEDFACEUP && event.getTargetId().equals(this.getSourceId())) { return true; } - if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) { + if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId())) { Permanent sourcePermanent = game.getPermanent(getSourceId()); if (sourcePermanent != null && !sourcePermanent.isFaceDown(game)) { return true; diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java b/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java index 6eda6b2e4ea..be677f414d2 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java @@ -112,7 +112,7 @@ class SidisiBroodTyrantAbility extends TriggeredAbilityImpl { class SidisiBroodTyrantTriggeredAbility extends TriggeredAbilityImpl { public SidisiBroodTyrantTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken("KTK")), false); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken()), false); } public SidisiBroodTyrantTriggeredAbility(final SidisiBroodTyrantTriggeredAbility ability) { @@ -126,12 +126,12 @@ class SidisiBroodTyrantTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent)event; + ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent) event; if (Zone.LIBRARY == zEvent.getFromZone() && Zone.GRAVEYARD == zEvent.getToZone()) { - for (Card card: zEvent.getCards()) { + for (Card card : zEvent.getCards()) { if (card.getOwnerId().equals(getControllerId()) && card.getCardType().contains(CardType.CREATURE)) { return true; - } + } } } return false; @@ -142,7 +142,6 @@ class SidisiBroodTyrantTriggeredAbility extends TriggeredAbilityImpl { return new SidisiBroodTyrantTriggeredAbility(this); } - @Override public String getRule() { return "Whenever one or more creature cards are put into your graveyard from your library, put a 2/2 black Zombie creature token onto the battlefield."; diff --git a/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java b/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java index b478145b76c..22f1f6bfa4b 100644 --- a/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.magic2011; import java.util.UUID; @@ -74,7 +73,7 @@ public class GraveTitan extends CardImpl { class GraveTitanAbility extends TriggeredAbilityImpl { public GraveTitanAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken("M11"), 2), false); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken(), 2), false); } public GraveTitanAbility(final GraveTitanAbility ability) { @@ -96,7 +95,7 @@ class GraveTitanAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { return true; } - if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId()) ) { + if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId().equals(this.getSourceId())) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2012/CemeteryReaper.java b/Mage.Sets/src/mage/sets/magic2012/CemeteryReaper.java index 91a639adbb4..54bc7b115d9 100644 --- a/Mage.Sets/src/mage/sets/magic2012/CemeteryReaper.java +++ b/Mage.Sets/src/mage/sets/magic2012/CemeteryReaper.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.magic2012; import java.util.UUID; @@ -55,7 +54,7 @@ import mage.target.common.TargetCardInGraveyard; public class CemeteryReaper extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Zombie creatures"); - + static { filter.add(new SubtypePredicate("Zombie")); } @@ -66,14 +65,14 @@ public class CemeteryReaper extends CardImpl { this.subtype.add("Zombie"); this.power = new MageInt(2); this.toughness = new MageInt(2); - + // Other Zombie creatures you control get +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true))); - - // {2}{B}, {T} : Exile target creature card from a graveyard. Put a 2/2 black Zombie creature token onto the battlefield. + + // {2}{B}, {T} : Exile target creature card from a graveyard. Put a 2/2 black Zombie creature token onto the battlefield. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl("{2}{B}")); ability.addCost(new TapSourceCost()); - ability.addEffect(new CreateTokenEffect(new ZombieToken("M12"))); + ability.addEffect(new CreateTokenEffect(new ZombieToken())); ability.addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard"))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/magic2012/ZombieInfestation.java b/Mage.Sets/src/mage/sets/magic2012/ZombieInfestation.java index 09c3d728579..e557f401005 100644 --- a/Mage.Sets/src/mage/sets/magic2012/ZombieInfestation.java +++ b/Mage.Sets/src/mage/sets/magic2012/ZombieInfestation.java @@ -28,13 +28,13 @@ package mage.sets.magic2012; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.permanent.token.ZombieToken; import mage.target.common.TargetCardInHand; @@ -49,10 +49,9 @@ public class ZombieInfestation extends CardImpl { super(ownerId, 120, "Zombie Infestation", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); this.expansionSetCode = "M12"; - // Discard two cards: Put a 2/2 black Zombie creature token onto the battlefield. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new CreateTokenEffect(new ZombieToken("M12")), + new CreateTokenEffect(new ZombieToken()), new DiscardTargetCost(new TargetCardInHand(2, new FilterCard("two cards")))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/magic2013/VileRebirth.java b/Mage.Sets/src/mage/sets/magic2013/VileRebirth.java index 2daa3aca0f9..f62b22cdeaa 100644 --- a/Mage.Sets/src/mage/sets/magic2013/VileRebirth.java +++ b/Mage.Sets/src/mage/sets/magic2013/VileRebirth.java @@ -37,8 +37,6 @@ import mage.filter.common.FilterCreatureCard; import mage.game.permanent.token.ZombieToken; import mage.target.common.TargetCardInGraveyard; - - /** * * @author North @@ -49,13 +47,12 @@ public class VileRebirth extends CardImpl { super(ownerId, 115, "Vile Rebirth", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{B}"); this.expansionSetCode = "M13"; - // Exile target creature card from a graveyard. this.getSpellAbility().addEffect(new ExileTargetEffect()); this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard"))); // Put a 2/2 black Zombie creature token onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken("M13"))); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken())); } public VileRebirth(final VileRebirth card) { diff --git a/Mage.Sets/src/mage/sets/magic2014/LilianasReaver.java b/Mage.Sets/src/mage/sets/magic2014/LilianasReaver.java index 8e1cc16edf6..d2094078eb9 100644 --- a/Mage.Sets/src/mage/sets/magic2014/LilianasReaver.java +++ b/Mage.Sets/src/mage/sets/magic2014/LilianasReaver.java @@ -57,8 +57,8 @@ public class LilianasReaver extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // Whenever Liliana's Reaver deals combat damage to a player, that player discards a card and you put a 2/2 black Zombie creature token onto the battlefield tapped. - Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1),false, true); - ability.addEffect(new CreateTokenEffect(new ZombieToken("M14"), 1, true, false)); + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true); + ability.addEffect(new CreateTokenEffect(new ZombieToken(), 1, true, false)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/magic2014/XathridNecromancer.java b/Mage.Sets/src/mage/sets/magic2014/XathridNecromancer.java index 32b7487ad92..cb5fd961888 100644 --- a/Mage.Sets/src/mage/sets/magic2014/XathridNecromancer.java +++ b/Mage.Sets/src/mage/sets/magic2014/XathridNecromancer.java @@ -49,6 +49,7 @@ import mage.game.permanent.token.ZombieToken; public class XathridNecromancer extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Human creature you control"); + static { filter.add(new ControllerPredicate(TargetController.YOU)); filter.add(new SubtypePredicate("Human")); @@ -64,7 +65,7 @@ public class XathridNecromancer extends CardImpl { this.toughness = new MageInt(2); // Whenever Xathrid Necromancer or another Human creature you control dies, put a 2/2 black Zombie creature token onto the battlefield tapped. - Effect effect = new CreateTokenEffect(new ZombieToken("M14"), 1, true, false); + Effect effect = new CreateTokenEffect(new ZombieToken(), 1, true, false); Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(effect, false, filter); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java b/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java index c3f5a323e46..51af6f7dedf 100644 --- a/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java +++ b/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java @@ -27,6 +27,7 @@ */ package mage.sets.magic2015; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.CostImpl; @@ -47,8 +48,6 @@ import mage.game.permanent.token.ZombieToken; import mage.players.Player; import mage.target.common.TargetCardInHand; -import java.util.UUID; - /** * @author noxx */ @@ -60,7 +59,6 @@ public class NecromancersStockpile extends CardImpl { super(ownerId, 108, "Necromancer's Stockpile", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); this.expansionSetCode = "M15"; - // {1}{B}, Discard a creature card: Draw a card. // If the discarded card was a Zombie card, put a 2/2 black Zombie creature token onto the battlefield tapped. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{1}{B}")); @@ -97,7 +95,7 @@ class NecromancersStockpileDiscardTargetCost extends CostImpl { public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { if (targets.choose(Outcome.Discard, controllerId, sourceId, game)) { Player player = game.getPlayer(controllerId); - for (UUID targetId: targets.get(0).getTargets()) { + for (UUID targetId : targets.get(0).getTargets()) { Card card = player.getHand().get(targetId, game); if (card == null) { return false; @@ -127,6 +125,7 @@ class NecromancersStockpileDiscardTargetCost extends CostImpl { } class NecromancersStockpilePutTokenEffect extends OneShotEffect { + NecromancersStockpilePutTokenEffect() { super(Outcome.Neutral); staticText = "If the discarded card was a Zombie card, put a 2/2 black Zombie creature token onto the battlefield tapped"; @@ -140,7 +139,7 @@ class NecromancersStockpilePutTokenEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { NecromancersStockpileDiscardTargetCost cost = (NecromancersStockpileDiscardTargetCost) source.getCosts().get(0); if (cost != null && cost.isZombieCard()) { - new CreateTokenEffect(new ZombieToken("M15"), 1, true, false).apply(game, source); + new CreateTokenEffect(new ZombieToken(), 1, true, false).apply(game, source); } return true; } @@ -150,4 +149,3 @@ class NecromancersStockpilePutTokenEffect extends OneShotEffect { return new NecromancersStockpilePutTokenEffect(this); } } - diff --git a/Mage.Sets/src/mage/sets/magic2015/WasteNot.java b/Mage.Sets/src/mage/sets/magic2015/WasteNot.java index 4fba77c7a41..ed5690362ef 100644 --- a/Mage.Sets/src/mage/sets/magic2015/WasteNot.java +++ b/Mage.Sets/src/mage/sets/magic2015/WasteNot.java @@ -53,13 +53,12 @@ public class WasteNot extends CardImpl { super(ownerId, 122, "Waste Not", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); this.expansionSetCode = "M15"; - // Whenever an opponent discards a creature card, put a 2/2 black Zombie creature token onto the battlefield. this.addAbility(new WasteNotCreatureTriggeredAbility()); - + // Whenever an opponent discards a land card, add {B}{B} to your mana pool. this.addAbility(new WasteNotLandTriggeredAbility()); - + // Whenever an opponent discards a noncreature, nonland card, draw a card. this.addAbility(new WasteNotOtherTriggeredAbility()); } @@ -75,15 +74,15 @@ public class WasteNot extends CardImpl { } class WasteNotCreatureTriggeredAbility extends TriggeredAbilityImpl { - + WasteNotCreatureTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken("M15")), false); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken()), false); } - + WasteNotCreatureTriggeredAbility(final WasteNotCreatureTriggeredAbility ability) { super(ability); } - + @Override public WasteNotCreatureTriggeredAbility copy() { return new WasteNotCreatureTriggeredAbility(this); @@ -93,7 +92,7 @@ class WasteNotCreatureTriggeredAbility extends TriggeredAbilityImpl { public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.DISCARDED_CARD; } - + @Override public boolean checkTrigger(GameEvent event, Game game) { if (game.getOpponents(this.getControllerId()).contains(event.getPlayerId())) { @@ -104,7 +103,7 @@ class WasteNotCreatureTriggeredAbility extends TriggeredAbilityImpl { } return false; } - + @Override public String getRule() { return "Whenever an opponent discards a creature card, put a 2/2 black Zombie creature token onto the battlefield."; @@ -112,15 +111,15 @@ class WasteNotCreatureTriggeredAbility extends TriggeredAbilityImpl { } class WasteNotLandTriggeredAbility extends TriggeredAbilityImpl { - + WasteNotLandTriggeredAbility() { super(Zone.BATTLEFIELD, new BasicManaEffect(new Mana(0, 0, 0, 0, 2, 0, 0)), false); } - + WasteNotLandTriggeredAbility(final WasteNotLandTriggeredAbility ability) { super(ability); } - + @Override public WasteNotLandTriggeredAbility copy() { return new WasteNotLandTriggeredAbility(this); @@ -130,7 +129,7 @@ class WasteNotLandTriggeredAbility extends TriggeredAbilityImpl { public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.DISCARDED_CARD; } - + @Override public boolean checkTrigger(GameEvent event, Game game) { if (game.getOpponents(this.getControllerId()).contains(event.getPlayerId())) { @@ -141,7 +140,7 @@ class WasteNotLandTriggeredAbility extends TriggeredAbilityImpl { } return false; } - + @Override public String getRule() { return "Whenever an opponent discards a land card, add {B}{B} to your mana pool."; @@ -149,15 +148,15 @@ class WasteNotLandTriggeredAbility extends TriggeredAbilityImpl { } class WasteNotOtherTriggeredAbility extends TriggeredAbilityImpl { - + WasteNotOtherTriggeredAbility() { super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), false); } - + WasteNotOtherTriggeredAbility(final WasteNotOtherTriggeredAbility ability) { super(ability); } - + @Override public WasteNotOtherTriggeredAbility copy() { return new WasteNotOtherTriggeredAbility(this); @@ -167,7 +166,7 @@ class WasteNotOtherTriggeredAbility extends TriggeredAbilityImpl { public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.DISCARDED_CARD; } - + @Override public boolean checkTrigger(GameEvent event, Game game) { if (game.getOpponents(this.getControllerId()).contains(event.getPlayerId())) { @@ -178,9 +177,9 @@ class WasteNotOtherTriggeredAbility extends TriggeredAbilityImpl { } return false; } - + @Override public String getRule() { return "Whenever an opponent discards a noncreature, nonland card, draw a card."; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/AspiringAeronaut.java b/Mage.Sets/src/mage/sets/magicorigins/AspiringAeronaut.java index 4af2005c389..c05f943cc9a 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/AspiringAeronaut.java +++ b/Mage.Sets/src/mage/sets/magicorigins/AspiringAeronaut.java @@ -53,9 +53,9 @@ public class AspiringAeronaut extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // When Aspiring Aeronaut enters the battlefield, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken("ORI")))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken()))); } public AspiringAeronaut(final AspiringAeronaut card) { diff --git a/Mage.Sets/src/mage/sets/magicorigins/FoundryOfTheConsuls.java b/Mage.Sets/src/mage/sets/magicorigins/FoundryOfTheConsuls.java index 954e9edf44c..d6b8561812d 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/FoundryOfTheConsuls.java +++ b/Mage.Sets/src/mage/sets/magicorigins/FoundryOfTheConsuls.java @@ -44,7 +44,7 @@ import mage.game.permanent.token.ThopterColorlessToken; /** * * @author LoneFox - + * */ public class FoundryOfTheConsuls extends CardImpl { @@ -55,8 +55,8 @@ public class FoundryOfTheConsuls extends CardImpl { // {T}: Add {1} to your mana pool. this.addAbility(new ColorlessManaAbility()); // {5}, {T}, Sacrifice Foundry of the Consuls: Put two 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new ThopterColorlessToken("ORI"), 2), - new ManaCostsImpl("{5}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new ThopterColorlessToken(), 2), + new ManaCostsImpl("{5}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java b/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java index 025ce206117..6a1aa70c7c5 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java +++ b/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java @@ -66,10 +66,10 @@ public class HangarbackWalker extends CardImpl { // Hangarback Walker enters the battlefield with X +1/+1 counters on it. this.addAbility(new EntersBattlefieldAbility(new HangarbackWalkerEffect(), "with X +1/+1 counters on it")); - + // When Hangarback Walker dies, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield for each +1/+1 counter on Hangarback Walker. - this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken("ORI"), new CountersCount(CounterType.P1P1)), false)); - + this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken(), new CountersCount(CounterType.P1P1)), false)); + // {1}, {t}: Put a +1/+1 counter on Hangarback Walker. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); @@ -88,33 +88,33 @@ public class HangarbackWalker extends CardImpl { class HangarbackWalkerEffect extends OneShotEffect { - public HangarbackWalkerEffect() { - super(Outcome.BoostCreature); - staticText = "{this} enters the battlefield with X +1/+1 counters on it"; - } + public HangarbackWalkerEffect() { + super(Outcome.BoostCreature); + staticText = "{this} enters the battlefield with X +1/+1 counters on it"; + } - public HangarbackWalkerEffect(final HangarbackWalkerEffect effect) { - super(effect); - } + public HangarbackWalkerEffect(final HangarbackWalkerEffect effect) { + super(effect); + } - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY); - if (obj != null && obj instanceof SpellAbility) { - int amount = ((SpellAbility)obj).getManaCostsToPay().getX(); - if (amount > 0) { - permanent.addCounters(CounterType.P1P1.createInstance(amount), game); - } + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY); + if (obj != null && obj instanceof SpellAbility) { + int amount = ((SpellAbility) obj).getManaCostsToPay().getX(); + if (amount > 0) { + permanent.addCounters(CounterType.P1P1.createInstance(amount), game); } } - return true; } + return true; + } - @Override - public HangarbackWalkerEffect copy() { - return new HangarbackWalkerEffect(this); - } + @Override + public HangarbackWalkerEffect copy() { + return new HangarbackWalkerEffect(this); + } - } \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/LilianaHereticalHealer.java b/Mage.Sets/src/mage/sets/magicorigins/LilianaHereticalHealer.java index a3a6bc156b0..265fa04b4e9 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/LilianaHereticalHealer.java +++ b/Mage.Sets/src/mage/sets/magicorigins/LilianaHereticalHealer.java @@ -77,7 +77,7 @@ public class LilianaHereticalHealer extends CardImpl { // Whenever another nontoken creature you control dies, exile Liliana Heretical Healer, then return her to the battlefield transformed under her owner's control. If you do, put a 2/2 black Zombie creature token onto the battlefield. this.addAbility(new DiesCreatureTriggeredAbility(new ExileAndReturnTransformedSourceEffect(ExileAndReturnTransformedSourceEffect.Gender.FEMAL, - new CreateTokenEffect(new ZombieToken(expansionSetCode))), false, filter)); + new CreateTokenEffect(new ZombieToken())), false, filter)); } public LilianaHereticalHealer(final LilianaHereticalHealer card) { diff --git a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java index ff93fac4615..6f256623cda 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java +++ b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java @@ -65,10 +65,10 @@ public class NissaSageAnimist extends CardImpl { this.expansionSetCode = "ORI"; this.subtype.add("Nissa"); this.color.setGreen(true); - + this.nightCard = true; this.canTransform = true; - + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false)); // +1: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. @@ -95,21 +95,21 @@ public class NissaSageAnimist extends CardImpl { } class NissaSageAnimistPlusOneEffect extends OneShotEffect { - + NissaSageAnimistPlusOneEffect() { super(Outcome.Benefit); this.staticText = "Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand."; } - + NissaSageAnimistPlusOneEffect(final NissaSageAnimistPlusOneEffect effect) { super(effect); } - + @Override public NissaSageAnimistPlusOneEffect copy() { return new NissaSageAnimistPlusOneEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -195,4 +195,4 @@ class NissaSageAnimistMinusSevenEffect extends ContinuousEffectImpl { public boolean hasLayer(Layer layer) { return layer == Layer.TypeChangingEffects_4 || layer == Layer.PTChangingEffects_7; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/PiaAndKiranNalaar.java b/Mage.Sets/src/mage/sets/magicorigins/PiaAndKiranNalaar.java index f6e8eff77fe..a0d055231c0 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/PiaAndKiranNalaar.java +++ b/Mage.Sets/src/mage/sets/magicorigins/PiaAndKiranNalaar.java @@ -61,11 +61,11 @@ public class PiaAndKiranNalaar extends CardImpl { this.toughness = new MageInt(2); // When Pia and Kiran Nalaar enters the battlefield put 2 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken("ORI"), 2))); - + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ThopterColorlessToken(), 2))); + // {2}{R}, Sacrifice an artifact: Pia and Kiran Nalaar deals 2 damage to target creature or player. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{2}{R}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1,1, new FilterControlledArtifactPermanent("an artifact"),true))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, new FilterControlledArtifactPermanent("an artifact"), true))); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); } @@ -78,4 +78,4 @@ public class PiaAndKiranNalaar extends CardImpl { public PiaAndKiranNalaar copy() { return new PiaAndKiranNalaar(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/ThopterSpyNetwork.java b/Mage.Sets/src/mage/sets/magicorigins/ThopterSpyNetwork.java index d5df94f6bc4..b56f9b7c0d9 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/ThopterSpyNetwork.java +++ b/Mage.Sets/src/mage/sets/magicorigins/ThopterSpyNetwork.java @@ -56,7 +56,7 @@ public class ThopterSpyNetwork extends CardImpl { // At the beginning of your upkeep, if you control an artifact, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield. this.addAbility(new ThopterSpyNetworkUpkeepTriggeredAbility()); - + // Whenever one or more artifact creatures you control deals combat damage to a player, draw a card. this.addAbility(new ThopterSpyNetworkDamageTriggeredAbility()); } @@ -74,7 +74,7 @@ public class ThopterSpyNetwork extends CardImpl { class ThopterSpyNetworkUpkeepTriggeredAbility extends TriggeredAbilityImpl { public ThopterSpyNetworkUpkeepTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new ThopterColorlessToken("ORI"), 1), false); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new ThopterColorlessToken(), 1), false); } public ThopterSpyNetworkUpkeepTriggeredAbility(final ThopterSpyNetworkUpkeepTriggeredAbility ability) { @@ -98,7 +98,7 @@ class ThopterSpyNetworkUpkeepTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkInterveningIfClause(Game game) { - return game.getBattlefield().countAll(new FilterArtifactPermanent(), this.controllerId, game) >= 1; + return game.getBattlefield().countAll(new FilterArtifactPermanent(), this.controllerId, game) >= 1; } @Override @@ -108,7 +108,7 @@ class ThopterSpyNetworkUpkeepTriggeredAbility extends TriggeredAbilityImpl { } class ThopterSpyNetworkDamageTriggeredAbility extends TriggeredAbilityImpl { - + List damagedPlayerIds = new ArrayList<>(); public ThopterSpyNetworkDamageTriggeredAbility() { @@ -127,7 +127,7 @@ class ThopterSpyNetworkDamageTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.DAMAGED_PLAYER - || event.getType() == GameEvent.EventType.END_COMBAT_STEP_POST; + || event.getType() == GameEvent.EventType.END_COMBAT_STEP_POST; } @Override @@ -135,14 +135,14 @@ class ThopterSpyNetworkDamageTriggeredAbility extends TriggeredAbilityImpl { if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { if (((DamagedPlayerEvent) event).isCombatDamage()) { Permanent creature = game.getPermanent(event.getSourceId()); - if (creature != null && creature.getControllerId().equals(controllerId) - && creature.getCardType().contains(CardType.ARTIFACT) && !damagedPlayerIds.contains(event.getTargetId())) { - damagedPlayerIds.add(event.getTargetId()); - return true; + if (creature != null && creature.getControllerId().equals(controllerId) + && creature.getCardType().contains(CardType.ARTIFACT) && !damagedPlayerIds.contains(event.getTargetId())) { + damagedPlayerIds.add(event.getTargetId()); + return true; } } } - if (event.getType().equals(GameEvent.EventType.END_COMBAT_STEP_POST)){ + if (event.getType().equals(GameEvent.EventType.END_COMBAT_STEP_POST)) { damagedPlayerIds.clear(); } return false; @@ -152,4 +152,4 @@ class ThopterSpyNetworkDamageTriggeredAbility extends TriggeredAbilityImpl { public String getRule() { return "Whenever one or more artifact creatures you control deals combat damage to a player, draw a card"; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/UndeadServant.java b/Mage.Sets/src/mage/sets/magicorigins/UndeadServant.java index de8bbce4967..559d0248210 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/UndeadServant.java +++ b/Mage.Sets/src/mage/sets/magicorigins/UndeadServant.java @@ -59,7 +59,7 @@ public class UndeadServant extends CardImpl { this.toughness = new MageInt(2); // When Undead Servant enters the battlefield, put a 2/2 black Zombie creature token onto the battlefield for each card named Undead Servant in your graveyard. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(expansionSetCode), new CardsInControllerGraveyardCount(filter)))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(), new CardsInControllerGraveyardCount(filter)))); } public UndeadServant(final UndeadServant card) { diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/NestedGhoul.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/NestedGhoul.java index 6751f451c29..c28f1a46104 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/NestedGhoul.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/NestedGhoul.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.mirrodinbesieged; import java.util.UUID; @@ -47,7 +46,7 @@ import mage.game.permanent.token.ZombieToken; */ public class NestedGhoul extends CardImpl { - public NestedGhoul (UUID ownerId) { + public NestedGhoul(UUID ownerId) { super(ownerId, 48, "Nested Ghoul", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); this.expansionSetCode = "MBS"; this.subtype.add("Zombie"); @@ -58,7 +57,7 @@ public class NestedGhoul extends CardImpl { this.addAbility(new NestedGhoulTriggeredAbility()); } - public NestedGhoul (final NestedGhoul card) { + public NestedGhoul(final NestedGhoul card) { super(card); } @@ -70,8 +69,9 @@ public class NestedGhoul extends CardImpl { } class NestedGhoulTriggeredAbility extends TriggeredAbilityImpl { + NestedGhoulTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken("MBS"))); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken())); } NestedGhoulTriggeredAbility(final NestedGhoulTriggeredAbility ability) { @@ -97,4 +97,4 @@ class NestedGhoulTriggeredAbility extends TriggeredAbilityImpl { public String getRule() { return "Whenever a source deals damage to {this}, put a 2/2 black Zombie creature token onto the battlefield."; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/planechase2012/BeetlebackChief.java b/Mage.Sets/src/mage/sets/planechase2012/BeetlebackChief.java index f1b2cb90f9d..a4c631a6224 100644 --- a/Mage.Sets/src/mage/sets/planechase2012/BeetlebackChief.java +++ b/Mage.Sets/src/mage/sets/planechase2012/BeetlebackChief.java @@ -28,12 +28,12 @@ package mage.sets.planechase2012; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.permanent.token.GoblinToken; /** @@ -52,7 +52,7 @@ public class BeetlebackChief extends CardImpl { this.toughness = new MageInt(2); // When Beetleback Chief enters the battlefield, put two 1/1 red Goblin creature tokens onto the battlefield. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinToken(expansionSetCode), 2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinToken(), 2))); } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/KuldothaRebirth.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/KuldothaRebirth.java index 0def5d46f32..f5e1c2d7146 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/KuldothaRebirth.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/KuldothaRebirth.java @@ -25,33 +25,32 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.scarsofmirrodin; -import mage.constants.CardType; -import mage.constants.Rarity; +import java.util.UUID; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.permanent.token.GoblinToken; import mage.target.common.TargetControlledPermanent; -import java.util.UUID; - /** * * @author Loki */ public class KuldothaRebirth extends CardImpl { + private static final FilterControlledPermanent filter = new FilterControlledPermanent("an artifact"); static { filter.add(new CardTypePredicate(CardType.ARTIFACT)); } - public KuldothaRebirth (UUID ownerId) { + public KuldothaRebirth(UUID ownerId) { super(ownerId, 96, "Kuldotha Rebirth", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{R}"); this.expansionSetCode = "SOM"; @@ -59,7 +58,7 @@ public class KuldothaRebirth extends CardImpl { this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); } - public KuldothaRebirth (final KuldothaRebirth card) { + public KuldothaRebirth(final KuldothaRebirth card) { super(card); } @@ -68,4 +67,4 @@ public class KuldothaRebirth extends CardImpl { return new KuldothaRebirth(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/shardsofalara/ArchdemonOfUnx.java b/Mage.Sets/src/mage/sets/shardsofalara/ArchdemonOfUnx.java index 9d490cb6f31..4ab86cd5878 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/ArchdemonOfUnx.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/ArchdemonOfUnx.java @@ -51,10 +51,11 @@ import mage.game.permanent.token.ZombieToken; public class ArchdemonOfUnx extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Zombie creature"); + static { filter.add(Predicates.not(new SubtypePredicate("Zombie"))); } - + public ArchdemonOfUnx(UUID ownerId) { super(ownerId, 64, "Archdemon of Unx", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}"); this.expansionSetCode = "ALA"; @@ -69,7 +70,7 @@ public class ArchdemonOfUnx extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // At the beginning of your upkeep, sacrifice a non-Zombie creature, then put a 2/2 black Zombie creature token onto the battlefield. Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(filter, 1, ""), TargetController.YOU, false); - ability.addEffect(new CreateTokenEffect(new ZombieToken("ALA"))); + ability.addEffect(new CreateTokenEffect(new ZombieToken())); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/shardsofalara/DragonFodder.java b/Mage.Sets/src/mage/sets/shardsofalara/DragonFodder.java index c1b33de6731..3e6a4f5989e 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/DragonFodder.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/DragonFodder.java @@ -28,10 +28,10 @@ package mage.sets.shardsofalara; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.permanent.token.GoblinToken; /** diff --git a/Mage.Sets/src/mage/sets/stronghold/MoggInfestation.java b/Mage.Sets/src/mage/sets/stronghold/MoggInfestation.java index b408d3a3d5a..3082cf32101 100644 --- a/Mage.Sets/src/mage/sets/stronghold/MoggInfestation.java +++ b/Mage.Sets/src/mage/sets/stronghold/MoggInfestation.java @@ -31,7 +31,6 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -83,14 +82,14 @@ class MoggInfestationEffect extends OneShotEffect { @Override public MoggInfestationEffect copy() { - return new MoggInfestationEffect(this); + return new MoggInfestationEffect(this); } @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null && getTargetPointer().getFirst(game, source) != null) { - for (Permanent permanent: game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), getTargetPointer().getFirst(game, source), game)) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), getTargetPointer().getFirst(game, source), game)) { if (permanent.destroy(source.getSourceId(), game, false)) { Effect effect = new CreateTokenTargetEffect(new GoblinToken(), 2); effect.setTargetPointer(getTargetPointer()); diff --git a/Mage.Sets/src/mage/sets/timespiral/EmptyTheWarrens.java b/Mage.Sets/src/mage/sets/timespiral/EmptyTheWarrens.java index 5397da90d23..54433fa9763 100644 --- a/Mage.Sets/src/mage/sets/timespiral/EmptyTheWarrens.java +++ b/Mage.Sets/src/mage/sets/timespiral/EmptyTheWarrens.java @@ -28,11 +28,11 @@ package mage.sets.timespiral; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.StormAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.permanent.token.GoblinToken; /** @@ -45,7 +45,6 @@ public class EmptyTheWarrens extends CardImpl { super(ownerId, 152, "Empty the Warrens", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{3}{R}"); this.expansionSetCode = "TSP"; - // Put two 1/1 red Goblin creature tokens onto the battlefield. this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(), 2)); // Storm diff --git a/Mage/src/mage/abilities/effects/common/CreateTokenEffect.java b/Mage/src/mage/abilities/effects/common/CreateTokenEffect.java index ee32ab0e86e..00c9dbd3a35 100644 --- a/Mage/src/mage/abilities/effects/common/CreateTokenEffect.java +++ b/Mage/src/mage/abilities/effects/common/CreateTokenEffect.java @@ -1,39 +1,40 @@ /* -* 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. -*/ - + * 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.abilities.effects.common; import java.util.ArrayList; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.Token; @@ -51,6 +52,7 @@ public class CreateTokenEffect extends OneShotEffect { private boolean attacking; private UUID lastAddedTokenId; private ArrayList lastAddedTokenIds = new ArrayList<>(); + private boolean expansionSetCodeChecked; public CreateTokenEffect(Token token) { this(token, new StaticValue(1)); @@ -63,7 +65,7 @@ public class CreateTokenEffect extends OneShotEffect { public CreateTokenEffect(Token token, DynamicValue amount) { this(token, amount, false, false); } - + public CreateTokenEffect(Token token, int amount, boolean tapped, boolean attacking) { this(token, new StaticValue(amount), tapped, attacking); } @@ -74,6 +76,7 @@ public class CreateTokenEffect extends OneShotEffect { this.amount = amount.copy(); this.tapped = tapped; this.attacking = attacking; + this.expansionSetCodeChecked = false; setText(); } @@ -85,6 +88,7 @@ public class CreateTokenEffect extends OneShotEffect { this.attacking = effect.attacking; this.lastAddedTokenId = effect.lastAddedTokenId; this.lastAddedTokenIds.addAll(effect.lastAddedTokenIds); + this.expansionSetCodeChecked = effect.expansionSetCodeChecked; } @Override @@ -94,6 +98,9 @@ public class CreateTokenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + if (!expansionSetCodeChecked) { + updateExpansionSetCode(game, source); + } int value = amount.calculate(game, source, this); token.putOntoBattlefield(value, game, source.getSourceId(), source.getControllerId(), tapped, attacking); this.lastAddedTokenId = token.getLastAddedToken(); @@ -101,10 +108,18 @@ public class CreateTokenEffect extends OneShotEffect { return true; } + private void updateExpansionSetCode(Game game, Ability source) { + MageObject sourceObject = source.getSourceObject(game); + if (sourceObject instanceof Card) { + token.setExpansionSetCodeForImage(((Card) sourceObject).getExpansionSetCode()); + } + expansionSetCodeChecked = true; + } + public UUID getLastAddedTokenId() { return lastAddedTokenId; } - + public ArrayList getLastAddedTokenIds() { return lastAddedTokenIds; } diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index 1706ac1fead..db25e8f955b 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.cards; import java.lang.reflect.Constructor; @@ -74,13 +73,14 @@ import mage.watchers.Watcher; import org.apache.log4j.Logger; public abstract class CardImpl extends MageObjectImpl implements Card { + private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(CardImpl.class); protected UUID ownerId; protected int cardNumber; - protected String expansionSetCode; + public String expansionSetCode; protected String tokenSetCode; protected Rarity rarity; protected boolean canTransform; @@ -108,16 +108,15 @@ public abstract class CardImpl extends MageObjectImpl implements Card { Ability ability = new PlayLandAbility(name); ability.setSourceId(this.getId()); abilities.add(ability); - } - else { + } else { SpellAbility ability = new SpellAbility(manaCost, name, Zone.HAND, spellAbilityType); if (!cardType.contains(CardType.INSTANT)) { ability.setTiming(TimingRule.SORCERY); } ability.setSourceId(this.getId()); - abilities.add(ability); + abilities.add(ability); } - this.usesVariousArt = Character.isDigit(this.getClass().getName().charAt(this.getClass().getName().length()-1)); + this.usesVariousArt = Character.isDigit(this.getClass().getName().charAt(this.getClass().getName().length() - 1)); this.morphCard = false; } @@ -206,8 +205,12 @@ public abstract class CardImpl extends MageObjectImpl implements Card { game.getState().getCardState(objectId).addInfo(key, value); } - protected static final ArrayList rulesError = new ArrayList() {{add("Exception occured in rules generation");}}; - + protected static final ArrayList rulesError = new ArrayList() { + { + add("Exception occured in rules generation"); + } + }; + @Override public List getRules() { try { @@ -217,7 +220,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { } return rulesError; } - + @Override public List getRules(Game game) { try { @@ -228,7 +231,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { for (String data : cardState.getInfo().values()) { rules.add(data); } - for (Ability ability: cardState.getAbilities()) { + for (Ability ability : cardState.getAbilities()) { rules.add(ability.getRule()); } } @@ -243,6 +246,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { /** * Gets all base abilities - does not include additional abilities added by * other cards or effects + * * @return A list of {@link Ability} - this collection is modifiable */ @Override @@ -251,9 +255,10 @@ public abstract class CardImpl extends MageObjectImpl implements Card { } /** - * Gets all current abilities - includes additional abilities added by - * other cards or effects - * @param game + * Gets all current abilities - includes additional abilities added by other + * cards or effects + * + * @param game * @return A list of {@link Ability} - this collection is not modifiable */ @Override @@ -265,28 +270,28 @@ public abstract class CardImpl extends MageObjectImpl implements Card { Abilities all = new AbilitiesImpl<>(); all.addAll(abilities); all.addAll(otherAbilities); - return all; + return all; } protected void addAbility(Ability ability) { ability.setSourceId(this.getId()); abilities.add(ability); - for (Ability subAbility: ability.getSubAbilities()) { + for (Ability subAbility : ability.getSubAbilities()) { abilities.add(subAbility); } } protected void addAbilities(List abilities) { - for (Ability ability: abilities) { + for (Ability ability : abilities) { addAbility(ability); } } - + protected void addAbility(Ability ability, Watcher watcher) { addAbility(ability); ability.addWatcher(watcher); } - + @Override public SpellAbility getSpellAbility() { if (spellAbility == null) { @@ -322,9 +327,9 @@ public abstract class CardImpl extends MageObjectImpl implements Card { public List getMana() { List mana = new ArrayList<>(); for (ManaAbility ability : this.abilities.getManaAbilities(Zone.BATTLEFIELD)) { - for (Mana netMana: ability.getNetMana(null)) { + for (Mana netMana : ability.getNetMana(null)) { mana.add(netMana); - } + } } return mana; } @@ -357,14 +362,14 @@ public abstract class CardImpl extends MageObjectImpl implements Card { game.getPlayer(ownerId).getSideboard().remove(this); break; case COMMAND: - game.getState().getCommand().remove((Commander)game.getObject(objectId)); + game.getState().getCommand().remove((Commander) game.getObject(objectId)); break; case STACK: StackObject stackObject = game.getStack().getSpell(getId()); if (stackObject == null && (this instanceof SplitCard)) { // handle if half od Split cast is on the stack - stackObject = game.getStack().getSpell(((SplitCard)this).getLeftHalfCard().getId()); + stackObject = game.getStack().getSpell(((SplitCard) this).getLeftHalfCard().getId()); if (stackObject == null) { - stackObject = game.getStack().getSpell(((SplitCard)this).getRightHalfCard().getId()); + stackObject = game.getStack().getSpell(((SplitCard) this).getRightHalfCard().getId()); } } if (stackObject != null) { @@ -379,12 +384,12 @@ public abstract class CardImpl extends MageObjectImpl implements Card { logger.fatal(new StringBuilder("Invalid from zone [").append(fromZone) .append("] for card [").append(this.getName()) .append("] to zone [").append(toZone) - .append("] source [").append(sourceCard != null ? sourceCard.getName():"null").append("]").toString()); + .append("] source [").append(sourceCard != null ? sourceCard.getName() : "null").append("]").toString()); break; } game.rememberLKI(objectId, event.getFromZone(), this); } - + setFaceDown(false, game); updateZoneChangeCounter(game); switch (event.getToZone()) { @@ -406,8 +411,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { case LIBRARY: if (flag) { game.getPlayer(ownerId).getLibrary().putOnTop(this, game); - } - else { + } else { game.getPlayer(ownerId).getLibrary().putOnBottom(this, game); } break; @@ -428,9 +432,9 @@ public abstract class CardImpl extends MageObjectImpl implements Card { default: Card sourceCard = game.getCard(sourceId); logger.fatal(new StringBuilder("Invalid to zone [").append(toZone) - .append("] for card [").append(this.getName()) - .append("] to zone [").append(toZone) - .append("] source [").append(sourceCard != null ? sourceCard.getName():"null").append("]").toString()); + .append("] for card [").append(this.getName()) + .append("] to zone [").append(toZone) + .append("] source [").append(sourceCard != null ? sourceCard.getName() : "null").append("]").toString()); return false; } game.setZone(objectId, event.getToZone()); @@ -462,12 +466,12 @@ public abstract class CardImpl extends MageObjectImpl implements Card { case OUTSIDE: game.getPlayer(ownerId).getSideboard().remove(mainCard); break; - + case COMMAND: - game.getState().getCommand().remove((Commander)game.getObject(mainCard.getId())); + game.getState().getCommand().remove((Commander) game.getObject(mainCard.getId())); break; default: - //logger.warning("moveToZone, not fully implemented: from="+event.getFromZone() + ", to="+event.getToZone()); + //logger.warning("moveToZone, not fully implemented: from="+event.getFromZone() + ", to="+event.getToZone()); } game.rememberLKI(mainCard.getId(), event.getFromZone(), this); } @@ -479,6 +483,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { } return false; } + @Override public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game) { return moveToExile(exileId, name, sourceId, game, null); @@ -514,7 +519,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { break; default: MageObject object = game.getObject(sourceId); - logger.warn(new StringBuilder("moveToExile, not fully implemented: from = ").append(fromZone).append(" - ").append(object != null ? object.getName():"null")); + logger.warn(new StringBuilder("moveToExile, not fully implemented: from = ").append(fromZone).append(" - ").append(object != null ? object.getName() : "null")); } game.rememberLKI(objectId, event.getFromZone(), this); } @@ -537,19 +542,19 @@ public abstract class CardImpl extends MageObjectImpl implements Card { public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId) { return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, false, false, null); } - + @Override - public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped){ + public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped) { return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, tapped, false, null); } @Override - public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown){ + public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown) { return this.putOntoBattlefield(game, fromZone, sourceId, controllerId, tapped, facedown, null); } - - @Override - public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown, ArrayList appliedEffects){ + + @Override + public boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown, ArrayList appliedEffects) { ZoneChangeEvent event = new ZoneChangeEvent(this.objectId, sourceId, controllerId, fromZone, Zone.BATTLEFIELD, appliedEffects, tapped); if (facedown) { this.setFaceDown(true, game); @@ -582,7 +587,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { removed = true; break; default: - logger.warn("putOntoBattlefield, not fully implemented: fromZone="+fromZone); + logger.warn("putOntoBattlefield, not fully implemented: fromZone=" + fromZone); } game.rememberLKI(objectId, event.getFromZone(), this); if (!removed) { @@ -601,7 +606,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { permanent.entersBattlefield(sourceId, game, event.getFromZone(), true); game.setScopeRelevant(false); game.applyEffects(); - game.addSimultaneousEvent(new ZoneChangeEvent(permanent, event.getPlayerId(), fromZone, Zone.BATTLEFIELD)); + game.addSimultaneousEvent(new ZoneChangeEvent(permanent, event.getPlayerId(), fromZone, Zone.BATTLEFIELD)); return true; } if (facedown) { @@ -625,7 +630,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { GameEvent event = GameEvent.getEvent(GameEvent.EventType.TURNFACEUP, getId(), playerId); if (!game.replaceEvent(event)) { setFaceDown(false, game); - for (Ability ability :abilities) { // abilities that were set to not visible face down must be set to visible again + for (Ability ability : abilities) { // abilities that were set to not visible face down must be set to visible again if (ability.getWorksFaceDown() && !ability.getRuleVisible()) { ability.setRuleVisible(true); } @@ -678,7 +683,8 @@ public abstract class CardImpl extends MageObjectImpl implements Card { } @Override - public void build() {} + public void build() { + } @Override public boolean getUsesVariousArt() { diff --git a/Mage/src/mage/game/permanent/token/GoblinToken.java b/Mage/src/mage/game/permanent/token/GoblinToken.java index 6b37933e5d2..ffbbac6b0a1 100644 --- a/Mage/src/mage/game/permanent/token/GoblinToken.java +++ b/Mage/src/mage/game/permanent/token/GoblinToken.java @@ -28,8 +28,6 @@ package mage.game.permanent.token; import java.util.Arrays; -import java.util.List; -import java.util.Random; import mage.MageInt; import mage.constants.CardType; @@ -39,22 +37,10 @@ import mage.constants.CardType; */ public class GoblinToken extends Token { - static List imageSetCodes = Arrays.asList( - "M10", "C14", "KTK", "EVG", "DTK" - ); - public GoblinToken() { - this(imageSetCodes.get(new Random().nextInt(imageSetCodes.size()))); - } - - public GoblinToken(String originalExpansionSetCode) { super("Goblin", "1/1 red Goblin creature token"); - if (!imageSetCodes.contains(originalExpansionSetCode)) { - this.setOriginalExpansionSetCode(imageSetCodes.get(new Random().nextInt(imageSetCodes.size()))); - } else { - this.setOriginalExpansionSetCode(originalExpansionSetCode); - } - + availableImageSetCodes.addAll(Arrays.asList("SOM", "M10", "C14", "KTK", "EVG", "DTK", "ORI")); + cardType.add(CardType.CREATURE); subtype.add("Goblin"); diff --git a/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java b/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java index a75c83ff0ce..81135864b56 100644 --- a/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java +++ b/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java @@ -27,6 +27,8 @@ */ package mage.game.permanent.token; +import java.util.Arrays; +import java.util.Random; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; @@ -38,12 +40,8 @@ import mage.constants.CardType; public class ThopterColorlessToken extends Token { public ThopterColorlessToken() { - this("EXO"); - } - - public ThopterColorlessToken(String expansionSetCode) { super("Thopter", "1/1 colorless Thopter artifact creature token with flying"); - this.setOriginalExpansionSetCode(expansionSetCode); + availableImageSetCodes.addAll(Arrays.asList("EXO", "ORI")); cardType.add(CardType.ARTIFACT); cardType.add(CardType.CREATURE); subtype.add("Thopter"); @@ -53,4 +51,11 @@ public class ThopterColorlessToken extends Token { addAbility(FlyingAbility.getInstance()); } + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("ORI")) { + this.setTokenType(new Random().nextInt(2) + 1); + } + } } diff --git a/Mage/src/mage/game/permanent/token/Token.java b/Mage/src/mage/game/permanent/token/Token.java index 48d99e43dff..9e4906947ac 100644 --- a/Mage/src/mage/game/permanent/token/Token.java +++ b/Mage/src/mage/game/permanent/token/Token.java @@ -1,35 +1,35 @@ /* -* 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. -*/ - + * 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.game.permanent.token; import java.util.ArrayList; import java.util.List; +import java.util.Random; import java.util.UUID; import mage.MageObjectImpl; import mage.ObjectColor; @@ -44,8 +44,6 @@ import mage.game.events.GameEvent.EventType; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.PermanentToken; import mage.players.Player; -import mage.util.CardUtil; - public class Token extends MageObjectImpl { @@ -56,22 +54,26 @@ public class Token extends MageObjectImpl { private int originalCardNumber; private String originalExpansionSetCode; private Card copySourceCard; // the card the Token is a copy from - + + // list of set codes tokene images are available for + protected List availableImageSetCodes = new ArrayList<>(); + public enum Type { + FIRST(1), SECOND(2); - + int code; - + Type(int code) { - this.code = code; + this.code = code; } - + int getCode() { return this.code; } } - + public Token(String name, String description) { this.name = name; this.description = description; @@ -95,7 +97,7 @@ public class Token extends MageObjectImpl { this.tokenType = token.tokenType; this.lastAddedTokenId = token.lastAddedTokenId; this.lastAddedTokenIds.addAll(token.lastAddedTokenIds); - this.originalCardNumber = token.originalCardNumber; + this.originalCardNumber = token.originalCardNumber; this.originalExpansionSetCode = token.originalExpansionSetCode; this.copySourceCard = token.copySourceCard; // will never be changed } @@ -165,7 +167,7 @@ public class Token extends MageObjectImpl { } if (!game.isSimulation()) { game.informPlayers(controller.getLogName() + " puts a " + newToken.getLogName() + " token onto the battlefield"); - } + } } return true; @@ -207,5 +209,13 @@ public class Token extends MageObjectImpl { } } - + public void setExpansionSetCodeForImage(String code) { + if (availableImageSetCodes.size() > 0) { + if (availableImageSetCodes.contains(code)) { + setOriginalExpansionSetCode(code); + } else { + setOriginalExpansionSetCode(availableImageSetCodes.get(new Random().nextInt(availableImageSetCodes.size()))); + } + } + } } diff --git a/Mage/src/mage/game/permanent/token/ZombieToken.java b/Mage/src/mage/game/permanent/token/ZombieToken.java index e64c978b46e..5e716ade6aa 100644 --- a/Mage/src/mage/game/permanent/token/ZombieToken.java +++ b/Mage/src/mage/game/permanent/token/ZombieToken.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,14 +20,14 @@ * 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.game.permanent.token; +import java.util.Arrays; import java.util.Random; import mage.MageInt; import mage.constants.CardType; @@ -39,15 +39,8 @@ import mage.constants.CardType; public class ZombieToken extends Token { public ZombieToken() { - this("10E"); - } - - public ZombieToken(String expansionSetCode) { super("Zombie", "2/2 black Zombie creature token"); - this.setOriginalExpansionSetCode(expansionSetCode); - if (expansionSetCode.equals("ISD")) { - this.setTokenType(new Random().nextInt(3) + 1); - } + availableImageSetCodes.addAll(Arrays.asList("10E", "M10", "M11", "M12", "M13", "M14", "M15", "MBS", "ALA", "ISD", "C14", "CNS", "MMA", "BNG", "KTK", "DTK", "ORI")); cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add("Zombie"); @@ -55,4 +48,12 @@ public class ZombieToken extends Token { toughness = new MageInt(2); } -} \ No newline at end of file + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("ISD")) { + this.setTokenType(new Random().nextInt(3) + 1); + } + } + +} From 05b14dad668f9c51a12b38391e33bf954432dab7 Mon Sep 17 00:00:00 2001 From: Simown Date: Mon, 29 Jun 2015 21:23:36 +0100 Subject: [PATCH 090/375] Fixed Strive aditional costs, added Battlefield Thaumaturge tests to verify. --- .../BattlefieldThaumaturgeTest.java | 300 ++++++++++++++++++ .../base/impl/CardTestPlayerAPIImpl.java | 22 ++ .../org/mage/test/utils/ManaUtilTest.java | 17 + .../abilities/abilityword/StriveAbility.java | 20 +- Mage/src/mage/util/ManaUtil.java | 48 ++- 5 files changed, 395 insertions(+), 12 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java new file mode 100644 index 00000000000..01b3c69440e --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java @@ -0,0 +1,300 @@ +package org.mage.test.cards.cost.modification; + +import mage.abilities.keyword.HexproofAbility; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * Battlefield Thaumaturge: + * Creature - Human Wizard + * Each instant and sorcery spell you cast costs {1} less to cast for each creature it targets. + * Heroic - Whenever you cast a spell that targets Battlefield Thaumaturge, Battlefield Thaumaturge gains hexproof until end of turn. + * + * @author Simown + */ +public class BattlefieldThaumaturgeTest extends CardTestPlayerBase { + + @Test + public void testSingleTargetReduction() { + + addCard(Zone.BATTLEFIELD, playerA, "Battlefield Thaumaturge"); + addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + addCard(Zone.BATTLEFIELD, playerA, "Island"); + addCard(Zone.HAND, playerA, "Lightning Strike"); + + addCard(Zone.BATTLEFIELD, playerB, "Akroan Skyguard"); + + // Lightning Strike - {1}{R} - Lightning Strike deals 3 damage to target creature or player. + // Because Battlefield Thaumaturge is on the battlefield, and the creature is targeted by the + // Lightning Strike it will be payable with {R}. + castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Strike", "Akroan Skyguard"); + setStopAt(2, PhaseStep.END_TURN); + execute(); + + // PlayerA still has the Battlefield Thaumaturge + assertPermanentCount(playerA, "Battlefield Thaumaturge", 1); + // The Akroan Skyguard has been killed by the Lightning Strike + assertPermanentCount(playerB, "Akroan Skyguard", 0); + assertGraveyardCount(playerB, "Akroan Skyguard", 1); + + // Check {R} has been used to pay, and the other land remains untapped + assertTappedCount("Mountain", true, 1); + assertTappedCount("Island", false, 1); + } + + @Test + public void testStriveTargetingReduction1() { + + addCard(Zone.BATTLEFIELD, playerA, "Battlefield Thaumaturge"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 4); + addCard(Zone.BATTLEFIELD, playerA, "Pharika's Chosen"); + addCard(Zone.HAND, playerA, "Silence the Believers"); + + addCard(Zone.BATTLEFIELD, playerB, "Battlewise Hoplite"); + /** + * Silence the Believers - {2}{B}{B} + * Exile any number of target creatures and all Auras attached to them + * Strive - Silence the Believers costs {2}{B} more to cast for each target beyond the first. + * Targetting a creature on both sides of the battlefield. + */ + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Silence the Believers", "Pharika's Chosen^Battlewise Hoplite"); + setStopAt(2, PhaseStep.END_TURN); + execute(); + + // Both creatures were exiled + assertExileCount("Pharika's Chosen", 1); + assertExileCount("Battlewise Hoplite", 1); + // Not still on the battlefield or in the graveyard + assertPermanentCount(playerA, "Pharika's Chosen", 0); + assertPermanentCount(playerB, "Battlewise Hoplite", 0); + assertGraveyardCount(playerA, "Pharika's Chosen", 0); + assertGraveyardCount(playerB, "Battlewise Hoplite", 0); + + /* Cost to exile 2 permanents will be: + * + {2}{B}{B} for the base spell + * + {2}{B} for an additional target + * - {2} for Battlefield Thaumaturge cost reducing effect + * = {2}{B}{B}{B} to pay. + */ + // Check 3 Swamps have been tapped to pay the reduced cost + assertTappedCount("Swamp", true, 3); + // And 2 Forests for the colorless mana + assertTappedCount("Forest", true, 2); + // And the rest of the Forests remain untapped + assertTappedCount("Forest", false, 2); + } + + @Test + public void testStriveTargetingReduction2() { + + String [] creatures = {"Battlefield Thaumaturge", "Agent of Horizons", "Blood-Toll Harpy", "Anvilwrought Raptor", "Fleshmad Steed" }; + for(String creature : creatures) { + addCard(Zone.BATTLEFIELD, playerA, creature); + } + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 5); + addCard(Zone.HAND, playerA, "Launch the Fleet"); + + // Launch the Fleet - {W} + // Strive - Launch the Fleet costs {1} more to cast for each target beyond the first. + // Until end of turn, any number of target creatures each gain "Whenever this creature attacks, put a 1/1 white Soldier token onto the battlefield tapped and attacking." + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Launch the Fleet", createTargetingString(creatures)); + for(String creature : creatures) { + attack(3, playerA, creature); + } + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + // 5 initial creatures + 5 soldier tokens + 6 lands + assertPermanentCount(playerA, 16); + // The initial creatures exist + for(String creature : creatures) { + assertPermanentCount(playerA, creature, 1); + } + // Each has a solider token generated while attacking + assertPermanentCount(playerA, "Soldier", 5); + // Battlefield Thaumaturge will have hexproof from heroic trigger + Permanent battlefieldThaumaturge = getPermanent("Battlefield Thaumaturge", playerA.getId()); + Assert.assertTrue("Battlefield Thaumaturge must have hexproof", battlefieldThaumaturge.getAbilities().contains(HexproofAbility.getInstance())); + + assertLife(playerA, 20); + // 5 initial creatures + 5 soldier tokens => 16 damage + assertLife(playerB, 4); + /* Cost to have 5 attackers generate soldier tokens + * + {W} for the base spell + * + {4} for an additional targets + * - {4} for Battlefield Thaumaturge cost reducing effect (reduce {1} per target) + * = {W} to pay. + */ + assertTappedCount("Plains", true, 1); + // No other mana has been tapped to pay costs + assertTappedCount("Island", false, 5); + } + + @Test + public void testVariableCostReduction() { + addCard(Zone.BATTLEFIELD, playerA, "Battlefield Thaumaturge"); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); + addCard(Zone.HAND, playerA, "Curse of the Swine"); + + String [] opponentsCreatures = {"Fleecemane Lion", "Sedge Scorpion", "Boon Satyr", "Bronze Sable"}; + for(String creature: opponentsCreatures) { + addCard(Zone.BATTLEFIELD, playerB, creature); + } + + /* Curse of the Swine - {X}{U}{U} + * Exile X target creatures. For each creature exiled this way, + * its controller puts a 2/2 green Boar creature token onto the battlefield + */ + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of the Swine"); + setChoice(playerA, "X=4"); + addTarget(playerA, createTargetingString(opponentsCreatures)); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + // All the opponents creatures have been exiled from the battlefield + for(String creature: opponentsCreatures) { + assertPermanentCount(playerB, creature, 0); + assertGraveyardCount(playerB, creature, 0); + assertExileCount(creature, 1); + } + + // All 4 creatures have been replaced by boars + assertPermanentCount(playerB, "Boar", 4); + + /* Cost to target 4 permanents will be: + * + {4}{U}{U} for the base spell with X = 4 + * - {4} for Battlefield Thaumaturge cost reducing effect as 4 creatures are targetted + * = {U}{U} to pay. + */ + // Check 2 islands have been tapped to pay the reduced cost + assertTappedCount("Island", true, 2); + // And the rest of the lands remain untapped + assertTappedCount("Plains", false, 4); + } + + @Test + public void testMutipleTargetReduction() { + + String [] playerACreatures = {"Battlefield Thaumaturge", "Sedge Scorpion", "Boon Satyr"}; + String [] playerBCreatures = {"Agent of Horizons", "Blood-Toll Harpy", "Anvilwrought Raptor"}; + + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + // Creatures for player A + for(String creature: playerACreatures) { + addCard(Zone.BATTLEFIELD, playerA, creature); + } + addCard(Zone.HAND, playerA, "Descent of the Dragons"); + // Creatures for player B + for(String creature: playerBCreatures) { + addCard(Zone.BATTLEFIELD, playerB, creature); + } + /* Descent of the Dragons - {4}{R}{R} + * Destroy any number of target creatures. + * For each creature destroyed this way, its controller puts a 4/4 red Dragon creature token with flying onto the battlefield. + * Battlefield Thaumaturge should reduce the cost of the spell when cast, before he is destroyed and replaced with a dragon. + */ + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Descent of the Dragons", createTargetingString(playerACreatures) + "^" + createTargetingString(playerBCreatures)); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + // All creatures have been put in the graveyard + for(String creature: playerACreatures) { + assertPermanentCount(playerA, creature, 0); + assertGraveyardCount(playerA, creature, 1); + } + for(String creature: playerBCreatures) { + assertPermanentCount(playerB, creature, 0); + assertGraveyardCount(playerB, creature, 1); + } + + // And each player has 3 dragons + assertPermanentCount(playerA, "Dragon", 3); + assertPermanentCount(playerB, "Dragon", 3); + + /* Cost to target 6 creatures will be + * + {4}{R}{R} for the fixed cost base spell + * - {4} for Battlefield Thaumaturge cost reducing effect + * each creature targeted will reduce the cost by {1} so the cost + * can only be reduced by {4} maximum using Battlefield Thaumaturge + * even though 6 creatures are targeted. + * = {R}{R} to pay. + */ + // Check 2 mountains have been tapped to pay the reduced cost + assertTappedCount("Mountain", true, 2); + // And the rest of the lands remain untapped + assertTappedCount("Swamp", false, 4); + } + + @Test + public void testTargetNonCreature() { + + addCard(Zone.BATTLEFIELD, playerA, "Battlefield Thaumaturge"); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + addCard(Zone.HAND, playerA, "Fade into Antiquity"); + + addCard(Zone.BATTLEFIELD, playerB, "Heliod, God of the Sun"); + + // Fade into Antiquity - Sorcery - {2}{G} - Exile target artifact or enchantment. + // Battlefield Thaumaturge only reduces the cost instants and sorceries where the target is a creature + // No cost reduction for targeting an enchantment (devotion is too low for Heliod to be a creature) + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Fade into Antiquity", "Heliod, God of the Sun"); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + // PlayerA still has the Battlefield Thaumaturge + assertPermanentCount(playerA, "Battlefield Thaumaturge", 1); + // Heliod has been exiled + assertPermanentCount(playerB, "Heliod, God of the Sun", 0); + assertGraveyardCount(playerB, "Heliod, God of the Sun", 0); + assertExileCount("Heliod, God of the Sun", 1); + + // Expect full amount paid, i.e. all lands are tapped. Cost was not reduced by Battlefield Thaumaturge, no creature was targeted. + assertTappedCount("Forest", true, 3); + } + + @Test + public void testTargetWithAura() { + + addCard(Zone.BATTLEFIELD, playerA, "Battlefield Thaumaturge"); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 5); + addCard(Zone.HAND, playerA, "Spectra Ward"); + + // Spectra Ward - {3}{W}{W} - Aura + // Enchanted creature gets +2/+2 and has protection from all colors. This effect doesn't remove auras. + // Battlefield Thaumaturge only reduces the cost instants and sorceries targeting creatures. + // No cost reduction for targeting a creature with an Aura. + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Spectra Ward", "Battlefield Thaumaturge"); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Battlefield Thaumaturge", 1); + assertPermanentCount(playerA, "Spectra Ward", 1); + // Battlefield Thaumaturge will have hexproof from heroic trigger + Permanent battlefieldThaumaturge = getPermanent("Battlefield Thaumaturge", playerA.getId()); + Assert.assertTrue("Battlefield Thaumaturge must have hexproof", battlefieldThaumaturge.getAbilities().contains(HexproofAbility.getInstance())); + + // No cost reduction from Battlefield Thaumaturge, full amount paid + assertTappedCount("Plains", true, 5); + } + + private String createTargetingString(String [] targets) { + StringBuilder targetBuilder = new StringBuilder(); + for (String target : targets) { + if (targetBuilder.length() > 0) { + targetBuilder.append('^'); + } + targetBuilder.append(target); + } + System.out.println(targetBuilder.toString()); + return targetBuilder.toString(); + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 331f42e4fea..25b40da1869 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -711,6 +711,28 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement Assert.assertEquals("(Battlefield) Tapped state is not equal (" + cardName + ")", tapped, found.isTapped()); } + /** + * Assert whether X permanents of the same name are tapped or not. + * + * @param cardName Name of the permanent that should be checked. + * @param tapped Whether the permanent is tapped or not + * @param count The amount of this permanents that should be tapped + */ + public void assertTappedCount(String cardName, boolean tapped, int count) throws AssertionError { + int tappedAmount = 0; + Permanent found = null; + for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) { + if (permanent.getName().equals(cardName)) { + if(permanent.isTapped() == tapped) { + tappedAmount++; + } + found = permanent; + } + } + Assert.assertNotNull("There is no such permanent on the battlefield, cardName=" + cardName, found); + Assert.assertEquals("(Battlefield) " + count + " permanents (" + cardName + ") are not " + ((tapped) ? "" : "un") + "tapped.", count, tappedAmount); + } + /** * Assert whether a permanent is attacking or not * diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java index 07bc006edf3..49ee45f089f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java @@ -66,6 +66,22 @@ public class ManaUtilTest extends CardTestPlayerBase { testManaToPayVsLand("{W/R}{R/G}", "Sacred Foundry", 2, 2); // can't auto choose to pay } + @Test + public void testManaCondensing() { + Assert.assertEquals("{5}{W}", ManaUtil.condenseManaCostString(("{1}{1}{1}{2}{W}"))); + Assert.assertEquals("{4}{B}{B}", ManaUtil.condenseManaCostString("{2}{B}{2}{B}")); + Assert.assertEquals("{6}{R}{R}{R}{U}", ManaUtil.condenseManaCostString("{R}{1}{R}{2}{R}{3}{U}")); + Assert.assertEquals("{5}{B}{U}{W}", ManaUtil.condenseManaCostString("{1}{B}{W}{4}{U}")); + Assert.assertEquals("{8}{B}{G}{G}{U}", ManaUtil.condenseManaCostString("{1}{G}{1}{2}{3}{G}{B}{U}{1}")); + Assert.assertEquals("{3}{R}{U}", ManaUtil.condenseManaCostString("{3}{R}{U}")); + Assert.assertEquals("{10}", ManaUtil.condenseManaCostString("{1}{2}{3}{4}")); + Assert.assertEquals("{B}{G}{R}{U}{W}", ManaUtil.condenseManaCostString("{B}{G}{R}{U}{W}")); + Assert.assertEquals("{R}{R}", ManaUtil.condenseManaCostString("{R}{R}")); + Assert.assertEquals("{U}", ManaUtil.condenseManaCostString("{U}")); + Assert.assertEquals("{2}", ManaUtil.condenseManaCostString("{2}")); + Assert.assertEquals("", ManaUtil.condenseManaCostString("")); + } + /** * Common way to test ManaUtil.tryToAutoPay * @@ -133,4 +149,5 @@ public class ManaUtilTest extends CardTestPlayerBase { } return useableAbilities; } + } diff --git a/Mage/src/mage/abilities/abilityword/StriveAbility.java b/Mage/src/mage/abilities/abilityword/StriveAbility.java index 404933fde23..cc7c57bd046 100644 --- a/Mage/src/mage/abilities/abilityword/StriveAbility.java +++ b/Mage/src/mage/abilities/abilityword/StriveAbility.java @@ -39,6 +39,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.target.Target; +import mage.util.ManaUtil; /** * @@ -50,7 +51,7 @@ public class StriveAbility extends SimpleStaticAbility { private final String striveCost; public StriveAbility(String manaString) { - super(Zone.STACK, new StriveCostIncreasementEffect(new ManaCostsImpl(manaString))); + super(Zone.STACK, new StriveCostIncreasingEffect(new ManaCostsImpl(manaString))); setRuleAtTheTop(true); this.striveCost = manaString; } @@ -71,29 +72,32 @@ public class StriveAbility extends SimpleStaticAbility { } } -class StriveCostIncreasementEffect extends CostModificationEffectImpl { +class StriveCostIncreasingEffect extends CostModificationEffectImpl { private ManaCostsImpl striveCosts = null; - public StriveCostIncreasementEffect(ManaCostsImpl striveCosts) { + public StriveCostIncreasingEffect(ManaCostsImpl striveCosts) { super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.INCREASE_COST); this.striveCosts = striveCosts; } - protected StriveCostIncreasementEffect(StriveCostIncreasementEffect effect) { + protected StriveCostIncreasingEffect(StriveCostIncreasingEffect effect) { super(effect); this.striveCosts = effect.striveCosts; } @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { - // Target target = abilityToModify.getTargets().get(0); for (Target target : abilityToModify.getTargets()) { if (target.getMaxNumberOfTargets() == Integer.MAX_VALUE) { int additionalTargets = target.getTargets().size() - 1; + StringBuilder sb = new StringBuilder(); for (int i = 0; i < additionalTargets; i++) { - abilityToModify.getManaCostsToPay().add(striveCosts.copy()); + // Build up a string of strive costs for each target + sb.append(striveCosts.getText()); } + String finalCost = ManaUtil.condenseManaCostString(sb.toString()); + abilityToModify.getManaCostsToPay().add(new ManaCostsImpl(finalCost)); return true; } } @@ -106,7 +110,7 @@ class StriveCostIncreasementEffect extends CostModificationEffectImpl { } @Override - public StriveCostIncreasementEffect copy() { - return new StriveCostIncreasementEffect(this); + public StriveCostIncreasingEffect copy() { + return new StriveCostIncreasingEffect(this); } } diff --git a/Mage/src/mage/util/ManaUtil.java b/Mage/src/mage/util/ManaUtil.java index 6b8e0062926..d094f807d39 100644 --- a/Mage/src/mage/util/ManaUtil.java +++ b/Mage/src/mage/util/ManaUtil.java @@ -1,9 +1,7 @@ package mage.util; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Set; -import java.util.UUID; +import java.util.*; + import mage.MageObject; import mage.Mana; import mage.ManaSymbol; @@ -379,4 +377,46 @@ public class ManaUtil { return unpaid.getText(); } } + + /** Converts a collection of mana symbols into a single condensed string + * e.g. + * {1}{1}{1}{1}{1}{W} = {5}{W} + * {2}{B}{2}{B}{2}{B} = {6}{B}{B}{B} + * {1}{2}{R}{U}{1}{1} = {5}{R}{U} + * {B}{G}{R} = {B}{G}{R} + * */ + public static String condenseManaCostString(String rawCost) { + int total = 0; + int index = 0; + // Split the string in to an array of numbers and colored mana symbols + String[] splitCost = rawCost.replace("{", "").replace("}", " ").split(" "); + // Sort alphabetically which will push1 the numbers to the front before the colored mana symbols + Arrays.sort(splitCost); + for (String c : splitCost) { + // If the string is a representation of a number + if(c.matches("\\d+")) { + total += Integer.parseInt(c); + } else { + // First non-number we see we can finish as they are sorted + break; + } + index++; + } + int splitCostLength = splitCost.length; + // No need to add {total} to the mana cost if total == 0 + int shift = (total > 0) ? 1 : 0; + String [] finalCost = new String[shift + splitCostLength - index]; + // Account for no colourless mana symbols seen + if(total > 0) { + finalCost[0] = String.valueOf(total); + } + System.arraycopy(splitCost, index, finalCost, shift, splitCostLength - index); + // Combine the cost back as a mana string + StringBuilder sb = new StringBuilder(); + for(String s: finalCost) { + sb.append("{" + s + "}"); + } + // Return the condensed string + return sb.toString(); + } } From c784637766db497ecc764cb90019e397f0e2a6e1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 18 Jul 2015 09:59:42 +0200 Subject: [PATCH 091/375] Set ALLOW_INTERRUPT back to true in repository. --- .../src/main/java/mage/player/ai/ComputerPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 952fe020cff..89d7ab37637 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -161,7 +161,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { private transient final static Logger log = Logger.getLogger(ComputerPlayer.class); protected int PASSIVITY_PENALTY = 5; // Penalty value for doing nothing if some actions are availble - protected boolean ALLOW_INTERRUPT = false; // change this for test / debugging purposes to false to switch off interrupts while debugging + protected boolean ALLOW_INTERRUPT = true; // change this for test / debugging purposes to false to switch off interrupts while debugging private transient Map unplayable = new TreeMap<>(); private transient List playableNonInstant = new ArrayList<>(); From 61b5609ae9c892fb33c39a7933246ed2ee7cd7d0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 18 Jul 2015 10:06:41 +0200 Subject: [PATCH 092/375] Some more token image handling changes. --- .../mage/sets/magic2015/FeralIncarnation.java | 3 +- .../mage/sets/magic2015/SoulOfZendikar.java | 4 +- .../mage/game/permanent/token/BeastToken.java | 80 +++++++++---------- .../mage/game/permanent/token/ElfToken.java | 62 +++++++------- 4 files changed, 78 insertions(+), 71 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2015/FeralIncarnation.java b/Mage.Sets/src/mage/sets/magic2015/FeralIncarnation.java index 0123ea48b26..2f4d8900e7f 100644 --- a/Mage.Sets/src/mage/sets/magic2015/FeralIncarnation.java +++ b/Mage.Sets/src/mage/sets/magic2015/FeralIncarnation.java @@ -45,11 +45,10 @@ public class FeralIncarnation extends CardImpl { super(ownerId, 174, "Feral Incarnation", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{8}{G}"); this.expansionSetCode = "M15"; - // Convoke this.addAbility(new ConvokeAbility()); // Put three 3/3 green Beast creature tokens onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new BeastToken("M15", 1), 3)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new BeastToken(), 3)); } public FeralIncarnation(final FeralIncarnation card) { diff --git a/Mage.Sets/src/mage/sets/magic2015/SoulOfZendikar.java b/Mage.Sets/src/mage/sets/magic2015/SoulOfZendikar.java index 7c09f0eb7c4..09593c16223 100644 --- a/Mage.Sets/src/mage/sets/magic2015/SoulOfZendikar.java +++ b/Mage.Sets/src/mage/sets/magic2015/SoulOfZendikar.java @@ -58,9 +58,9 @@ public class SoulOfZendikar extends CardImpl { // Reach this.addAbility(ReachAbility.getInstance()); // {3}{G}{G}: Put a 3/3 green Beast creature token onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new BeastToken("M15")), new ManaCostsImpl("{3}{G}{G}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new BeastToken()), new ManaCostsImpl("{3}{G}{G}"))); // {3}{G}{G}, Exile Soul of Zendikar from your graveyard: Put a 3/3 green Beast creature token onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new CreateTokenEffect(new BeastToken("M15")), new ManaCostsImpl("{3}{G}{G}")); + Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new CreateTokenEffect(new BeastToken()), new ManaCostsImpl("{3}{G}{G}")); ability.addCost(new ExileSourceFromGraveCost()); this.addAbility(ability); } diff --git a/Mage/src/mage/game/permanent/token/BeastToken.java b/Mage/src/mage/game/permanent/token/BeastToken.java index f5d9b98a546..761f5e03c78 100644 --- a/Mage/src/mage/game/permanent/token/BeastToken.java +++ b/Mage/src/mage/game/permanent/token/BeastToken.java @@ -1,35 +1,35 @@ /* -* 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. -*/ - + * 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.game.permanent.token; +import java.util.Arrays; +import java.util.Random; import mage.MageInt; -import mage.ObjectColor; import mage.constants.CardType; /** @@ -39,24 +39,24 @@ import mage.constants.CardType; public class BeastToken extends Token { public BeastToken() { - this("LRW"); - } - public BeastToken(String setCode) { - this(setCode, Integer.MIN_VALUE); - } - - public BeastToken(String setCode, int tokenType) { super("Beast", "3/3 green Beast creature token"); - setOriginalExpansionSetCode(setCode); - if (tokenType != Integer.MIN_VALUE) { - setTokenType(tokenType); - } + availableImageSetCodes.addAll(Arrays.asList("C14", "LRW", "M15", "M14", "DDL", "M13", "M12")); cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add("Beast"); power = new MageInt(3); toughness = new MageInt(3); - + } + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("C14")) { + this.setTokenType(new Random().nextInt(2) + 1); + } + if (getOriginalExpansionSetCode().equals("M15")) { + this.setTokenType(2); + } + } } diff --git a/Mage/src/mage/game/permanent/token/ElfToken.java b/Mage/src/mage/game/permanent/token/ElfToken.java index 11807debd70..256c67e8cc9 100644 --- a/Mage/src/mage/game/permanent/token/ElfToken.java +++ b/Mage/src/mage/game/permanent/token/ElfToken.java @@ -1,33 +1,33 @@ /* -* 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. -*/ - + * 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.game.permanent.token; +import java.util.Arrays; import mage.MageInt; import mage.constants.CardType; @@ -39,6 +39,7 @@ public class ElfToken extends Token { public ElfToken() { super("Elf Warrior", "1/1 green Elf Warrior creature token"); + availableImageSetCodes.addAll(Arrays.asList("C14", "SHM", "EVG", "LRW", "ORI")); cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add("Elf"); @@ -47,4 +48,11 @@ public class ElfToken extends Token { toughness = new MageInt(1); } + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("SHM")) { + this.setTokenType(1); + } + } } From 9de285a87658a1e0eb657e5d62c0dbf266515b9e Mon Sep 17 00:00:00 2001 From: Simown Date: Sat, 18 Jul 2015 14:54:56 +0100 Subject: [PATCH 093/375] Removed rogue print statement from test --- .../test/cards/cost/modification/BattlefieldThaumaturgeTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java index 01b3c69440e..a779b7e5ee5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/BattlefieldThaumaturgeTest.java @@ -293,7 +293,6 @@ public class BattlefieldThaumaturgeTest extends CardTestPlayerBase { } targetBuilder.append(target); } - System.out.println(targetBuilder.toString()); return targetBuilder.toString(); } From 1fd56df3935dc6ed4cf08aea0b039bcb8a56d887 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sat, 18 Jul 2015 09:18:20 -0500 Subject: [PATCH 094/375] Implemented Rotlung Reanimator, Gangrenous Goliath, and Cabal Archon. --- .../src/mage/sets/onslaught/CabalArchon.java | 83 +++++++++++++++++++ .../sets/onslaught/GangrenousGoliath.java | 78 +++++++++++++++++ .../sets/onslaught/RotlungReanimator.java | 73 ++++++++++++++++ 3 files changed, 234 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/onslaught/CabalArchon.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/GangrenousGoliath.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java diff --git a/Mage.Sets/src/mage/sets/onslaught/CabalArchon.java b/Mage.Sets/src/mage/sets/onslaught/CabalArchon.java new file mode 100644 index 00000000000..e67cd3fa843 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/CabalArchon.java @@ -0,0 +1,83 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPlayer; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CabalArchon extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Cleric"); + + static { + filter.add(new SubtypePredicate("Cleric")); + } + + public CabalArchon(UUID ownerId) { + super(ownerId, 129, "Cabal Archon", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {B}, Sacrifice a Cleric: Target player loses 2 life and you gain 2 life. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseLifeTargetEffect(2), new ManaCostsImpl("{B}")); + ability.addEffect(new GainLifeEffect(2)); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false))); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public CabalArchon(final CabalArchon card) { + super(card); + } + + @Override + public CabalArchon copy() { + return new CabalArchon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/GangrenousGoliath.java b/Mage.Sets/src/mage/sets/onslaught/GangrenousGoliath.java new file mode 100644 index 00000000000..9d4064426a8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/GangrenousGoliath.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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class GangrenousGoliath extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Clerics"); + + static { + filter.add(new SubtypePredicate("Cleric")); + } + + public GangrenousGoliath(UUID ownerId) { + super(ownerId, 150, "Gangrenous Goliath", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Zombie"); + this.subtype.add("Giant"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Tap three untapped Clerics you control: Return Gangrenous Goliath from your graveyard to your hand. + this.addAbility(new SimpleActivatedAbility( + Zone.GRAVEYARD, + new ReturnToHandSourceEffect(), + new TapTargetCost(new TargetControlledCreaturePermanent(3, 3, filter, true)))); + } + + public GangrenousGoliath(final GangrenousGoliath card) { + super(card); + } + + @Override + public GangrenousGoliath copy() { + return new GangrenousGoliath(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java b/Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java new file mode 100644 index 00000000000..15ec38fc4df --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java @@ -0,0 +1,73 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.permanent.token.ZombieToken; + +/** + * + * @author fireshoes + */ +public class RotlungReanimator extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("{this} or another Cleric"); + + static { + filter.add(new SubtypePredicate("Cleric")); + } + + public RotlungReanimator(UUID ownerId) { + super(ownerId, 164, "Rotlung Reanimator", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Zombie"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Rotlung Reanimator or another Cleric dies, put a 2/2 black Zombie creature token onto the battlefield. + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new ZombieToken()), false, filter)); + } + + public RotlungReanimator(final RotlungReanimator card) { + super(card); + } + + @Override + public RotlungReanimator copy() { + return new RotlungReanimator(this); + } +} From 5a6d8e2bc3e7b8eac6df0e591c92dac7544ff6fc Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sun, 19 Jul 2015 00:35:01 -0500 Subject: [PATCH 095/375] Implemented Utopia Vow, Fallen Ideal, Plaxmanta, and Ocular Halo. --- .../src/mage/sets/dissension/OcularHalo.java | 86 ++++++++++++ .../src/mage/sets/dissension/Plaxmanta.java | 78 +++++++++++ .../src/mage/sets/planarchaos/UtopiaVow.java | 84 ++++++++++++ .../sets/shardsofalara/TortoiseFormation.java | 125 +++++++++--------- .../src/mage/sets/timespiral/FallenIdeal.java | 95 +++++++++++++ 5 files changed, 405 insertions(+), 63 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/dissension/OcularHalo.java create mode 100644 Mage.Sets/src/mage/sets/dissension/Plaxmanta.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/UtopiaVow.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/FallenIdeal.java diff --git a/Mage.Sets/src/mage/sets/dissension/OcularHalo.java b/Mage.Sets/src/mage/sets/dissension/OcularHalo.java new file mode 100644 index 00000000000..9c479298177 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dissension/OcularHalo.java @@ -0,0 +1,86 @@ +/* + * 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.dissension; + +import java.util.UUID; +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.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class OcularHalo extends CardImpl { + + public OcularHalo(UUID ownerId) { + super(ownerId, 28, "Ocular Halo", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + this.expansionSetCode = "DIS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature has "{tap}: Draw a card." + Ability gainAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new TapSourceCost()); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(gainAbility, AttachmentType.AURA))); + + // {W}: Enchanted creature gains vigilance until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), + AttachmentType.AURA, Duration.EndOfTurn), new ManaCostsImpl("{W}"))); + } + + public OcularHalo(final OcularHalo card) { + super(card); + } + + @Override + public OcularHalo copy() { + return new OcularHalo(this); + } +} diff --git a/Mage.Sets/src/mage/sets/dissension/Plaxmanta.java b/Mage.Sets/src/mage/sets/dissension/Plaxmanta.java new file mode 100644 index 00000000000..55eff8520ba --- /dev/null +++ b/Mage.Sets/src/mage/sets/dissension/Plaxmanta.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.dissension; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.ManaWasSpentCondition; +import mage.abilities.effects.common.SacrificeSourceUnlessConditionEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.watchers.common.ManaSpentToCastWatcher; + +/** + * + * @author fireshoes + */ +public class Plaxmanta extends CardImpl { + + public Plaxmanta(UUID ownerId) { + super(ownerId, 29, "Plaxmanta", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "DIS"; + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // When Plaxmanta enters the battlefield, creatures you control gain shroud until end of turn. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new GainAbilityControlledEffect(ShroudAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent("creatures")))); + + // When Plaxmanta enters the battlefield, sacrifice it unless {G} was spent to cast it. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessConditionEffect(new ManaWasSpentCondition(ColoredManaSymbol.G)), false), new ManaSpentToCastWatcher()); + } + + public Plaxmanta(final Plaxmanta card) { + super(card); + } + + @Override + public Plaxmanta copy() { + return new Plaxmanta(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/UtopiaVow.java b/Mage.Sets/src/mage/sets/planarchaos/UtopiaVow.java new file mode 100644 index 00000000000..6455fdf557b --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/UtopiaVow.java @@ -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.planarchaos; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.combat.CantAttackBlockAttachedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class UtopiaVow extends CardImpl { + + public UtopiaVow(UUID ownerId) { + super(ownerId, 142, "Utopia Vow", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature can't attack or block. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackBlockAttachedEffect(AttachmentType.AURA))); + + // Enchanted creature has "{tap}: Add one mana of any color to your mana pool." + Effect effect = new GainAbilityAttachedEffect(new AnyColorManaAbility(), AttachmentType.AURA, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature has \"{T}: Add one mana of any color to your mana pool.\""); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + } + + public UtopiaVow(final UtopiaVow card) { + super(card); + } + + @Override + public UtopiaVow copy() { + return new UtopiaVow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shardsofalara/TortoiseFormation.java b/Mage.Sets/src/mage/sets/shardsofalara/TortoiseFormation.java index 3e39a14a239..b82bcb45747 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/TortoiseFormation.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/TortoiseFormation.java @@ -1,63 +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.shardsofalara; - -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.keyword.ShroudAbility; -import mage.cards.CardImpl; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterCreaturePermanent; - -/** - * - * @author North - */ -public class TortoiseFormation extends CardImpl { - - public TortoiseFormation(UUID ownerId) { - super(ownerId, 61, "Tortoise Formation", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{U}"); - this.expansionSetCode = "ALA"; - - - // Creatures you control gain shroud until end of turn. - this.getSpellAbility().addEffect(new GainAbilityControlledEffect(ShroudAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent())); - } - - public TortoiseFormation(final TortoiseFormation card) { - super(card); - } - - @Override - public TortoiseFormation copy() { - return new TortoiseFormation(this); - } -} +/* + * 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.shardsofalara; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author North + */ +public class TortoiseFormation extends CardImpl { + + public TortoiseFormation(UUID ownerId) { + super(ownerId, 61, "Tortoise Formation", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{U}"); + this.expansionSetCode = "ALA"; + + + // Creatures you control gain shroud until end of turn. + this.getSpellAbility().addEffect(new GainAbilityControlledEffect(ShroudAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent())); + } + + public TortoiseFormation(final TortoiseFormation card) { + super(card); + } + + @Override + public TortoiseFormation copy() { + return new TortoiseFormation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/FallenIdeal.java b/Mage.Sets/src/mage/sets/timespiral/FallenIdeal.java new file mode 100644 index 00000000000..7f0f46ab9b4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/FallenIdeal.java @@ -0,0 +1,95 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class FallenIdeal extends CardImpl { + + public FallenIdeal(UUID ownerId) { + super(ownerId, 109, "Fallen Ideal", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature has flying and "Sacrifice a creature: This creature gets +2/+1 until end of turn." + Effect effect = new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield); + Ability gainedAbility = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + this.addAbility(gainedAbility); + gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2, 1, Duration.EndOfTurn), + new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("a creature"), true))); + effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature has \"Sacrifice a creature: This creature gets +2/+1 until end of turn.\""); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + + // When Fallen Ideal is put into a graveyard from the battlefield, return Fallen Ideal to its owner's hand. + this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect())); + } + + public FallenIdeal(final FallenIdeal card) { + super(card); + } + + @Override + public FallenIdeal copy() { + return new FallenIdeal(this); + } +} \ No newline at end of file From 20d1bba69bbd8cbca0d5c904393359fdf3a32989 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 19 Jul 2015 09:22:18 +0200 Subject: [PATCH 096/375] * Sigil of Sleep - Fixed that the triggered effect only worked for combat damage instead of all dealt damage. --- Mage.Sets/src/mage/sets/urzasdestiny/SigilOfSleep.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/SigilOfSleep.java b/Mage.Sets/src/mage/sets/urzasdestiny/SigilOfSleep.java index fac417a452e..8594f497f6e 100644 --- a/Mage.Sets/src/mage/sets/urzasdestiny/SigilOfSleep.java +++ b/Mage.Sets/src/mage/sets/urzasdestiny/SigilOfSleep.java @@ -57,7 +57,6 @@ public class SigilOfSleep extends CardImpl { this.expansionSetCode = "UDS"; this.subtype.add("Aura"); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -67,7 +66,7 @@ public class SigilOfSleep extends CardImpl { // Whenever enchanted creature deals damage to a player, return target creature that player controls to its owner's hand. Effect effect = new ReturnToHandTargetEffect(); effect.setText("return target creature that player controls to its owner's hand"); - ability = new DealsDamageToAPlayerAttachedTriggeredAbility(effect, "enchanted", false, true); + ability = new DealsDamageToAPlayerAttachedTriggeredAbility(effect, "enchanted", false, true, false); this.addAbility(ability); } From 6ef50c42bffcceec15644278f165be56e63fab67 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 19 Jul 2015 10:08:58 +0200 Subject: [PATCH 097/375] Some minor changes. --- .../main/java/mage/player/ai/Attackers.java | 17 +++---- .../org/mage/test/AI/basic/CombatTest.java | 49 +++++++++++++++++++ .../org/mage/test/utils/ManaUtilTest.java | 46 +++++++++-------- 3 files changed, 83 insertions(+), 29 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/Attackers.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/Attackers.java index a20c15f41da..d64d08900b7 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/Attackers.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/Attackers.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.player.ai; import java.util.ArrayList; @@ -40,9 +39,9 @@ import mage.game.permanent.Permanent; public class Attackers extends TreeMap> { public List getAttackers() { - List attackers = new ArrayList(); - for (List l: this.values()) { - for (Permanent permanent: l) { + List attackers = new ArrayList<>(); + for (List l : this.values()) { + for (Permanent permanent : l) { attackers.add(permanent); } } diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java new file mode 100644 index 00000000000..f95d8e9aabd --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java @@ -0,0 +1,49 @@ +/* + * 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 org.mage.test.AI.basic; + +import org.mage.test.serverside.base.CardTestPlayerBaseAI; + +/** + * + * @author LevelX2 + */ +public class CombatTest extends CardTestPlayerBaseAI { + + /* + * Combat is not integrated yet in the CardTestPlayerBaseAI + * + * TODO: Modify CardTestPlayerBaseAI to use the AI combat acting + * + * Tests to create: + * AI is not attacking if opponent has a creature that can't block + * AI is not blocking also if able if the damage the attacker will do will kill the AI + * AI is not able to block with two or more creatures one attacking creature to kill it. Even if none of the AI creatures will die + * AI attacks with a flyer even if opponent has a bigger flyer that kills AI + */ +} diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java index 49ee45f089f..888bd5fa924 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java @@ -1,9 +1,16 @@ package org.mage.test.utils; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.mana.*; +import mage.abilities.mana.BasicManaAbility; +import mage.abilities.mana.BlackManaAbility; +import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.RedManaAbility; +import mage.abilities.mana.WhiteManaAbility; import mage.cards.Card; import mage.cards.repository.CardRepository; import mage.util.ManaUtil; @@ -11,10 +18,6 @@ import org.junit.Assert; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.UUID; - /** * @author noxx */ @@ -47,7 +50,7 @@ public class ManaUtilTest extends CardTestPlayerBase { testManaToPayVsLand("{2}", "Cavern of Souls", 2, 2); // can't auto choose to pay testManaToPayVsLand("{2}", "Eldrazi Temple", 2, 2); // can't auto choose to pay - + // hybrid mana testManaToPayVsLand("{W/R}{W/R}{W/R}", "Sacred Foundry", 2, 1); // auto choose for hybrid mana: choose any testManaToPayVsLand("{R}{W/R}", "Sacred Foundry", 2, RedManaAbility.class); // auto choose for hybrid mana: we should choose {R} @@ -79,18 +82,20 @@ public class ManaUtilTest extends CardTestPlayerBase { Assert.assertEquals("{R}{R}", ManaUtil.condenseManaCostString("{R}{R}")); Assert.assertEquals("{U}", ManaUtil.condenseManaCostString("{U}")); Assert.assertEquals("{2}", ManaUtil.condenseManaCostString("{2}")); - Assert.assertEquals("", ManaUtil.condenseManaCostString("")); + Assert.assertEquals("", ManaUtil.condenseManaCostString("{}")); } /** * Common way to test ManaUtil.tryToAutoPay * - * We get all mana abilities, then try to auto pay and compare to expected1 and expected2 params. + * We get all mana abilities, then try to auto pay and compare to expected1 + * and expected2 params. * * @param manaToPay Mana that should be paid using land. * @param landName Land to use as mana producer. * @param expected1 The amount of mana abilities the land should have. - * @param expected2 The amount of mana abilities that ManaUtil.tryToAutoPay should be returned after optimization. + * @param expected2 The amount of mana abilities that ManaUtil.tryToAutoPay + * should be returned after optimization. */ private void testManaToPayVsLand(String manaToPay, String landName, int expected1, int expected2) { ManaCost unpaid = new ManaCostsImpl(manaToPay); @@ -100,19 +105,20 @@ public class ManaUtilTest extends CardTestPlayerBase { HashMap useableAbilities = getManaAbilities(card); Assert.assertEquals(expected1, useableAbilities.size()); - useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap)useableAbilities); + useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap) useableAbilities); Assert.assertEquals(expected2, useableAbilities.size()); } /** - * Another way to test ManaUtil.tryToAutoPay - * Here we also check what ability was auto chosen + * Another way to test ManaUtil.tryToAutoPay Here we also check what ability + * was auto chosen * - * N.B. This method can be used ONLY if we have one ability left that auto choose mode! - * That's why we assert the following: - * Assert.assertEquals(1, useableAbilities.size()); + * N.B. This method can be used ONLY if we have one ability left that auto + * choose mode! That's why we assert the following: Assert.assertEquals(1, + * useableAbilities.size()); * - * We get all mana abilities, then try to auto pay and compare to expected1 and expected2 params. + * We get all mana abilities, then try to auto pay and compare to expected1 + * and expected2 params. * * @param manaToPay Mana that should be paid using land. * @param landName Land to use as mana producer. @@ -127,7 +133,7 @@ public class ManaUtilTest extends CardTestPlayerBase { HashMap useableAbilities = getManaAbilities(card); Assert.assertEquals(expected1, useableAbilities.size()); - useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap)useableAbilities); + useableAbilities = ManaUtil.tryToAutoPay(unpaid, (LinkedHashMap) useableAbilities); Assert.assertEquals(1, useableAbilities.size()); ManaAbility ability = useableAbilities.values().iterator().next(); Assert.assertTrue("Wrong mana ability has been chosen", expectedChosen.isInstance(ability)); @@ -141,13 +147,13 @@ public class ManaUtilTest extends CardTestPlayerBase { */ private HashMap getManaAbilities(Card card) { HashMap useableAbilities = new LinkedHashMap<>(); - for (Ability ability: card.getAbilities()) { + for (Ability ability : card.getAbilities()) { if (ability instanceof ManaAbility) { ability.newId(); // we need to assign id manually as we are not in game - useableAbilities.put(ability.getId(), (ManaAbility)ability); + useableAbilities.put(ability.getId(), (ManaAbility) ability); } } return useableAbilities; } - + } From 4324a6a68374b8f52a2bdbaca8522e16a47df77b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 19 Jul 2015 10:09:50 +0200 Subject: [PATCH 098/375] Fixes to token image handling. --- .../src/mage/player/ai/SimulatedPlayer2.java | 6 - .../sets/commander2014/DeployToTheFront.java | 3 +- .../mage/sets/magic2015/FirstResponse.java | 3 +- .../sets/shadowmoor/WheelOfSunAndMoon.java | 8 +- .../test/AI/basic/TargetsAreChosenTest.java | 127 +++++++++++++++++- .../mage/game/permanent/token/BeastToken.java | 19 ++- .../mage/game/permanent/token/ElfToken.java | 19 ++- .../game/permanent/token/GoblinToken.java | 2 +- .../game/permanent/token/SoldierToken.java | 87 +++++++----- .../game/permanent/token/SquirrelToken.java | 14 +- .../token/ThopterColorlessToken.java | 20 ++- Mage/src/mage/game/permanent/token/Token.java | 5 + .../game/permanent/token/ZombieToken.java | 18 ++- Mage/src/mage/target/TargetImpl.java | 96 +++++++++++-- 14 files changed, 356 insertions(+), 71 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java index 75d69b98518..419a33a0b53 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java @@ -138,16 +138,10 @@ public class SimulatedPlayer2 extends ComputerPlayer { options = optimizeOptions(game, options, ability); if (options.isEmpty()) { allActions.add(ability); -// simulateAction(game, previousActions, ability); } else { -// ExecutorService simulationExecutor = Executors.newFixedThreadPool(4); for (Ability option : options) { allActions.add(option); -// SimulationWorker worker = new SimulationWorker(game, this, previousActions, option); -// simulationExecutor.submit(worker); } -// simulationExecutor.shutdown(); -// while(!simulationExecutor.isTerminated()) {} } } } diff --git a/Mage.Sets/src/mage/sets/commander2014/DeployToTheFront.java b/Mage.Sets/src/mage/sets/commander2014/DeployToTheFront.java index 8d0206462e5..add6e65efa1 100644 --- a/Mage.Sets/src/mage/sets/commander2014/DeployToTheFront.java +++ b/Mage.Sets/src/mage/sets/commander2014/DeployToTheFront.java @@ -47,9 +47,8 @@ public class DeployToTheFront extends CardImpl { super(ownerId, 6, "Deploy to the Front", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{5}{W}{W}"); this.expansionSetCode = "C14"; - // Put X 1/1 white Soldier creature tokens onto the battlefield, where X is the number of creatures on the battlefield. - Effect effect = new CreateTokenEffect(new SoldierToken("C14"), new PermanentsOnBattlefieldCount(new FilterCreaturePermanent("the number of creatures on the battlefield"))); + Effect effect = new CreateTokenEffect(new SoldierToken(), new PermanentsOnBattlefieldCount(new FilterCreaturePermanent("the number of creatures on the battlefield"))); effect.setText("Put X 1/1 white Soldier creature tokens onto the battlefield, where X is the number of creatures on the battlefield"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/sets/magic2015/FirstResponse.java b/Mage.Sets/src/mage/sets/magic2015/FirstResponse.java index 87dc7ad335c..f83349340d7 100644 --- a/Mage.Sets/src/mage/sets/magic2015/FirstResponse.java +++ b/Mage.Sets/src/mage/sets/magic2015/FirstResponse.java @@ -51,7 +51,6 @@ public class FirstResponse extends CardImpl { super(ownerId, 12, "First Response", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); this.expansionSetCode = "M15"; - // At the beginning of each upkeep, if you lost life last turn, put a 1/1 white Soldier creature token onto the battlefield. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new FirstResponseEffect(), TargetController.ANY, false), new PlayerLostLifeWatcher()); @@ -88,7 +87,7 @@ class FirstResponseEffect extends OneShotEffect { PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get("PlayerLostLifeWatcher"); if (watcher != null) { if (watcher.getLiveLostLastTurn(source.getControllerId()) > 0) { - return new CreateTokenEffect(new SoldierToken("M15")).apply(game, source); + return new CreateTokenEffect(new SoldierToken()).apply(game, source); } return true; } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java b/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java index d028787067d..e41ad1b2148 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java @@ -102,7 +102,7 @@ class WheelOfSunAndMoonEffect extends ReplacementEffectImpl { public boolean checksEventType(GameEvent event, Game game) { return event.getType() == EventType.ZONE_CHANGE; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; @@ -110,8 +110,8 @@ class WheelOfSunAndMoonEffect extends ReplacementEffectImpl { Card card = game.getCard(event.getTargetId()); if (card != null) { Permanent enchantment = game.getPermanent(source.getSourceId()); - if (enchantment != null && enchantment.getAttachedTo() != null && - card.getOwnerId().equals(enchantment.getAttachedTo())) { + if (enchantment != null && enchantment.getAttachedTo() != null + && card.getOwnerId().equals(enchantment.getAttachedTo())) { return true; } } @@ -128,7 +128,7 @@ class WheelOfSunAndMoonEffect extends ReplacementEffectImpl { if (card != null) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; Cards cards = new CardsImpl(card); - controller.revealCards(sourceObject.getName(), cards, game); + controller.revealCards(sourceObject.getIdName(), cards, game); controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, zEvent.getFromZone(), false, true); return true; } diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java index 7b65f262232..31a037b721b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java @@ -29,6 +29,8 @@ package org.mage.test.AI.basic; import mage.constants.PhaseStep; import mage.constants.Zone; +import mage.filter.Filter; +import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBaseAI; @@ -88,8 +90,10 @@ public class TargetsAreChosenTest extends CardTestPlayerBaseAI { // Destroy two target artifacts. addCard(Zone.HAND, playerA, "Rack and Ruin"); // {2}{R} - addCard(Zone.BATTLEFIELD, playerB, "Mox Emerald", 2); - addCard(Zone.BATTLEFIELD, playerA, "Juggernaut"); + addCard(Zone.BATTLEFIELD, playerB, "Mox Emerald", 4); + addCard(Zone.BATTLEFIELD, playerA, "Juggernaut", 1); + addCard(Zone.BATTLEFIELD, playerA, "Composite Golem", 1); + addCard(Zone.BATTLEFIELD, playerA, "Mox Emerald", 1); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -99,4 +103,123 @@ public class TargetsAreChosenTest extends CardTestPlayerBaseAI { } + /** + * Target only opponent creatures to tap + */ + @Test + public void testFrostBreath1() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + // Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. + addCard(Zone.HAND, playerA, "Frost Breath"); // {2}{U} + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); + addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1); + addCard(Zone.BATTLEFIELD, playerA, "Juggernaut", 1); + addCard(Zone.BATTLEFIELD, playerA, "Composite Golem", 1); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Frost Breath", 1); + assertTapped("Silvercoat Lion", true); + assertTapped("Pillarfield Ox", true); + assertTapped("Juggernaut", false); + assertTapped("Composite Golem", false); + + } + + /** + * Target only opponent creatures also if more targets are possible + */ + @Test + public void testFrostBreath2() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + // Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. + addCard(Zone.HAND, playerA, "Frost Breath"); // {2}{U} + + addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1); + addCard(Zone.BATTLEFIELD, playerA, "Juggernaut", 1); + addCard(Zone.BATTLEFIELD, playerA, "Composite Golem", 1); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Frost Breath", 1); + assertTapped("Pillarfield Ox", true); + assertTapped("Juggernaut", false); + assertTapped("Composite Golem", false); + + } + + /** + * Spell is not cast if only own creatures can be targeted + */ + @Test + public void testFrostBreath3() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + // Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. + addCard(Zone.HAND, playerA, "Frost Breath"); // {2}{U} + + addCard(Zone.BATTLEFIELD, playerA, "Juggernaut", 1); + addCard(Zone.BATTLEFIELD, playerA, "Composite Golem", 1); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Frost Breath", 0); + assertTapped("Juggernaut", false); + assertTapped("Composite Golem", false); + + } + + /** + * + */ + @Test + public void testNefashu() { + // Whenever Nefashu attacks, up to five target creatures each get -1/-1 until end of turn. + addCard(Zone.BATTLEFIELD, playerA, "Nefashu"); // 5/3 + + addCard(Zone.BATTLEFIELD, playerB, "Bellows Lizard", 5); + // Whenever a creature an opponent controls dies, put a +1/+1 counter on Malakir Cullblade. + addCard(Zone.BATTLEFIELD, playerA, "Malakir Cullblade", 5); + + attack(3, playerA, "Nefashu"); + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, "Bellows Lizard", 5); + assertPowerToughness(playerA, "Malakir Cullblade", 6, 6, Filter.ComparisonScope.All); + assertTapped("Nefashu", true); + + assertLife(playerB, 15); + } + + /** + * Test that AI counters creatire spell + */ + @Test + @Ignore // counter spells don't seem to be cast by AI + public void testRewind() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + // Counter target spell. Untap up to four lands. + addCard(Zone.HAND, playerA, "Rewind"); // {2}{U}{U} + + addCard(Zone.BATTLEFIELD, playerB, "Plains", 4); + // Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) + // {W}{W}: Tap target creature. + addCard(Zone.HAND, playerB, "Kytheon's Irregulars", 1); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Kytheon's Irregulars"); + setStopAt(2, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerB, "Kytheon's Irregulars", 0); + assertGraveyardCount(playerB, "Kytheon's Irregulars", 1); + assertGraveyardCount(playerA, "Rewind", 1); + + assertTappedCount("Island", true, 0); + + } + } diff --git a/Mage/src/mage/game/permanent/token/BeastToken.java b/Mage/src/mage/game/permanent/token/BeastToken.java index 761f5e03c78..27c443fef1c 100644 --- a/Mage/src/mage/game/permanent/token/BeastToken.java +++ b/Mage/src/mage/game/permanent/token/BeastToken.java @@ -27,7 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Random; import mage.MageInt; import mage.constants.CardType; @@ -38,9 +40,15 @@ import mage.constants.CardType; */ public class BeastToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C14", "LRW", "M15", "M14", "DDL", "M13", "M12")); + } + public BeastToken() { super("Beast", "3/3 green Beast creature token"); - availableImageSetCodes.addAll(Arrays.asList("C14", "LRW", "M15", "M14", "DDL", "M13", "M12")); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add("Beast"); @@ -59,4 +67,13 @@ public class BeastToken extends Token { this.setTokenType(2); } } + + public BeastToken(final BeastToken token) { + super(token); + } + + @Override + public BeastToken copy() { + return new BeastToken(this); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/Mage/src/mage/game/permanent/token/ElfToken.java b/Mage/src/mage/game/permanent/token/ElfToken.java index 256c67e8cc9..06c4cbc1b91 100644 --- a/Mage/src/mage/game/permanent/token/ElfToken.java +++ b/Mage/src/mage/game/permanent/token/ElfToken.java @@ -27,7 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.constants.CardType; @@ -37,9 +39,15 @@ import mage.constants.CardType; */ public class ElfToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C14", "SHM", "EVG", "LRW", "ORI")); + } + public ElfToken() { super("Elf Warrior", "1/1 green Elf Warrior creature token"); - availableImageSetCodes.addAll(Arrays.asList("C14", "SHM", "EVG", "LRW", "ORI")); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add("Elf"); @@ -55,4 +63,13 @@ public class ElfToken extends Token { this.setTokenType(1); } } + + public ElfToken(final ElfToken token) { + super(token); + } + + @Override + public ElfToken copy() { + return new ElfToken(this); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/Mage/src/mage/game/permanent/token/GoblinToken.java b/Mage/src/mage/game/permanent/token/GoblinToken.java index ffbbac6b0a1..7b2dfd151f0 100644 --- a/Mage/src/mage/game/permanent/token/GoblinToken.java +++ b/Mage/src/mage/game/permanent/token/GoblinToken.java @@ -39,7 +39,7 @@ public class GoblinToken extends Token { public GoblinToken() { super("Goblin", "1/1 red Goblin creature token"); - availableImageSetCodes.addAll(Arrays.asList("SOM", "M10", "C14", "KTK", "EVG", "DTK", "ORI")); + availableImageSetCodes.addAll(Arrays.asList("SOM", "M10", "C14", "KTK", "EVG", "DTK", "ORI", "DDG")); cardType.add(CardType.CREATURE); subtype.add("Goblin"); diff --git a/Mage/src/mage/game/permanent/token/SoldierToken.java b/Mage/src/mage/game/permanent/token/SoldierToken.java index 8cf3fa003f5..956f808b5b7 100644 --- a/Mage/src/mage/game/permanent/token/SoldierToken.java +++ b/Mage/src/mage/game/permanent/token/SoldierToken.java @@ -1,33 +1,36 @@ /* -* 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. -*/ - + * 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.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; import mage.MageInt; import mage.constants.CardType; @@ -37,18 +40,38 @@ import mage.constants.CardType; */ public class SoldierToken extends Token { - public SoldierToken() { - this("10E"); + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("10E", "M15", "C14", "ORI", "ALA", "DDF", "THS", "M12", "M13", "MM2", "MMA", "RTR", "SOM")); } - public SoldierToken(String setCode) { + + public SoldierToken() { super("Soldier", "1/1 white Soldier creature token"); - this.setOriginalExpansionSetCode(setCode); + availableImageSetCodes = tokenImageSets; + cardType.add(CardType.CREATURE); color.setWhite(true); subtype.add("Soldier"); power = new MageInt(1); toughness = new MageInt(1); - + } + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("THS")) { + this.setTokenType(new Random().nextInt(2) + 1); + } + } + + public SoldierToken(final SoldierToken token) { + super(token); + } + + @Override + public SoldierToken copy() { + return new SoldierToken(this); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/Mage/src/mage/game/permanent/token/SquirrelToken.java b/Mage/src/mage/game/permanent/token/SquirrelToken.java index 88a35610725..c8b5e56fdb6 100644 --- a/Mage/src/mage/game/permanent/token/SquirrelToken.java +++ b/Mage/src/mage/game/permanent/token/SquirrelToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.constants.CardType; @@ -36,12 +39,15 @@ import mage.constants.CardType; */ public class SquirrelToken extends Token { - public SquirrelToken() { - this("CNS"); + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("CNS")); } - public SquirrelToken(String setCode) { + + public SquirrelToken() { super("Squirrel", "1/1 green Squirrel creature token"); - setOriginalExpansionSetCode(setCode); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); subtype.add("Squirrel"); diff --git a/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java b/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java index 81135864b56..840f15504be 100644 --- a/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java +++ b/Mage/src/mage/game/permanent/token/ThopterColorlessToken.java @@ -27,7 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Random; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; @@ -39,9 +41,15 @@ import mage.constants.CardType; */ public class ThopterColorlessToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("EXO", "ORI")); + } + public ThopterColorlessToken() { super("Thopter", "1/1 colorless Thopter artifact creature token with flying"); - availableImageSetCodes.addAll(Arrays.asList("EXO", "ORI")); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.ARTIFACT); cardType.add(CardType.CREATURE); subtype.add("Thopter"); @@ -58,4 +66,14 @@ public class ThopterColorlessToken extends Token { this.setTokenType(new Random().nextInt(2) + 1); } } + + public ThopterColorlessToken(final ThopterColorlessToken token) { + super(token); + } + + @Override + public ThopterColorlessToken copy() { + return new ThopterColorlessToken(this); //To change body of generated methods, choose Tools | Templates. + } + } diff --git a/Mage/src/mage/game/permanent/token/Token.java b/Mage/src/mage/game/permanent/token/Token.java index 9e4906947ac..def3ce49c65 100644 --- a/Mage/src/mage/game/permanent/token/Token.java +++ b/Mage/src/mage/game/permanent/token/Token.java @@ -100,6 +100,7 @@ public class Token extends MageObjectImpl { this.originalCardNumber = token.originalCardNumber; this.originalExpansionSetCode = token.originalExpansionSetCode; this.copySourceCard = token.copySourceCard; // will never be changed + this.availableImageSetCodes = token.availableImageSetCodes; } public String getDescription() { @@ -216,6 +217,10 @@ public class Token extends MageObjectImpl { } else { setOriginalExpansionSetCode(availableImageSetCodes.get(new Random().nextInt(availableImageSetCodes.size()))); } + } else { + if (getOriginalExpansionSetCode() == null || getOriginalExpansionSetCode().isEmpty()) { + setOriginalExpansionSetCode(code); + } } } } diff --git a/Mage/src/mage/game/permanent/token/ZombieToken.java b/Mage/src/mage/game/permanent/token/ZombieToken.java index 5e716ade6aa..ab636da61fe 100644 --- a/Mage/src/mage/game/permanent/token/ZombieToken.java +++ b/Mage/src/mage/game/permanent/token/ZombieToken.java @@ -27,7 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Random; import mage.MageInt; import mage.constants.CardType; @@ -38,9 +40,15 @@ import mage.constants.CardType; */ public class ZombieToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("10E", "M10", "M11", "M12", "M13", "M14", "M15", "MBS", "ALA", "ISD", "C14", "CNS", "MMA", "BNG", "KTK", "DTK", "ORI")); + } + public ZombieToken() { super("Zombie", "2/2 black Zombie creature token"); - availableImageSetCodes.addAll(Arrays.asList("10E", "M10", "M11", "M12", "M13", "M14", "M15", "MBS", "ALA", "ISD", "C14", "CNS", "MMA", "BNG", "KTK", "DTK", "ORI")); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add("Zombie"); @@ -56,4 +64,12 @@ public class ZombieToken extends Token { } } + public ZombieToken(final ZombieToken token) { + super(token); + } + + @Override + public ZombieToken copy() { + return new ZombieToken(this); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/Mage/src/mage/target/TargetImpl.java b/Mage/src/mage/target/TargetImpl.java index 3776a61446d..aa4b2a27047 100644 --- a/Mage/src/mage/target/TargetImpl.java +++ b/Mage/src/mage/target/TargetImpl.java @@ -376,26 +376,94 @@ public abstract class TargetImpl implements Target { return targets.size() > 0; } + /** + * Returns all possible different target combinations + * + * @param source + * @param game + * @return + */ @Override public List getTargetOptions(Ability source, Game game) { List options = new ArrayList<>(); - Set possibleTargets = possibleTargets(source.getSourceId(), source.getControllerId(), game); + List possibleTargets = new ArrayList<>(); + possibleTargets.addAll(possibleTargets(source.getSourceId(), source.getControllerId(), game)); possibleTargets.removeAll(getTargets()); - Iterator it = possibleTargets.iterator(); - while (it.hasNext()) { - UUID targetId = it.next(); + + // get the length of the array + // e.g. for {'A','B','C','D'} => N = 4 + int N = possibleTargets.size(); + // not enough targets, return no option + if (N < getNumberOfTargets()) { + return options; + } + // not target but that's allowed, return one empty option + if (N == 0) { TargetImpl target = this.copy(); - target.clearChosen(); - target.addTarget(targetId, source, game, true); - if (!target.isChosen()) { - Iterator it2 = possibleTargets.iterator(); - while (it2.hasNext() && !target.isChosen()) { - UUID nextTargetId = it2.next(); - target.addTarget(nextTargetId, source, game, true); - } + options.add(target); + return options; + } + int maxK = getMaxNumberOfTargets() - getTargets().size(); + if (maxK > 5) { // Prevent endless iteration with targets set to INTEGER.maxvalue + maxK = 5; + if (N > 10) { // not more than 252 combinations + maxK = 4; } - if (target.isChosen()) { - options.add(target); + if (N > 20) { // not more than 4845 combinations + maxK = 3; + } + } + if (N < maxK) { // less possible targets than the maximum allowed so reduce the max + maxK = N; + } + int minK = getNumberOfTargets(); + if (getNumberOfTargets() == 0) { // add option without targets if possible + TargetImpl target = this.copy(); + options.add(target); + minK = 1; + } + for (int K = minK; K <= maxK; K++) { + // get the combination by index + // e.g. 01 --> AB , 23 --> CD + int combination[] = new int[K]; + + // position of current index + // if (r = 1) r* + // index ==> 0 | 1 | 2 + // element ==> A | B | C + int r = 0; + int index = 0; + + while (r >= 0) { + // possible indexes for 1st position "r=0" are "0,1,2" --> "A,B,C" + // possible indexes for 2nd position "r=1" are "1,2,3" --> "B,C,D" + + // for r = 0 ==> index < (4+ (0 - 2)) = 2 + if (index <= (N + (r - K))) { + combination[r] = index; + + // if we are at the last position print and increase the index + if (r == K - 1) { + //add the new target option + TargetImpl target = this.copy(); + for (int i = 0; i < combination.length; i++) { + target.addTarget(possibleTargets.get(combination[i]), source, game, true); + } + options.add(target); + index++; + } else { + // select index for next position + index = combination[r] + 1; + r++; + } + } else { + r--; + if (r > 0) { + index = combination[r] + 1; + } else { + index = combination[0] + 1; + } + } } } return options; From cedf16806e24e0d23a5b29d1c98b02c73cc37013 Mon Sep 17 00:00:00 2001 From: Simown Date: Sun, 19 Jul 2015 12:11:03 +0100 Subject: [PATCH 099/375] Fix to #1128 Deck generation throws IndexOutOfBoundsException. Reserve cards now counted correctly. Fixed reserve card adding algorithm to stop trying to add cards out of range. --- .../mage/client/deck/generator/DeckGenerator.java | 8 +++++--- .../client/deck/generator/DeckGeneratorPool.java | 14 ++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java index cdfad4bf344..2a7d8570191 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java @@ -193,6 +193,7 @@ public class DeckGenerator { Random random = new Random(); int count = 0; int reservesAdded = 0; + boolean added; if (retrievedCount > 0 && retrievedCount >= spellCount) { int tries = 0; while (count < spellCount) { @@ -208,9 +209,10 @@ public class DeckGenerator { count++; } } else { - if (reservesAdded < genPool.getDeckSize() / 2) { - genPool.tryAddReserve(card, cardCMC); - reservesAdded++; + if (reservesAdded < (genPool.getDeckSize() / 2)) { + added = genPool.tryAddReserve(card, cardCMC); + if(added) + reservesAdded++; } } } diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java index 64daa31f5a0..d45838990ee 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java @@ -176,13 +176,15 @@ public class DeckGeneratorPool * @param card the card to add * @param cardCMC the converted mana cost of the card */ - public void tryAddReserve(Card card, int cardCMC) { + public boolean tryAddReserve(Card card, int cardCMC) { // Only cards with CMC < 7 and don't already exist in the deck // can be added to our reserve pool as not to overwhelm the curve // with high CMC cards and duplicates. if(cardCMC < 7 && getCardCount(card.getName()) == 0) { this.reserveSpells.add(card); + return true; } + return false; } /** @@ -386,13 +388,13 @@ public class DeckGeneratorPool List spellsToAdd = new ArrayList<>(spellsNeeded); // Initial reservoir - for(int i = 0; i < spellsNeeded-1; i++) + for(int i = 0; i < spellsNeeded; i++) spellsToAdd.add(reserveSpells.get(i)); - for(int j = spellsNeeded+1; j < reserveSpells.size()-1; j++) { - int index = random.nextInt(j); - Card randomCard = reserveSpells.get(index); - if (index < j && isValidSpellCard(randomCard)) { + for(int i = spellsNeeded+1; i < reserveSpells.size()-1; i++) { + int j = random.nextInt(i); + Card randomCard = reserveSpells.get(j); + if (isValidSpellCard(randomCard) && j < spellsToAdd.size()) { spellsToAdd.set(j, randomCard); } } From a6bab84c8579c6797ba79e77e453690aed72500a Mon Sep 17 00:00:00 2001 From: Simown Date: Sun, 19 Jul 2015 13:39:38 +0100 Subject: [PATCH 100/375] Generated deck name/path is now a timestamp. Changed deck generator to use a timestamp of the current time to the millisecond as the generated deck name. This gets rid of the random UUID filling up the deck path and generated deck name. --- .../client/deck/generator/DeckGeneratorDialog.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java index 009785b124f..8e3770ce582 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorDialog.java @@ -39,7 +39,8 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; -import java.util.UUID; +import java.text.SimpleDateFormat; +import java.util.Date; /** * @@ -53,10 +54,12 @@ public class DeckGeneratorDialog { private static JComboBox cbDeckSize; private static JButton btnGenerate, btnCancel; private static JCheckBox cArtifacts, cSingleton, cNonBasicLands; + private static SimpleDateFormat dateFormat; public DeckGeneratorDialog() { initDialog(); + dateFormat = new SimpleDateFormat("dd-MM-yyyy-hh-mm-ss-SSS"); } private void initDialog() { @@ -172,14 +175,17 @@ public class DeckGeneratorDialog { for (ActionListener al: btnCancel.getActionListeners()) { btnCancel.removeActionListener(al); } - //deck = null; } public String saveDeck(Deck deck) { try { - File tmp = File.createTempFile("tempDeck" + UUID.randomUUID().toString(), ".dck"); + // Random directory through the system property to avoid random numeric string attached to temp files. + String tempDir = System.getProperty("java.io.tmpdir"); + // Generated deck has a nice unique name which corresponds to the timestamp at which it was created. + String deckName = "Generated-Deck-" + dateFormat.format( new Date()); + File tmp = new File(tempDir + File.separator + deckName + ".dck"); tmp.createNewFile(); - deck.setName("Generated-Deck-" + UUID.randomUUID()); + deck.setName(deckName); Sets.saveDeck(tmp.getAbsolutePath(), deck.getDeckCardLists()); DeckGeneratorDialog.cleanUp(); return tmp.getAbsolutePath(); From 422ce50535c5622c0bdec40eac934c8803f8dd93 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sun, 19 Jul 2015 12:11:35 -0500 Subject: [PATCH 101/375] Implemented Petrified Plating, Minotaur Tactician, Hedge Troll, Shade of Trokair, Thunder Totem, Icatian Crier, Flamemaw Kavu, Mire Boa, & Stonewood Invocation --- .../sets/apocalypse/MinotaurTactician.java | 96 +++++++++++++++++++ .../sets/futuresight/PetrifiedPlating.java | 80 ++++++++++++++++ .../src/mage/sets/planarchaos/HedgeTroll.java | 79 +++++++++++++++ .../src/mage/sets/planarchaos/MireBoa.java | 69 +++++++++++++ .../mage/sets/planarchaos/ShadeOfTrokair.java | 72 ++++++++++++++ .../src/mage/sets/timespiral/FiremawKavu.java | 77 +++++++++++++++ .../mage/sets/timespiral/IcatianCrier.java | 73 ++++++++++++++ .../sets/timespiral/StonewoodInvocation.java | 73 ++++++++++++++ .../mage/sets/timespiral/ThunderTotem.java | 87 +++++++++++++++++ 9 files changed, 706 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/MinotaurTactician.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/PetrifiedPlating.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/HedgeTroll.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/MireBoa.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/ShadeOfTrokair.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/FiremawKavu.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/IcatianCrier.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/StonewoodInvocation.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/ThunderTotem.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/MinotaurTactician.java b/Mage.Sets/src/mage/sets/apocalypse/MinotaurTactician.java new file mode 100644 index 00000000000..b838ecdd088 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/MinotaurTactician.java @@ -0,0 +1,96 @@ +/* + * 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.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author fireshoes + */ +public class MinotaurTactician extends CardImpl { + + private static final FilterControlledCreaturePermanent filterWhite = new FilterControlledCreaturePermanent(); + private static final FilterControlledCreaturePermanent filterBlue = new FilterControlledCreaturePermanent(); + + static { + filterWhite.add(new ColorPredicate(ObjectColor.WHITE)); + filterBlue.add(new ColorPredicate(ObjectColor.BLUE)); + } + + final private String ruleWhite = "{this} gets +1/+1 as long as you control another white creature"; + + final private String ruleBlue = "{this} gets +1/+1 as long as you control another white creature"; + + public MinotaurTactician(UUID ownerId) { + super(ownerId, 65, "Minotaur Tactician", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "APC"; + this.subtype.add("Minotaur"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Minotaur Tactician gets +1/+1 as long as you control a white creature. + Condition conditionWhite = new PermanentsOnTheBattlefieldCondition(filterWhite, CountType.MORE_THAN, 0); + Effect effectWhite = new ConditionalContinuousEffect(new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), conditionWhite, ruleWhite); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effectWhite)); + + // Minotaur Tactician gets +1/+1 as long as you control a blue creature. + Condition conditionBlue = new PermanentsOnTheBattlefieldCondition(filterBlue, CountType.MORE_THAN, 0); + Effect effectBlue = new ConditionalContinuousEffect(new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), conditionBlue, ruleBlue); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effectBlue)); + } + + public MinotaurTactician(final MinotaurTactician card) { + super(card); + } + + @Override + public MinotaurTactician copy() { + return new MinotaurTactician(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/PetrifiedPlating.java b/Mage.Sets/src/mage/sets/futuresight/PetrifiedPlating.java new file mode 100644 index 00000000000..ae237c7075c --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/PetrifiedPlating.java @@ -0,0 +1,80 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.SuspendAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class PetrifiedPlating extends CardImpl { + + public PetrifiedPlating(UUID ownerId) { + super(ownerId, 133, "Petrified Plating", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +2/+2. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield))); + + // Suspend 2-{G} + this.addAbility(new SuspendAbility(2, new ManaCostsImpl("{G}"), this)); + } + + public PetrifiedPlating(final PetrifiedPlating card) { + super(card); + } + + @Override + public PetrifiedPlating copy() { + return new PetrifiedPlating(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/HedgeTroll.java b/Mage.Sets/src/mage/sets/planarchaos/HedgeTroll.java new file mode 100644 index 00000000000..95a342342b6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/HedgeTroll.java @@ -0,0 +1,79 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.abilities.effects.common.continuous.BoostSourceWhileControlsEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class HedgeTroll extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Plains"); + + static { + filter.add(new SubtypePredicate("Plains")); + } + + public HedgeTroll(UUID ownerId) { + super(ownerId, 151, "Hedge Troll", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Troll"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Hedge Troll gets +1/+1 as long as you control a Plains. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceWhileControlsEffect(filter, 1, 1))); + + // {W}: Regenerate Hedge Troll. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{W}"))); + } + + public HedgeTroll(final HedgeTroll card) { + super(card); + } + + @Override + public HedgeTroll copy() { + return new HedgeTroll(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/MireBoa.java b/Mage.Sets/src/mage/sets/planarchaos/MireBoa.java new file mode 100644 index 00000000000..9f3f6d05c77 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/MireBoa.java @@ -0,0 +1,69 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.abilities.keyword.SwampwalkAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class MireBoa extends CardImpl { + + public MireBoa(UUID ownerId) { + super(ownerId, 135, "Mire Boa", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Snake"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Swampwalk + this.addAbility(new SwampwalkAbility()); + + // {G}: Regenerate Mire Boa. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{G}"))); + } + + public MireBoa(final MireBoa card) { + super(card); + } + + @Override + public MireBoa copy() { + return new MireBoa(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/ShadeOfTrokair.java b/Mage.Sets/src/mage/sets/planarchaos/ShadeOfTrokair.java new file mode 100644 index 00000000000..eca024d270c --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/ShadeOfTrokair.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.SuspendAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ShadeOfTrokair extends CardImpl { + + public ShadeOfTrokair(UUID ownerId) { + super(ownerId, 18, "Shade of Trokair", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Shade"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // {W}: Shade of Trokair gets +1/+1 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.W))); + + // Suspend 3-{W} + this.addAbility(new SuspendAbility(3, new ManaCostsImpl("{W}"), this)); + } + + public ShadeOfTrokair(final ShadeOfTrokair card) { + super(card); + } + + @Override + public ShadeOfTrokair copy() { + return new ShadeOfTrokair(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/FiremawKavu.java b/Mage.Sets/src/mage/sets/timespiral/FiremawKavu.java new file mode 100644 index 00000000000..791e8b600a3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/FiremawKavu.java @@ -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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.EchoAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class FiremawKavu extends CardImpl { + + public FiremawKavu(UUID ownerId) { + super(ownerId, 153, "Firemaw Kavu", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{R}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Kavu"); + this.power = new MageInt(4); + this.toughness = new MageInt(2); + + // Echo {5}{R} + this.addAbility(new EchoAbility("{5}{R}")); + + // When Firemaw Kavu enters the battlefield, it deals 2 damage to target creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // When Firemaw Kavu leaves the battlefield, it deals 4 damage to target creature. + ability = new LeavesBattlefieldTriggeredAbility(new DamageTargetEffect(4), false); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public FiremawKavu(final FiremawKavu card) { + super(card); + } + + @Override + public FiremawKavu copy() { + return new FiremawKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/IcatianCrier.java b/Mage.Sets/src/mage/sets/timespiral/IcatianCrier.java new file mode 100644 index 00000000000..5fe2991a137 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/IcatianCrier.java @@ -0,0 +1,73 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +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.CitizenToken; + +/** + * + * @author fireshoes + */ +public class IcatianCrier extends CardImpl { + + public IcatianCrier(UUID ownerId) { + super(ownerId, 23, "Icatian Crier", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}{W}, {tap}, Discard a card: Put two 1/1 white Citizen creature tokens onto the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new CitizenToken(), 2), new ManaCostsImpl("{1}{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + public IcatianCrier(final IcatianCrier card) { + super(card); + } + + @Override + public IcatianCrier copy() { + return new IcatianCrier(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/timespiral/StonewoodInvocation.java b/Mage.Sets/src/mage/sets/timespiral/StonewoodInvocation.java new file mode 100644 index 00000000000..48f2b638f5a --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/StonewoodInvocation.java @@ -0,0 +1,73 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.ShroudAbility; +import mage.abilities.keyword.SplitSecondAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class StonewoodInvocation extends CardImpl { + + public StonewoodInvocation(UUID ownerId) { + super(ownerId, 223, "Stonewood Invocation", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{G}"); + this.expansionSetCode = "TSP"; + + // Split second + this.addAbility(new SplitSecondAbility()); + + // Target creature gets +5/+5 and gains shroud until end of turn. + Effect effect = new BoostTargetEffect(5, 5, Duration.EndOfTurn); + effect.setText("Target creature gets +5/+5"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(ShroudAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains shroud until end of turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public StonewoodInvocation(final StonewoodInvocation card) { + super(card); + } + + @Override + public StonewoodInvocation copy() { + return new StonewoodInvocation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/ThunderTotem.java b/Mage.Sets/src/mage/sets/timespiral/ThunderTotem.java new file mode 100644 index 00000000000..eb0a4cdeddf --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/ThunderTotem.java @@ -0,0 +1,87 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.mana.WhiteManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.permanent.token.Token; + +/** + * + * @author fireshoes + */ +public class ThunderTotem extends CardImpl { + + public ThunderTotem(UUID ownerId) { + super(ownerId, 265, "Thunder Totem", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "TSP"; + + // {tap}: Add {W} to your mana pool. + this.addAbility(new WhiteManaAbility()); + + // {1}{W}{W}: Thunder Totem becomes a 2/2 white Spirit artifact creature with flying and first strike until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new BecomesCreatureSourceEffect(new ThunderTotemToken(), "", Duration.EndOfTurn), + new ManaCostsImpl("{1}{W}{W}"))); + } + + public ThunderTotem(final ThunderTotem card) { + super(card); + } + + @Override + public ThunderTotem copy() { + return new ThunderTotem(this); + } + +private class ThunderTotemToken extends Token { + ThunderTotemToken() { + super("", "a 2/2 white Spirit artifact creature with flying and first strike"); + cardType.add(CardType.ARTIFACT); + cardType.add(CardType.CREATURE); + color.setWhite(true); + this.subtype.add("Spirit"); + power = new MageInt(2); + toughness = new MageInt(2); + this.addAbility(FlyingAbility.getInstance()); + this.addAbility(FirstStrikeAbility.getInstance()); + } + } +} \ No newline at end of file From 2d54604fd2ea37781cc721f20b880cb4fd7a1c09 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 19 Jul 2015 19:27:20 +0200 Subject: [PATCH 102/375] Some redesign for split cards. --- Mage/src/mage/cards/Card.java | 106 +++++++----- Mage/src/mage/cards/SplitCard.java | 177 ++------------------- Mage/src/mage/cards/SplitCardHalf.java | 16 ++ Mage/src/mage/cards/SplitCardHalfImpl.java | 81 ++++++++++ 4 files changed, 178 insertions(+), 202 deletions(-) create mode 100644 Mage/src/mage/cards/SplitCardHalf.java create mode 100644 Mage/src/mage/cards/SplitCardHalfImpl.java diff --git a/Mage/src/mage/cards/Card.java b/Mage/src/mage/cards/Card.java index 91217b0c02a..6e5ec8c1d32 100644 --- a/Mage/src/mage/cards/Card.java +++ b/Mage/src/mage/cards/Card.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.cards; import java.util.ArrayList; @@ -33,7 +32,6 @@ import java.util.List; import java.util.UUID; import mage.MageObject; import mage.Mana; -import mage.ObjectColor; import mage.abilities.Abilities; import mage.abilities.Ability; import mage.abilities.SpellAbility; @@ -46,26 +44,45 @@ import mage.game.Game; public interface Card extends MageObject { UUID getOwnerId(); + int getCardNumber(); + Rarity getRarity(); + void setOwnerId(UUID ownerId); + public Abilities getAbilities(Game game); + void setSpellAbility(SpellAbility ability); + SpellAbility getSpellAbility(); + List getRules(); // gets base card rules + List getRules(Game game); // gets card rules + in game modifications + String getExpansionSetCode(); + String getTokenSetCode(); + void setFaceDown(boolean value, Game game); + boolean isFaceDown(Game game); + boolean turnFaceUp(Game game, UUID playerId); + boolean turnFaceDown(Game game, UUID playerId); + boolean isFlipCard(); + String getFlipCardName(); + boolean isSplitCard(); boolean canTransform(); + Card getSecondCardFace(); + boolean isNightCard(); void assignNewId(); @@ -74,14 +91,18 @@ public interface Card extends MageObject { /** * Moves the card to the specified zone + * * @param zone * @param sourceId * @param game * @param flag If zone *
    - *
  • LIBRARY:
    • true - put on top
    • false - put on bottom
  • - *
  • BATTLEFIELD:
    • true - tapped
    • false - untapped
  • - *
  • GRAVEYARD:
    • true - not from Battlefield
    • false - from Battlefield
  • + *
  • LIBRARY:
    • true - put on top
    • false - put on + * bottom
  • + *
  • BATTLEFIELD:
    • true - tapped
    • false - + * untapped
  • + *
  • GRAVEYARD:
    • true - not from Battlefield
    • false - from + * Battlefield
  • *
* @return true if card was moved to zone */ @@ -91,6 +112,7 @@ public interface Card extends MageObject { /** * Moves the card to an exile zone + * * @param exileId set to null for generic exile zone * @param name used for exile zone with the specified exileId * @param sourceId @@ -98,15 +120,19 @@ public interface Card extends MageObject { * @return true if card was moved to zone */ boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game); - + boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList appliedEffects); - boolean cast(Game game, Zone fromZone, SpellAbility ability, UUID controllerId); + boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId); + boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped); + boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown); + boolean putOntoBattlefield(Game game, Zone fromZone, UUID sourceId, UUID controllerId, boolean tapped, boolean facedown, ArrayList appliedEffects); + List getMana(); void build(); @@ -116,24 +142,30 @@ public interface Card extends MageObject { * @return true if there exists various art images for this card */ boolean getUsesVariousArt(); + Counters getCounters(Game game); void addCounters(String name, int amount, Game game); + void addCounters(String name, int amount, Game game, ArrayList appliedEffects); + void addCounters(Counter counter, Game game); + void addCounters(Counter counter, Game game, ArrayList appliedEffects); void removeCounters(String name, int amount, Game game); + void removeCounters(Counter counter, Game game); - + @Override Card copy(); - + /** * - * @return The main card of a split half card, otherwise thae card itself is returned + * @return The main card of a split half card, otherwise thae card itself is + * returned */ Card getMainCard(); - void setZone(Zone zone, Game game); + void setZone(Zone zone, Game game); } diff --git a/Mage/src/mage/cards/SplitCard.java b/Mage/src/mage/cards/SplitCard.java index 1bfe550d540..7aef9b2756d 100644 --- a/Mage/src/mage/cards/SplitCard.java +++ b/Mage/src/mage/cards/SplitCard.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards; import java.util.ArrayList; @@ -53,9 +52,9 @@ public abstract class SplitCard extends CardImpl { protected Card rightHalfCard; public SplitCard(UUID ownerId, int cardNumber, String nameLeft, String nameRight, Rarity rarity, CardType[] cardTypes, String costsLeft, String costsRight, boolean fused) { - super(ownerId, cardNumber, new StringBuilder(nameLeft).append(" // ").append(nameRight).toString(), rarity, cardTypes, costsLeft + costsRight, (fused ?SpellAbilityType.SPLIT_FUSED:SpellAbilityType.SPLIT)); - this.createLeftHalfCard(nameLeft, costsLeft); - this.createRightHalfCard(nameRight, costsRight); + super(ownerId, cardNumber, new StringBuilder(nameLeft).append(" // ").append(nameRight).toString(), rarity, cardTypes, costsLeft + costsRight, (fused ? SpellAbilityType.SPLIT_FUSED : SpellAbilityType.SPLIT)); + leftHalfCard = new SplitCardHalfImpl(this.getOwnerId(), this.getCardNumber(), nameLeft, this.rarity, cardTypes, costsLeft, this, SpellAbilityType.SPLIT_LEFT); + rightHalfCard = new SplitCardHalfImpl(this.getOwnerId(), this.getCardNumber(), nameRight, this.rarity, cardTypes, costsRight, this, SpellAbilityType.SPLIT_RIGHT); this.splitCard = true; } @@ -65,29 +64,11 @@ public abstract class SplitCard extends CardImpl { this.rightHalfCard = card.rightHalfCard.copy(); } - private Card createLeftHalfCard (String nameLeft, String costsLeft) { - CardType[] cardTypes = new CardType[getCardType().size()]; - this.getCardType().toArray(cardTypes); - leftHalfCard = new LeftHalfCard(this.getOwnerId(), this.getCardNumber(), nameLeft, this.rarity, cardTypes, costsLeft, this); - //leftHalfCard.getAbilities().setSourceId(objectId); + public Card getLeftHalfCard() { return leftHalfCard; } - private Card createRightHalfCard (String nameRight, String costsRight) { - CardType[] cardTypes = new CardType[getCardType().size()]; - this.getCardType().toArray(cardTypes); - rightHalfCard = new RightHalfCard(this.getOwnerId(), this.getCardNumber(), nameRight, this.rarity, cardTypes, costsRight, this); - //rightHalfCard.getAbilities().setSourceId(objectId); - return rightHalfCard; - } - - - - public Card getLeftHalfCard () { - return leftHalfCard; - } - - public Card getRightHalfCard () { + public Card getRightHalfCard() { return rightHalfCard; } @@ -114,7 +95,7 @@ public abstract class SplitCard extends CardImpl { @Override public boolean cast(Game game, Zone fromZone, SpellAbility ability, UUID controllerId) { - switch(ability.getSpellAbilityType()) { + switch (ability.getSpellAbilityType()) { case SPLIT_LEFT: return this.getLeftHalfCard().cast(game, fromZone, ability, controllerId); case SPLIT_RIGHT: @@ -131,17 +112,16 @@ public abstract class SplitCard extends CardImpl { game.setZone(getRightHalfCard().getId(), zone); } - @Override - public Abilities getAbilities(){ + public Abilities getAbilities() { Abilities allAbilites = new AbilitiesImpl<>(); for (Ability ability : super.getAbilities()) { - if (ability instanceof SpellAbility && !((SpellAbility)ability).getSpellAbilityType().equals(SpellAbilityType.SPLIT)) { + if (ability instanceof SpellAbility && !((SpellAbility) ability).getSpellAbilityType().equals(SpellAbilityType.SPLIT)) { allAbilites.add(ability); } } allAbilites.addAll(leftHalfCard.getAbilities()); - allAbilites.addAll(rightHalfCard.getAbilities()); + allAbilites.addAll(rightHalfCard.getAbilities()); return allAbilites; } @@ -149,15 +129,15 @@ public abstract class SplitCard extends CardImpl { public Abilities getAbilities(Game game) { Abilities allAbilites = new AbilitiesImpl<>(); for (Ability ability : super.getAbilities(game)) { - if (ability instanceof SpellAbility && !((SpellAbility)ability).getSpellAbilityType().equals(SpellAbilityType.SPLIT)) { + if (ability instanceof SpellAbility && !((SpellAbility) ability).getSpellAbilityType().equals(SpellAbilityType.SPLIT)) { allAbilites.add(ability); } } allAbilites.addAll(leftHalfCard.getAbilities(game)); - allAbilites.addAll(rightHalfCard.getAbilities(game)); + allAbilites.addAll(rightHalfCard.getAbilities(game)); return allAbilites; } - + @Override public List getRules() { List rules = new ArrayList<>(); @@ -179,136 +159,3 @@ public abstract class SplitCard extends CardImpl { } } - -/* - * The left side card of the split card - */ -class LeftHalfCard extends CardImpl { - - SplitCard splitCardParent; - - public LeftHalfCard(UUID ownerId, int cardNumber, String name, Rarity rarity, CardType[] cardTypes, String costs, SplitCard splitCardParent) { - super(ownerId, cardNumber, name, rarity, cardTypes, costs, SpellAbilityType.SPLIT_LEFT); - this.splitCardParent = splitCardParent; - } - - public LeftHalfCard(final LeftHalfCard card) { - super(card); - this.splitCardParent = card.splitCardParent; - } - - @Override - public LeftHalfCard copy() { - return new LeftHalfCard(this); - } - - @Override - public UUID getOwnerId() { - return splitCardParent.getOwnerId(); - } - - @Override - public String getImageName() { - return splitCardParent.getImageName(); - } - - @Override - public String getExpansionSetCode() { - return splitCardParent.getExpansionSetCode(); - } - - @Override - public int getCardNumber() { - return splitCardParent.getCardNumber(); - } - - @Override - public boolean moveToZone(Zone toZone, UUID sourceId, Game game, boolean flag, ArrayList appliedEffects) { - return splitCardParent.moveToZone(toZone, sourceId, game, flag, appliedEffects); - } - - @Override - public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList appliedEffects) { - return splitCardParent.moveToExile(exileId, name, sourceId, game, appliedEffects); - } - - @Override - public Card getMainCard() { - return splitCardParent; - } - - @Override - public void setZone(Zone zone, Game game) { - super.setZone(zone, game); - game.setZone(splitCardParent.getId(), zone); - game.setZone(splitCardParent.getRightHalfCard().getId(), zone); - } - - -} - -/* - * The right side card of the split card - */ -class RightHalfCard extends CardImpl { - - SplitCard splitCardParent; - - public RightHalfCard(UUID ownerId, int cardNumber, String name, Rarity rarity, CardType[] cardTypes, String costs, SplitCard splitCardParent) { - super(ownerId, cardNumber, name, rarity, cardTypes, costs, SpellAbilityType.SPLIT_RIGHT); - this.splitCardParent = splitCardParent; - } - - public RightHalfCard(final RightHalfCard card) { - super(card); - this.splitCardParent = card.splitCardParent; - } - - @Override - public RightHalfCard copy() { - return new RightHalfCard(this); - } - - @Override - public UUID getOwnerId() { - return splitCardParent.getOwnerId(); - } - - @Override - public String getImageName() { - return splitCardParent.getImageName(); - } - - @Override - public String getExpansionSetCode() { - return splitCardParent.getExpansionSetCode(); - } - - @Override - public int getCardNumber() { - return splitCardParent.getCardNumber(); - } - - @Override - public boolean moveToZone(Zone toZone, UUID sourceId, Game game, boolean flag, ArrayList appliedEffects) { - return splitCardParent.moveToZone(toZone, sourceId, game, flag, appliedEffects); - } - - @Override - public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList appliedEffects) { - return splitCardParent.moveToExile(exileId, name, sourceId, game, appliedEffects); - } - - @Override - public Card getMainCard() { - return splitCardParent; - } - - @Override - public void setZone(Zone zone, Game game) { - super.setZone(zone, game); - game.setZone(splitCardParent.getId(), zone); - game.setZone(splitCardParent.getLeftHalfCard().getId(), zone); - } - -} diff --git a/Mage/src/mage/cards/SplitCardHalf.java b/Mage/src/mage/cards/SplitCardHalf.java new file mode 100644 index 00000000000..52fa1086bb6 --- /dev/null +++ b/Mage/src/mage/cards/SplitCardHalf.java @@ -0,0 +1,16 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.cards; + +/** + * + * @author LevelX2 + */ +public interface SplitCardHalf extends Card { + + @Override + Card copy(); +} diff --git a/Mage/src/mage/cards/SplitCardHalfImpl.java b/Mage/src/mage/cards/SplitCardHalfImpl.java new file mode 100644 index 00000000000..af6cc3f6ab6 --- /dev/null +++ b/Mage/src/mage/cards/SplitCardHalfImpl.java @@ -0,0 +1,81 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.cards; + +import java.util.ArrayList; +import java.util.UUID; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.SpellAbilityType; +import mage.constants.Zone; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ +public class SplitCardHalfImpl extends CardImpl implements SplitCardHalf { + + SplitCard splitCardParent; + + public SplitCardHalfImpl(UUID ownerId, int cardNumber, String name, Rarity rarity, CardType[] cardTypes, String costs, SplitCard splitCardParent, SpellAbilityType spellAbilityType) { + super(ownerId, cardNumber, name, rarity, cardTypes, costs, spellAbilityType); + this.splitCardParent = splitCardParent; + } + + public SplitCardHalfImpl(final SplitCardHalfImpl card) { + super(card); + this.splitCardParent = card.splitCardParent; + } + + @Override + public UUID getOwnerId() { + return splitCardParent.getOwnerId(); + } + + @Override + public String getImageName() { + return splitCardParent.getImageName(); + } + + @Override + public String getExpansionSetCode() { + return splitCardParent.getExpansionSetCode(); + } + + @Override + public int getCardNumber() { + return splitCardParent.getCardNumber(); + } + + @Override + public boolean moveToZone(Zone toZone, UUID sourceId, Game game, boolean flag, ArrayList appliedEffects) { + return splitCardParent.moveToZone(toZone, sourceId, game, flag, appliedEffects); + } + + @Override + public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList appliedEffects) { + return splitCardParent.moveToExile(exileId, name, sourceId, game, appliedEffects); + } + + @Override + public Card getMainCard() { + return splitCardParent; + } + + @Override + public void setZone(Zone zone, Game game) { + game.setZone(splitCardParent.getId(), zone); + game.setZone(splitCardParent.getLeftHalfCard().getId(), zone); + game.setZone(splitCardParent.getRightHalfCard().getId(), zone); + } + + @Override + public SplitCardHalfImpl copy() { + return new SplitCardHalfImpl(this); + } + +} From 0df798393788c6b5bb48760d0f12506b12012444 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 19 Jul 2015 19:27:49 +0200 Subject: [PATCH 103/375] Added some test. --- .../org/mage/test/AI/basic/CombatTest.java | 2 + .../test/AI/basic/TriggeredAbilityTest.java | 47 +++++++++++ .../test/cards/single/OmniscienceTest.java | 83 ++++++++++++++----- 3 files changed, 110 insertions(+), 22 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/AI/basic/TriggeredAbilityTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java index f95d8e9aabd..4310dac8920 100644 --- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CombatTest.java @@ -45,5 +45,7 @@ public class CombatTest extends CardTestPlayerBaseAI { * AI is not blocking also if able if the damage the attacker will do will kill the AI * AI is not able to block with two or more creatures one attacking creature to kill it. Even if none of the AI creatures will die * AI attacks with a flyer even if opponent has a bigger flyer that kills AI + * Opponent of AI has only 1 life. AI has more creatures that can attack taht do at least 1 damage than opponent has blockers. Ai should attack with all needed creatures + * */ } diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/TriggeredAbilityTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TriggeredAbilityTest.java new file mode 100644 index 00000000000..16087622d1f --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TriggeredAbilityTest.java @@ -0,0 +1,47 @@ +/* + * 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 org.mage.test.AI.basic; + +import org.mage.test.serverside.base.CardTestPlayerBaseAI; + +/** + * + * @author LevelX2 + */ +public class TriggeredAbilityTest extends CardTestPlayerBaseAI { + + /* + * + * TODO: Create tests and fix AI to be able to handle tested situations + * + * Tests to create: + * AI has the only one creature in play and plays a Gilt-Leaf Winnower. AI should select No if asked to use the destray effect becuase it targets the AI creature + * + * + */ +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/OmniscienceTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/OmniscienceTest.java index a75dbc61e3d..ad4f7febe71 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/OmniscienceTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/OmniscienceTest.java @@ -25,11 +25,11 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package org.mage.test.cards.single; import mage.constants.PhaseStep; import mage.constants.Zone; +import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -37,27 +37,24 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class OmniscienceTest extends CardTestPlayerBase { /** - * Omniscience {7}{U}{U}{U} + * Omniscience {7}{U}{U}{U} * - * Enchantment - * You may cast nonland cards from your hand without paying their mana costs. + * Enchantment You may cast nonland cards from your hand without paying + * their mana costs. * */ - @Test public void testCastingCreature() { addCard(Zone.BATTLEFIELD, playerA, "Omniscience"); - - /* player.getPlayable does not take alternate - casting costs in account, so for the test the mana has to be available - but won't be used - */ - addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + /* player.getPlayable does not take alternate + casting costs in account, so for the test the mana has to be available + but won't be used + */ + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); addCard(Zone.HAND, playerA, "Silvercoat Lion"); @@ -80,7 +77,7 @@ public class OmniscienceTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Island", 1); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); - + // Fire deals 2 damage divided as you choose among one or two target creatures and/or players. addCard(Zone.HAND, playerA, "Fire // Ice"); @@ -94,7 +91,7 @@ public class OmniscienceTest extends CardTestPlayerBase { assertLife(playerA, 20); assertLife(playerB, 18); - + assertTapped("Island", false); assertTapped("Mountain", false); } @@ -104,9 +101,9 @@ public class OmniscienceTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Omniscience"); /* player.getPlayable does not take alternate - casting costs in account, so for the test the mana has to be available - but won't be used - */ + casting costs in account, so for the test the mana has to be available + but won't be used + */ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); addCard(Zone.BATTLEFIELD, playerA, "Ornithopter", 1); @@ -124,12 +121,13 @@ public class OmniscienceTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Ornithopter", 1); assertTapped("Mountain", false); } - /** - * Spell get cast for 0 if Omniscience is being in play. - * But with Trinisphere it costs at least {3}. - * Cost/alternate cost (Omniscience) + additional costs - cost reductions + minimum cost (Trinishpere) = total cost. - */ + /** + * Spell get cast for 0 if Omniscience is being in play. But with + * Trinisphere it costs at least {3}. Cost/alternate cost (Omniscience) + + * additional costs - cost reductions + minimum cost (Trinishpere) = total + * cost. + */ @Test public void testCastingWithTrinisphere() { addCard(Zone.BATTLEFIELD, playerA, "Omniscience"); @@ -153,4 +151,45 @@ public class OmniscienceTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Silvercoat Lion", 1); assertTapped("Plains", true); // plains have to be tapped because {3} have to be paid } + + /** + * Omniscience is not allowing me to cast spells for free. I'm playing a + * Commander game against the Computer, if that helps. + * + * Edit: It's not letting me cast fused spells for free. Others seems to be + * working. + */ + @Test + @Ignore // targeting of fused/split spells not supported by thestplayer + public void testCastingFusedSpell() { + addCard(Zone.BATTLEFIELD, playerA, "Omniscience"); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion"); + + addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox"); + + /* + * Instant + * Far {1}{U} Return target creature to its owner's hand. + * Away{2}{B} Target player sacrifices a creature. + * Fuse (You may cast one or both halves of this card from your hand.) + */ + addCard(Zone.HAND, playerA, "Far // Away"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "fused Far // Away", "Silvercoat Lion^targetPlayer=PlayerB"); + playerB.addTarget("Pillarfield Ox"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, 1); + assertHandCount(playerB, 0); + + assertGraveyardCount(playerA, "Far // Away", 1); + + assertPermanentCount(playerB, "Pillarfield Ox", 0); + assertGraveyardCount(playerB, "Pillarfield Ox", 1); + } + } From 4b0ae51c07a16ac0b160a205d415524497584809 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 19 Jul 2015 19:28:46 +0200 Subject: [PATCH 104/375] * Omniscience - Workaround to be able to use Omniscience alternate casting cost for fused spells. --- .../src/mage/sets/magic2013/Omniscience.java | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2013/Omniscience.java b/Mage.Sets/src/mage/sets/magic2013/Omniscience.java index 6c9b7cf9322..1b2f082a670 100644 --- a/Mage.Sets/src/mage/sets/magic2013/Omniscience.java +++ b/Mage.Sets/src/mage/sets/magic2013/Omniscience.java @@ -28,7 +28,6 @@ package mage.sets.magic2013; import java.util.UUID; - import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; @@ -39,6 +38,7 @@ import mage.abilities.costs.AlternativeCostSourceAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.cards.Card; import mage.cards.CardImpl; +import mage.cards.SplitCardHalf; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Layer; @@ -61,7 +61,6 @@ public class Omniscience extends CardImpl { super(ownerId, 63, "Omniscience", Rarity.MYTHIC, new CardType[]{CardType.ENCHANTMENT}, "{7}{U}{U}{U}"); this.expansionSetCode = "M13"; - // You may cast nonland cards from your hand without paying their mana costs. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OmniscienceCastingEffect())); } @@ -116,19 +115,18 @@ class OmniscienceCastingEffect extends ContinuousEffectImpl { class IsBeingCastFromHandCondition implements Condition { - @Override - public boolean apply(Game game, Ability source) { + @Override + public boolean apply(Game game, Ability source) { MageObject object = game.getObject(source.getSourceId()); - if(object instanceof Spell) { - Spell spell = (Spell) object; - return spell != null && spell.getFromZone() == Zone.HAND; - } - if(object instanceof Card) { - Card card = (Card)object; - return game.getPlayer(card.getOwnerId()).getHand().get(card.getId(), game) != null; - } - - return false; - } + if (object instanceof SplitCardHalf) { + UUID splitCardId = ((Card) object).getMainCard().getId(); + object = game.getObject(splitCardId); + } + if (object instanceof Spell) { + Spell spell = (Spell) object; + return spell.getFromZone() == Zone.HAND; + } + return false; + } } From 5468c1dede91ed529ad61f79e03ca454f5087130 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sun, 19 Jul 2015 23:53:01 -0500 Subject: [PATCH 105/375] Implemented ~44 cards. Added +2/+2 counters. --- .../mage/sets/alarareborn/MadrushCyclops.java | 144 ++-- .../mage/sets/alliances/FloodwaterDam.java | 52 ++ .../sets/alliances/PhyrexianWarBeast.java | 70 ++ .../mage/sets/apocalypse/SqueesEmbrace.java | 80 +++ .../TokenAndCounters/GoldToken.java | 104 ++- .../mage/sets/exodus/ReapingTheRewards.java | 65 ++ .../src/mage/sets/futuresight/AvenAugur.java | 80 +++ .../sets/futuresight/EmblemOfTheWarmind.java | 78 +++ .../sets/futuresight/GoldmeadowLookout.java | 94 +++ .../sets/futuresight/HenchfiendOfUkor.java | 74 +++ .../mage/sets/futuresight/JudgeUnworthy.java | 108 +++ .../mage/sets/futuresight/LeadenFists.java | 85 +++ .../mage/sets/futuresight/MarshalingCry.java | 77 +++ .../mage/sets/futuresight/Saltskitter.java | 72 ++ .../mage/sets/futuresight/SpiritEnDal.java | 73 ++ .../src/mage/sets/homelands/BaronSengir.java | 52 ++ .../src/mage/sets/homelands/Renewal.java | 72 ++ .../src/mage/sets/iceage/DanceOfTheDead.java | 623 +++++++++--------- .../src/mage/sets/iceage/DwarvenArmory.java | 76 +++ .../mage/sets/invasion/TreefolkHealer.java | 76 +++ .../mage/sets/judgment/AnuridBrushhopper.java | 70 ++ .../src/mage/sets/legions/GoblinFirebug.java | 71 ++ .../src/mage/sets/lorwyn/MistbindClique.java | 236 ++++--- .../src/mage/sets/lorwyn/NovaChaser.java | 67 ++ .../src/mage/sets/lorwyn/ThoughtweftTrio.java | 77 +++ .../src/mage/sets/lorwyn/TriclopeanSight.java | 89 +++ .../mage/sets/mastersedition/BaronSengir.java | 90 +++ .../mastersedition/PhyrexianWarBeast.java | 54 ++ .../sets/masterseditioniv/FloodwaterDam.java | 84 +++ .../sets/masterseditioniv/FoulSpirit.java | 75 +++ .../sets/mercadianmasques/Sustenance.java | 70 ++ .../mercadianmasques/TerritorialDispute.java | 110 ++++ .../mage/sets/mirrodin/VulshokGauntlets.java | 122 ++++ .../sets/morningtide/FinalStingFaerie.java | 80 +++ .../morningtide/OrderOfTheGoldenCricket.java | 73 ++ .../sets/onslaught/DwarvenBlastminer.java | 78 +++ .../mage/sets/onslaught/WretchedAnurid.java | 74 +++ .../sets/planarchaos/DreamscapeArtist.java | 83 +++ .../mage/sets/portalsecondage/FoulSpirit.java | 54 ++ .../src/mage/sets/prophecy/AuraFracture.java | 78 +++ .../src/mage/sets/prophecy/BogElemental.java | 84 +++ .../src/mage/sets/prophecy/Excavation.java | 70 ++ .../src/mage/sets/prophecy/FaultRiders.java | 81 +++ .../src/mage/sets/prophecy/GulfSquid.java | 69 ++ .../mage/sets/prophecy/StormwatchEagle.java | 73 ++ .../mage/sets/prophecy/TrenchingSteed.java | 72 ++ .../mage/sets/prophecy/TroubledHealer.java | 76 +++ .../src/mage/sets/tempest/Sarcomancy.java | 148 ++--- .../src/mage/sets/timespiral/HerdGnarr.java | 73 ++ .../mage/sets/urzassaga/ArgothianWurm.java | 115 ++++ .../src/mage/sets/urzassaga/MishrasHelix.java | 84 +++ Mage.Sets/src/mage/sets/visions/ArmyAnts.java | 75 +++ .../mage/sets/weatherlight/PsychicVortex.java | 108 +++ Mage/src/mage/counters/CounterType.java | 3 + 54 files changed, 4390 insertions(+), 631 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/alliances/FloodwaterDam.java create mode 100644 Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/SqueesEmbrace.java create mode 100644 Mage.Sets/src/mage/sets/exodus/ReapingTheRewards.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/AvenAugur.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/EmblemOfTheWarmind.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/GoldmeadowLookout.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/HenchfiendOfUkor.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/JudgeUnworthy.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/LeadenFists.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/MarshalingCry.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/Saltskitter.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/SpiritEnDal.java create mode 100644 Mage.Sets/src/mage/sets/homelands/BaronSengir.java create mode 100644 Mage.Sets/src/mage/sets/homelands/Renewal.java create mode 100644 Mage.Sets/src/mage/sets/iceage/DwarvenArmory.java create mode 100644 Mage.Sets/src/mage/sets/invasion/TreefolkHealer.java create mode 100644 Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java create mode 100644 Mage.Sets/src/mage/sets/legions/GoblinFirebug.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/NovaChaser.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/ThoughtweftTrio.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/TriclopeanSight.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/BaronSengir.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/FloodwaterDam.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/Sustenance.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/TerritorialDispute.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java create mode 100644 Mage.Sets/src/mage/sets/morningtide/FinalStingFaerie.java create mode 100644 Mage.Sets/src/mage/sets/morningtide/OrderOfTheGoldenCricket.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/DwarvenBlastminer.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/WretchedAnurid.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/DreamscapeArtist.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/FoulSpirit.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/AuraFracture.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/BogElemental.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/Excavation.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/FaultRiders.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/GulfSquid.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/StormwatchEagle.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/TrenchingSteed.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/TroubledHealer.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/HerdGnarr.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/ArgothianWurm.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/MishrasHelix.java create mode 100644 Mage.Sets/src/mage/sets/visions/ArmyAnts.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/PsychicVortex.java diff --git a/Mage.Sets/src/mage/sets/alarareborn/MadrushCyclops.java b/Mage.Sets/src/mage/sets/alarareborn/MadrushCyclops.java index 952c829ce4c..63c01ca52dc 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/MadrushCyclops.java +++ b/Mage.Sets/src/mage/sets/alarareborn/MadrushCyclops.java @@ -1,71 +1,73 @@ -/* - * 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.alarareborn; - -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.continuous.GainAbilityControlledEffect; -import mage.abilities.keyword.HasteAbility; -import mage.cards.CardImpl; -import mage.filter.common.FilterCreaturePermanent; - -/** - * - * @author Loki - */ -public class MadrushCyclops extends CardImpl { - - public MadrushCyclops (UUID ownerId) { - super(ownerId, 119, "Madrush Cyclops", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{B}{R}{G}"); - this.expansionSetCode = "ARB"; - this.subtype.add("Cyclops"); - this.subtype.add("Warrior"); - - - - this.power = new MageInt(3); - this.toughness = new MageInt(4); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()))); - } - - public MadrushCyclops (final MadrushCyclops card) { - super(card); - } - - @Override - public MadrushCyclops copy() { - return new MadrushCyclops(this); - } - -} +/* + * 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.alarareborn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author Loki + */ +public class MadrushCyclops extends CardImpl { + + public MadrushCyclops (UUID ownerId) { + super(ownerId, 119, "Madrush Cyclops", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{B}{R}{G}"); + this.expansionSetCode = "ARB"; + this.subtype.add("Cyclops"); + this.subtype.add("Warrior"); + + + + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Creatures you control have haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()))); + } + + public MadrushCyclops (final MadrushCyclops card) { + super(card); + } + + @Override + public MadrushCyclops copy() { + return new MadrushCyclops(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/alliances/FloodwaterDam.java b/Mage.Sets/src/mage/sets/alliances/FloodwaterDam.java new file mode 100644 index 00000000000..ae4e16a926f --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/FloodwaterDam.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class FloodwaterDam extends mage.sets.masterseditioniv.FloodwaterDam { + + public FloodwaterDam(UUID ownerId) { + super(ownerId); + this.cardNumber = 161; + this.expansionSetCode = "ALL"; + } + + public FloodwaterDam(final FloodwaterDam card) { + super(card); + } + + @Override + public FloodwaterDam copy() { + return new FloodwaterDam(this); + } +} diff --git a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast.java b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast.java new file mode 100644 index 00000000000..552835b9017 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast.java @@ -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.alliances; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class PhyrexianWarBeast extends CardImpl { + + public PhyrexianWarBeast(UUID ownerId) { + super(ownerId, 169, "Phyrexian War Beast", Rarity.COMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + this.expansionSetCode = "ALL"; + this.subtype.add("Beast"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // When Phyrexian War Beast leaves the battlefield, sacrifice a land and Phyrexian War Beast deals 1 damage to you. + Ability ability = new LeavesBattlefieldTriggeredAbility(new SacrificeTargetEffect(), false); + ability.addEffect(new DamageControllerEffect(1)); + ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); + this.addAbility(ability); + } + + public PhyrexianWarBeast(final PhyrexianWarBeast card) { + super(card); + } + + @Override + public PhyrexianWarBeast copy() { + return new PhyrexianWarBeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/SqueesEmbrace.java b/Mage.Sets/src/mage/sets/apocalypse/SqueesEmbrace.java new file mode 100644 index 00000000000..15236cb021c --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/SqueesEmbrace.java @@ -0,0 +1,80 @@ +/* + * 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.abilities.Ability; +import mage.abilities.common.DiesAttachedTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnToHandAttachedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class SqueesEmbrace extends CardImpl { + + public SqueesEmbrace(UUID ownerId) { + super(ownerId, 122, "Squee's Embrace", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{R}{W}"); + this.expansionSetCode = "APC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +2/+2. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield))); + + // When enchanted creature dies, return that card to its owner's hand. + this.addAbility(new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted creature")); + } + + public SqueesEmbrace(final SqueesEmbrace card) { + super(card); + } + + @Override + public SqueesEmbrace copy() { + return new SqueesEmbrace(this); + } +} diff --git a/Mage.Sets/src/mage/sets/bornofthegods/TokenAndCounters/GoldToken.java b/Mage.Sets/src/mage/sets/bornofthegods/TokenAndCounters/GoldToken.java index 353b51e49a1..cfb620594f3 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/TokenAndCounters/GoldToken.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/TokenAndCounters/GoldToken.java @@ -1,53 +1,51 @@ -/* - * 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.bornofthegods.TokenAndCounters; - -import mage.abilities.Ability; -import mage.abilities.costs.common.SacrificeSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; -import mage.abilities.mana.SimpleManaAbility; -import mage.choices.ChoiceColor; -import mage.constants.CardType; -import mage.constants.Zone; -import mage.game.permanent.token.Token; - -/** - * - * @author LevelX2 - */ -public class GoldToken extends Token { - - public GoldToken() { - super("Gold", "colorless artifact token named Gold onto the battlefield. It has \"Sacrifice this artifact: Add one mana of any color to your mana pool.\""); - this.setOriginalExpansionSetCode("BNG"); - cardType.add(CardType.ARTIFACT); - - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), new SacrificeSourceCost())); - } -} +/* + * 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.bornofthegods.TokenAndCounters; + +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.permanent.token.Token; + +/** + * + * @author LevelX2 + */ +public class GoldToken extends Token { + + public GoldToken() { + super("Gold", "colorless artifact token named Gold onto the battlefield. It has \"Sacrifice this artifact: Add one mana of any color to your mana pool.\""); + this.setOriginalExpansionSetCode("BNG"); + cardType.add(CardType.ARTIFACT); + + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), new SacrificeSourceCost())); + } +} diff --git a/Mage.Sets/src/mage/sets/exodus/ReapingTheRewards.java b/Mage.Sets/src/mage/sets/exodus/ReapingTheRewards.java new file mode 100644 index 00000000000..e1cd5b7f455 --- /dev/null +++ b/Mage.Sets/src/mage/sets/exodus/ReapingTheRewards.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.exodus; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.BuybackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class ReapingTheRewards extends CardImpl { + + public ReapingTheRewards(UUID ownerId) { + super(ownerId, 16, "Reaping the Rewards", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}"); + this.expansionSetCode = "EXO"; + + // Buyback-Sacrifice a land. + this.addAbility(new BuybackAbility(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent())))); + + // You gain 2 life. + this.getSpellAbility().addEffect(new GainLifeEffect(2)); + } + + public ReapingTheRewards(final ReapingTheRewards card) { + super(card); + } + + @Override + public ReapingTheRewards copy() { + return new ReapingTheRewards(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/AvenAugur.java b/Mage.Sets/src/mage/sets/futuresight/AvenAugur.java new file mode 100644 index 00000000000..ba9edfe7fd4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/AvenAugur.java @@ -0,0 +1,80 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class AvenAugur extends CardImpl { + + public AvenAugur(UUID ownerId) { + super(ownerId, 32, "Aven Augur", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Bird"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Sacrifice Aven Augur: Return up to two target creatures to their owners' hands. Activate this ability only during your upkeep. + Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, + new ReturnToHandTargetEffect(), + new SacrificeSourceCost(), + new IsStepCondition(PhaseStep.UPKEEP), + null); + ability.addTarget(new TargetCreaturePermanent(0, 2)); + this.addAbility(ability); + } + + public AvenAugur(final AvenAugur card) { + super(card); + } + + @Override + public AvenAugur copy() { + return new AvenAugur(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/EmblemOfTheWarmind.java b/Mage.Sets/src/mage/sets/futuresight/EmblemOfTheWarmind.java new file mode 100644 index 00000000000..68a667d8a1a --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/EmblemOfTheWarmind.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.futuresight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class EmblemOfTheWarmind extends CardImpl { + + public EmblemOfTheWarmind(UUID ownerId) { + super(ownerId, 112, "Emblem of the Warmind", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Aura"); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Creatures you control have haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("creatures")))); + } + + public EmblemOfTheWarmind(final EmblemOfTheWarmind card) { + super(card); + } + + @Override + public EmblemOfTheWarmind copy() { + return new EmblemOfTheWarmind(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/GoldmeadowLookout.java b/Mage.Sets/src/mage/sets/futuresight/GoldmeadowLookout.java new file mode 100644 index 00000000000..c3471c3316f --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/GoldmeadowLookout.java @@ -0,0 +1,94 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.permanent.token.Token; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class GoldmeadowLookout extends CardImpl { + + public GoldmeadowLookout(UUID ownerId) { + super(ownerId, 22, "Goldmeadow Lookout", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Kithkin"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {W}, {tap}, Discard a card: Put a 1/1 white Kithkin Soldier creature token named Goldmeadow Harrier onto the battlefield. It has "{W}, {tap}: Tap target creature." + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GoldmeadowHarrierToken()), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + public GoldmeadowLookout(final GoldmeadowLookout card) { + super(card); + } + + @Override + public GoldmeadowLookout copy() { + return new GoldmeadowLookout(this); + } +} + +class GoldmeadowHarrierToken extends Token { + + public GoldmeadowHarrierToken() { + super("Goldmeadow Harrier", "1/1 white Kithkin Soldier creature token named Goldmeadow Harrier with \"{W}, {tap}: Tap target creature.\""); + this.setOriginalExpansionSetCode("FUT"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add("Kithkin"); + subtype.add("Soldier"); + power = new MageInt(1); + toughness = new MageInt(1); + + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/futuresight/HenchfiendOfUkor.java b/Mage.Sets/src/mage/sets/futuresight/HenchfiendOfUkor.java new file mode 100644 index 00000000000..e6069dddbea --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/HenchfiendOfUkor.java @@ -0,0 +1,74 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.EchoAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class HenchfiendOfUkor extends CardImpl { + + public HenchfiendOfUkor(UUID ownerId) { + super(ownerId, 117, "Henchfiend of Ukor", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Ogre"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Echo {1}{B} + this.addAbility(new EchoAbility("{1}{B}")); + + // {BR}: Henchfiend of Ukor gets +1/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{B/R}"))); + } + + public HenchfiendOfUkor(final HenchfiendOfUkor card) { + super(card); + } + + @Override + public HenchfiendOfUkor copy() { + return new HenchfiendOfUkor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/JudgeUnworthy.java b/Mage.Sets/src/mage/sets/futuresight/JudgeUnworthy.java new file mode 100644 index 00000000000..f233e07da66 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/JudgeUnworthy.java @@ -0,0 +1,108 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetAttackingOrBlockingCreature; + +/** + * + * @author fireshoes + */ +public class JudgeUnworthy extends CardImpl { + + public JudgeUnworthy(UUID ownerId) { + super(ownerId, 9, "Judge Unworthy", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "FUT"; + + // Choose target attacking or blocking creature. Scry 3, then reveal the top card of your library. Judge Unworthy deals damage equal to that card's converted mana cost to that creature. + this.getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature()); + Effect effect = new ScryEffect(3); + effect.setText("Choose target attacking or blocking creature. Scry 3"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addEffect(new JudgeUnworthyEffect()); + } + + public JudgeUnworthy(final JudgeUnworthy card) { + super(card); + } + + @Override + public JudgeUnworthy copy() { + return new JudgeUnworthy(this); + } +} + +class JudgeUnworthyEffect extends OneShotEffect { + + public JudgeUnworthyEffect() { + super(Outcome.Damage); + this.staticText = ", then reveal the top card of your library. {this} deals damage equal to that card's converted mana cost to that creature"; + } + + public JudgeUnworthyEffect(final JudgeUnworthyEffect effect) { + super(effect); + } + + @Override + public JudgeUnworthyEffect copy() { + return new JudgeUnworthyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Card sourceCard = game.getCard(source.getSourceId()); + if (sourceCard != null && controller != null) { + if (controller.getLibrary().size() > 0) { + Card card = controller.getLibrary().getFromTop(game); + controller.revealCards(sourceCard.getName(), new CardsImpl(card), game); + Permanent targetCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source)); + if (targetCreature != null) { + targetCreature.damage(card.getManaCost().convertedManaCost(), source.getSourceId(), game, false, true); + return true; + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/LeadenFists.java b/Mage.Sets/src/mage/sets/futuresight/LeadenFists.java new file mode 100644 index 00000000000..d333589ef19 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/LeadenFists.java @@ -0,0 +1,85 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class LeadenFists extends CardImpl { + + public LeadenFists(UUID ownerId) { + super(ownerId, 38, "Leaden Fists", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Aura"); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Neutral)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +3/+3 and doesn't untap during its controller's untap step. + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield)); + Effect effect = new DontUntapInControllersUntapStepEnchantedEffect(); + effect.setText("and doesn't untap during its controller's untap step"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public LeadenFists(final LeadenFists card) { + super(card); + } + + @Override + public LeadenFists copy() { + return new LeadenFists(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/MarshalingCry.java b/Mage.Sets/src/mage/sets/futuresight/MarshalingCry.java new file mode 100644 index 00000000000..be54d903931 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/MarshalingCry.java @@ -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.futuresight; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.keyword.FlashbackAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TimingRule; + +/** + * + * @author fireshoes + */ +public class MarshalingCry extends CardImpl { + + public MarshalingCry(UUID ownerId) { + super(ownerId, 13, "Marshaling Cry", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{W}{W}"); + this.expansionSetCode = "FUT"; + + // Creatures you control get +1/+1 and gain vigilance until end of turn. + Effect effect = new BoostControlledEffect(1, 1, Duration.EndOfTurn); + effect.setText("Creatures you control get +1/+1"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and vigilance until end of turn"); + this.getSpellAbility().addEffect(effect); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + + // Flashback {3}{W} + this.addAbility(new FlashbackAbility(new ManaCostsImpl("{3}{W}"), TimingRule.SORCERY)); + } + + public MarshalingCry(final MarshalingCry card) { + super(card); + } + + @Override + public MarshalingCry copy() { + return new MarshalingCry(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/Saltskitter.java b/Mage.Sets/src/mage/sets/futuresight/Saltskitter.java new file mode 100644 index 00000000000..70f9bc4bd43 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/Saltskitter.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.ExileReturnToBattlefieldOwnerNextEndStepEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author fireshoes + */ +public class Saltskitter extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("another creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public Saltskitter(UUID ownerId) { + super(ownerId, 14, "Saltskitter", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Wurm"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Whenever another creature enters the battlefield, exile Saltskitter. Return Saltskitter to the battlefield under its owner's control at the beginning of the next end step. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new ExileReturnToBattlefieldOwnerNextEndStepEffect(), filter)); + } + + public Saltskitter(final Saltskitter card) { + super(card); + } + + @Override + public Saltskitter copy() { + return new Saltskitter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/SpiritEnDal.java b/Mage.Sets/src/mage/sets/futuresight/SpiritEnDal.java new file mode 100644 index 00000000000..4a225849ea3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/SpiritEnDal.java @@ -0,0 +1,73 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.ForecastAbility; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class SpiritEnDal extends CardImpl { + + public SpiritEnDal(UUID ownerId) { + super(ownerId, 17, "Spirit en-Dal", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Spirit"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Shadow + this.addAbility(ShadowAbility.getInstance()); + + // Forecast - {1}{W}, Reveal Spirit en-Dal from your hand: Target creature gains shadow until end of turn. + Ability ability = new ForecastAbility(new GainAbilityTargetEffect(ShadowAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{1}{W}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public SpiritEnDal(final SpiritEnDal card) { + super(card); + } + + @Override + public SpiritEnDal copy() { + return new SpiritEnDal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/BaronSengir.java b/Mage.Sets/src/mage/sets/homelands/BaronSengir.java new file mode 100644 index 00000000000..1acc37a4fdc --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/BaronSengir.java @@ -0,0 +1,52 @@ +/* + * 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.homelands; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class BaronSengir extends mage.sets.mastersedition.BaronSengir { + + public BaronSengir(UUID ownerId) { + super(ownerId); + this.cardNumber = 1; + this.expansionSetCode = "HML"; + } + + public BaronSengir(final BaronSengir card) { + super(card); + } + + @Override + public BaronSengir copy() { + return new BaronSengir(this); + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/Renewal.java b/Mage.Sets/src/mage/sets/homelands/Renewal.java new file mode 100644 index 00000000000..eea9df9d5cc --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/Renewal.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.homelands; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class Renewal extends CardImpl { + + public Renewal(UUID ownerId) { + super(ownerId, 66, "Renewal", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}"); + this.expansionSetCode = "HML"; + + // As an additional cost to cast Renewal, sacrifice a land. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); + + // Search your library for a basic land card and put that card onto the battlefield. Then shuffle your library. + this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterBasicLandCard()))); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Renewal(final Renewal card) { + super(card); + } + + @Override + public Renewal copy() { + return new Renewal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/DanceOfTheDead.java b/Mage.Sets/src/mage/sets/iceage/DanceOfTheDead.java index 8c694ba376d..5f308525d87 100644 --- a/Mage.Sets/src/mage/sets/iceage/DanceOfTheDead.java +++ b/Mage.Sets/src/mage/sets/iceage/DanceOfTheDead.java @@ -1,313 +1,312 @@ -/* - * 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.iceage; - -import java.util.UUID; -import mage.MageObjectReference; -import mage.abilities.Ability; -import mage.abilities.Mode; -import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.common.LeavesBattlefieldTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.common.SourceOnBattlefieldCondition; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DoIfCostPaid; -import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; -import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; -import mage.abilities.effects.common.UntapEnchantedEffect; -import mage.abilities.effects.common.continuous.BoostEnchantedEffect; -import mage.abilities.effects.common.continuous.SourceEffect; -import mage.abilities.keyword.EnchantAbility; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.SubLayer; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.PermanentIdPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInGraveyard; -import mage.target.common.TargetCreaturePermanent; - -/** - * - * @author LevelX2 - */ -public class DanceOfTheDead extends CardImpl { - - public DanceOfTheDead(UUID ownerId) { - super(ownerId, 6, "Dance of the Dead", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); - this.expansionSetCode = "ICE"; - this.subtype.add("Aura"); - - - // Enchant creature card in a graveyard - TargetCardInGraveyard auraTarget = new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard")); - this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new DanceOfTheDeadAttachEffect(Outcome.PutCreatureInPlay)); - Ability enchantAbility = new EnchantAbility(auraTarget.getTargetName()); - this.addAbility(enchantAbility); - // When Dance of the Dead enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with Dance of the Dead." Put enchanted creature card to the battlefield tapped under your control and attach Dance of the Dead to it. When Dance of the Dead leaves the battlefield, that creature's controller sacrifices it. - Ability ability = new ConditionalTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DanceOfTheDeadReAttachEffect(), false), - SourceOnBattlefieldCondition.getInstance(), - "When {this} enters the battlefield, if it's on the battlefield, it loses \"enchant creature card in a graveyard\" and gains \"enchant creature put onto the battlefield with {this}.\" Return enchanted creature card to the battlefield under your control and attach {this} to it."); - ability.addEffect(new DanceOfTheDeadChangeAbilityEffect()); - this.addAbility(ability); - this.addAbility(new LeavesBattlefieldTriggeredAbility(new DanceOfTheDeadLeavesBattlefieldTriggeredEffect(), false)); - - // Enchanted creature gets +1/+1 and doesn't untap during its controller's untap step. - ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)); - Effect effect = new DontUntapInControllersUntapStepEnchantedEffect(); - effect.setText("and doesn't untap during its controller's untap step"); - ability.addEffect(effect); - this.addAbility(ability); - - // At the beginning of the upkeep of enchanted creature's controller, that player may pay {1}{B}. If he or she does, untap that creature. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DanceOfTheDeadDoIfCostPaidEffect(), TargetController.CONTROLLER_ATTACHED_TO, false)); - - } - - public DanceOfTheDead(final DanceOfTheDead card) { - super(card); - } - - @Override - public DanceOfTheDead copy() { - return new DanceOfTheDead(this); - } -} - -class DanceOfTheDeadReAttachEffect extends OneShotEffect { - - public DanceOfTheDeadReAttachEffect() { - super(Outcome.Benefit); - this.staticText = "Return enchanted creature card to the battlefield under your control and attach {this} to it"; - } - - public DanceOfTheDeadReAttachEffect(final DanceOfTheDeadReAttachEffect effect) { - super(effect); - } - - @Override - public DanceOfTheDeadReAttachEffect copy() { - return new DanceOfTheDeadReAttachEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - Permanent enchantment = game.getPermanent(source.getSourceId()); - - if (controller != null && enchantment != null) { - Card cardInGraveyard = game.getCard(enchantment.getAttachedTo()); - if (cardInGraveyard == null) { - return true; - } - - // put card into play - controller.putOntoBattlefieldWithInfo(cardInGraveyard, game, Zone.GRAVEYARD, source.getSourceId(), true); - Permanent enchantedCreature = game.getPermanent(cardInGraveyard.getId()); - - FilterCreaturePermanent filter = new FilterCreaturePermanent("enchant creature put onto the battlefield with Dance of the Dead"); - filter.add(new PermanentIdPredicate(cardInGraveyard.getId())); - Target target = new TargetCreaturePermanent(filter); - //enchantAbility.setTargetName(target.getTargetName()); - if (enchantedCreature != null) { - target.addTarget(enchantedCreature.getId(), source, game); - enchantment.getSpellAbility().getTargets().clear(); - enchantment.getSpellAbility().getTargets().add(target); - enchantedCreature.addAttachment(enchantment.getId(), game); - } - return true; - } - - return false; - } -} - -class DanceOfTheDeadLeavesBattlefieldTriggeredEffect extends OneShotEffect { - - public DanceOfTheDeadLeavesBattlefieldTriggeredEffect() { - super(Outcome.Benefit); - this.staticText = "enchanted creature's controller sacrifices it"; - } - - public DanceOfTheDeadLeavesBattlefieldTriggeredEffect(final DanceOfTheDeadLeavesBattlefieldTriggeredEffect effect) { - super(effect); - } - - @Override - public DanceOfTheDeadLeavesBattlefieldTriggeredEffect copy() { - return new DanceOfTheDeadLeavesBattlefieldTriggeredEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (controller != null && sourcePermanent != null) { - if (sourcePermanent.getAttachedTo() != null) { - Permanent attachedTo = game.getPermanent(sourcePermanent.getAttachedTo()); - if (attachedTo != null) { - attachedTo.sacrifice(source.getSourceId(), game); - } - } - return true; - } - return false; - } -} - -class DanceOfTheDeadAttachEffect extends OneShotEffect { - - public DanceOfTheDeadAttachEffect(Outcome outcome) { - super(outcome); - } - - public DanceOfTheDeadAttachEffect(Outcome outcome, String rule) { - super(outcome); - staticText = rule; - } - - public DanceOfTheDeadAttachEffect(final DanceOfTheDeadAttachEffect effect) { - super(effect); - } - - @Override - public DanceOfTheDeadAttachEffect copy() { - return new DanceOfTheDeadAttachEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Card card = game.getCard(source.getFirstTarget()); - if (card != null && game.getState().getZone(source.getFirstTarget()).equals(Zone.GRAVEYARD)) { - // Card have no attachedTo attribute yet so write ref only to enchantment now - Permanent enchantment = game.getPermanent(source.getSourceId()); - if (enchantment != null) { - enchantment.attachTo(card.getId(), game); - } - return true; - } - return false; - } - -} - -class DanceOfTheDeadChangeAbilityEffect extends ContinuousEffectImpl implements SourceEffect { - - private final static Ability newAbility = new EnchantAbility("creature put onto the battlefield with Dance of the Dead"); - - static { - newAbility.setRuleAtTheTop(true); - } - - public DanceOfTheDeadChangeAbilityEffect() { - super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - staticText = "it loses \"enchant creature card in a graveyard\" and gains \"enchant creature put onto the battlefield with Dance of the Dead\""; - } - - - public DanceOfTheDeadChangeAbilityEffect(final DanceOfTheDeadChangeAbilityEffect effect) { - super(effect); - } - - @Override - public DanceOfTheDeadChangeAbilityEffect copy() { - return new DanceOfTheDeadChangeAbilityEffect(this); - } - - @Override - public void init(Ability source, Game game) { - super.init(source, game); - affectedObjectList.add(new MageObjectReference(source.getSourceId(), game)); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = affectedObjectList.get(0).getPermanent(game);; - if (permanent != null) { - Ability abilityToRemove = null; - for (Ability ability: permanent.getAbilities()) { - if (ability instanceof EnchantAbility) { - abilityToRemove = ability; - } - } - if (abilityToRemove != null) { - permanent.getAbilities().remove(abilityToRemove); - } - permanent.addAbility(newAbility, source.getSourceId(), game); - return true; - } - return false; - } -} - -class DanceOfTheDeadDoIfCostPaidEffect extends DoIfCostPaid { - - public DanceOfTheDeadDoIfCostPaidEffect() { - super(new UntapEnchantedEffect(), new ManaCostsImpl("{1}{B}")); - } - - public DanceOfTheDeadDoIfCostPaidEffect(final DanceOfTheDeadDoIfCostPaidEffect effect) { - super(effect); - } - - @Override - public DanceOfTheDeadDoIfCostPaidEffect copy() { - return new DanceOfTheDeadDoIfCostPaidEffect(this); - } - - @Override - protected Player getPayingPlayer(Game game, Ability source) { - Permanent attachment = game.getPermanent(source.getSourceId()); - Permanent attachedTo = game.getPermanent(attachment.getAttachedTo()); - return game.getPlayer(attachedTo.getControllerId()); - } - - @Override - public String getText(Mode mode) { - return new StringBuilder("that player may ").append(getCostText()) - .append(". If he or she does, ").append(executingEffects.getText(mode)).toString(); - } +/* + * 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.iceage; + +import java.util.UUID; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.SourceOnBattlefieldCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.UntapEnchantedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.SourceEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.PermanentIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCardInGraveyard; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class DanceOfTheDead extends CardImpl { + + public DanceOfTheDead(UUID ownerId) { + super(ownerId, 6, "Dance of the Dead", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + this.expansionSetCode = "ICE"; + this.subtype.add("Aura"); + + + // Enchant creature card in a graveyard + TargetCardInGraveyard auraTarget = new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard")); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new DanceOfTheDeadAttachEffect(Outcome.PutCreatureInPlay)); + Ability enchantAbility = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(enchantAbility); + // When Dance of the Dead enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with Dance of the Dead." Put enchanted creature card to the battlefield tapped under your control and attach Dance of the Dead to it. When Dance of the Dead leaves the battlefield, that creature's controller sacrifices it. + Ability ability = new ConditionalTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new DanceOfTheDeadReAttachEffect(), false), + SourceOnBattlefieldCondition.getInstance(), + "When {this} enters the battlefield, if it's on the battlefield, it loses \"enchant creature card in a graveyard\" and gains \"enchant creature put onto the battlefield with {this}.\" Return enchanted creature card to the battlefield under your control and attach {this} to it."); + ability.addEffect(new DanceOfTheDeadChangeAbilityEffect()); + this.addAbility(ability); + this.addAbility(new LeavesBattlefieldTriggeredAbility(new DanceOfTheDeadLeavesBattlefieldTriggeredEffect(), false)); + + // Enchanted creature gets +1/+1 and doesn't untap during its controller's untap step. + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)); + Effect effect = new DontUntapInControllersUntapStepEnchantedEffect(); + effect.setText("and doesn't untap during its controller's untap step"); + ability.addEffect(effect); + this.addAbility(ability); + + // At the beginning of the upkeep of enchanted creature's controller, that player may pay {1}{B}. If he or she does, untap that creature. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DanceOfTheDeadDoIfCostPaidEffect(), TargetController.CONTROLLER_ATTACHED_TO, false)); + + } + + public DanceOfTheDead(final DanceOfTheDead card) { + super(card); + } + + @Override + public DanceOfTheDead copy() { + return new DanceOfTheDead(this); + } +} + +class DanceOfTheDeadReAttachEffect extends OneShotEffect { + + public DanceOfTheDeadReAttachEffect() { + super(Outcome.Benefit); + this.staticText = "Return enchanted creature card to the battlefield under your control and attach {this} to it"; + } + + public DanceOfTheDeadReAttachEffect(final DanceOfTheDeadReAttachEffect effect) { + super(effect); + } + + @Override + public DanceOfTheDeadReAttachEffect copy() { + return new DanceOfTheDeadReAttachEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent enchantment = game.getPermanent(source.getSourceId()); + + if (controller != null && enchantment != null) { + Card cardInGraveyard = game.getCard(enchantment.getAttachedTo()); + if (cardInGraveyard == null) { + return true; + } + + // put card into play + controller.putOntoBattlefieldWithInfo(cardInGraveyard, game, Zone.GRAVEYARD, source.getSourceId(), true); + Permanent enchantedCreature = game.getPermanent(cardInGraveyard.getId()); + + FilterCreaturePermanent filter = new FilterCreaturePermanent("enchant creature put onto the battlefield with Dance of the Dead"); + filter.add(new PermanentIdPredicate(cardInGraveyard.getId())); + Target target = new TargetCreaturePermanent(filter); + //enchantAbility.setTargetName(target.getTargetName()); + if (enchantedCreature != null) { + target.addTarget(enchantedCreature.getId(), source, game); + enchantment.getSpellAbility().getTargets().clear(); + enchantment.getSpellAbility().getTargets().add(target); + enchantedCreature.addAttachment(enchantment.getId(), game); + } + return true; + } + + return false; + } +} + +class DanceOfTheDeadLeavesBattlefieldTriggeredEffect extends OneShotEffect { + + public DanceOfTheDeadLeavesBattlefieldTriggeredEffect() { + super(Outcome.Benefit); + this.staticText = "enchanted creature's controller sacrifices it"; + } + + public DanceOfTheDeadLeavesBattlefieldTriggeredEffect(final DanceOfTheDeadLeavesBattlefieldTriggeredEffect effect) { + super(effect); + } + + @Override + public DanceOfTheDeadLeavesBattlefieldTriggeredEffect copy() { + return new DanceOfTheDeadLeavesBattlefieldTriggeredEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (controller != null && sourcePermanent != null) { + if (sourcePermanent.getAttachedTo() != null) { + Permanent attachedTo = game.getPermanent(sourcePermanent.getAttachedTo()); + if (attachedTo != null) { + attachedTo.sacrifice(source.getSourceId(), game); + } + } + return true; + } + return false; + } +} + +class DanceOfTheDeadAttachEffect extends OneShotEffect { + + public DanceOfTheDeadAttachEffect(Outcome outcome) { + super(outcome); + } + + public DanceOfTheDeadAttachEffect(Outcome outcome, String rule) { + super(outcome); + staticText = rule; + } + + public DanceOfTheDeadAttachEffect(final DanceOfTheDeadAttachEffect effect) { + super(effect); + } + + @Override + public DanceOfTheDeadAttachEffect copy() { + return new DanceOfTheDeadAttachEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Card card = game.getCard(source.getFirstTarget()); + if (card != null && game.getState().getZone(source.getFirstTarget()).equals(Zone.GRAVEYARD)) { + // Card have no attachedTo attribute yet so write ref only to enchantment now + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (enchantment != null) { + enchantment.attachTo(card.getId(), game); + } + return true; + } + return false; + } + +} + +class DanceOfTheDeadChangeAbilityEffect extends ContinuousEffectImpl implements SourceEffect { + + private final static Ability newAbility = new EnchantAbility("creature put onto the battlefield with Dance of the Dead"); + + static { + newAbility.setRuleAtTheTop(true); + } + + public DanceOfTheDeadChangeAbilityEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + staticText = "it loses \"enchant creature card in a graveyard\" and gains \"enchant creature put onto the battlefield with Dance of the Dead\""; + } + + + public DanceOfTheDeadChangeAbilityEffect(final DanceOfTheDeadChangeAbilityEffect effect) { + super(effect); + } + + @Override + public DanceOfTheDeadChangeAbilityEffect copy() { + return new DanceOfTheDeadChangeAbilityEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + affectedObjectList.add(new MageObjectReference(source.getSourceId(), game)); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = affectedObjectList.get(0).getPermanent(game);; + if (permanent != null) { + Ability abilityToRemove = null; + for (Ability ability: permanent.getAbilities()) { + if (ability instanceof EnchantAbility) { + abilityToRemove = ability; + } + } + if (abilityToRemove != null) { + permanent.getAbilities().remove(abilityToRemove); + } + permanent.addAbility(newAbility, source.getSourceId(), game); + return true; + } + return false; + } +} + +class DanceOfTheDeadDoIfCostPaidEffect extends DoIfCostPaid { + + public DanceOfTheDeadDoIfCostPaidEffect() { + super(new UntapEnchantedEffect(), new ManaCostsImpl("{1}{B}")); + } + + public DanceOfTheDeadDoIfCostPaidEffect(final DanceOfTheDeadDoIfCostPaidEffect effect) { + super(effect); + } + + @Override + public DanceOfTheDeadDoIfCostPaidEffect copy() { + return new DanceOfTheDeadDoIfCostPaidEffect(this); + } + + @Override + protected Player getPayingPlayer(Game game, Ability source) { + Permanent attachment = game.getPermanent(source.getSourceId()); + Permanent attachedTo = game.getPermanent(attachment.getAttachedTo()); + return game.getPlayer(attachedTo.getControllerId()); + } + + @Override + public String getText(Mode mode) { + return new StringBuilder("that player may ").append(getCostText()) + .append(". If he or she does, ").append(executingEffects.getText(mode)).toString(); + } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/iceage/DwarvenArmory.java b/Mage.Sets/src/mage/sets/iceage/DwarvenArmory.java new file mode 100644 index 00000000000..4cc9dedfa91 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/DwarvenArmory.java @@ -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.iceage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class DwarvenArmory extends CardImpl { + + public DwarvenArmory(UUID ownerId) { + super(ownerId, 182, "Dwarven Armory", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}"); + this.expansionSetCode = "ICE"; + + // {2}, Sacrifice a land: Put a +2/+2 counter on target creature. Activate this ability only during any upkeep step. + Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, + new AddCountersTargetEffect(CounterType.P2P2.createInstance()), + new ManaCostsImpl("{2}"), + new IsStepCondition(PhaseStep.UPKEEP, false), + null); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent()))); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public DwarvenArmory(final DwarvenArmory card) { + super(card); + } + + @Override + public DwarvenArmory copy() { + return new DwarvenArmory(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/TreefolkHealer.java b/Mage.Sets/src/mage/sets/invasion/TreefolkHealer.java new file mode 100644 index 00000000000..3f20252cb18 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/TreefolkHealer.java @@ -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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class TreefolkHealer extends CardImpl { + + public TreefolkHealer(UUID ownerId) { + super(ownerId, 218, "Treefolk Healer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}"); + this.expansionSetCode = "INV"; + this.subtype.add("Treefolk"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // {2}{W}, {tap}: Prevent the next 2 damage that would be dealt to target creature or player this turn. + Ability ability = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), + new ManaCostsImpl("{2}{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public TreefolkHealer(final TreefolkHealer card) { + super(card); + } + + @Override + public TreefolkHealer copy() { + return new TreefolkHealer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java b/Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java new file mode 100644 index 00000000000..e0685694697 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java @@ -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.judgment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.effects.common.ExileReturnToBattlefieldOwnerNextEndStepEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.target.common.TargetCardInHand; + +/** + * + * @author fireshoes + */ +public class AnuridBrushhopper extends CardImpl { + + public AnuridBrushhopper(UUID ownerId) { + super(ownerId, 137, "Anurid Brushhopper", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}{W}"); + this.expansionSetCode = "JUD"; + this.subtype.add("Frog"); + this.subtype.add("Beast"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Discard two cards: Exile Anurid Brushhopper. Return it to the battlefield under its owner's control at the beginning of the next end step. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new ExileReturnToBattlefieldOwnerNextEndStepEffect(), + new DiscardTargetCost(new TargetCardInHand(2, new FilterCard("two cards"))))); + } + + public AnuridBrushhopper(final AnuridBrushhopper card) { + super(card); + } + + @Override + public AnuridBrushhopper copy() { + return new AnuridBrushhopper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legions/GoblinFirebug.java b/Mage.Sets/src/mage/sets/legions/GoblinFirebug.java new file mode 100644 index 00000000000..907f6577eb9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legions/GoblinFirebug.java @@ -0,0 +1,71 @@ +/* + * 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.legions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class GoblinFirebug extends CardImpl { + + public GoblinFirebug(UUID ownerId) { + super(ownerId, 98, "Goblin Firebug", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "LGN"; + this.subtype.add("Goblin"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Goblin Firebug leaves the battlefield, sacrifice a land. + Effect effect = new SacrificeTargetEffect(); + effect.setText("sacrifice a land"); + Ability ability = new LeavesBattlefieldTriggeredAbility(effect, false); + ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); + this.addAbility(ability); + } + + public GoblinFirebug(final GoblinFirebug card) { + super(card); + } + + @Override + public GoblinFirebug copy() { + return new GoblinFirebug(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java b/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java index 3809f1350bc..b2efb5c1b1c 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java +++ b/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java @@ -1,120 +1,116 @@ -/* - * 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.lorwyn; - -import java.util.UUID; - -import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.common.ZoneChangeTriggeredAbility; -import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; -import mage.abilities.keyword.ChampionAbility; -import mage.abilities.keyword.FlashAbility; -import mage.abilities.keyword.FlyingAbility; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.target.TargetPlayer; - -/** - * - * @author LevelX2 - */ -public class MistbindClique extends CardImpl { - - public MistbindClique(UUID ownerId) { - super(ownerId, 75, "Mistbind Clique", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}"); - this.expansionSetCode = "LRW"; - this.subtype.add("Faerie"); - this.subtype.add("Wizard"); - - this.power = new MageInt(4); - this.toughness = new MageInt(4); - - // Flash - this.addAbility(FlashAbility.getInstance()); - // Flying - this.addAbility(FlyingAbility.getInstance()); - // Champion a Faerie - this.addAbility(new ChampionAbility(this, "Faerie")); - // When a Faerie is championed with Mistbind Clique, tap all lands target player controls. - this.addAbility(new MistbindCliqueAbility()); - - - } - - public MistbindClique(final MistbindClique card) { - super(card); - } - - @Override - public MistbindClique copy() { - return new MistbindClique(this); - } -} - -class MistbindCliqueAbility extends ZoneChangeTriggeredAbility { - - public MistbindCliqueAbility() { - // ability has to trigger independant where the source object is now - super(Zone.ALL, Zone.BATTLEFIELD, Zone.EXILED, new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands")), "When a Faerie is championed with {this}, ", false); - this.addTarget(new TargetPlayer()); - } - - public MistbindCliqueAbility(MistbindCliqueAbility ability) { - super(ability); - } - - @Override - public MistbindCliqueAbility copy() { - return new MistbindCliqueAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getSourceId() != null && event.getSourceId().equals(getSourceId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent)event; - if (zEvent.getTarget() != null && zEvent.getTarget().hasSubtype("Faerie")) { - return true; - } - } - return false; - } -} +/* + * 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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.ZoneChangeTriggeredAbility; +import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; +import mage.abilities.keyword.ChampionAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.target.TargetPlayer; + +/** + * + * @author LevelX2 + */ +public class MistbindClique extends CardImpl { + + public MistbindClique(UUID ownerId) { + super(ownerId, 75, "Mistbind Clique", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Faerie"); + this.subtype.add("Wizard"); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flash + this.addAbility(FlashAbility.getInstance()); + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Champion a Faerie + this.addAbility(new ChampionAbility(this, "Faerie")); + // When a Faerie is championed with Mistbind Clique, tap all lands target player controls. + this.addAbility(new MistbindCliqueAbility()); + + + } + + public MistbindClique(final MistbindClique card) { + super(card); + } + + @Override + public MistbindClique copy() { + return new MistbindClique(this); + } +} + +class MistbindCliqueAbility extends ZoneChangeTriggeredAbility { + + public MistbindCliqueAbility() { + // ability has to trigger independant where the source object is now + super(Zone.ALL, Zone.BATTLEFIELD, Zone.EXILED, new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands")), "When a Faerie is championed with {this}, ", false); + this.addTarget(new TargetPlayer()); + } + + public MistbindCliqueAbility(MistbindCliqueAbility ability) { + super(ability); + } + + @Override + public MistbindCliqueAbility copy() { + return new MistbindCliqueAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getSourceId() != null && event.getSourceId().equals(getSourceId())) { + ZoneChangeEvent zEvent = (ZoneChangeEvent)event; + if (zEvent.getTarget() != null && zEvent.getTarget().hasSubtype("Faerie")) { + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/NovaChaser.java b/Mage.Sets/src/mage/sets/lorwyn/NovaChaser.java new file mode 100644 index 00000000000..a36f051d3c7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/NovaChaser.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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.ChampionAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class NovaChaser extends CardImpl { + + public NovaChaser(UUID ownerId) { + super(ownerId, 187, "Nova Chaser", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Elemental"); + this.subtype.add("Warrior"); + this.power = new MageInt(10); + this.toughness = new MageInt(2); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Champion an Elemental + this.addAbility(new ChampionAbility(this, "Elemental")); + } + + public NovaChaser(final NovaChaser card) { + super(card); + } + + @Override + public NovaChaser copy() { + return new NovaChaser(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/ThoughtweftTrio.java b/Mage.Sets/src/mage/sets/lorwyn/ThoughtweftTrio.java new file mode 100644 index 00000000000..0aefa5956e3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/ThoughtweftTrio.java @@ -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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; +import mage.abilities.keyword.ChampionAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ThoughtweftTrio extends CardImpl { + + public ThoughtweftTrio(UUID ownerId) { + super(ownerId, 44, "Thoughtweft Trio", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Kithkin"); + this.subtype.add("Soldier"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Champion a Kithkin + this.addAbility(new ChampionAbility(this, "Kithkin")); + + // Thoughtweft Trio can block any number of creatures. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(0))); + } + + public ThoughtweftTrio(final ThoughtweftTrio card) { + super(card); + } + + @Override + public ThoughtweftTrio copy() { + return new ThoughtweftTrio(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/TriclopeanSight.java b/Mage.Sets/src/mage/sets/lorwyn/TriclopeanSight.java new file mode 100644 index 00000000000..89883601195 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/TriclopeanSight.java @@ -0,0 +1,89 @@ +/* + * 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.lorwyn; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.UntapEnchantedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class TriclopeanSight extends CardImpl { + + public TriclopeanSight(UUID ownerId) { + super(ownerId, 45, "Triclopean Sight", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Aura"); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Neutral)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Triclopean Sight enters the battlefield, untap enchanted creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new UntapEnchantedEffect())); + + // Enchanted creature gets +1/+1 and has vigilance. + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1,1, Duration.WhileOnBattlefield)); + ability.addEffect(new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield)); + this.addAbility(ability); + } + + public TriclopeanSight(final TriclopeanSight card) { + super(card); + } + + @Override + public TriclopeanSight copy() { + return new TriclopeanSight(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/BaronSengir.java b/Mage.Sets/src/mage/sets/mastersedition/BaronSengir.java new file mode 100644 index 00000000000..b18a14d8f97 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/BaronSengir.java @@ -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.mastersedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesAndDealtDamageThisTurnTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.RegenerateTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class BaronSengir extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another Vampire"); + + static { + filter.add(new SubtypePredicate("Vampire")); + filter.add(new AnotherPredicate()); + } + + public BaronSengir(UUID ownerId) { + super(ownerId, 58, "Baron Sengir", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}{B}"); + this.expansionSetCode = "MED"; + this.supertype.add("Legendary"); + this.subtype.add("Vampire"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever a creature dealt damage by Baron Sengir this turn dies, put a +2/+2 counter on Baron Sengir. + this.addAbility(new DiesAndDealtDamageThisTurnTriggeredAbility(new AddCountersSourceEffect(CounterType.P2P2.createInstance()), false)); + + // {tap}: Regenerate another target Vampire. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateTargetEffect(), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent(1, 1, filter, true)); + this.addAbility(ability); + } + + public BaronSengir(final BaronSengir card) { + super(card); + } + + @Override + public BaronSengir copy() { + return new BaronSengir(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.java b/Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.java new file mode 100644 index 00000000000..67d8bff8d78 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.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.mastersedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class PhyrexianWarBeast extends mage.sets.alliances.PhyrexianWarBeast { + + public PhyrexianWarBeast(UUID ownerId) { + super(ownerId); + this.cardNumber = 162; + this.expansionSetCode = "MED"; + this.rarity = Rarity.UNCOMMON; + } + + public PhyrexianWarBeast(final PhyrexianWarBeast card) { + super(card); + } + + @Override + public PhyrexianWarBeast copy() { + return new PhyrexianWarBeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/FloodwaterDam.java b/Mage.Sets/src/mage/sets/masterseditioniv/FloodwaterDam.java new file mode 100644 index 00000000000..66466c4dc3b --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/FloodwaterDam.java @@ -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.masterseditioniv; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class FloodwaterDam extends CardImpl { + + private final UUID originalId; + + public FloodwaterDam(UUID ownerId) { + super(ownerId, 200, "Floodwater Dam", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "ME4"; + + // {X}{X}{1}, {tap}: Tap X target lands. + Effect effect = new TapTargetEffect(); + effect.setText("tap X target lands"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}{X}{1}")); + ability.addCost(new TapSourceCost()); + originalId = ability.getOriginalId(); + this.addAbility(ability); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability.getOriginalId().equals(originalId)){ + int xValue = ability.getManaCostsToPay().getX(); + ability.getTargets().clear(); + ability.addTarget(new TargetLandPermanent(xValue, xValue, new FilterLandPermanent(), false)); + } + } + + public FloodwaterDam(final FloodwaterDam card) { + super(card); + this.originalId = card.originalId; + } + + @Override + public FloodwaterDam copy() { + return new FloodwaterDam(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java b/Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java new file mode 100644 index 00000000000..bf83c7d77ad --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java @@ -0,0 +1,75 @@ +/* + * 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.masterseditioniv; + +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.SacrificeTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class FoulSpirit extends CardImpl { + + public FoulSpirit(UUID ownerId) { + super(ownerId, 81, "Foul Spirit", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "ME4"; + this.subtype.add("Spirit"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Foul Spirit enters the battlefield, sacrifice a land. + Effect effect = new SacrificeTargetEffect(); + effect.setText("sacrifice a land"); + Ability ability = new EntersBattlefieldTriggeredAbility(effect, false); + ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); + this.addAbility(ability); + } + + public FoulSpirit(final FoulSpirit card) { + super(card); + } + + @Override + public FoulSpirit copy() { + return new FoulSpirit(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Sustenance.java b/Mage.Sets/src/mage/sets/mercadianmasques/Sustenance.java new file mode 100644 index 00000000000..cb3e9f21445 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Sustenance.java @@ -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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Sustenance extends CardImpl { + + public Sustenance(UUID ownerId) { + super(ownerId, 278, "Sustenance", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + this.expansionSetCode = "MMQ"; + + // {1}, Sacrifice a land: Target creature gets +1/+1 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{1}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("land")))); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public Sustenance(final Sustenance card) { + super(card); + } + + @Override + public Sustenance copy() { + return new Sustenance(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/TerritorialDispute.java b/Mage.Sets/src/mage/sets/mercadianmasques/TerritorialDispute.java new file mode 100644 index 00000000000..8f5d15435a3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/TerritorialDispute.java @@ -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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class TerritorialDispute extends CardImpl { + + public TerritorialDispute(UUID ownerId) { + super(ownerId, 217, "Territorial Dispute", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}{R}"); + this.expansionSetCode = "MMQ"; + + // At the beginning of your upkeep, sacrifice Territorial Dispute unless you sacrifice a land. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, + new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))), + TargetController.YOU, + false)); + + // Players can't play lands. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new TerritorialDisputeEffect())); + } + + public TerritorialDispute(final TerritorialDispute card) { + super(card); + } + + @Override + public TerritorialDispute copy() { + return new TerritorialDispute(this); + } +} + +class TerritorialDisputeEffect extends ContinuousRuleModifyingEffectImpl { + + public TerritorialDisputeEffect() { + super(Duration.WhileOnBattlefield, Outcome.Neutral); + this.staticText = "Players can't play lands"; + } + + public TerritorialDisputeEffect(final TerritorialDisputeEffect effect) { + super(effect); + } + + @Override + public TerritorialDisputeEffect copy() { + return new TerritorialDisputeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.PLAY_LAND; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return true; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java b/Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java new file mode 100644 index 00000000000..d07b4de3224 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java @@ -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.mirrodin; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.ReplacementEffectImpl; +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.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author fireshoes + */ +public class VulshokGauntlets extends CardImpl { + + public VulshokGauntlets(UUID ownerId) { + super(ownerId, 273, "Vulshok Gauntlets", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "MRD"; + this.subtype.add("Equipment"); + + // Equipped creature gets +4/+2 and doesn't untap during its controller's untap step. + Effect effect = new BoostEquippedEffect(4, 2); + effect.setText("Equipped creature gets +4/+2"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new VulshokGauntletsEffect(); + effect.setText("and has doesn't untap during its controller's untap step"); + ability.addEffect(effect); + this.addAbility(ability); + + // Equip {3} + this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(3))); + } + + public VulshokGauntlets(final VulshokGauntlets card) { + super(card); + } + + @Override + public VulshokGauntlets copy() { + return new VulshokGauntlets(this); + } +} + +class VulshokGauntletsEffect extends ReplacementEffectImpl { + + public VulshokGauntletsEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "Equipped creature doesn't untap during its controller's untap step"; + } + + public VulshokGauntletsEffect(final VulshokGauntletsEffect effect) { + super(effect); + } + + @Override + public VulshokGauntletsEffect copy() { + return new VulshokGauntletsEffect(this); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.UNTAP; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (game.getTurn().getStepType() == PhaseStep.UNTAP) { + Permanent equipment = game.getPermanent(source.getSourceId()); + if (equipment != null && equipment.getAttachedTo() != null) { + Permanent equipped = game.getPermanent(equipment.getAttachedTo()); + if (equipped.getId().equals(event.getTargetId())) { + return true; + } + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/morningtide/FinalStingFaerie.java b/Mage.Sets/src/mage/sets/morningtide/FinalStingFaerie.java new file mode 100644 index 00000000000..33f52b3a1d1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/FinalStingFaerie.java @@ -0,0 +1,80 @@ +/* + * 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.morningtide; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.WasDealtDamageThisTurnPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class FinalStingFaerie extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature that was dealt damage this turn"); + + static { + filter.add(new WasDealtDamageThisTurnPredicate()); + } + + public FinalStingFaerie(UUID ownerId) { + super(ownerId, 63, "Final-Sting Faerie", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "MOR"; + this.subtype.add("Faerie"); + this.subtype.add("Assassin"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Final-Sting Faerie enters the battlefield, destroy target creature that was dealt damage this turn. + Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public FinalStingFaerie(final FinalStingFaerie card) { + super(card); + } + + @Override + public FinalStingFaerie copy() { + return new FinalStingFaerie(this); + } +} diff --git a/Mage.Sets/src/mage/sets/morningtide/OrderOfTheGoldenCricket.java b/Mage.Sets/src/mage/sets/morningtide/OrderOfTheGoldenCricket.java new file mode 100644 index 00000000000..2460b30f144 --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/OrderOfTheGoldenCricket.java @@ -0,0 +1,73 @@ +/* + * 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.morningtide; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class OrderOfTheGoldenCricket extends CardImpl { + + public OrderOfTheGoldenCricket(UUID ownerId) { + super(ownerId, 19, "Order of the Golden Cricket", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "MOR"; + this.subtype.add("Kithkin"); + this.subtype.add("Knight"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Order of the Golden Cricket attacks, you may pay {W}. If you do, it gains flying until end of turn. + Ability ability = new AttacksTriggeredAbility(new DoIfCostPaid( + new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{W}")), + false, + "Whenever {this} attacks, you may pay {W}. If you do, it gains flying until end of turn."); + this.addAbility(ability); + } + + public OrderOfTheGoldenCricket(final OrderOfTheGoldenCricket card) { + super(card); + } + + @Override + public OrderOfTheGoldenCricket copy() { + return new OrderOfTheGoldenCricket(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/onslaught/DwarvenBlastminer.java b/Mage.Sets/src/mage/sets/onslaught/DwarvenBlastminer.java new file mode 100644 index 00000000000..98fe0119bc0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/DwarvenBlastminer.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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class DwarvenBlastminer extends CardImpl { + + private static final FilterLandPermanent filter = new FilterLandPermanent("nonbasic land"); + + public DwarvenBlastminer(UUID ownerId) { + super(ownerId, 199, "Dwarven Blastminer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Dwarf"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {2}{R}, {tap}: Destroy target nonbasic land. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{2}{R}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetLandPermanent(filter)); + this.addAbility(ability); + + // Morph {R} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{R}"))); + } + + public DwarvenBlastminer(final DwarvenBlastminer card) { + super(card); + } + + @Override + public DwarvenBlastminer copy() { + return new DwarvenBlastminer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/WretchedAnurid.java b/Mage.Sets/src/mage/sets/onslaught/WretchedAnurid.java new file mode 100644 index 00000000000..9c58825fe2b --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/WretchedAnurid.java @@ -0,0 +1,74 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author fireshoes + */ +public class WretchedAnurid extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("another creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public WretchedAnurid(UUID ownerId) { + super(ownerId, 183, "Wretched Anurid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Zombie"); + this.subtype.add("Frog"); + this.subtype.add("Beast"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Whenever another creature enters the battlefield, you lose 1 life. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new LoseLifeSourceControllerEffect(1), filter)); + } + + public WretchedAnurid(final WretchedAnurid card) { + super(card); + } + + @Override + public WretchedAnurid copy() { + return new WretchedAnurid(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/DreamscapeArtist.java b/Mage.Sets/src/mage/sets/planarchaos/DreamscapeArtist.java new file mode 100644 index 00000000000..14335e8ba6b --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/DreamscapeArtist.java @@ -0,0 +1,83 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class DreamscapeArtist extends CardImpl { + + public DreamscapeArtist(UUID ownerId) { + super(ownerId, 40, "Dreamscape Artist", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {2}{U}, {tap}, Discard a card, Sacrifice a land: Search your library for up to two basic land cards and put them onto the battlefield. Then shuffle your library. + TargetCardInLibrary target = new TargetCardInLibrary(0, 2, new FilterBasicLandCard()); + Ability ability = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new SearchLibraryPutInPlayEffect(target, false, Outcome.PutLandInPlay), + new ManaCostsImpl("{2}{U}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("land")))); + this.addAbility(ability); + } + + public DreamscapeArtist(final DreamscapeArtist card) { + super(card); + } + + @Override + public DreamscapeArtist copy() { + return new DreamscapeArtist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalsecondage/FoulSpirit.java b/Mage.Sets/src/mage/sets/portalsecondage/FoulSpirit.java new file mode 100644 index 00000000000..4162ab26c12 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/FoulSpirit.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.portalsecondage; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class FoulSpirit extends mage.sets.masterseditioniv.FoulSpirit { + + public FoulSpirit(UUID ownerId) { + super(ownerId); + this.cardNumber = 13; + this.expansionSetCode = "PO2"; + this.rarity = Rarity.UNCOMMON; + } + + public FoulSpirit(final FoulSpirit card) { + super(card); + } + + @Override + public FoulSpirit copy() { + return new FoulSpirit(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/AuraFracture.java b/Mage.Sets/src/mage/sets/prophecy/AuraFracture.java new file mode 100644 index 00000000000..af058cd709f --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/AuraFracture.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.prophecy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class AuraFracture extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("enchantment"); + + static { + filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); + } + + public AuraFracture(UUID ownerId) { + super(ownerId, 2, "Aura Fracture", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + this.expansionSetCode = "PCY"; + + // Sacrifice a land: Destroy target enchantment. + Ability ability = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new DestroyTargetEffect(), + new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("land")))); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public AuraFracture(final AuraFracture card) { + super(card); + } + + @Override + public AuraFracture copy() { + return new AuraFracture(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/BogElemental.java b/Mage.Sets/src/mage/sets/prophecy/BogElemental.java new file mode 100644 index 00000000000..2e7de4e009b --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/BogElemental.java @@ -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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class BogElemental extends CardImpl { + + private static final FilterCard filter = new FilterCard("white"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public BogElemental(UUID ownerId) { + super(ownerId, 57, "Bog Elemental", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Elemental"); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // Protection from white + this.addAbility(new ProtectionAbility(filter)); + + // At the beginning of your upkeep, sacrifice Bog Elemental unless you sacrifice a land. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, + new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent()))), + TargetController.YOU, + false)); + } + + public BogElemental(final BogElemental card) { + super(card); + } + + @Override + public BogElemental copy() { + return new BogElemental(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/Excavation.java b/Mage.Sets/src/mage/sets/prophecy/Excavation.java new file mode 100644 index 00000000000..d3e03bab5b6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/Excavation.java @@ -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.prophecy; + +import java.util.UUID; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class Excavation extends CardImpl { + + public Excavation(UUID ownerId) { + super(ownerId, 33, "Excavation", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "PCY"; + + // {1}, Sacrifice a land: Draw a card. Any player may activate this ability. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{1}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); + ability.setMayActivate(TargetController.ANY); + ability.addEffect(new InfoEffect("Any player may activate this ability")); + this.addAbility(ability); + } + + public Excavation(final Excavation card) { + super(card); + } + + @Override + public Excavation copy() { + return new Excavation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/FaultRiders.java b/Mage.Sets/src/mage/sets/prophecy/FaultRiders.java new file mode 100644 index 00000000000..d493f08ed5f --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/FaultRiders.java @@ -0,0 +1,81 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class FaultRiders extends CardImpl { + + public FaultRiders(UUID ownerId) { + super(ownerId, 88, "Fault Riders", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Sacrifice a land: Fault Riders gets +2/+0 and gains first strike until end of turn. Activate this ability only once each turn. + Effect effect = new BoostSourceEffect(2,0, Duration.EndOfTurn); + effect.setText("{this} gets +2/+0"); + Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, + effect, + new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); + effect = new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains first strike"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public FaultRiders(final FaultRiders card) { + super(card); + } + + @Override + public FaultRiders copy() { + return new FaultRiders(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java b/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java new file mode 100644 index 00000000000..5ea725b257a --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java @@ -0,0 +1,69 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterLandPermanent; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class GulfSquid extends CardImpl { + + public GulfSquid(UUID ownerId) { + super(ownerId, 35, "Gulf Squid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Squid"); + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Gulf Squid enters the battlefield, tap all lands target player controls. + Ability ability = new EntersBattlefieldTriggeredAbility(new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands"))); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public GulfSquid(final GulfSquid card) { + super(card); + } + + @Override + public GulfSquid copy() { + return new GulfSquid(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/StormwatchEagle.java b/Mage.Sets/src/mage/sets/prophecy/StormwatchEagle.java new file mode 100644 index 00000000000..9134cc353a9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/StormwatchEagle.java @@ -0,0 +1,73 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class StormwatchEagle extends CardImpl { + + public StormwatchEagle(UUID ownerId) { + super(ownerId, 50, "Stormwatch Eagle", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Bird"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Sacrifice a land: Return Stormwatch Eagle to its owner's hand. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new ReturnToHandSourceEffect(), + new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land"))))); + } + + public StormwatchEagle(final StormwatchEagle card) { + super(card); + } + + @Override + public StormwatchEagle copy() { + return new StormwatchEagle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/TrenchingSteed.java b/Mage.Sets/src/mage/sets/prophecy/TrenchingSteed.java new file mode 100644 index 00000000000..a138473021a --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/TrenchingSteed.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class TrenchingSteed extends CardImpl { + + public TrenchingSteed(UUID ownerId) { + super(ownerId, 26, "Trenching Steed", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Horse"); + this.subtype.add("Rebel"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Sacrifice a land: Trenching Steed gets +0/+3 until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new BoostSourceEffect(0, 3, Duration.EndOfTurn), + new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("land"))))); + } + + public TrenchingSteed(final TrenchingSteed card) { + super(card); + } + + @Override + public TrenchingSteed copy() { + return new TrenchingSteed(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/TroubledHealer.java b/Mage.Sets/src/mage/sets/prophecy/TroubledHealer.java new file mode 100644 index 00000000000..af64eae7561 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/TroubledHealer.java @@ -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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class TroubledHealer extends CardImpl { + + public TroubledHealer(UUID ownerId) { + super(ownerId, 27, "Troubled Healer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Sacrifice a land: Prevent the next 2 damage that would be dealt to target creature or player this turn. + Ability ability = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), + new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("land")))); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public TroubledHealer(final TroubledHealer card) { + super(card); + } + + @Override + public TroubledHealer copy() { + return new TroubledHealer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/Sarcomancy.java b/Mage.Sets/src/mage/sets/tempest/Sarcomancy.java index 19a9c322c3f..77b8d9ec149 100644 --- a/Mage.Sets/src/mage/sets/tempest/Sarcomancy.java +++ b/Mage.Sets/src/mage/sets/tempest/Sarcomancy.java @@ -1,75 +1,73 @@ -/* - * 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.tempest; - -import java.util.UUID; -import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.DamageControllerEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.NamePredicate; -import mage.game.permanent.token.ZombieToken; - -/** - * - * @author LevelX2 - */ -public class Sarcomancy extends CardImpl { - - public Sarcomancy(UUID ownerId) { - super(ownerId, 48, "Sarcomancy", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{B}"); - this.expansionSetCode = "TMP"; - - - // When Sarcomancy enters the battlefield, put a 2/2 black Zombie creature token onto the battlefield. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1), false)); - // At the beginning of your upkeep, if there are no Zombies on the battlefield, Sarcomancy deals 1 damage to you. - this.addAbility(new ConditionalTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageControllerEffect(1), TargetController.YOU, false), - new PermanentsOnTheBattlefieldCondition(new FilterPermanent("Zombie", "Zombies"), PermanentsOnTheBattlefieldCondition.CountType.EQUAL_TO, 0, false), - "At the beginning of your upkeep, if there are no Zombies on the battlefield, {this} deals 1 damage to you.")); - } - - public Sarcomancy(final Sarcomancy card) { - super(card); - } - - @Override - public Sarcomancy copy() { - return new Sarcomancy(this); - } -} +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.game.permanent.token.ZombieToken; + +/** + * + * @author LevelX2 + */ +public class Sarcomancy extends CardImpl { + + public Sarcomancy(UUID ownerId) { + super(ownerId, 48, "Sarcomancy", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{B}"); + this.expansionSetCode = "TMP"; + + + // When Sarcomancy enters the battlefield, put a 2/2 black Zombie creature token onto the battlefield. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1), false)); + // At the beginning of your upkeep, if there are no Zombies on the battlefield, Sarcomancy deals 1 damage to you. + this.addAbility(new ConditionalTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageControllerEffect(1), TargetController.YOU, false), + new PermanentsOnTheBattlefieldCondition(new FilterPermanent("Zombie", "Zombies"), PermanentsOnTheBattlefieldCondition.CountType.EQUAL_TO, 0, false), + "At the beginning of your upkeep, if there are no Zombies on the battlefield, {this} deals 1 damage to you.")); + } + + public Sarcomancy(final Sarcomancy card) { + super(card); + } + + @Override + public Sarcomancy copy() { + return new Sarcomancy(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/HerdGnarr.java b/Mage.Sets/src/mage/sets/timespiral/HerdGnarr.java new file mode 100644 index 00000000000..8d2fb429192 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/HerdGnarr.java @@ -0,0 +1,73 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author fireshoes + */ +public class HerdGnarr extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("another creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public HerdGnarr(UUID ownerId) { + super(ownerId, 200, "Herd Gnarr", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever another creature enters the battlefield under your control, Herd Gnarr gets +2/+2 until end of turn. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), filter)); + } + + public HerdGnarr(final HerdGnarr card) { + super(card); + } + + @Override + public HerdGnarr copy() { + return new HerdGnarr(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/ArgothianWurm.java b/Mage.Sets/src/mage/sets/urzassaga/ArgothianWurm.java new file mode 100644 index 00000000000..159db3e05a6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/ArgothianWurm.java @@ -0,0 +1,115 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.PutOnLibrarySourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class ArgothianWurm extends CardImpl { + + public ArgothianWurm(UUID ownerId) { + super(ownerId, 236, "Argothian Wurm", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "USG"; + this.subtype.add("Wurm"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // When Argothian Wurm enters the battlefield, any player may sacrifice a land. If a player does, put Argothian Wurm on top of its owner's library. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ArgothianWurmEffect(), false)); + } + + public ArgothianWurm(final ArgothianWurm card) { + super(card); + } + + @Override + public ArgothianWurm copy() { + return new ArgothianWurm(this); + } +} + +class ArgothianWurmEffect extends PutOnLibrarySourceEffect { + + ArgothianWurmEffect() { + super(true); + this.staticText = "any player may sacrifice a land. If a player does, put {this} on top of its owner's library"; + } + + ArgothianWurmEffect(final ArgothianWurmEffect effect) { + super(effect); + } + + @Override + public ArgothianWurmEffect copy() { + return new ArgothianWurmEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + boolean costPaid = false; + for (UUID playerId : controller.getInRange()) { + Cost cost = new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent())); + Player player = game.getPlayer(playerId); + if (player != null + && cost.canPay(source, source.getSourceId(), playerId, game) + && player.chooseUse(Outcome.Sacrifice, "Sacrifice a land?", source, game) + && cost.pay(source, game, source.getSourceId(), playerId, true)) { + costPaid = true; + } + } + if (costPaid) { + super.apply(game, source); + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzassaga/MishrasHelix.java b/Mage.Sets/src/mage/sets/urzassaga/MishrasHelix.java new file mode 100644 index 00000000000..da0880100fb --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/MishrasHelix.java @@ -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.urzassaga; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class MishrasHelix extends CardImpl { + + private final UUID originalId; + + public MishrasHelix(UUID ownerId) { + super(ownerId, 302, "Mishra's Helix", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{5}"); + this.expansionSetCode = "USG"; + + // {X}, {tap}: Tap X target lands. + Effect effect = new TapTargetEffect(); + effect.setText("tap X target lands"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}")); + ability.addCost(new TapSourceCost()); + originalId = ability.getOriginalId(); + this.addAbility(ability); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability.getOriginalId().equals(originalId)){ + int xValue = ability.getManaCostsToPay().getX(); + ability.getTargets().clear(); + ability.addTarget(new TargetLandPermanent(xValue, xValue, new FilterLandPermanent(), false)); + } + } + + public MishrasHelix(final MishrasHelix card) { + super(card); + this.originalId = card.originalId; + } + + @Override + public MishrasHelix copy() { + return new MishrasHelix(this); + } +} diff --git a/Mage.Sets/src/mage/sets/visions/ArmyAnts.java b/Mage.Sets/src/mage/sets/visions/ArmyAnts.java new file mode 100644 index 00000000000..91bf8d80ae5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/ArmyAnts.java @@ -0,0 +1,75 @@ +/* + * 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.visions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class ArmyAnts extends CardImpl { + + public ArmyAnts(UUID ownerId) { + super(ownerId, 126, "Army Ants", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{R}"); + this.expansionSetCode = "VIS"; + this.subtype.add("Insect"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {tap}, Sacrifice a land: Destroy target land. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new DestroyTargetEffect(), + new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent()))); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public ArmyAnts(final ArmyAnts card) { + super(card); + } + + @Override + public ArmyAnts copy() { + return new ArmyAnts(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/PsychicVortex.java b/Mage.Sets/src/mage/sets/weatherlight/PsychicVortex.java new file mode 100644 index 00000000000..b829bd3c80d --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/PsychicVortex.java @@ -0,0 +1,108 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.costs.CostImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.discard.DiscardHandControllerEffect; +import mage.abilities.keyword.CumulativeUpkeepAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class PsychicVortex extends CardImpl { + + public PsychicVortex(UUID ownerId) { + super(ownerId, 50, "Psychic Vortex", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); + this.expansionSetCode = "WTH"; + + // Cumulative upkeep-Draw a card. + this.addAbility(new CumulativeUpkeepAbility(new PsychicVortexCost())); + + // At the beginning of your end step, sacrifice a land and discard your hand. + Effect effect = new SacrificeTargetEffect(); + effect.setText("sacrifice a land"); + Ability ability = new BeginningOfEndStepTriggeredAbility(effect, TargetController.YOU, false); + effect = new DiscardHandControllerEffect(); + effect.setText("and discard your hand"); + ability.addEffect(effect); + ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); + this.addAbility(ability); + } + + public PsychicVortex(final PsychicVortex card) { + super(card); + } + + @Override + public PsychicVortex copy() { + return new PsychicVortex(this); + } +} + +class PsychicVortexCost extends CostImpl { + + PsychicVortexCost() { + this.text = "Draw a card."; + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { + Player controller = game.getPlayer(controllerId); + if (controller != null) { + controller.drawCards(1, game); + this.paid = true; + return true; + } + return false; + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + Player controller = game.getPlayer(controllerId); + return controller.getLibrary().size() > 0; + } + + @Override + public PsychicVortexCost copy() { + return new PsychicVortexCost(); + } +} \ No newline at end of file diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java index e446016fa61..2f0aa49ad8d 100644 --- a/Mage/src/mage/counters/CounterType.java +++ b/Mage/src/mage/counters/CounterType.java @@ -68,6 +68,7 @@ public enum CounterType { M1M1(new BoostCounter(-1, -1).name), MINING("mining"), P1P1(new BoostCounter(1, 1).name), + P2P2(new BoostCounter(2, 2).name), PAGE("page"), PAIN("pain"), PETRIFICATION("petrification"), @@ -120,6 +121,8 @@ public enum CounterType { switch (this) { case P1P1: return new BoostCounter(1, 1, amount); + case P2P2: + return new BoostCounter(2, 2, amount); case M1M1: return new BoostCounter(-1, -1, amount); default: From ad8358a495b8c8a63917067e72416af41909c2ee Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 20 Jul 2015 12:10:05 +0300 Subject: [PATCH 106/375] Implement cards: Devouring Strossus, Samite Elder, and Waterspout Elemental --- .../mage/sets/invasion/DevouringStrossus.java | 83 +++++++++++++ .../src/mage/sets/planeshift/SamiteElder.java | 110 ++++++++++++++++++ .../sets/planeshift/WaterspoutElemental.java | 83 +++++++++++++ 3 files changed, 276 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/SamiteElder.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/WaterspoutElemental.java diff --git a/Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java b/Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java new file mode 100644 index 00000000000..94644acdf1b --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java @@ -0,0 +1,83 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class DevouringStrossus extends CardImpl { + + public DevouringStrossus(UUID ownerId) { + super(ownerId, 101, "Devouring Strossus", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}{B}"); + this.expansionSetCode = "INV"; + this.subtype.add("Horror"); + this.power = new MageInt(9); + this.toughness = new MageInt(9); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Trample + this.addAbility(TrampleAbility.getInstance()); + // At the beginning of your upkeep, sacrifice a creature. + Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeTargetEffect("sacrifice a creature"), + TargetController.YOU, false); + ability.addTarget(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent(), true)); + this.addAbility(ability); + // Sacrifice a creature: Regenerate Devouring Strossus. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), + new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("a creature"), true)))); + } + + public DevouringStrossus(final DevouringStrossus card) { + super(card); + } + + @Override + public DevouringStrossus copy() { + return new DevouringStrossus(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/SamiteElder.java b/Mage.Sets/src/mage/sets/planeshift/SamiteElder.java new file mode 100644 index 00000000000..50cd28ade0e --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/SamiteElder.java @@ -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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author LoneFox + */ +public class SamiteElder extends CardImpl { + + public SamiteElder(UUID ownerId) { + super(ownerId, 14, "Samite Elder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // {T}: Creatures you control gain protection from the colors of target permanent you control until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SamiteElderEffect(), new TapSourceCost()); + ability.addTarget(new TargetControlledPermanent()); + this.addAbility(ability); + } + + public SamiteElder(final SamiteElder card) { + super(card); + } + + @Override + public SamiteElder copy() { + return new SamiteElder(this); + } +} + +class SamiteElderEffect extends OneShotEffect { + + public SamiteElderEffect() { + super(Outcome.Protect); + staticText = "Creatures you control gain protection from the colors of target permanent you control until end of turn"; + } + + public SamiteElderEffect(final SamiteElderEffect effect) { + super(effect); + } + + public SamiteElderEffect copy() { + return new SamiteElderEffect(this); + } + + public boolean apply(Game game, Ability source) { + Permanent target = game.getPermanent(source.getFirstTarget()); + if(target != null) { + for(ObjectColor color : target.getColor(game).getColors()) { + FilterCard filter = new FilterCard(color.getDescription()); + filter.add(new ColorPredicate(color)); + game.addEffect(new GainAbilityControlledEffect(new ProtectionAbility(filter), + Duration.EndOfTurn, new FilterControlledCreaturePermanent()), source); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/WaterspoutElemental.java b/Mage.Sets/src/mage/sets/planeshift/WaterspoutElemental.java new file mode 100644 index 00000000000..787126a6ccd --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/WaterspoutElemental.java @@ -0,0 +1,83 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect; +import mage.abilities.effects.common.turn.SkipNextTurnSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author LoneFox + */ +public class WaterspoutElemental extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures"); + + static { + filter.add(new AnotherPredicate()); + } + + public WaterspoutElemental(UUID ownerId) { + super(ownerId, 38, "Waterspout Elemental", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Elemental"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Kicker {U} + this.addAbility(new KickerAbility("{U}")); + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Waterspout Elemental enters the battlefield, if it was kicked, return all other creatures to their owners' hands and you skip your next turn. + EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandFromBattlefieldAllEffect(filter)); + ability.addEffect(new SkipNextTurnSourceEffect()); + this.addAbility(new ConditionalTriggeredAbility(ability, KickedCondition.getInstance(), + "When {this} enters the battlefield, if it was kicked, return all other creatures to their owners' hands and you skip your next turn")); + } + + public WaterspoutElemental(final WaterspoutElemental card) { + super(card); + } + + @Override + public WaterspoutElemental copy() { + return new WaterspoutElemental(this); + } +} From daf875050ca8f02260e9baa80434481d68218356 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 20 Jul 2015 12:10:58 +0300 Subject: [PATCH 107/375] Ass BecomesTargetAttachedTriggeredAbility and use it for existing cards. Implement card: Sleeping Potion --- .../src/mage/sets/magic2010/IceCage.java | 56 ++---------- .../mage/sets/magic2014/IllusionaryArmor.java | 49 +---------- .../mage/sets/planeshift/SleepingPotion.java | 84 ++++++++++++++++++ ...BecomesTargetAttachedTriggeredAbility.java | 87 +++++++++++++++++++ 4 files changed, 181 insertions(+), 95 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/planeshift/SleepingPotion.java create mode 100644 Mage/src/mage/abilities/common/BecomesTargetAttachedTriggeredAbility.java diff --git a/Mage.Sets/src/mage/sets/magic2010/IceCage.java b/Mage.Sets/src/mage/sets/magic2010/IceCage.java index 911d57ec0d6..9c8f2b22653 100644 --- a/Mage.Sets/src/mage/sets/magic2010/IceCage.java +++ b/Mage.Sets/src/mage/sets/magic2010/IceCage.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -30,7 +30,7 @@ package mage.sets.magic2010; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.DestroySourceEffect; @@ -41,10 +41,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -71,7 +67,7 @@ public class IceCage extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAttackActivateAttachedEffect())); // When enchanted creature becomes the target of a spell or ability, destroy Ice Cage. - this.addAbility(new IceCageAbility()); + this.addAbility(new BecomesTargetAttachedTriggeredAbility(new DestroySourceEffect())); } public IceCage(final IceCage card) { @@ -83,41 +79,3 @@ public class IceCage extends CardImpl { return new IceCage(this); } } - -class IceCageAbility extends TriggeredAbilityImpl { - - public IceCageAbility() { - super(Zone.BATTLEFIELD, new DestroySourceEffect()); - } - - public IceCageAbility(final IceCageAbility ability) { - super(ability); - } - - @Override - public IceCageAbility copy() { - return new IceCageAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - if (enchantment != null && enchantment.getAttachedTo() != null) { - if (event.getTargetId().equals(enchantment.getAttachedTo())) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "When enchanted creature becomes the target of a spell or ability, destroy {this}."; - } - -} diff --git a/Mage.Sets/src/mage/sets/magic2014/IllusionaryArmor.java b/Mage.Sets/src/mage/sets/magic2014/IllusionaryArmor.java index 07129d69f2f..d536c5102cc 100644 --- a/Mage.Sets/src/mage/sets/magic2014/IllusionaryArmor.java +++ b/Mage.Sets/src/mage/sets/magic2014/IllusionaryArmor.java @@ -28,10 +28,10 @@ package mage.sets.magic2014; import java.util.UUID; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BecomesTargetAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.DestroySourceEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; @@ -40,10 +40,6 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -67,7 +63,7 @@ public class IllusionaryArmor extends CardImpl { // Enchanted creature gets +4/+4. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(4, 4, Duration.WhileOnBattlefield))); // When enchanted creature becomes the target of a spell or ability, sacrifice Illusionary Armor. - this.addAbility(new IllusionaryArmorAbility()); + this.addAbility(new BecomesTargetAttachedTriggeredAbility(new SacrificeSourceEffect())); } public IllusionaryArmor(final IllusionaryArmor card) { @@ -79,42 +75,3 @@ public class IllusionaryArmor extends CardImpl { return new IllusionaryArmor(this); } } - - -class IllusionaryArmorAbility extends TriggeredAbilityImpl { - - public IllusionaryArmorAbility() { - super(Zone.BATTLEFIELD, new DestroySourceEffect()); - } - - public IllusionaryArmorAbility(final IllusionaryArmorAbility ability) { - super(ability); - } - - @Override - public IllusionaryArmorAbility copy() { - return new IllusionaryArmorAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.TARGETED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - if (enchantment != null && enchantment.getAttachedTo() != null) { - if (event.getTargetId().equals(enchantment.getAttachedTo())) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "When enchanted creature becomes the target of a spell or ability, destroy {this}."; - } - -} diff --git a/Mage.Sets/src/mage/sets/planeshift/SleepingPotion.java b/Mage.Sets/src/mage/sets/planeshift/SleepingPotion.java new file mode 100644 index 00000000000..ad0cacc5e64 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/SleepingPotion.java @@ -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.planeshift; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BecomesTargetAttachedTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class SleepingPotion extends CardImpl { + + public SleepingPotion(UUID ownerId) { + super(ownerId, 34, "Sleeping Potion", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // When Sleeping Potion enters the battlefield, tap enchanted creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect())); + // Enchanted creature doesn't untap during its controller's untap step. + Effect effect = new DontUntapInControllersUntapStepEnchantedEffect(); + effect.setText("Enchanted creature doesn't untap during its controller's untap step"); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + // When enchanted creature becomes the target of a spell or ability, sacrifice Sleeping Potion. + this.addAbility(new BecomesTargetAttachedTriggeredAbility(new SacrificeSourceEffect())); + } + + public SleepingPotion(final SleepingPotion card) { + super(card); + } + + @Override + public SleepingPotion copy() { + return new SleepingPotion(this); + } +} diff --git a/Mage/src/mage/abilities/common/BecomesTargetAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesTargetAttachedTriggeredAbility.java new file mode 100644 index 00000000000..f7f89e62e89 --- /dev/null +++ b/Mage/src/mage/abilities/common/BecomesTargetAttachedTriggeredAbility.java @@ -0,0 +1,87 @@ +/* + * 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.abilities.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author LoneFox + */ +public class BecomesTargetAttachedTriggeredAbility extends TriggeredAbilityImpl { + + private final String enchantType; + + public BecomesTargetAttachedTriggeredAbility(Effect effect) { + this(effect, "creature"); + } + + public BecomesTargetAttachedTriggeredAbility(Effect effect, String enchantType) { + super(Zone.BATTLEFIELD, effect); + this.enchantType = enchantType; + } + + public BecomesTargetAttachedTriggeredAbility(final BecomesTargetAttachedTriggeredAbility ability) { + super(ability); + this.enchantType = ability.enchantType; + } + + @Override + public BecomesTargetAttachedTriggeredAbility copy() { + return new BecomesTargetAttachedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.TARGETED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent enchantment = game.getPermanent(sourceId); + if (enchantment != null && enchantment.getAttachedTo() != null) { + if (event.getTargetId().equals(enchantment.getAttachedTo())) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "When enchanted " + enchantType + " becomes the target of a spell or ability, " + super.getRule(); + } +} From 597d1ab8326b3bdbbd85847f236ee82281ed7a31 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 12:28:30 +0200 Subject: [PATCH 108/375] Added a test. --- .../mage/sets/magic2011/PyreticRitual.java | 16 ++++---- .../modification/CostModificationTest.java | 39 +++++++++++++++---- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2011/PyreticRitual.java b/Mage.Sets/src/mage/sets/magic2011/PyreticRitual.java index 9000bb19c95..5b75d3cb028 100644 --- a/Mage.Sets/src/mage/sets/magic2011/PyreticRitual.java +++ b/Mage.Sets/src/mage/sets/magic2011/PyreticRitual.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,20 +20,19 @@ * 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.magic2011; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.Mana; import mage.abilities.effects.common.BasicManaEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; /** * @@ -45,6 +44,7 @@ public class PyreticRitual extends CardImpl { super(ownerId, 153, "Pyretic Ritual", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}"); this.expansionSetCode = "M11"; + // Add {R}{R}{R} to your mana pool. this.getSpellAbility().addEffect(new BasicManaEffect(Mana.RedMana(3))); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java index c0022e21951..bb002da08cd 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java @@ -8,7 +8,7 @@ import org.mage.test.serverside.base.CardTestPlayerBase; /** * * also tests cost reduction effects - * + * * @author BetaSteward */ public class CostModificationTest extends CardTestPlayerBase { @@ -46,16 +46,12 @@ public class CostModificationTest extends CardTestPlayerBase { } /** - * Test that cost reduction also works with mana source restriction - * Myr Superion - * Spend only mana produced by creatures to cast Myr Superion + * Test that cost reduction also works with mana source restriction Myr + * Superion Spend only mana produced by creatures to cast Myr Superion * - * Etherium Sculptor {1}{U} - * Artifact Creature - Vedalken Artificer - * 1/2 + * Etherium Sculptor {1}{U} Artifact Creature - Vedalken Artificer 1/2 * Artifact spells you cast cost {1} less to cast. */ - @Test public void testCostReductionWithManaSourceRestrictionWorking() { // Artifact spells you cast cost {1} less to cast @@ -95,4 +91,31 @@ public class CostModificationTest extends CardTestPlayerBase { assertHandCount(playerA, "Myr Superion", 1); // Can't be cast because mana was not produced by a creature } + /* + I had Goblin Electromancer, but somehow Pyretic Ritual wasn't cheaper howeverDesperate Ritual was. + */ + @Test + public void testCostReductionForPyreticRitual() { + // Instant and sorcery spells you cast cost {1} less to cast. + addCard(Zone.BATTLEFIELD, playerA, "Goblin Electromancer"); + addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + + // Add {R}{R}{R} to your mana pool. + addCard(Zone.HAND, playerA, "Pyretic Ritual"); + // Fated Conflagration deals 5 damage to target creature or planeswalker. + // If it's your turn, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) + addCard(Zone.HAND, playerA, "Fated Conflagration"); + + addCard(Zone.BATTLEFIELD, playerB, "Carnivorous Moss-Beast"); // 4/5 + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pyretic Ritual"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Fated Conflagration", "Carnivorous Moss-Beast"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Pyretic Ritual", 1); + assertGraveyardCount(playerA, "Fated Conflagration", 1); + assertGraveyardCount(playerB, "Carnivorous Moss-Beast", 1); + } } From 5872709e3e5766037bce25e7415e98e4c1c4d516 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 20 Jul 2015 13:49:04 +0300 Subject: [PATCH 109/375] Add DamageEachOtherEffect and use it for existing cards. Implement cards: Karplusan Yeti; Tracker; and Tahngarth, Talruum Hero --- .../src/mage/sets/iceage/KarplusanYeti.java | 70 +++++++++++++++ .../mage/sets/masterseditioniii/Tracker.java | 71 +++++++++++++++ .../mage/sets/ninthedition/KarplusanYeti.java | 52 +++++++++++ .../sets/planeshift/TahngarthTalruumHero.java | 76 ++++++++++++++++ .../mage/sets/shardsofalara/VeinDrinker.java | 48 +--------- Mage.Sets/src/mage/sets/thedark/Tracker.java | 54 ++++++++++++ .../src/mage/sets/zendikar/PredatoryUrge.java | 66 +++----------- .../effects/common/DamageEachOtherEffect.java | 88 +++++++++++++++++++ 8 files changed, 429 insertions(+), 96 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/iceage/KarplusanYeti.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/Tracker.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/KarplusanYeti.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/TahngarthTalruumHero.java create mode 100644 Mage.Sets/src/mage/sets/thedark/Tracker.java create mode 100644 Mage/src/mage/abilities/effects/common/DamageEachOtherEffect.java diff --git a/Mage.Sets/src/mage/sets/iceage/KarplusanYeti.java b/Mage.Sets/src/mage/sets/iceage/KarplusanYeti.java new file mode 100644 index 00000000000..6012dd2abe1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/KarplusanYeti.java @@ -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.iceage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageEachOtherEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class KarplusanYeti extends CardImpl { + + public KarplusanYeti(UUID ownerId) { + super(ownerId, 197, "Karplusan Yeti", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + this.expansionSetCode = "ICE"; + this.subtype.add("Yeti"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {T}: Karplusan Yeti deals damage equal to its power to target creature. That creature deals damage equal to its power to Karplusan Yeti. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageEachOtherEffect(), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public KarplusanYeti(final KarplusanYeti card) { + super(card); + } + + @Override + public KarplusanYeti copy() { + return new KarplusanYeti(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/Tracker.java b/Mage.Sets/src/mage/sets/masterseditioniii/Tracker.java new file mode 100644 index 00000000000..1f81dac24ad --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/Tracker.java @@ -0,0 +1,71 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageEachOtherEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class Tracker extends CardImpl { + + public Tracker(UUID ownerId) { + super(ownerId, 136, "Tracker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "ME3"; + this.subtype.add("Human"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {G}{G}, {tap}: Tracker deals damage equal to its power to target creature. That creature deals damage equal to its power to Tracker. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageEachOtherEffect(), new ManaCostsImpl("{G}{G}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public Tracker(final Tracker card) { + super(card); + } + + @Override + public Tracker copy() { + return new Tracker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/KarplusanYeti.java b/Mage.Sets/src/mage/sets/ninthedition/KarplusanYeti.java new file mode 100644 index 00000000000..d0eaf0d4594 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/KarplusanYeti.java @@ -0,0 +1,52 @@ +/* + * 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.ninthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class KarplusanYeti extends mage.sets.iceage.KarplusanYeti { + + public KarplusanYeti(UUID ownerId) { + super(ownerId); + this.cardNumber = 198; + this.expansionSetCode = "9ED"; + } + + public KarplusanYeti(final KarplusanYeti card) { + super(card); + } + + @Override + public KarplusanYeti copy() { + return new KarplusanYeti(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/TahngarthTalruumHero.java b/Mage.Sets/src/mage/sets/planeshift/TahngarthTalruumHero.java new file mode 100644 index 00000000000..876e3724c04 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/TahngarthTalruumHero.java @@ -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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageEachOtherEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class TahngarthTalruumHero extends CardImpl { + + public TahngarthTalruumHero(UUID ownerId) { + super(ownerId, 74, "Tahngarth, Talruum Hero", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + this.expansionSetCode = "PLS"; + this.supertype.add("Legendary"); + this.subtype.add("Minotaur"); + this.subtype.add("Warrior"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + // {1}{R}, {tap}: Tahngarth, Talruum Hero deals damage equal to its power to target creature. That creature deals damage equal to its power to Tahngarth. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageEachOtherEffect(), new ManaCostsImpl("{1}{R}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public TahngarthTalruumHero(final TahngarthTalruumHero card) { + super(card); + } + + @Override + public TahngarthTalruumHero copy() { + return new TahngarthTalruumHero(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shardsofalara/VeinDrinker.java b/Mage.Sets/src/mage/sets/shardsofalara/VeinDrinker.java index 3248596ce07..abe026812b6 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/VeinDrinker.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/VeinDrinker.java @@ -29,24 +29,20 @@ package mage.sets.shardsofalara; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.Mode; import mage.abilities.common.DiesAndDealtDamageThisTurnTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageEachOtherEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; -import mage.constants.Outcome; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; /** @@ -66,7 +62,7 @@ public class VeinDrinker extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // {R}, {tap}: Vein Drinker deals damage equal to its power to target creature. That creature deals damage equal to its power to Vein Drinker. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new VeinDrinkerEffect(), new ManaCostsImpl("{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageEachOtherEffect(), new ManaCostsImpl("{R}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); @@ -83,39 +79,3 @@ public class VeinDrinker extends CardImpl { return new VeinDrinker(this); } } - -class VeinDrinkerEffect extends OneShotEffect { - - public VeinDrinkerEffect() { - super(Outcome.Damage); - } - - public VeinDrinkerEffect(final VeinDrinkerEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent sourceCreature = game.getPermanent(source.getSourceId()); - Permanent targetCreature = game.getPermanent(source.getTargets().get(0).getFirstTarget()); - if (sourceCreature != null && targetCreature != null) { - if (sourceCreature.getCardType().contains(CardType.CREATURE) && targetCreature.getCardType().contains(CardType.CREATURE)) { - sourceCreature.damage(targetCreature.getPower().getValue(), targetCreature.getId(), game, false, true); - targetCreature.damage(sourceCreature.getPower().getValue(), sourceCreature.getId(), game, false, true); - return true; - } - } - return false; - } - - @Override - public VeinDrinkerEffect copy() { - return new VeinDrinkerEffect(this); - } - - @Override - public String getText(Mode mode) { - return "{this} deals damage equal to its power to target creature. That creature deals damage equal to its power to {this}"; - } - -} diff --git a/Mage.Sets/src/mage/sets/thedark/Tracker.java b/Mage.Sets/src/mage/sets/thedark/Tracker.java new file mode 100644 index 00000000000..18d3bf592a5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/thedark/Tracker.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.thedark; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class Tracker extends mage.sets.masterseditioniii.Tracker { + + public Tracker(UUID ownerId) { + super(ownerId); + this.cardNumber = 52; + this.expansionSetCode = "DRK"; + this.rarity = Rarity.RARE; + } + + public Tracker(final Tracker card) { + super(card); + } + + @Override + public Tracker copy() { + return new Tracker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/PredatoryUrge.java b/Mage.Sets/src/mage/sets/zendikar/PredatoryUrge.java index 76273506c4c..bf1fac671b9 100644 --- a/Mage.Sets/src/mage/sets/zendikar/PredatoryUrge.java +++ b/Mage.Sets/src/mage/sets/zendikar/PredatoryUrge.java @@ -28,22 +28,21 @@ package mage.sets.zendikar; import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DamageEachOtherEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; import mage.constants.AttachmentType; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; -import mage.abilities.keyword.EnchantAbility; -import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -67,9 +66,11 @@ public class PredatoryUrge extends CardImpl { this.addAbility(ability); // Enchanted creature has "{tap}: This creature deals damage equal to its power to target creature. // That creature deals damage equal to its power to this creature." - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PredatoryUrgeEffect(), new TapSourceCost()); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageEachOtherEffect(), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ability, AttachmentType.AURA))); + Effect effect = new GainAbilityAttachedEffect(ability, AttachmentType.AURA); + effect.setText("Enchanted creature has \"{T}: This creature deals damage equal to its power to target creature. That creature deals damage equal to its power to this creature.\""); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } public PredatoryUrge(final PredatoryUrge card) { @@ -81,42 +82,3 @@ public class PredatoryUrge extends CardImpl { return new PredatoryUrge(this); } } - -class PredatoryUrgeEffect extends OneShotEffect { - - public PredatoryUrgeEffect() { - super(Outcome.Damage); - this.staticText = "This creature deals damage equal to its power to target creature. That creature deals damage equal to its power to this creature."; - } - - public PredatoryUrgeEffect(final PredatoryUrgeEffect effect) { - super(effect); - } - - @Override - public PredatoryUrgeEffect copy() { - return new PredatoryUrgeEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - boolean sourceOnBattlefield = true; - Permanent targetCreature = game.getPermanent(source.getFirstTarget()); - Permanent sourceCreature = game.getPermanent(source.getSourceId()); - if (sourceCreature == null) { - sourceCreature = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); - sourceOnBattlefield = false; - } - - if (sourceCreature != null && targetCreature != null - && sourceCreature.getCardType().contains(CardType.CREATURE) - && targetCreature.getCardType().contains(CardType.CREATURE)) { - targetCreature.damage(sourceCreature.getPower().getValue(), sourceCreature.getId(), game, false, true); - if (sourceOnBattlefield) { - sourceCreature.damage(targetCreature.getPower().getValue(), targetCreature.getId(), game, false, true); - } - return true; - } - return false; - } -} diff --git a/Mage/src/mage/abilities/effects/common/DamageEachOtherEffect.java b/Mage/src/mage/abilities/effects/common/DamageEachOtherEffect.java new file mode 100644 index 00000000000..4c58bf38f51 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/DamageEachOtherEffect.java @@ -0,0 +1,88 @@ +/* + * 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.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author LoneFox + */ +public class DamageEachOtherEffect extends OneShotEffect { + + public DamageEachOtherEffect() { + super(Outcome.Damage); + } + + public DamageEachOtherEffect(final DamageEachOtherEffect effect) { + super(effect); + } + + @Override + public DamageEachOtherEffect copy() { + return new DamageEachOtherEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + boolean sourceOnBattlefield = true; + Permanent targetCreature = game.getPermanent(source.getFirstTarget()); + Permanent sourceCreature = game.getPermanent(source.getSourceId()); + if (sourceCreature == null) { + sourceCreature = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); + sourceOnBattlefield = false; + } + + if (sourceCreature != null && targetCreature != null + && sourceCreature.getCardType().contains(CardType.CREATURE) + && targetCreature.getCardType().contains(CardType.CREATURE)) { + targetCreature.damage(sourceCreature.getPower().getValue(), sourceCreature.getId(), game, false, true); + if (sourceOnBattlefield) { + sourceCreature.damage(targetCreature.getPower().getValue(), targetCreature.getId(), game, false, true); + } + return true; + } + return false; + } + + @Override + public String getText(Mode mode) { + if(staticText != null && !staticText.isEmpty()) { + return staticText; + } + return "{this} deals damage equal to its power to target creature. That creature deals damage equal to its power to {this}"; + } + +} From c3c2aa9b369b3e1c1b79630ca51d08ee00a1f4b7 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 20 Jul 2015 14:04:46 +0300 Subject: [PATCH 110/375] Use plain SacrificeEffect instead of SacrificeTargetEffect for Devouring Strossus --- Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java b/Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java index 94644acdf1b..96baa61d2d8 100644 --- a/Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java +++ b/Mage.Sets/src/mage/sets/invasion/DevouringStrossus.java @@ -34,7 +34,7 @@ import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.common.RegenerateSourceEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; @@ -63,9 +63,8 @@ public class DevouringStrossus extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); // At the beginning of your upkeep, sacrifice a creature. - Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeTargetEffect("sacrifice a creature"), + Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeEffect(new FilterControlledCreaturePermanent("creature"), 1, null), TargetController.YOU, false); - ability.addTarget(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent(), true)); this.addAbility(ability); // Sacrifice a creature: Regenerate Devouring Strossus. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), From df0edb07b73bba6cfdf137d976fd6464168cd604 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 13:51:12 +0200 Subject: [PATCH 111/375] * Gather the Pack - Fixed that the second selected card (spell mastery) was not moved to hand. --- Mage.Sets/src/mage/sets/magicorigins/GatherThePack.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/GatherThePack.java b/Mage.Sets/src/mage/sets/magicorigins/GatherThePack.java index 31888fd17a7..c6087d29b07 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/GatherThePack.java +++ b/Mage.Sets/src/mage/sets/magicorigins/GatherThePack.java @@ -31,7 +31,6 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.common.SpellMasteryCondition; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.Cards; import mage.cards.CardsImpl; @@ -98,10 +97,10 @@ class GatherThePackEffect extends OneShotEffect { } TargetCard target = new TargetCard(0, max, Zone.LIBRARY, new FilterCreatureCard("creature card" + (max > 1 ? "s" : "") + " to put into your hand")); if (controller.choose(Outcome.PutCreatureInPlay, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - controller.moveCards(card, Zone.LIBRARY, Zone.HAND, source, game); + Cards cardsToHand = new CardsImpl(target.getTargets()); + if (cardsToHand.size() > 0) { + cards.removeAll(cardsToHand); + controller.moveCards(cardsToHand, Zone.LIBRARY, Zone.HAND, source, game); } } } From 764541d8ca05fc8fe044365aa4fcab66458e6475 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 20 Jul 2015 15:35:37 +0300 Subject: [PATCH 112/375] Implement cards: Kavu Mauler, Kavu Monarch, Kavu Runner, and Skittish Kavu --- .../src/mage/sets/apocalypse/KavuMauler.java | 79 +++++++++++++++++ .../src/mage/sets/invasion/KavuMonarch.java | 85 ++++++++++++++++++ .../src/mage/sets/invasion/KavuRunner.java | 86 +++++++++++++++++++ .../src/mage/sets/invasion/SkittishKavu.java | 86 +++++++++++++++++++ 4 files changed, 336 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/KavuMauler.java create mode 100644 Mage.Sets/src/mage/sets/invasion/KavuMonarch.java create mode 100644 Mage.Sets/src/mage/sets/invasion/KavuRunner.java create mode 100644 Mage.Sets/src/mage/sets/invasion/SkittishKavu.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/KavuMauler.java b/Mage.Sets/src/mage/sets/apocalypse/KavuMauler.java new file mode 100644 index 00000000000..131fc3391fd --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/KavuMauler.java @@ -0,0 +1,79 @@ +/* + * 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.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author LoneFox + */ +public class KavuMauler extends CardImpl { + + private static final FilterAttackingCreature filter = new FilterAttackingCreature("other attacking Kavu"); + + static { + filter.add(new SubtypePredicate("Kavu")); + filter.add(new AnotherPredicate()); + } + + public KavuMauler(UUID ownerId) { + super(ownerId, 80, "Kavu Mauler", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); + this.expansionSetCode = "APC"; + this.subtype.add("Kavu"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + // Whenever Kavu Mauler attacks, it gets +1/+1 until end of turn for each other attacking Kavu. + PermanentsOnBattlefieldCount value = new PermanentsOnBattlefieldCount(filter); + this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(value, value, Duration.EndOfTurn, true), false)); + } + + public KavuMauler(final KavuMauler card) { + super(card); + } + + @Override + public KavuMauler copy() { + return new KavuMauler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/KavuMonarch.java b/Mage.Sets/src/mage/sets/invasion/KavuMonarch.java new file mode 100644 index 00000000000..1a4cd916450 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/KavuMonarch.java @@ -0,0 +1,85 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author LoneFox + */ +public class KavuMonarch extends CardImpl { + + private static final FilterCreaturePermanent filter1 = new FilterCreaturePermanent("Kavu creatures"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("another Kavu"); + + static { + filter1.add(new SubtypePredicate("Kavu")); + filter2.add(new SubtypePredicate("Kavu")); + filter2.add(new AnotherPredicate()); + } + + public KavuMonarch(UUID ownerId) { + super(ownerId, 149, "Kavu Monarch", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Kavu"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Kavu creatures have trample. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(TrampleAbility.getInstance(), + Duration.WhileOnBattlefield, filter1))); + + // Whenever another Kavu enters the battlefield, put a +1/+1 counter on Kavu Monarch. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter2)); + } + + public KavuMonarch(final KavuMonarch card) { + super(card); + } + + @Override + public KavuMonarch copy() { + return new KavuMonarch(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/KavuRunner.java b/Mage.Sets/src/mage/sets/invasion/KavuRunner.java new file mode 100644 index 00000000000..14a00fbb7b7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/KavuRunner.java @@ -0,0 +1,86 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.InvertCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LoneFox + */ +public class KavuRunner extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("white or blue creature"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.WHITE), new ColorPredicate(ObjectColor.BLUE))); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public KavuRunner(UUID ownerId) { + super(ownerId, 150, "Kavu Runner", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Kavu"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Kavu Runner has haste as long as no opponent controls a white or blue creature. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new ConditionalContinuousEffect(new GainAbilitySourceEffect(HasteAbility.getInstance(), + Duration.WhileOnBattlefield), new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0, false)), + "{this} has haste as long as no opponent controls a white or blue creature"))); + } + + public KavuRunner(final KavuRunner card) { + super(card); + } + + @Override + public KavuRunner copy() { + return new KavuRunner(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/SkittishKavu.java b/Mage.Sets/src/mage/sets/invasion/SkittishKavu.java new file mode 100644 index 00000000000..d5d4ad43552 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/SkittishKavu.java @@ -0,0 +1,86 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.InvertCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LoneFox + */ +public class SkittishKavu extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("white or blue creature"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.WHITE), new ColorPredicate(ObjectColor.BLUE))); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public SkittishKavu(UUID ownerId) { + super(ownerId, 168, "Skittish Kavu", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Kavu"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Skittish Kavu gets +1/+1 as long as no opponent controls a white or blue creature. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new ConditionalContinuousEffect(new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), + new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0, false)), + "{this} gets +1/+1 as long as no opponent controls a white or blue creature"))); + } + + public SkittishKavu(final SkittishKavu card) { + super(card); + } + + @Override + public SkittishKavu copy() { + return new SkittishKavu(this); + } +} From 0c490c619a4c0a9d75350921d0337b60669f0baf Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 17:00:54 +0200 Subject: [PATCH 113/375] * Unstable Frontier - Fixed that also a not controlled land could be selected as target land. --- Mage.Sets/src/mage/sets/conflux/UnstableFrontier.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/UnstableFrontier.java b/Mage.Sets/src/mage/sets/conflux/UnstableFrontier.java index e48c369876e..46c79c956f9 100644 --- a/Mage.Sets/src/mage/sets/conflux/UnstableFrontier.java +++ b/Mage.Sets/src/mage/sets/conflux/UnstableFrontier.java @@ -38,8 +38,9 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; import mage.target.Target; -import mage.target.common.TargetLandPermanent; +import mage.target.common.TargetControlledPermanent; /** * @@ -55,7 +56,7 @@ public class UnstableFrontier extends CardImpl { this.addAbility(new ColorlessManaAbility()); // {tap}: Target land you control becomes the basic land type of your choice until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn), new TapSourceCost()); - Target target = new TargetLandPermanent(); + Target target = new TargetControlledPermanent(new FilterControlledLandPermanent()); ability.addTarget(target); this.addAbility(ability); } From 46d2bb9313e4c40e773c08d4d476fec38433f7ce Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 17:08:04 +0200 Subject: [PATCH 114/375] * Added Recover ability (closes #1119). --- .../cards/abilities/keywords/RecoverTest.java | 105 +++++++++++++ .../abilities/keyword/RecoverAbility.java | 143 ++++++++++++++++++ 2 files changed, 248 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RecoverTest.java create mode 100644 Mage/src/mage/abilities/keyword/RecoverAbility.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RecoverTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RecoverTest.java new file mode 100644 index 00000000000..41b6b4470c2 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RecoverTest.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 org.mage.test.cards.abilities.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class RecoverTest extends CardTestPlayerBase { + + /** + * 702.58a Recover is a triggered ability that functions only while the card + * with recover is in a player’s graveyard. “Recover [cost]” means “When a + * creature is put into your graveyard from the battlefield, you may pay + * [cost]. If you do, return this card from your graveyard to your hand. + * Otherwise, exile this card.” + */ + @Test + public void testReturnToHand() { + addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); + // You gain 4 life. + // Recover {1}{W} + addCard(Zone.HAND, playerA, "Sun's Bounty"); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); + addCard(Zone.HAND, playerB, "Lightning Bolt", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sun's Bounty"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion"); + setChoice(playerA, "Yes"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertGraveyardCount(playerB, "Lightning Bolt", 1); + assertHandCount(playerA, "Sun's Bounty", 1); + assertGraveyardCount(playerA, "Silvercoat Lion", 1); + + assertLife(playerA, 24); + + assertTappedCount("Plains", true, 4); + + } + + @Test + public void testGoingToExile() { + addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); + // You gain 4 life. + // Recover {1}{W} + addCard(Zone.HAND, playerA, "Sun's Bounty"); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); + addCard(Zone.HAND, playerB, "Lightning Bolt", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sun's Bounty"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion"); + setChoice(playerA, "No"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertTappedCount("Plains", true, 2); + + assertGraveyardCount(playerB, "Lightning Bolt", 1); + assertExileCount("Sun's Bounty", 1); + assertGraveyardCount(playerA, "Silvercoat Lion", 1); + + assertLife(playerA, 24); + + } +} diff --git a/Mage/src/mage/abilities/keyword/RecoverAbility.java b/Mage/src/mage/abilities/keyword/RecoverAbility.java new file mode 100644 index 00000000000..6b6c47b52ef --- /dev/null +++ b/Mage/src/mage/abilities/keyword/RecoverAbility.java @@ -0,0 +1,143 @@ +/* + * 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.abilities.keyword; + +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.ManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileSourceEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.Card; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.players.Player; + +/** + * 702.58a Recover is a triggered ability that functions only while the card + * with recover is in a player’s graveyard. “Recover [cost]” means “When a + * creature is put into your graveyard from the battlefield, you may pay [cost]. + * If you do, return this card from your graveyard to your hand. Otherwise, + * exile this card.” + * + * @author LevelX2 + */ +public class RecoverAbility extends TriggeredAbilityImpl { + + public RecoverAbility(Cost cost, Card card) { + super(Zone.GRAVEYARD, new RecoverEffect(cost, card.getCardType().contains(CardType.CREATURE)), false); + } + + public RecoverAbility(final RecoverAbility ability) { + super(ability); + } + + @Override + public RecoverAbility copy() { + return new RecoverAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getFromZone().equals(Zone.BATTLEFIELD) && zEvent.getToZone().equals(Zone.GRAVEYARD)) { + if (zEvent.getTarget().getOwnerId().equals(getControllerId()) + && !zEvent.getTarget().getId().equals(getSourceId())) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return super.getRule(); + } +} + +class RecoverEffect extends OneShotEffect { + + protected Cost cost; + + public RecoverEffect(Cost cost, boolean creature) { + super(Outcome.ReturnToHand); + this.cost = cost; + this.staticText = setText(cost, creature); + } + + public RecoverEffect(final RecoverEffect effect) { + super(effect); + this.cost = effect.cost; + } + + @Override + public RecoverEffect copy() { + return new RecoverEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Card sourceCard = game.getCard(source.getSourceId()); + if (controller != null && sourceCard != null + && game.getState().getZone(source.getSourceId()).equals(Zone.GRAVEYARD)) { + if (controller.chooseUse(Outcome.Damage, "Pay " + cost.getText() + " to recover " + sourceCard.getLogName() + "? (Otherwise the card will be exiled)", source, game)) { + cost.clearPaid(); + if (cost.pay(source, game, source.getSourceId(), controller.getId(), false)) { + return new ReturnToHandSourceEffect().apply(game, source); + } + } + return new ExileSourceEffect().apply(game, source); + } + return false; + } + + private String setText(Cost cost, boolean creature) { + StringBuilder sb = new StringBuilder(); + sb.append("Recover"); + if (cost instanceof ManaCost) { + sb.append(" ").append(cost.getText()).append(" "); + } else { + sb.append("—").append(cost.getText()).append(". "); + } + sb.append("(When ").append(creature ? "another" : "a").append(" creature is put into your graveyard from the battlefield, you may pay "); + sb.append(cost.getText()); + sb.append(". If you do, return this card from your graveyard to your hand. Otherwise, exile this card.)"); + return sb.toString(); + } +} From 25ade412f43f388599062ce8267a28e43afbf2ad Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 17:08:21 +0200 Subject: [PATCH 115/375] * Added Sun's Bounty. --- .../src/mage/sets/coldsnap/SunsBounty.java | 63 +++++++++++++++++++ .../mage/sets/magicorigins/DaysUndoing.java | 17 ++--- 2 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/coldsnap/SunsBounty.java diff --git a/Mage.Sets/src/mage/sets/coldsnap/SunsBounty.java b/Mage.Sets/src/mage/sets/coldsnap/SunsBounty.java new file mode 100644 index 00000000000..5de3e872cf3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/SunsBounty.java @@ -0,0 +1,63 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.RecoverAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class SunsBounty extends CardImpl { + + public SunsBounty(UUID ownerId) { + super(ownerId, 18, "Sun's Bounty", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "CSP"; + + // You gain 4 life. + this.getSpellAbility().addEffect(new GainLifeEffect(4)); + + // Recover {1}{W} + this.addAbility(new RecoverAbility(new ManaCostsImpl("{1}{W}"), this)); + } + + public SunsBounty(final SunsBounty card) { + super(card); + } + + @Override + public SunsBounty copy() { + return new SunsBounty(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/DaysUndoing.java b/Mage.Sets/src/mage/sets/magicorigins/DaysUndoing.java index 6f576a90b9e..a77cbe2b199 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/DaysUndoing.java +++ b/Mage.Sets/src/mage/sets/magicorigins/DaysUndoing.java @@ -81,25 +81,26 @@ class DaysUndoingEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player sourcePlayer = game.getPlayer(source.getControllerId()); - for (UUID playerId: sourcePlayer.getInRange()) { + for (UUID playerId : sourcePlayer.getInRange()) { Player player = game.getPlayer(playerId); if (player != null) { - for (Card card: player.getHand().getCards(game)) { + for (Card card : player.getHand().getCards(game)) { card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); } - for (Card card: player.getGraveyard().getCards(game)) { + for (Card card : player.getGraveyard().getCards(game)) { card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); } + game.informPlayers(player.getLogName() + " puts his or her hand and graveyard into his or her library"); player.shuffleLibrary(game); - + } } - game.getState().handleSimultaneousEvent(game); // needed here so state based triggered effects - for (UUID playerId: sourcePlayer.getInRange()) { + game.getState().handleSimultaneousEvent(game); // needed here so state based triggered effects + for (UUID playerId : sourcePlayer.getInRange()) { Player player = game.getPlayer(playerId); if (player != null) { player.drawCards(7, game); - } + } } return true; } @@ -109,4 +110,4 @@ class DaysUndoingEffect extends OneShotEffect { return new DaysUndoingEffect(this); } -} \ No newline at end of file +} From 1a722267bec139db02b94ccaedf05fa4878457f1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 17:28:45 +0200 Subject: [PATCH 116/375] * Daretti, Scrap Savant - Fixed that the triggered emblem effect did also move the artifact if it already left the graveyard meanwhile. --- .../commander2014/DarettiScrapSavant.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java b/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java index 3436c1fb33d..48b846573c7 100644 --- a/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java +++ b/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java @@ -75,7 +75,6 @@ public class DarettiScrapSavant extends CardImpl { this.expansionSetCode = "C14"; this.subtype.add("Daretti"); - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false)); // +2: Discard up to two cards, then draw that many cards. @@ -126,7 +125,7 @@ class DarettiDiscardDrawEffect extends OneShotEffect { TargetDiscard target = new TargetDiscard(0, 2, new FilterCard(), controller.getId()); target.choose(outcome, controller.getId(), source.getSourceId(), game); int count = 0; - for (UUID cardId: target.getTargets()) { + for (UUID cardId : target.getTargets()) { Card card = game.getCard(cardId); if (card != null) { controller.discard(card, source, game); @@ -160,9 +159,9 @@ class DarettiSacrificeEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - Target target = new TargetControlledPermanent(1,1,new FilterControlledArtifactPermanent(), true); - if (target.canChoose(source.getSourceId(), controller.getId(), game) && - controller.chooseTarget(outcome, target, source, game)) { + Target target = new TargetControlledPermanent(1, 1, new FilterControlledArtifactPermanent(), true); + if (target.canChoose(source.getSourceId(), controller.getId(), game) + && controller.chooseTarget(outcome, target, source, game)) { Permanent artifact = game.getPermanent(target.getFirstTarget()); if (artifact != null && artifact.sacrifice(source.getSourceId(), game)) { Card card = game.getCard(getTargetPointer().getFirst(game, source)); @@ -178,7 +177,9 @@ class DarettiSacrificeEffect extends OneShotEffect { } class DarettiScrapSavantEmblem extends Emblem { + // You get an emblem with "Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step." + public DarettiScrapSavantEmblem() { this.setName("Emblem - Daretti"); this.getAbilities().add(new DarettiScrapSavantTriggeredAbility()); @@ -208,10 +209,10 @@ class DarettiScrapSavantTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() == Zone.GRAVEYARD && - zEvent.getFromZone() == Zone.BATTLEFIELD && - zEvent.getTarget().getCardType().contains(CardType.ARTIFACT) && - zEvent.getTarget().getOwnerId().equals(this.controllerId)) { + if (zEvent.getToZone() == Zone.GRAVEYARD + && zEvent.getFromZone() == Zone.BATTLEFIELD + && zEvent.getTarget().getCardType().contains(CardType.ARTIFACT) + && zEvent.getTarget().getOwnerId().equals(this.controllerId)) { for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(zEvent.getTargetId())); } @@ -245,9 +246,9 @@ class DarettiScrapSavantEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (card != null) { + if (card != null && game.getState().getZone(card.getId()).equals(Zone.GRAVEYARD)) { Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); + effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); effect.setText("return that card to the battlefield at the beginning of the next end step"); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(Zone.COMMAND, effect, TargetController.ANY); delayedAbility.setSourceId(source.getSourceId()); @@ -258,4 +259,4 @@ class DarettiScrapSavantEffect extends OneShotEffect { } return false; } -} \ No newline at end of file +} From fcd74a65a99611d6b136384f34efc01e08adf9f6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 17:35:35 +0200 Subject: [PATCH 117/375] Added test. --- .../triggers/dies/SidisiBroodTyrantTest.java | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SidisiBroodTyrantTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SidisiBroodTyrantTest.java index 2971d74545b..eaaefeed1d8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SidisiBroodTyrantTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SidisiBroodTyrantTest.java @@ -36,12 +36,12 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class SidisiBroodTyrantTest extends CardTestPlayerBase { /** - * Tests that if Sidisi, Brood Tyrant leaves the battlefield - * before it's first ability resolves, there will be no Zombie token added to the battlefield + * Tests that if Sidisi, Brood Tyrant leaves the battlefield before it's + * first ability resolves, there will be no Zombie token added to the + * battlefield * */ @Test @@ -73,4 +73,43 @@ public class SidisiBroodTyrantTest extends CardTestPlayerBase { } + /** + * Another potential bug would be related to Sidisi, Brood Tyrant 's second + * trigger. If there is one in play and I play a Satyr Wayfinder or a Gather + * the Pack, then mill some creatures, Sidisi should trigger and make a + * Zombie token, right? This doesn't seem to work currently. + * + */ + @Test + public void testDiesTriggeredAbilityNormal() { + // {1}{B}{G}{U} + // Whenever Sidisi, Brood Tyrant enters the battlefield or attacks, put the top three cards of your library into your graveyard + // Whenever one or more creature cards are put into your graveyard from your library, put a 2/2 black Zombie creature token onto the battlefield. + addCard(Zone.HAND, playerA, "Sidisi, Brood Tyrant"); // 2/2 {1}{B}{G}{U} + + // When Satyr Wayfinder enters the battlefield, reveal the top four cards of your library. You may put a land card from among them into your hand. Put the rest into your graveyard. + addCard(Zone.HAND, playerA, "Satyr Wayfinder"); // 1/1 {1}{G} + + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 4); + addCard(Zone.BATTLEFIELD, playerA, "Island"); + addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 3); + addCard(Zone.LIBRARY, playerA, "Swamp", 1); + addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 3); + skipInitShuffling(); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sidisi, Brood Tyrant"); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Satyr Wayfinder"); + setChoice(playerA, "Yes"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Sidisi, Brood Tyrant", 1); + assertPermanentCount(playerA, "Satyr Wayfinder", 1); + assertHandCount(playerA, "Swamp", 1); + assertGraveyardCount(playerA, "Silvercoat Lion", 6); + assertPermanentCount(playerA, "Zombie", 2); + + } } From fd08db3b2baae40c58fd82a73dc3a012eaa79a83 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 17:43:20 +0200 Subject: [PATCH 118/375] * Rally the Ancestors - Fixed that the delayed exile effect still did move the card if it left the battlefield meanwhile. --- .../sets/fatereforged/RallyTheAncestors.java | 27 ++++++++++--------- .../mage/sets/gatecrash/HellkiteTyrant.java | 6 ++--- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java b/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java index bd820c79eb1..100549a277a 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java +++ b/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java @@ -34,8 +34,8 @@ import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.ExileSpellEffect; +import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; @@ -76,21 +76,21 @@ public class RallyTheAncestors extends CardImpl { } class RallyTheAncestorsEffect extends OneShotEffect { - + RallyTheAncestorsEffect() { super(Outcome.PutCreatureInPlay); this.staticText = "Return each creature card with converted mana cost X or less from your graveyard to the battlefield. Exile those creatures at the beginning of your next upkeep"; } - + RallyTheAncestorsEffect(final RallyTheAncestorsEffect effect) { super(effect); } - + @Override public RallyTheAncestorsEffect copy() { return new RallyTheAncestorsEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); @@ -101,14 +101,15 @@ class RallyTheAncestorsEffect extends OneShotEffect { Set cards = player.getGraveyard().getCards(filter, game); for (Card card : cards) { if (card != null) { - player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId()); - Effect exileEffect = new ExileTargetEffect("Exile those creatures at the beginning of your next upkeep"); - exileEffect.setTargetPointer(new FixedTarget(card.getId())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(exileEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); + if (player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId())) { + Effect exileEffect = new ExileTargetEffect("Exile those creatures at the beginning of your next upkeep"); + exileEffect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(exileEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + } } } return true; diff --git a/Mage.Sets/src/mage/sets/gatecrash/HellkiteTyrant.java b/Mage.Sets/src/mage/sets/gatecrash/HellkiteTyrant.java index 20a1c1781f9..ff32625bf78 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/HellkiteTyrant.java +++ b/Mage.Sets/src/mage/sets/gatecrash/HellkiteTyrant.java @@ -77,13 +77,13 @@ public class HellkiteTyrant extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); // Whenever Hellkite Tyrant deals combat damage to a player, gain control of all artifacts that player controls. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new HellkiteTyrantEffect(),false, true)); + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new HellkiteTyrantEffect(), false, true)); // At the beginning of your upkeep, if you control twenty or more artifacts, you win the game. TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect(), TargetController.YOU, false); this.addAbility(new ConditionalTriggeredAbility( ability, - new PermanentsOnTheBattlefieldCondition(new FilterArtifactPermanent(), PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN,19), + new PermanentsOnTheBattlefieldCondition(new FilterArtifactPermanent(), PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 19), "At the beginning of your upkeep, if you control twenty or more artifacts, you win the game.")); } @@ -123,7 +123,7 @@ class HellkiteTyrantEffect extends OneShotEffect { FilterPermanent filter = new FilterArtifactPermanent(); filter.add(new ControllerIdPredicate(player.getId())); - List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId() , game); + List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); for (Permanent permanent : permanents) { ContinuousEffect effect = new HellkiteTyrantControlEffect(source.getControllerId()); effect.setTargetPointer(new FixedTarget(permanent.getId())); From dd8b6115400b1dd6677cb8e58f64366f84efcc74 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 20 Jul 2015 11:28:12 -0500 Subject: [PATCH 119/375] Implemented Thicket Elemental, Gamekeeper, Crippling Fatigue, Overkeeper, Odyssey Eggs, Ifh-Biff Efreet, Squallmonger, Workhorse, Riptide Director, Jungle Patrol, Magus of the Library, Ironfist Crusher, and Wall of Glare. --- .../sets/arabiannights/IfhBiffEfreet.java | 52 ++++++++ .../src/mage/sets/commander/Squallmonger.java | 84 ++++++++++++ .../src/mage/sets/conspiracy/Gamekeeper.java | 52 ++++++++ Mage.Sets/src/mage/sets/exodus/Workhorse.java | 73 +++++++++++ .../mage/sets/invasion/ThicketElemental.java | 124 ++++++++++++++++++ .../mage/sets/legions/RiptideDirector.java | 82 ++++++++++++ .../sets/mastersedition/IfhBiffEfreet.java | 87 ++++++++++++ .../mage/sets/mercadianmasques/Overtaker.java | 83 ++++++++++++ .../sets/mercadianmasques/Squallmonger.java | 52 ++++++++ .../src/mage/sets/mirage/JunglePatrol.java | 106 +++++++++++++++ .../src/mage/sets/odyssey/DarkwaterEgg.java | 70 ++++++++++ .../src/mage/sets/odyssey/MossfireEgg.java | 70 ++++++++++ .../src/mage/sets/odyssey/ShadowbloodEgg.java | 70 ++++++++++ .../src/mage/sets/odyssey/SkycloudEgg.java | 70 ++++++++++ .../src/mage/sets/odyssey/SungrassEgg.java | 70 ++++++++++ .../mage/sets/onslaught/IronfistCrusher.java | 70 ++++++++++ .../sets/planarchaos/MagusOfTheLibrary.java | 76 +++++++++++ .../mage/sets/prereleaseevents/Overtaker.java | 54 ++++++++ .../mage/sets/torment/CripplingFatigue.java | 71 ++++++++++ .../mage/sets/urzasdestiny/Gamekeeper.java | 119 +++++++++++++++++ .../mage/sets/urzasdestiny/WallOfGlare.java | 68 ++++++++++ Utils/mtg-cards-data.txt | 4 +- 22 files changed, 1605 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/arabiannights/IfhBiffEfreet.java create mode 100644 Mage.Sets/src/mage/sets/commander/Squallmonger.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/Gamekeeper.java create mode 100644 Mage.Sets/src/mage/sets/exodus/Workhorse.java create mode 100644 Mage.Sets/src/mage/sets/invasion/ThicketElemental.java create mode 100644 Mage.Sets/src/mage/sets/legions/RiptideDirector.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/IfhBiffEfreet.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/Overtaker.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/Squallmonger.java create mode 100644 Mage.Sets/src/mage/sets/mirage/JunglePatrol.java create mode 100644 Mage.Sets/src/mage/sets/odyssey/DarkwaterEgg.java create mode 100644 Mage.Sets/src/mage/sets/odyssey/MossfireEgg.java create mode 100644 Mage.Sets/src/mage/sets/odyssey/ShadowbloodEgg.java create mode 100644 Mage.Sets/src/mage/sets/odyssey/SkycloudEgg.java create mode 100644 Mage.Sets/src/mage/sets/odyssey/SungrassEgg.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/IronfistCrusher.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/MagusOfTheLibrary.java create mode 100644 Mage.Sets/src/mage/sets/prereleaseevents/Overtaker.java create mode 100644 Mage.Sets/src/mage/sets/torment/CripplingFatigue.java create mode 100644 Mage.Sets/src/mage/sets/urzasdestiny/Gamekeeper.java create mode 100644 Mage.Sets/src/mage/sets/urzasdestiny/WallOfGlare.java diff --git a/Mage.Sets/src/mage/sets/arabiannights/IfhBiffEfreet.java b/Mage.Sets/src/mage/sets/arabiannights/IfhBiffEfreet.java new file mode 100644 index 00000000000..0b1b20df4c7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/arabiannights/IfhBiffEfreet.java @@ -0,0 +1,52 @@ +/* + * 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.arabiannights; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class IfhBiffEfreet extends mage.sets.mastersedition.IfhBiffEfreet { + + public IfhBiffEfreet(UUID ownerId) { + super(ownerId); + this.cardNumber = 34; + this.expansionSetCode = "ARN"; + } + + public IfhBiffEfreet(final IfhBiffEfreet card) { + super(card); + } + + @Override + public IfhBiffEfreet copy() { + return new IfhBiffEfreet(this); + } +} diff --git a/Mage.Sets/src/mage/sets/commander/Squallmonger.java b/Mage.Sets/src/mage/sets/commander/Squallmonger.java new file mode 100644 index 00000000000..2e54b1d3c2b --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/Squallmonger.java @@ -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.commander; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.InfoEffect; +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.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author fireshoes + */ +public class Squallmonger extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public Squallmonger(UUID ownerId) { + super(ownerId, 173, "Squallmonger", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "CMD"; + this.subtype.add("Monger"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {2}: Squallmonger deals 1 damage to each creature with flying and each player. Any player may activate this ability. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageAllEffect(1, filter), new ManaCostsImpl("{2}")); + Effect effect = new DamagePlayersEffect(1); + effect.setText("and each player"); + ability.addEffect(effect); + ability.setMayActivate(TargetController.ANY); + ability.addEffect(new InfoEffect("Any player may activate this ability")); + this.addAbility(ability); + } + + public Squallmonger(final Squallmonger card) { + super(card); + } + + @Override + public Squallmonger copy() { + return new Squallmonger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/Gamekeeper.java b/Mage.Sets/src/mage/sets/conspiracy/Gamekeeper.java new file mode 100644 index 00000000000..92a52b22662 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/Gamekeeper.java @@ -0,0 +1,52 @@ +/* + * 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.conspiracy; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Gamekeeper extends mage.sets.urzasdestiny.Gamekeeper { + + public Gamekeeper(UUID ownerId) { + super(ownerId); + this.cardNumber = 165; + this.expansionSetCode = "CNS"; + } + + public Gamekeeper(final Gamekeeper card) { + super(card); + } + + @Override + public Gamekeeper copy() { + return new Gamekeeper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/exodus/Workhorse.java b/Mage.Sets/src/mage/sets/exodus/Workhorse.java new file mode 100644 index 00000000000..d681e6b96b9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/exodus/Workhorse.java @@ -0,0 +1,73 @@ +/* + * 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.exodus; + +import java.util.UUID; +import mage.MageInt; +import mage.Mana; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; + +/** + * + * @author fireshoes + */ +public class Workhorse extends CardImpl { + + public Workhorse(UUID ownerId) { + super(ownerId, 142, "Workhorse", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}"); + this.expansionSetCode = "EXO"; + this.subtype.add("Horse"); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Workhorse enters the battlefield with four +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(4)), "with four +1/+1 counters on it")); + + // Remove a +1/+1 counter from Workhorse: Add {1} to your mana pool. + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, + new Mana(new Mana(0, 0, 0, 0, 0, 1, 0)), + new RemoveCountersSourceCost(CounterType.P1P1.createInstance()))); + } + + public Workhorse(final Workhorse card) { + super(card); + } + + @Override + public Workhorse copy() { + return new Workhorse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/ThicketElemental.java b/Mage.Sets/src/mage/sets/invasion/ThicketElemental.java new file mode 100644 index 00000000000..142a7b4fc14 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/ThicketElemental.java @@ -0,0 +1,124 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.KickerAbility; +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.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class ThicketElemental extends CardImpl { + + public ThicketElemental(UUID ownerId) { + super(ownerId, 214, "Thicket Elemental", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + this.expansionSetCode = "INV"; + this.subtype.add("Elemental"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Kicker {1}{G} + this.addAbility(new KickerAbility("{1}{G}")); + + // When Thicket Elemental enters the battlefield, if it was kicked, you may reveal cards from the top of your library until you reveal a creature card. If you do, put that card onto the battlefield and shuffle all other cards revealed this way into your library. + TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new ThicketElementalEffect()); + this.addAbility(new ConditionalTriggeredAbility(ability, KickedCondition.getInstance(), + "When {this} enters the battlefield, if it was kicked, you may reveal cards from the top of your library until you reveal a creature card. If you do, put that card onto the battlefield and shuffle all other cards revealed this way into your library.")); + } + + public ThicketElemental(final ThicketElemental card) { + super(card); + } + + @Override + public ThicketElemental copy() { + return new ThicketElemental(this); + } +} + +class ThicketElementalEffect extends OneShotEffect { + + + + public ThicketElementalEffect() { + super(Outcome.Benefit); + staticText = "if {this} was kicked, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and shuffle all other cards revealed this way into your library"; + } + + public ThicketElementalEffect(final ThicketElementalEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + Cards revealedCards = new CardsImpl(); + while (controller.getLibrary().size() > 0) { + Card card = controller.getLibrary().removeFromTop(game); + if (card.getCardType().contains(CardType.CREATURE)) { + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId()); + break; + } + revealedCards.add(card); + } + controller.revealCards("ThicketElemental", revealedCards, game); + for (Card card: revealedCards.getCards(game)) { + card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + } + controller.shuffleLibrary(game); + return true; + } + return false; + } + + @Override + public ThicketElementalEffect copy() { + return new ThicketElementalEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/legions/RiptideDirector.java b/Mage.Sets/src/mage/sets/legions/RiptideDirector.java new file mode 100644 index 00000000000..436c04b4260 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legions/RiptideDirector.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.legions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class RiptideDirector extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("Wizard you control"); + + static { + filter.add(new SubtypePredicate("Wizard")); + } + + public RiptideDirector(UUID ownerId) { + super(ownerId, 50, "Riptide Director", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + this.expansionSetCode = "LGN"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // {2}{U}{U}, {tap}: Draw a card for each Wizard you control. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new DrawCardSourceControllerEffect(new PermanentsOnBattlefieldCount(filter)), + new ManaCostsImpl("{2}{U}{U}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + public RiptideDirector(final RiptideDirector card) { + super(card); + } + + @Override + public RiptideDirector copy() { + return new RiptideDirector(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/IfhBiffEfreet.java b/Mage.Sets/src/mage/sets/mastersedition/IfhBiffEfreet.java new file mode 100644 index 00000000000..1b657394d49 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/IfhBiffEfreet.java @@ -0,0 +1,87 @@ +/* + * 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.mastersedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.InfoEffect; +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.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author fireshoes + */ +public class IfhBiffEfreet extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public IfhBiffEfreet(UUID ownerId) { + super(ownerId, 123, "Ifh-Biff Efreet", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + this.expansionSetCode = "MED"; + this.subtype.add("Efreet"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {G}: Ifh-Biff Efreet deals 1 damage to each creature with flying and each player. Any player may activate this ability. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageAllEffect(1, filter), new ManaCostsImpl("{G}")); + Effect effect = new DamagePlayersEffect(1); + effect.setText("and each player"); + ability.addEffect(effect); + ability.setMayActivate(TargetController.ANY); + ability.addEffect(new InfoEffect("Any player may activate this ability")); + this.addAbility(ability); + } + + public IfhBiffEfreet(final IfhBiffEfreet card) { + super(card); + } + + @Override + public IfhBiffEfreet copy() { + return new IfhBiffEfreet(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Overtaker.java b/Mage.Sets/src/mage/sets/mercadianmasques/Overtaker.java new file mode 100644 index 00000000000..ecc066adc56 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Overtaker.java @@ -0,0 +1,83 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Overtaker extends CardImpl { + + public Overtaker(UUID ownerId) { + super(ownerId, 89, "Overtaker", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Merfolk"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {3}{U}, {tap}, Discard a card: Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ManaCostsImpl("{3}{U}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + Effect effect = new GainControlTargetEffect(Duration.EndOfTurn); + ability.addEffect(effect); + effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + ability.addEffect(effect); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public Overtaker(final Overtaker card) { + super(card); + } + + @Override + public Overtaker copy() { + return new Overtaker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Squallmonger.java b/Mage.Sets/src/mage/sets/mercadianmasques/Squallmonger.java new file mode 100644 index 00000000000..48d394544f5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Squallmonger.java @@ -0,0 +1,52 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Squallmonger extends mage.sets.commander.Squallmonger { + + public Squallmonger(UUID ownerId) { + super(ownerId); + this.cardNumber = 276; + this.expansionSetCode = "MMQ"; + } + + public Squallmonger(final Squallmonger card) { + super(card); + } + + @Override + public Squallmonger copy() { + return new Squallmonger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/JunglePatrol.java b/Mage.Sets/src/mage/sets/mirage/JunglePatrol.java new file mode 100644 index 00000000000..e7c75ea8bb2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/JunglePatrol.java @@ -0,0 +1,106 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.permanent.token.Token; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class JunglePatrol extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a token named Wood"); + + static { + filter.add(new NamePredicate("Wood")); + filter.add(new TokenPredicate()); + } + + public JunglePatrol(UUID ownerId) { + super(ownerId, 121, "Jungle Patrol", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // {1}{G}, {tap}: Put a 0/1 green Wall creature token with defender named Wood onto the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new WoodToken()), new ManaCostsImpl("{1}{G}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // Sacrifice a token named Wood: Add {R} to your mana pool. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BasicManaEffect(Mana.RedMana), + new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filter, true)))); + } + + public JunglePatrol(final JunglePatrol card) { + super(card); + } + + @Override + public JunglePatrol copy() { + return new JunglePatrol(this); + } +} + +class WoodToken extends Token { + + public WoodToken() { + super("Wood", "0/1 green Wall creature token with defender named Wood"); + this.setOriginalExpansionSetCode("MIR"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add("Wall"); + power = new MageInt(0); + toughness = new MageInt(1); + + this.addAbility(DefenderAbility.getInstance()); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/odyssey/DarkwaterEgg.java b/Mage.Sets/src/mage/sets/odyssey/DarkwaterEgg.java new file mode 100644 index 00000000000..52bd2d1bd08 --- /dev/null +++ b/Mage.Sets/src/mage/sets/odyssey/DarkwaterEgg.java @@ -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.odyssey; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class DarkwaterEgg extends CardImpl { + + public DarkwaterEgg(UUID ownerId) { + super(ownerId, 299, "Darkwater Egg", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "ODY"; + + // {2}, {tap}, Sacrifice Darkwater Egg: Add {U}{B} to your mana pool. Draw a card. + ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 0, 1, 0, 0), new ManaCostsImpl("{2}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + public DarkwaterEgg(final DarkwaterEgg card) { + super(card); + } + + @Override + public DarkwaterEgg copy() { + return new DarkwaterEgg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/odyssey/MossfireEgg.java b/Mage.Sets/src/mage/sets/odyssey/MossfireEgg.java new file mode 100644 index 00000000000..693f6be1ed4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/odyssey/MossfireEgg.java @@ -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.odyssey; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class MossfireEgg extends CardImpl { + + public MossfireEgg(UUID ownerId) { + super(ownerId, 304, "Mossfire Egg", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "ODY"; + + // {2}, {tap}, Sacrifice Mossfire Egg: Add {R}{G} to your mana pool. Draw a card. + ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 1, 0, 0, 0, 0, 0), new ManaCostsImpl("{2}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + public MossfireEgg(final MossfireEgg card) { + super(card); + } + + @Override + public MossfireEgg copy() { + return new MossfireEgg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/odyssey/ShadowbloodEgg.java b/Mage.Sets/src/mage/sets/odyssey/ShadowbloodEgg.java new file mode 100644 index 00000000000..c2de9c96901 --- /dev/null +++ b/Mage.Sets/src/mage/sets/odyssey/ShadowbloodEgg.java @@ -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.odyssey; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ShadowbloodEgg extends CardImpl { + + public ShadowbloodEgg(UUID ownerId) { + super(ownerId, 308, "Shadowblood Egg", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "ODY"; + + // {2}, {tap}, Sacrifice Shadowblood Egg: Add {B}{R} to your mana pool. Draw a card. + ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 0, 0, 0, 1, 0, 0), new ManaCostsImpl("{2}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + public ShadowbloodEgg(final ShadowbloodEgg card) { + super(card); + } + + @Override + public ShadowbloodEgg copy() { + return new ShadowbloodEgg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/odyssey/SkycloudEgg.java b/Mage.Sets/src/mage/sets/odyssey/SkycloudEgg.java new file mode 100644 index 00000000000..622f19765c1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/odyssey/SkycloudEgg.java @@ -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.odyssey; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class SkycloudEgg extends CardImpl { + + public SkycloudEgg(UUID ownerId) { + super(ownerId, 309, "Skycloud Egg", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "ODY"; + + // {2}, {tap}, Sacrifice Skycloud Egg: Add {W}{U} to your mana pool. Draw a card. + ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 1, 0, 0, 0), new ManaCostsImpl("{2}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + public SkycloudEgg(final SkycloudEgg card) { + super(card); + } + + @Override + public SkycloudEgg copy() { + return new SkycloudEgg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/odyssey/SungrassEgg.java b/Mage.Sets/src/mage/sets/odyssey/SungrassEgg.java new file mode 100644 index 00000000000..06a04ccfed1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/odyssey/SungrassEgg.java @@ -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.odyssey; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class SungrassEgg extends CardImpl { + + public SungrassEgg(UUID ownerId) { + super(ownerId, 311, "Sungrass Egg", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "ODY"; + + // {2}, {tap}, Sacrifice Sungrass Egg: Add {G}{W} to your mana pool. Draw a card. + ManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 1, 0, 1, 0, 0, 0), new ManaCostsImpl("{2}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + public SungrassEgg(final SungrassEgg card) { + super(card); + } + + @Override + public SungrassEgg copy() { + return new SungrassEgg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/IronfistCrusher.java b/Mage.Sets/src/mage/sets/onslaught/IronfistCrusher.java new file mode 100644 index 00000000000..c8928d998c2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/IronfistCrusher.java @@ -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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class IronfistCrusher extends CardImpl { + + public IronfistCrusher(UUID ownerId) { + super(ownerId, 42, "Ironfist Crusher", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{W}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Ironfist Crusher can block any number of creatures. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(0))); + + // Morph {3}{W} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{3}{W}"))); + } + + public IronfistCrusher(final IronfistCrusher card) { + super(card); + } + + @Override + public IronfistCrusher copy() { + return new IronfistCrusher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheLibrary.java b/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheLibrary.java new file mode 100644 index 00000000000..81163b98e6b --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheLibrary.java @@ -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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class MagusOfTheLibrary extends CardImpl { + + public MagusOfTheLibrary(UUID ownerId) { + super(ownerId, 134, "Magus of the Library", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{G}{G}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {tap}: Add {1} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {tap}: Draw a card. Activate this ability only if you have exactly seven cards in hand. + this.addAbility(new ConditionalActivatedAbility( + Zone.BATTLEFIELD, + new DrawCardSourceControllerEffect(1), + new TapSourceCost(), + new CardsInHandCondition(CardsInHandCondition.CountType.EQUAL_TO, 7), + "")); + } + + public MagusOfTheLibrary(final MagusOfTheLibrary card) { + super(card); + } + + @Override + public MagusOfTheLibrary copy() { + return new MagusOfTheLibrary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prereleaseevents/Overtaker.java b/Mage.Sets/src/mage/sets/prereleaseevents/Overtaker.java new file mode 100644 index 00000000000..01ece0181ee --- /dev/null +++ b/Mage.Sets/src/mage/sets/prereleaseevents/Overtaker.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.prereleaseevents; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Overtaker extends mage.sets.mercadianmasques.Overtaker { + + public Overtaker(UUID ownerId) { + super(ownerId); + this.cardNumber = 9; + this.expansionSetCode = "PTC"; + this.rarity = Rarity.SPECIAL; + } + + public Overtaker(final Overtaker card) { + super(card); + } + + @Override + public Overtaker copy() { + return new Overtaker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/CripplingFatigue.java b/Mage.Sets/src/mage/sets/torment/CripplingFatigue.java new file mode 100644 index 00000000000..d0ae4762c02 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/CripplingFatigue.java @@ -0,0 +1,71 @@ +/* + * 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.torment; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TimingRule; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CripplingFatigue extends CardImpl { + + public CripplingFatigue(UUID ownerId) { + super(ownerId, 58, "Crippling Fatigue", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{B}{B}"); + this.expansionSetCode = "TOR"; + + // Target creature gets -2/-2 until end of turn. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new BoostTargetEffect(-2, -2, Duration.EndOfTurn)); + + // Flashback-{1}{B}, Pay 3 life + Ability ability = new FlashbackAbility(new ManaCostsImpl("{1}{B}"), TimingRule.SORCERY); + ability.addCost(new PayLifeCost(3)); + this.addAbility(ability); + } + + public CripplingFatigue(final CripplingFatigue card) { + super(card); + } + + @Override + public CripplingFatigue copy() { + return new CripplingFatigue(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/Gamekeeper.java b/Mage.Sets/src/mage/sets/urzasdestiny/Gamekeeper.java new file mode 100644 index 00000000000..71b6e21e76b --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzasdestiny/Gamekeeper.java @@ -0,0 +1,119 @@ +/* + * 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.urzasdestiny; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.costs.common.ExileSourceFromGraveCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.ExileSourceEffect; +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.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class Gamekeeper extends CardImpl { + + public Gamekeeper(UUID ownerId) { + super(ownerId, 106, "Gamekeeper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "UDS"; + this.subtype.add("Elf"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Gamekeeper dies, you may exile it. If you do, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and put all other cards revealed this way into your graveyard. + Ability ability = new DiesTriggeredAbility(new DoIfCostPaid(new GamekeeperEffect(), new ExileSourceFromGraveCost(), "Exile to reveal cards from the top of your library until you reveal a creature card?"), false); + this.addAbility(ability); + } + + public Gamekeeper(final Gamekeeper card) { + super(card); + } + + @Override + public Gamekeeper copy() { + return new Gamekeeper(this); + } +} + +class GamekeeperEffect extends OneShotEffect { + + + + public GamekeeperEffect() { + super(Outcome.Benefit); + staticText = "reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and put all other cards revealed this way into your graveyard"; + } + + public GamekeeperEffect(final GamekeeperEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + new ExileSourceEffect().apply(game, source); + Cards revealedCards = new CardsImpl(); + while (controller.getLibrary().size() > 0) { + Card card = controller.getLibrary().removeFromTop(game); + if (card.getCardType().contains(CardType.CREATURE)) { + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId()); + break; + } + revealedCards.add(card); + } + controller.revealCards("Gamekeeper", revealedCards, game); + for (Card card: revealedCards.getCards(game)) { + card.moveToZone(Zone.GRAVEYARD, source.getSourceId(), game, true); + } + return true; + } + return false; + } + + @Override + public GamekeeperEffect copy() { + return new GamekeeperEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/WallOfGlare.java b/Mage.Sets/src/mage/sets/urzasdestiny/WallOfGlare.java new file mode 100644 index 00000000000..19a096e9985 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzasdestiny/WallOfGlare.java @@ -0,0 +1,68 @@ +/* + * 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.urzasdestiny; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class WallOfGlare extends CardImpl { + + public WallOfGlare(UUID ownerId) { + super(ownerId, 25, "Wall of Glare", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "UDS"; + this.subtype.add("Wall"); + this.power = new MageInt(0); + this.toughness = new MageInt(5); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // Wall of Glare can block any number of creatures. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(0))); + } + + public WallOfGlare(final WallOfGlare card) { + super(card); + } + + @Override + public WallOfGlare copy() { + return new WallOfGlare(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 66cd2ae3041..7dde083ccd7 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -628,7 +628,7 @@ Desert Twister|Arabian Nights|30|U|{4}{G}{G}|Sorcery|||Destroy target permanent. Drop of Honey|Arabian Nights|31|R|{G}|Enchantment|||At the beginning of your upkeep, destroy the creature with the least power. It can't be regenerated. If two or more creatures are tied for least power, you choose one of them.$When there are no creatures on the battlefield, sacrifice Drop of Honey.| Erhnam Djinn|Arabian Nights|32|R|{3}{G}|Creature - Djinn|4|5|At the beginning of your upkeep, target non-Wall creature an opponent controls gains forestwalk until your next upkeep.| Ghazban Ogre|Arabian Nights|33|C|{G}|Creature - Ogre|2|2|At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of Ghazbán Ogre.| -Ifh-B ff Efreet|Arabian Nights|34|R|{2}{G}{G}|Creature - Efreet|3|3|Flying${G}: Ifh-Bíff Efreet deals 1 damage to each creature with flying and each player. Any player may activate this ability.| +Ifh-Biff Efreet|Arabian Nights|34|R|{2}{G}{G}|Creature - Efreet|3|3|Flying${G}: Ifh-Biff Efreet deals 1 damage to each creature with flying and each player. Any player may activate this ability.| Metamorphosis|Arabian Nights|35|C|{G}|Sorcery|||As an additional cost to cast Metamorphosis, sacrifice a creature.$Add X mana of any one color to your mana pool, where X is one plus the sacrificed creature's converted mana cost. Spend this mana only to cast creature spells.| Nafs Asp|Arabian Nights|36|C|{G}|Creature - Snake|1|1|Whenever Nafs Asp deals damage to a player, that player loses 1 life at the beginning of his or her next draw step unless he or she pays {1} before that draw step.| Nafs Asp|Arabian Nights|36|C|{G}|Creature - Snake|1|1|Whenever Nafs Asp deals damage to a player, that player loses 1 life at the beginning of his or her next draw step unless he or she pays {1} before that draw step.| @@ -10651,7 +10651,7 @@ Exile|Masters Edition|12|C|{2}{W}|Instant|||Exile target nonwhite attacking crea Ghazban Ogre|Masters Edition|120|C|{G}|Creature - Ogre|2|2|At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of Ghazbán Ogre.| Hungry Mist|Masters Edition|121|C|{2}{G}{G}|Creature - Elemental|6|2|At the beginning of your upkeep, sacrifice Hungry Mist unless you pay {G}{G}.| Ice Storm|Masters Edition|122|U|{2}{G}|Sorcery|||Destroy target land.| -Ifh-B ff Efreet|Masters Edition|123|R|{2}{G}{G}|Creature - Efreet|3|3|Flying${G}: Ifh-Bíff Efreet deals 1 damage to each creature with flying and each player. Any player may activate this ability.| +Ifh-Biff Efreet|Masters Edition|123|R|{2}{G}{G}|Creature - Efreet|3|3|Flying${G}: Ifh-Biff Efreet deals 1 damage to each creature with flying and each player. Any player may activate this ability.| Nature's Lore|Masters Edition|124|C|{1}{G}|Sorcery|||Search your library for a Forest card and put that card onto the battlefield. Then shuffle your library.| Primal Order|Masters Edition|125|R|{2}{G}{G}|Enchantment|||At the beginning of each player's upkeep, Primal Order deals damage to that player equal to the number of nonbasic lands he or she controls.| Rabid Wombat|Masters Edition|126|U|{2}{G}{G}|Creature - Wombat|0|1|Vigilance$Rabid Wombat gets +2/+2 for each Aura attached to it.| From 8f68f2b7d521f7e97dbbcf59cb88e23ea8b39419 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 19:34:58 +0200 Subject: [PATCH 120/375] * Fixed some exile zone names not showing the ID of the owning object. --- .../sets/avacynrestored/DarkImpostor.java | 21 +++++--- .../mage/sets/dragonsoftarkir/Silkwrap.java | 10 ++-- .../sets/journeyintonyx/BanishingLight.java | 11 ++-- .../sets/khansoftarkir/SuspensionField.java | 8 +-- .../mage/sets/magic2014/BanisherPriest.java | 3 +- .../mage/sets/magic2014/ColossalWhale.java | 2 +- .../sets/magic2015/ConstrictingSliver.java | 9 ++-- .../mage/sets/newphyrexia/KarnLiberated.java | 24 ++++----- .../sets/ravnica/SistersOfStoneDeath.java | 24 ++++----- .../mage/sets/theros/ChainedToTheRocks.java | 50 ++++++++++--------- 10 files changed, 84 insertions(+), 78 deletions(-) diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DarkImpostor.java b/Mage.Sets/src/mage/sets/avacynrestored/DarkImpostor.java index 1748583e0db..d51cdecde77 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/DarkImpostor.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/DarkImpostor.java @@ -27,7 +27,7 @@ */ package mage.sets.avacynrestored; -import mage.constants.*; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; @@ -40,17 +40,22 @@ import mage.abilities.effects.common.ImprintTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; - /** * * @author noxx - + * */ public class DarkImpostor extends CardImpl { @@ -65,7 +70,7 @@ public class DarkImpostor extends CardImpl { // {4}{B}{B}: Exile target creature and put a +1/+1 counter on Dark Impostor.\ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ImprintTargetEffect(), new ManaCostsImpl("{4}{B}{B}")); - ability.addEffect(new ExileTargetEffect(null, "Dark Impostor")); + ability.addEffect(new ExileTargetEffect(null, this.getIdName())); ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance())); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); @@ -99,10 +104,10 @@ class DarkImpostorContinuousEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { Permanent perm = game.getPermanent(source.getSourceId()); if (perm != null) { - for (UUID imprintedId: perm.getImprinted()) { + for (UUID imprintedId : perm.getImprinted()) { Card card = game.getCard(imprintedId); if (card != null) { - for (Ability ability: card.getAbilities()) { + for (Ability ability : card.getAbilities()) { if (ability instanceof ActivatedAbility) { perm.addAbility(ability, source.getSourceId(), game); } @@ -118,4 +123,4 @@ class DarkImpostorContinuousEffect extends ContinuousEffectImpl { return new DarkImpostorContinuousEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/Silkwrap.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/Silkwrap.java index 450283ec59d..9af141380e4 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/Silkwrap.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/Silkwrap.java @@ -53,7 +53,7 @@ import mage.util.CardUtil; * @author jeffwadsworth */ public class Silkwrap extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost 3 or less an opponent controls"); static { @@ -69,8 +69,8 @@ public class Silkwrap extends CardImpl { Ability ability = new EntersBattlefieldTriggeredAbility(new SilkwrapEffect()); ability.addTarget(new TargetPermanent(filter)); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility())); - this.addAbility(ability); - + this.addAbility(ability); + } public Silkwrap(final Silkwrap card) { @@ -103,8 +103,8 @@ class SilkwrapEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source); } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/BanishingLight.java b/Mage.Sets/src/mage/sets/journeyintonyx/BanishingLight.java index feaed29eaec..392e925c027 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/BanishingLight.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/BanishingLight.java @@ -53,21 +53,20 @@ import mage.util.CardUtil; public class BanishingLight extends CardImpl { private final static FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanent an opponent controls"); - + static { filter.add(new ControllerPredicate(TargetController.OPPONENT)); - } - + } + public BanishingLight(UUID ownerId) { super(ownerId, 5, "Banishing Light", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); this.expansionSetCode = "JOU"; - // When Banishing Light enters the battlefield, exile target nonland permanent an opponent controls until Banishing Light leaves the battlefield. Ability ability = new EntersBattlefieldTriggeredAbility(new BanishingLightExileEffect()); ability.addTarget(new TargetPermanent(filter)); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility())); - this.addAbility(ability); + this.addAbility(ability); } public BanishingLight(final BanishingLight card) { @@ -102,7 +101,7 @@ class BanishingLightExileEffect extends OneShotEffect { // If Banishing Light leaves the battlefield before its triggered ability resolves, // the target won't be exiled. if (permanent != null) { - return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/SuspensionField.java b/Mage.Sets/src/mage/sets/khansoftarkir/SuspensionField.java index 419d131632d..087631b2a71 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/SuspensionField.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/SuspensionField.java @@ -53,15 +53,15 @@ import mage.util.CardUtil; public class SuspensionField extends CardImpl { private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 3 or greater"); + static { filter.add(new ToughnessPredicate(ComparisonType.GreaterThan, 2)); - } - + } + public SuspensionField(UUID ownerId) { super(ownerId, 25, "Suspension Field", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); this.expansionSetCode = "KTK"; - // When Suspension Field enters the battlefield, you may exile target creature with toughness 3 or greater until Suspension Field leaves the battlefield. Ability ability = new EntersBattlefieldTriggeredAbility(new SuspensionFieldExileEffect(), true); ability.addTarget(new TargetCreaturePermanent(filter)); @@ -101,7 +101,7 @@ class SuspensionFieldExileEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanent(source.getSourceId()); // If Suspension Field leaves the battlefield before its triggered ability resolves, the target won't be exiled. if (sourcePermanent != null) { - return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), sourcePermanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), sourcePermanent.getIdName()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java b/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java index 6f3baeec946..f907e0226d6 100644 --- a/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java +++ b/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java @@ -54,6 +54,7 @@ import mage.util.CardUtil; public class BanisherPriest extends CardImpl { private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); + static { filter.add(new ControllerPredicate(TargetController.OPPONENT)); } @@ -106,7 +107,7 @@ class BanisherPriestExileEffect extends OneShotEffect { // If Banisher Priest leaves the battlefield before its triggered ability resolves, // the target creature won't be exiled. if (permanent != null) { - return new ExileTargetEffect(CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()), permanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()), permanent.getIdName()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2014/ColossalWhale.java b/Mage.Sets/src/mage/sets/magic2014/ColossalWhale.java index 187439dba28..1838807ab83 100644 --- a/Mage.Sets/src/mage/sets/magic2014/ColossalWhale.java +++ b/Mage.Sets/src/mage/sets/magic2014/ColossalWhale.java @@ -146,7 +146,7 @@ class ColossalWhaleExileEffect extends OneShotEffect { // If Whale leaves the battlefield before its triggered ability resolves, // the target creature won't be exiled. if (permanent != null) { - return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java b/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java index 5e2e5682c94..e16e2afde9e 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java +++ b/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java @@ -64,7 +64,6 @@ public class ConstrictingSliver extends CardImpl { filterTarget.add(new ControllerPredicate(TargetController.OPPONENT)); } - public ConstrictingSliver(UUID ownerId) { super(ownerId, 7, "Constricting Sliver", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{W}"); this.expansionSetCode = "M15"; @@ -73,15 +72,15 @@ public class ConstrictingSliver extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); - // Sliver creatures you control have "When this creature enters the battlefield, you may exile target creature an opponent controls + // Sliver creatures you control have "When this creature enters the battlefield, you may exile target creature an opponent controls // until this creature leaves the battlefield." Ability ability = new EntersBattlefieldTriggeredAbility(new ConstrictingSliverExileEffect(), true); ability.addTarget(new TargetCreaturePermanent(filterTarget)); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility())); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ability, - Duration.WhileOnBattlefield, new FilterControlledCreaturePermanent("Sliver","Sliver creatures"), - "Sliver creatures you control have \"When this creature enters the battlefield, you may exile target creature an opponent controls until this creature leaves the battlefield.\""))); + Duration.WhileOnBattlefield, new FilterControlledCreaturePermanent("Sliver", "Sliver creatures"), + "Sliver creatures you control have \"When this creature enters the battlefield, you may exile target creature an opponent controls until this creature leaves the battlefield.\""))); } @@ -117,7 +116,7 @@ class ConstrictingSliverExileEffect extends OneShotEffect { // If the creature leaves the battlefield before its triggered ability resolves, // the target creature won't be exiled. if (permanent != null) { - return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java b/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java index 38deecc35fe..5b5a30d8035 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java @@ -75,12 +75,12 @@ public class KarnLiberated extends CardImpl { this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(6)), false)); // +4: Target player exiles a card from his or her hand. - LoyaltyAbility ability1 = new LoyaltyAbility(new ExileFromZoneTargetEffect(Zone.HAND, exileId, "Karn Liberated", new FilterCard()), 4); + LoyaltyAbility ability1 = new LoyaltyAbility(new ExileFromZoneTargetEffect(Zone.HAND, exileId, this.getIdName(), new FilterCard()), 4); ability1.addTarget(new TargetPlayer()); this.addAbility(ability1); // -3: Exile target permanent. - LoyaltyAbility ability2 = new LoyaltyAbility(new ExileTargetEffect(exileId, "Karn Liberated"), -3); + LoyaltyAbility ability2 = new LoyaltyAbility(new ExileTargetEffect(exileId, this.getIdName()), -3); ability2.addTarget(new TargetPermanent()); this.addAbility(ability2); @@ -120,9 +120,9 @@ class KarnLiberatedEffect extends OneShotEffect { return false; } List cards = new ArrayList<>(); - for (ExileZone zone: game.getExile().getExileZones()) { + for (ExileZone zone : game.getExile().getExileZones()) { if (zone.getId().equals(exileId)) { - for (Card card: zone.getCards(game)) { + for (Card card : zone.getCards(game)) { if (!card.getSubtype().contains("Aura") && CardUtil.isPermanentCard(card)) { cards.add(card); } @@ -130,15 +130,15 @@ class KarnLiberatedEffect extends OneShotEffect { } } game.getState().clear(); - for (Card card: game.getCards()) { + for (Card card : game.getCards()) { game.getState().addCard(card); } - for (Player player: game.getPlayers().values()) { + for (Player player : game.getPlayers().values()) { player.getGraveyard().clear(); player.getHand().clear(); player.getLibrary().clear(); - for (Card card: game.getCards()) { - if (card.getOwnerId().equals(player.getId()) && !card.isCopy() // no copies + for (Card card : game.getCards()) { + if (card.getOwnerId().equals(player.getId()) && !card.isCopy() // no copies && !player.getSideboard().contains(card.getId()) && !cards.contains(card)) { // not the exiled cards player.getLibrary().putOnTop(card, game); @@ -146,8 +146,8 @@ class KarnLiberatedEffect extends OneShotEffect { } player.init(game); } - for (Card card: cards) { - if ( CardUtil.isPermanentCard(card) && !card.getSubtype().contains("Aura") ) { + for (Card card : cards) { + if (CardUtil.isPermanentCard(card) && !card.getSubtype().contains("Aura")) { game.getExile().add(exileId, sourceObject.getIdName(), card); } } @@ -215,10 +215,10 @@ class KarnLiberatedDelayedEffect extends OneShotEffect { if (exile != null) { Cards cards = new CardsImpl(); // needed because putOntoTheBattlefield removes from exile cards.addAll(exile); - for (Card card: cards.getCards(game)) { + for (Card card : cards.getCards(game)) { card.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), source.getControllerId()); Permanent permanent = game.getPermanent(card.getId()); - ((PermanentImpl)permanent).removeSummoningSickness(); + ((PermanentImpl) permanent).removeSummoningSickness(); } return true; } diff --git a/Mage.Sets/src/mage/sets/ravnica/SistersOfStoneDeath.java b/Mage.Sets/src/mage/sets/ravnica/SistersOfStoneDeath.java index 1c74a4d7b71..200188ec098 100644 --- a/Mage.Sets/src/mage/sets/ravnica/SistersOfStoneDeath.java +++ b/Mage.Sets/src/mage/sets/ravnica/SistersOfStoneDeath.java @@ -59,16 +59,14 @@ import mage.target.common.TargetCreaturePermanent; * @author jeffwadsworth */ public class SistersOfStoneDeath extends CardImpl { - + private UUID exileId = UUID.randomUUID(); - + public SistersOfStoneDeath(UUID ownerId) { super(ownerId, 231, "Sisters of Stone Death", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{B}{B}{G}{G}"); this.expansionSetCode = "RAV"; this.supertype.add("Legendary"); this.subtype.add("Gorgon"); - - this.power = new MageInt(7); this.toughness = new MageInt(5); @@ -79,7 +77,7 @@ public class SistersOfStoneDeath extends CardImpl { this.addAbility(ability); // {B}{G}: Exile target creature blocking or blocked by Sisters of Stone Death. - Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(exileId, "Sisters Of Stone Death"), new ManaCostsImpl("{B}{G}")); + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(exileId, this.getIdName()), new ManaCostsImpl("{B}{G}")); FilterCreaturePermanent filter = new FilterCreaturePermanent("creature blocking or blocked by Sisters of Stone Death"); filter.add(Predicates.or(new BlockedByIdPredicate(this.getId()), new BlockingAttackerIdPredicate(this.getId()))); @@ -88,13 +86,13 @@ public class SistersOfStoneDeath extends CardImpl { // {2}{B}: Put a creature card exiled with Sisters of Stone Death onto the battlefield under your control. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new SistersOfStoneDeathEffect(exileId), new ManaCostsImpl("{2}{B}"))); - + } - + public SistersOfStoneDeath(final SistersOfStoneDeath card) { super(card); } - + @Override public SistersOfStoneDeath copy() { return new SistersOfStoneDeath(this); @@ -102,20 +100,20 @@ public class SistersOfStoneDeath extends CardImpl { } class SistersOfStoneDeathEffect extends OneShotEffect { - + private UUID exileId; - + public SistersOfStoneDeathEffect(UUID exileId) { super(Outcome.PutCreatureInPlay); this.exileId = exileId; staticText = "Put a creature card exiled with {this} onto the battlefield under your control"; } - + public SistersOfStoneDeathEffect(final SistersOfStoneDeathEffect effect) { super(effect); this.exileId = effect.exileId; } - + @Override public boolean apply(Game game, Ability source) { CardsImpl cardsInExile = new CardsImpl(); @@ -137,7 +135,7 @@ class SistersOfStoneDeathEffect extends OneShotEffect { } return false; } - + @Override public SistersOfStoneDeathEffect copy() { return new SistersOfStoneDeathEffect(this); diff --git a/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java b/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java index a5d3a0e0246..2a8dd53f012 100644 --- a/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java +++ b/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java @@ -52,33 +52,37 @@ import mage.target.common.TargetCreaturePermanent; import mage.util.CardUtil; /** - * If the land Chained to the Rocks is enchanting stops being a Mountain or another player - * gains control of it, Chained to the Rocks will be put into its owner's graveyard when - * state-based actions are performed. + * If the land Chained to the Rocks is enchanting stops being a Mountain or + * another player gains control of it, Chained to the Rocks will be put into its + * owner's graveyard when state-based actions are performed. * - * Chained to the Rocks's ability causes a zone change with a duration, a style of ability - * introduced in Magic 2014 that's somewhat reminiscent of older cards like Oblivion Ring. - * However, unlike Oblivion Ring, cards like Chained to the Rocks have a single ability - * that creates two one-shot effects: one that exiles the creature when the ability resolves, - * and another that returns the exiled card to the battlefield immediately after Chained to - * the Rocks leaves the battlefield. + * Chained to the Rocks's ability causes a zone change with a duration, a style + * of ability introduced in Magic 2014 that's somewhat reminiscent of older + * cards like Oblivion Ring. However, unlike Oblivion Ring, cards like Chained + * to the Rocks have a single ability that creates two one-shot effects: one + * that exiles the creature when the ability resolves, and another that returns + * the exiled card to the battlefield immediately after Chained to the Rocks + * leaves the battlefield. * - * If Chained to the Rocks leaves the battlefield before its triggered ability resolves, - * the target creature won't be exiled. + * If Chained to the Rocks leaves the battlefield before its triggered ability + * resolves, the target creature won't be exiled. * - * Auras attached to the exiled creature will be put into their owners' graveyards (unless - * they have bestow). Equipment attached to the exiled creature will become unattached and - * remain on the battlefield. Any counters on the exiled creature will cease to exist. + * Auras attached to the exiled creature will be put into their owners' + * graveyards (unless they have bestow). Equipment attached to the exiled + * creature will become unattached and remain on the battlefield. Any counters + * on the exiled creature will cease to exist. * - * If a creature token is exiled, it ceases to exist. It won't be returned to the battlefield. + * If a creature token is exiled, it ceases to exist. It won't be returned to + * the battlefield. * - * The exiled card returns to the battlefield immediately after Chained to the Rocks leaves - * the battlefield. Nothing happens between the two events, including state-based actions. + * The exiled card returns to the battlefield immediately after Chained to the + * Rocks leaves the battlefield. Nothing happens between the two events, + * including state-based actions. * - * In a multiplayer game, if Chained to the Rocks's owner leaves the game, the exiled card - * will return to the battlefield. Because the one-shot effect that returns the card isn't - * an ability that goes on the stack, it won't cease to exist along with the leaving player's - * spells and abilities on the stack. + * In a multiplayer game, if Chained to the Rocks's owner leaves the game, the + * exiled card will return to the battlefield. Because the one-shot effect that + * returns the card isn't an ability that goes on the stack, it won't cease to + * exist along with the leaving player's spells and abilities on the stack. * * @author LevelX2 */ @@ -86,6 +90,7 @@ public class ChainedToTheRocks extends CardImpl { private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("Mountain you control"); private static final FilterCreaturePermanent filterTarget = new FilterCreaturePermanent("creature an opponent controls"); + static { filter.add(new SubtypePredicate("Mountain")); filterTarget.add(new ControllerPredicate(TargetController.OPPONENT)); @@ -96,7 +101,6 @@ public class ChainedToTheRocks extends CardImpl { this.expansionSetCode = "THS"; this.subtype.add("Aura"); - // Enchant Mountain you control TargetPermanent auraTarget = new TargetPermanent(filter); this.getSpellAbility().addTarget(auraTarget); @@ -144,7 +148,7 @@ class ChainedToTheRocksEffect extends OneShotEffect { // If Chained to the Rocks leaves the battlefield before its triggered ability resolves, // the target creature won't be exiled. if (permanent != null) { - return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source); } return false; } From 2c3790b70e8814b9e1df8e31053bd3288d68e270 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 20 Jul 2015 21:06:51 +0300 Subject: [PATCH 121/375] Remove basic lands from boosters that are not supposed to have them. Implement the timeshifted slot of Time Spiral boosters. TODO: Planar Chaos with its "planeshifted" card slots --- .../src/mage/sets/ChampionsOfKamigawa.java | 4 ++-- .../src/mage/sets/ClassicSixthEdition.java | 4 ++-- Mage.Sets/src/mage/sets/FifthEdition.java | 6 ++--- Mage.Sets/src/mage/sets/FourthEdition.java | 4 ++-- Mage.Sets/src/mage/sets/FutureSight.java | 4 ++-- Mage.Sets/src/mage/sets/IceAge.java | 4 ++-- Mage.Sets/src/mage/sets/Invasion.java | 6 ++--- Mage.Sets/src/mage/sets/Judgment.java | 6 ++--- Mage.Sets/src/mage/sets/Legends.java | 4 ++-- .../src/mage/sets/LimitedEditionAlpha.java | 4 ++-- .../src/mage/sets/LimitedEditionBeta.java | 4 ++-- Mage.Sets/src/mage/sets/Lorwyn.java | 4 ++-- Mage.Sets/src/mage/sets/MercadianMasques.java | 4 ++-- Mage.Sets/src/mage/sets/Mirage.java | 4 ++-- Mage.Sets/src/mage/sets/Mirrodin.java | 4 ++-- Mage.Sets/src/mage/sets/Odyssey.java | 4 ++-- Mage.Sets/src/mage/sets/Onslaught.java | 6 ++--- .../src/mage/sets/RavnicaCityOfGuilds.java | 4 ++-- Mage.Sets/src/mage/sets/RevisedEdition.java | 4 ++-- Mage.Sets/src/mage/sets/Shadowmoor.java | 4 ++-- Mage.Sets/src/mage/sets/Tempest.java | 4 ++-- Mage.Sets/src/mage/sets/TimeSpiral.java | 23 +++++++++++++++---- Mage.Sets/src/mage/sets/UrzasDestiny.java | 4 ++-- Mage.Sets/src/mage/sets/UrzasLegacy.java | 4 ++-- Mage.Sets/src/mage/sets/UrzasSaga.java | 4 ++-- Mage.Sets/src/mage/sets/Weatherlight.java | 4 ++-- Mage/src/mage/cards/ExpansionSet.java | 2 +- 27 files changed, 73 insertions(+), 60 deletions(-) diff --git a/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java b/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java index ee0847dea9f..bd5d6bdda63 100644 --- a/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java +++ b/Mage.Sets/src/mage/sets/ChampionsOfKamigawa.java @@ -15,8 +15,8 @@ public class ChampionsOfKamigawa extends ExpansionSet { super("Champions of Kamigawa", "CHK", "mage.sets.championsofkamigawa", new GregorianCalendar(2004, 9, 1).getTime(), SetType.EXPANSION); this.blockName = "Kamigawa"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/ClassicSixthEdition.java b/Mage.Sets/src/mage/sets/ClassicSixthEdition.java index f8b987af32f..543300a0f50 100644 --- a/Mage.Sets/src/mage/sets/ClassicSixthEdition.java +++ b/Mage.Sets/src/mage/sets/ClassicSixthEdition.java @@ -47,8 +47,8 @@ public class ClassicSixthEdition extends ExpansionSet { private ClassicSixthEdition() { super("Classic Sixth Edition", "6ED", "mage.sets.classicsixthedition", new GregorianCalendar(1999, 3, 28).getTime(), SetType.CORE); this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index 56b9d933fc4..5f3a0b10e3b 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -15,11 +15,11 @@ public class FifthEdition extends ExpansionSet { private FifthEdition() { super("Fifth Edition", "5ED", "mage.sets.fifthedition", new GregorianCalendar(1997, 3, 1).getTime(), SetType.CORE); this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/FourthEdition.java b/Mage.Sets/src/mage/sets/FourthEdition.java index 46b0f5a8906..624d4519eb2 100644 --- a/Mage.Sets/src/mage/sets/FourthEdition.java +++ b/Mage.Sets/src/mage/sets/FourthEdition.java @@ -47,8 +47,8 @@ public class FourthEdition extends ExpansionSet { private FourthEdition() { super("Fourth Edition", "4ED", "mage.sets.fourthedition", new GregorianCalendar(1995, 3, 1).getTime(), SetType.CORE); this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/FutureSight.java b/Mage.Sets/src/mage/sets/FutureSight.java index ca70d3b350d..30444985c8f 100644 --- a/Mage.Sets/src/mage/sets/FutureSight.java +++ b/Mage.Sets/src/mage/sets/FutureSight.java @@ -49,8 +49,8 @@ public class FutureSight extends ExpansionSet { this.parentSet = TimeSpiral.getInstance(); this.hasBasicLands = false; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index 0612030775c..3ef48130795 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -48,8 +48,8 @@ public class IceAge extends ExpansionSet { super("Ice Age", "ICE", "mage.sets.iceage", new GregorianCalendar(1995, 5, 1).getTime(), SetType.EXPANSION); this.blockName = "Ice Age"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Invasion.java b/Mage.Sets/src/mage/sets/Invasion.java index 98588fb7648..8e9290f7724 100644 --- a/Mage.Sets/src/mage/sets/Invasion.java +++ b/Mage.Sets/src/mage/sets/Invasion.java @@ -46,10 +46,10 @@ public class Invasion extends ExpansionSet { super("Invasion", "INV", "mage.sets.invasion", new GregorianCalendar(2000, 9, 2).getTime(), SetType.EXPANSION); this.blockName = "Invasion"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/Judgment.java b/Mage.Sets/src/mage/sets/Judgment.java index 4b25afcd4e6..3614c778829 100644 --- a/Mage.Sets/src/mage/sets/Judgment.java +++ b/Mage.Sets/src/mage/sets/Judgment.java @@ -49,10 +49,10 @@ public class Judgment extends ExpansionSet { this.parentSet = Odyssey.getInstance(); this.hasBasicLands = false; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/Legends.java b/Mage.Sets/src/mage/sets/Legends.java index cdc9935d03a..b5307e817fa 100644 --- a/Mage.Sets/src/mage/sets/Legends.java +++ b/Mage.Sets/src/mage/sets/Legends.java @@ -48,8 +48,8 @@ public class Legends extends ExpansionSet { super("Legends", "LEG", "mage.sets.legends", new GregorianCalendar(1994, 5, 1).getTime(), SetType.EXPANSION); this.hasBasicLands = false; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java index fb93b406110..467f742fd0d 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java @@ -20,8 +20,8 @@ public class LimitedEditionAlpha extends ExpansionSet { private LimitedEditionAlpha() { super("Limited Edition Alpha", "LEA", "mage.sets.limitedalpha", new GregorianCalendar(1993, 7, 1).getTime(), SetType.CORE); this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java index 599ae25cf32..dfd8189ced3 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java @@ -20,8 +20,8 @@ public class LimitedEditionBeta extends ExpansionSet { private LimitedEditionBeta() { super("Limited Edition Beta", "LEB", "mage.sets.limitedbeta", new GregorianCalendar(1993, 9, 1).getTime(), SetType.CORE); this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Lorwyn.java b/Mage.Sets/src/mage/sets/Lorwyn.java index cac08597c78..011e1b6180e 100644 --- a/Mage.Sets/src/mage/sets/Lorwyn.java +++ b/Mage.Sets/src/mage/sets/Lorwyn.java @@ -47,8 +47,8 @@ public class Lorwyn extends ExpansionSet { super("Lorwyn", "LRW", "mage.sets.lorwyn", new GregorianCalendar(2007, 9, 12).getTime(), SetType.EXPANSION); this.blockName = "Lorwyn"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java index 7182d87bc46..dc1d00790f8 100644 --- a/Mage.Sets/src/mage/sets/MercadianMasques.java +++ b/Mage.Sets/src/mage/sets/MercadianMasques.java @@ -48,8 +48,8 @@ public class MercadianMasques extends ExpansionSet { super("Mercadian Masques", "MMQ", "mage.sets.mercadianmasques", new GregorianCalendar(1999, 8, 25).getTime(), SetType.EXPANSION); this.blockName = "Masques"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java index 7bdbf7c12dc..9d40be18729 100644 --- a/Mage.Sets/src/mage/sets/Mirage.java +++ b/Mage.Sets/src/mage/sets/Mirage.java @@ -47,8 +47,8 @@ public class Mirage extends ExpansionSet { super("Mirage", "MIR", "mage.sets.mirage", new GregorianCalendar(1996, 8, 21).getTime(), SetType.EXPANSION); this.blockName = "Mirage"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Mirrodin.java b/Mage.Sets/src/mage/sets/Mirrodin.java index 92f3cdb2c9c..82d6d416541 100644 --- a/Mage.Sets/src/mage/sets/Mirrodin.java +++ b/Mage.Sets/src/mage/sets/Mirrodin.java @@ -16,8 +16,8 @@ public class Mirrodin extends ExpansionSet { super("Mirrodin", "MRD", "mage.sets.mirrodin", new GregorianCalendar(2003, 9, 2).getTime(), SetType.EXPANSION); this.blockName = "Mirrodin"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Odyssey.java b/Mage.Sets/src/mage/sets/Odyssey.java index 6eea1098284..b962188d4e7 100644 --- a/Mage.Sets/src/mage/sets/Odyssey.java +++ b/Mage.Sets/src/mage/sets/Odyssey.java @@ -47,8 +47,8 @@ public class Odyssey extends ExpansionSet { super("Odyssey", "ODY", "mage.sets.odyssey", new GregorianCalendar(2001, 9, 22).getTime(), SetType.EXPANSION); this.blockName = "Odyssey"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index c3ca10d05d0..e1e64cb4754 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -16,10 +16,10 @@ public class Onslaught extends ExpansionSet { super("Onslaught", "ONS", "mage.sets.onslaught", new GregorianCalendar(2002, 10, 7).getTime(), SetType.EXPANSION); this.blockName = "Onslaught"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/RavnicaCityOfGuilds.java b/Mage.Sets/src/mage/sets/RavnicaCityOfGuilds.java index b0c4cfaffd0..f9f0f39e511 100644 --- a/Mage.Sets/src/mage/sets/RavnicaCityOfGuilds.java +++ b/Mage.Sets/src/mage/sets/RavnicaCityOfGuilds.java @@ -48,8 +48,8 @@ public class RavnicaCityOfGuilds extends ExpansionSet { super("Ravnica: City of Guilds", "RAV", "mage.sets.ravnica", new GregorianCalendar(2005, 9, 24).getTime(), SetType.EXPANSION); this.blockName = "Ravnica"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/RevisedEdition.java b/Mage.Sets/src/mage/sets/RevisedEdition.java index 585abbfc50a..9a39ecc2686 100644 --- a/Mage.Sets/src/mage/sets/RevisedEdition.java +++ b/Mage.Sets/src/mage/sets/RevisedEdition.java @@ -20,8 +20,8 @@ public class RevisedEdition extends ExpansionSet { private RevisedEdition() { super("Revised Edition", "3ED", "mage.sets.revisededition", new GregorianCalendar(1994, 3, 1).getTime(), SetType.CORE); this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Shadowmoor.java b/Mage.Sets/src/mage/sets/Shadowmoor.java index f6c6627905d..855d14b372c 100644 --- a/Mage.Sets/src/mage/sets/Shadowmoor.java +++ b/Mage.Sets/src/mage/sets/Shadowmoor.java @@ -47,8 +47,8 @@ public class Shadowmoor extends ExpansionSet { super("Shadowmoor", "SHM", "mage.sets.shadowmoor", new GregorianCalendar(2008, 4, 2).getTime(), SetType.EXPANSION); this.blockName = "Shadowmoor"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Tempest.java b/Mage.Sets/src/mage/sets/Tempest.java index 28249cb07db..8ac10ab2a21 100644 --- a/Mage.Sets/src/mage/sets/Tempest.java +++ b/Mage.Sets/src/mage/sets/Tempest.java @@ -16,8 +16,8 @@ public class Tempest extends ExpansionSet { super("Tempest", "TMP", "mage.sets.tempest", new GregorianCalendar(1997, 9, 1).getTime(), SetType.EXPANSION); this.blockName = "Tempest"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/TimeSpiral.java b/Mage.Sets/src/mage/sets/TimeSpiral.java index 98aa18145ab..6ac46687ed2 100644 --- a/Mage.Sets/src/mage/sets/TimeSpiral.java +++ b/Mage.Sets/src/mage/sets/TimeSpiral.java @@ -1,9 +1,13 @@ package mage.sets; -import mage.cards.ExpansionSet; -import mage.constants.SetType; - import java.util.GregorianCalendar; +import java.util.List; +import mage.cards.Card; +import mage.cards.ExpansionSet; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardRepository; +import mage.constants.Rarity; +import mage.constants.SetType; public class TimeSpiral extends ExpansionSet { @@ -17,10 +21,19 @@ public class TimeSpiral extends ExpansionSet { super("Time Spiral", "TSP", "mage.sets.timespiral", new GregorianCalendar(2006, 9, 9).getTime(), SetType.EXPANSION); this.blockName = "Time Spiral"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 11; + this.numBoosterLands = 0; + this.numBoosterCommon = 10; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; } + + @Override + public List createBooster() { + List booster = super.createBooster(); + CardCriteria criteria = new CardCriteria(); + criteria.rarities(Rarity.SPECIAL).setCodes("TSB"); + addToBooster(booster, CardRepository.instance.findCards(criteria)); + return booster; + } } diff --git a/Mage.Sets/src/mage/sets/UrzasDestiny.java b/Mage.Sets/src/mage/sets/UrzasDestiny.java index e0fcdbdebef..8a71f5e2e6f 100644 --- a/Mage.Sets/src/mage/sets/UrzasDestiny.java +++ b/Mage.Sets/src/mage/sets/UrzasDestiny.java @@ -49,8 +49,8 @@ public class UrzasDestiny extends ExpansionSet { this.parentSet = UrzasSaga.getInstance(); this.hasBasicLands = false; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/UrzasLegacy.java b/Mage.Sets/src/mage/sets/UrzasLegacy.java index 3d4fef267ad..c56402921e2 100644 --- a/Mage.Sets/src/mage/sets/UrzasLegacy.java +++ b/Mage.Sets/src/mage/sets/UrzasLegacy.java @@ -51,8 +51,8 @@ public class UrzasLegacy extends ExpansionSet { this.parentSet = UrzasSaga.getInstance(); this.hasBasicLands = false; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/UrzasSaga.java b/Mage.Sets/src/mage/sets/UrzasSaga.java index 9187caf4678..2ff9831caca 100644 --- a/Mage.Sets/src/mage/sets/UrzasSaga.java +++ b/Mage.Sets/src/mage/sets/UrzasSaga.java @@ -48,8 +48,8 @@ public class UrzasSaga extends ExpansionSet { super("Urza's Saga", "USG", "mage.sets.urzassaga", new GregorianCalendar(1998, 10, 1).getTime(), SetType.EXPANSION); this.blockName = "Urza"; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage.Sets/src/mage/sets/Weatherlight.java b/Mage.Sets/src/mage/sets/Weatherlight.java index 6020c0bf36c..9931163de2f 100644 --- a/Mage.Sets/src/mage/sets/Weatherlight.java +++ b/Mage.Sets/src/mage/sets/Weatherlight.java @@ -51,8 +51,8 @@ public class Weatherlight extends ExpansionSet { this.parentSet = Mirage.getInstance(); this.hasBasicLands = false; this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index 4c5b9249fcc..a7b968c724c 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -257,7 +257,7 @@ public abstract class ExpansionSet implements Serializable { } } - private void addToBooster(List booster, List cards) { + protected void addToBooster(List booster, List cards) { if (!cards.isEmpty()) { CardInfo cardInfo = cards.remove(rnd.nextInt(cards.size())); if (cardInfo != null) { From eb7ca3788a78ed8843181785a7b5f0a4240759ca Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 20 Jul 2015 22:09:36 +0200 Subject: [PATCH 122/375] * Recovery added missing check for creature type. --- Mage/src/mage/abilities/keyword/RecoverAbility.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage/src/mage/abilities/keyword/RecoverAbility.java b/Mage/src/mage/abilities/keyword/RecoverAbility.java index 6b6c47b52ef..bd8cbb938d3 100644 --- a/Mage/src/mage/abilities/keyword/RecoverAbility.java +++ b/Mage/src/mage/abilities/keyword/RecoverAbility.java @@ -77,6 +77,7 @@ public class RecoverAbility extends TriggeredAbilityImpl { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getFromZone().equals(Zone.BATTLEFIELD) && zEvent.getToZone().equals(Zone.GRAVEYARD)) { if (zEvent.getTarget().getOwnerId().equals(getControllerId()) + && zEvent.getTarget().getCardType().contains(CardType.CREATURE) && !zEvent.getTarget().getId().equals(getSourceId())) { return true; } From 28f42b4000166331152ef0f0a88a9711f953b8ba Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 20 Jul 2015 15:47:48 -0500 Subject: [PATCH 123/375] Implemented Planar Chaos, Overlaid Terrain, Bloodcurdling Scream, Aeolipile, Ritual of Restoration, Barbed Sextant, Essence Fracture, Locust Swarm, Jungle Troll, Undo, Gorilla Shaman, Astrolabe, Squall Drifter, Reconstruction, Implements of Sacrifice, Wall of Kelp, Counterintelligence --- .../src/mage/sets/alliances/Astrolabe.java | 52 +++++++ .../mage/sets/alliances/GorillaShaman.java | 90 ++++++++++++ .../mage/sets/antiquities/Reconstruction.java | 61 ++++++++ .../src/mage/sets/coldsnap/SquallDrifter.java | 76 ++++++++++ .../sets/darksteel/RitualOfRestoration.java | 61 ++++++++ .../mage/sets/fallenempires/Aeolipile.java | 54 +++++++ .../fallenempires/ImplementsOfSacrifice.java | 66 +++++++++ .../mage/sets/fifthedition/BarbedSextant.java | 52 +++++++ .../src/mage/sets/homelands/WallOfKelp.java | 91 ++++++++++++ .../src/mage/sets/iceage/BarbedSextant.java | 72 ++++++++++ .../src/mage/sets/judgment/PlanarChaos.java | 132 ++++++++++++++++++ .../mage/sets/masterseditionii/Aeolipile.java | 69 +++++++++ .../sets/masterseditionii/BarbedSextant.java | 52 +++++++ .../sets/masterseditionii/GorillaShaman.java | 54 +++++++ .../sets/masterseditionii/WallOfKelp.java | 54 +++++++ .../sets/masterseditioniii/Astrolabe.java | 73 ++++++++++ .../sets/masterseditioniv/Reconstruction.java | 52 +++++++ .../src/mage/sets/mirage/JungleTroll.java | 68 +++++++++ .../src/mage/sets/mirage/LocustSwarm.java | 74 ++++++++++ .../mage/sets/nemesis/OverlaidTerrain.java | 106 ++++++++++++++ .../mage/sets/onslaught/EssenceFracture.java | 68 +++++++++ .../portalsecondage/BloodcurdlingScream.java | 63 +++++++++ .../src/mage/sets/portalsecondage/Undo.java | 52 +++++++ .../Counterintelligence.java | 60 ++++++++ .../sets/revisededition/Reconstruction.java | 52 +++++++ Mage.Sets/src/mage/sets/starter1999/Undo.java | 60 ++++++++ Mage.Sets/src/mage/sets/visions/Undo.java | 54 +++++++ Utils/mtg-cards-data.txt | 2 +- 28 files changed, 1819 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/sets/alliances/Astrolabe.java create mode 100644 Mage.Sets/src/mage/sets/alliances/GorillaShaman.java create mode 100644 Mage.Sets/src/mage/sets/antiquities/Reconstruction.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/SquallDrifter.java create mode 100644 Mage.Sets/src/mage/sets/darksteel/RitualOfRestoration.java create mode 100644 Mage.Sets/src/mage/sets/fallenempires/Aeolipile.java create mode 100644 Mage.Sets/src/mage/sets/fallenempires/ImplementsOfSacrifice.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/BarbedSextant.java create mode 100644 Mage.Sets/src/mage/sets/homelands/WallOfKelp.java create mode 100644 Mage.Sets/src/mage/sets/iceage/BarbedSextant.java create mode 100644 Mage.Sets/src/mage/sets/judgment/PlanarChaos.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/Aeolipile.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/BarbedSextant.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/WallOfKelp.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/Astrolabe.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/Reconstruction.java create mode 100644 Mage.Sets/src/mage/sets/mirage/JungleTroll.java create mode 100644 Mage.Sets/src/mage/sets/mirage/LocustSwarm.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/OverlaidTerrain.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/EssenceFracture.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/BloodcurdlingScream.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/Undo.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/Counterintelligence.java create mode 100644 Mage.Sets/src/mage/sets/revisededition/Reconstruction.java create mode 100644 Mage.Sets/src/mage/sets/starter1999/Undo.java create mode 100644 Mage.Sets/src/mage/sets/visions/Undo.java diff --git a/Mage.Sets/src/mage/sets/alliances/Astrolabe.java b/Mage.Sets/src/mage/sets/alliances/Astrolabe.java new file mode 100644 index 00000000000..33660230615 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/Astrolabe.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Astrolabe extends mage.sets.masterseditioniii.Astrolabe { + + public Astrolabe(UUID ownerId) { + super(ownerId); + this.cardNumber = 159; + this.expansionSetCode = "ALL"; + } + + public Astrolabe(final Astrolabe card) { + super(card); + } + + @Override + public Astrolabe copy() { + return new Astrolabe(this); + } +} diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaShaman.java b/Mage.Sets/src/mage/sets/alliances/GorillaShaman.java new file mode 100644 index 00000000000..bc8eed1bc83 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/GorillaShaman.java @@ -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.alliances; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.Filter; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.target.Target; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class GorillaShaman extends CardImpl { + + public GorillaShaman(UUID ownerId) { + super(ownerId, 106, "Gorilla Shaman", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "ALL"; + this.subtype.add("Ape"); + this.subtype.add("Shaman"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {X}{X}{1}: Destroy target noncreature artifact with converted mana cost X. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{X}{X}{1}")); + ability.addTarget(new TargetPermanent(new FilterArtifactPermanent("noncreature artifact with converted mana cost X"))); + this.addAbility(ability); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability instanceof SimpleActivatedAbility) { + int xValue = ability.getManaCostsToPay().getX(); + ability.getTargets().clear(); + FilterArtifactPermanent filter = new FilterArtifactPermanent(new StringBuilder("noncreature artifact with converted mana cost ").append(xValue).toString()); + filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.Equal, xValue)); + filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + Target target = new TargetPermanent(filter); + ability.addTarget(target); + } + } + + public GorillaShaman(final GorillaShaman card) { + super(card); + } + + @Override + public GorillaShaman copy() { + return new GorillaShaman(this); + } +} diff --git a/Mage.Sets/src/mage/sets/antiquities/Reconstruction.java b/Mage.Sets/src/mage/sets/antiquities/Reconstruction.java new file mode 100644 index 00000000000..a50fea4eec6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/antiquities/Reconstruction.java @@ -0,0 +1,61 @@ +/* + * 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.antiquities; + +import java.util.UUID; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterArtifactCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class Reconstruction extends CardImpl { + + public Reconstruction(UUID ownerId) { + super(ownerId, 56, "Reconstruction", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{U}"); + this.expansionSetCode = "ATQ"; + + // Return target artifact card from your graveyard to your hand. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterArtifactCard("artifact card from your graveyard"))); + } + + public Reconstruction(final Reconstruction card) { + super(card); + } + + @Override + public Reconstruction copy() { + return new Reconstruction(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/SquallDrifter.java b/Mage.Sets/src/mage/sets/coldsnap/SquallDrifter.java new file mode 100644 index 00000000000..a60272e585c --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/SquallDrifter.java @@ -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.coldsnap; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class SquallDrifter extends CardImpl { + + public SquallDrifter(UUID ownerId) { + super(ownerId, 17, "Squall Drifter", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "CSP"; + this.supertype.add("Snow"); + this.subtype.add("Elemental"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {W}, {tap}: Tap target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public SquallDrifter(final SquallDrifter card) { + super(card); + } + + @Override + public SquallDrifter copy() { + return new SquallDrifter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/darksteel/RitualOfRestoration.java b/Mage.Sets/src/mage/sets/darksteel/RitualOfRestoration.java new file mode 100644 index 00000000000..22da651aa12 --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/RitualOfRestoration.java @@ -0,0 +1,61 @@ +/* + * 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.darksteel; + +import java.util.UUID; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterArtifactCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class RitualOfRestoration extends CardImpl { + + public RitualOfRestoration(UUID ownerId) { + super(ownerId, 13, "Ritual of Restoration", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{W}"); + this.expansionSetCode = "DST"; + + // Return target artifact card from your graveyard to your hand. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterArtifactCard("artifact card from your graveyard"))); + } + + public RitualOfRestoration(final RitualOfRestoration card) { + super(card); + } + + @Override + public RitualOfRestoration copy() { + return new RitualOfRestoration(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fallenempires/Aeolipile.java b/Mage.Sets/src/mage/sets/fallenempires/Aeolipile.java new file mode 100644 index 00000000000..e17cda959c3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fallenempires/Aeolipile.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.fallenempires; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Aeolipile extends mage.sets.masterseditionii.Aeolipile { + + public Aeolipile(UUID ownerId) { + super(ownerId); + this.cardNumber = 166; + this.expansionSetCode = "FEM"; + this.rarity = Rarity.RARE; + } + + public Aeolipile(final Aeolipile card) { + super(card); + } + + @Override + public Aeolipile copy() { + return new Aeolipile(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fallenempires/ImplementsOfSacrifice.java b/Mage.Sets/src/mage/sets/fallenempires/ImplementsOfSacrifice.java new file mode 100644 index 00000000000..87fb0dbdc03 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fallenempires/ImplementsOfSacrifice.java @@ -0,0 +1,66 @@ +/* + * 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.fallenempires; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ImplementsOfSacrifice extends CardImpl { + + public ImplementsOfSacrifice(UUID ownerId) { + super(ownerId, 173, "Implements of Sacrifice", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "FEM"; + + // {1}, {tap}, Sacrifice Implements of Sacrifice: Add two mana of any one color to your mana pool. + SimpleManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(2), new ManaCostsImpl("{1}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public ImplementsOfSacrifice(final ImplementsOfSacrifice card) { + super(card); + } + + @Override + public ImplementsOfSacrifice copy() { + return new ImplementsOfSacrifice(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/BarbedSextant.java b/Mage.Sets/src/mage/sets/fifthedition/BarbedSextant.java new file mode 100644 index 00000000000..39fd118bff4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/BarbedSextant.java @@ -0,0 +1,52 @@ +/* + * 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.fifthedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class BarbedSextant extends mage.sets.iceage.BarbedSextant { + + public BarbedSextant(UUID ownerId) { + super(ownerId); + this.cardNumber = 351; + this.expansionSetCode = "5ED"; + } + + public BarbedSextant(final BarbedSextant card) { + super(card); + } + + @Override + public BarbedSextant copy() { + return new BarbedSextant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/WallOfKelp.java b/Mage.Sets/src/mage/sets/homelands/WallOfKelp.java new file mode 100644 index 00000000000..b3d29836185 --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/WallOfKelp.java @@ -0,0 +1,91 @@ +/* + * 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.homelands; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.permanent.token.Token; + +/** + * + * @author fireshoes + */ +public class WallOfKelp extends CardImpl { + + public WallOfKelp(UUID ownerId) { + super(ownerId, 50, "Wall of Kelp", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{U}{U}"); + this.expansionSetCode = "HML"; + this.subtype.add("Plant"); + this.subtype.add("Wall"); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {U}{U}, {tap}: Put a 0/1 blue Plant Wall creature token with defender named Kelp onto the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new KelpToken()), new ManaCostsImpl("{U}{U}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + public WallOfKelp(final WallOfKelp card) { + super(card); + } + + @Override + public WallOfKelp copy() { + return new WallOfKelp(this); + } +} + +class KelpToken extends Token { + + public KelpToken() { + super("Kelp", "0/1 blue Plant Wall creature token with defender named Kelp"); + this.setOriginalExpansionSetCode("MIR"); + cardType.add(CardType.CREATURE); + color.setBlue(true); + subtype.add("Plant"); + subtype.add("Wall"); + power = new MageInt(0); + toughness = new MageInt(1); + + this.addAbility(DefenderAbility.getInstance()); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/iceage/BarbedSextant.java b/Mage.Sets/src/mage/sets/iceage/BarbedSextant.java new file mode 100644 index 00000000000..1e75700d9ab --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/BarbedSextant.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.iceage; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.mana.ManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class BarbedSextant extends CardImpl { + + public BarbedSextant(UUID ownerId) { + super(ownerId, 287, "Barbed Sextant", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "ICE"; + + // {1}, {tap}, Sacrifice Barbed Sextant: Add one mana of any color to your mana pool. Draw a card at the beginning of the next turn's upkeep. + ManaAbility ability = new AnyColorManaAbility(new GenericManaCost(1)); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + public BarbedSextant(final BarbedSextant card) { + super(card); + } + + @Override + public BarbedSextant copy() { + return new BarbedSextant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/PlanarChaos.java b/Mage.Sets/src/mage/sets/judgment/PlanarChaos.java new file mode 100644 index 00000000000..6820fc2da3f --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/PlanarChaos.java @@ -0,0 +1,132 @@ +/* + * 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.judgment; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SetTargetPointer; +import mage.constants.TargetController; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class PlanarChaos extends CardImpl { + + public PlanarChaos(UUID ownerId) { + super(ownerId, 97, "Planar Chaos", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + this.expansionSetCode = "JUD"; + + // At the beginning of your upkeep, flip a coin. If you lose the flip, sacrifice Planar Chaos. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new PlanarChaosUpkeepEffect(), TargetController.YOU, false)); + + // Whenever a player casts a spell, that player flips a coin. If he or she loses the flip, counter that spell. + this.addAbility(new SpellCastAllTriggeredAbility(new PlanarChaosCastAllEffect(), new FilterSpell("a spell"), false, SetTargetPointer.SPELL)); + } + + public PlanarChaos(final PlanarChaos card) { + super(card); + } + + @Override + public PlanarChaos copy() { + return new PlanarChaos(this); + } +} + +class PlanarChaosUpkeepEffect extends OneShotEffect { + + PlanarChaosUpkeepEffect() { + super(Outcome.Damage); + staticText = "flip a coin. If you lose the flip, sacrifice {this}"; + } + + PlanarChaosUpkeepEffect(final PlanarChaosUpkeepEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + if (!player.flipCoin(game)) { + Permanent perm = game.getPermanent(source.getSourceId()); + if (perm != null) { + perm.sacrifice(source.getSourceId(), game); + } + return true; + } + } + return false; + } + + @Override + public PlanarChaosUpkeepEffect copy() { + return new PlanarChaosUpkeepEffect(this); + } +} + +class PlanarChaosCastAllEffect extends OneShotEffect { + + public PlanarChaosCastAllEffect() { + super(Outcome.Benefit); + this.staticText = "that player flips a coin. If he or she loses the flip, counter that spell"; + } + + public PlanarChaosCastAllEffect(final PlanarChaosCastAllEffect effect) { + super(effect); + } + + @Override + public PlanarChaosCastAllEffect copy() { + return new PlanarChaosCastAllEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + if (!controller.flipCoin(game)) { + game.informPlayers("Planar Chaos: Spell countered"); + return game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game); + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/masterseditionii/Aeolipile.java b/Mage.Sets/src/mage/sets/masterseditionii/Aeolipile.java new file mode 100644 index 00000000000..5d1ae57078a --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/Aeolipile.java @@ -0,0 +1,69 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +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 fireshoes + */ +public class Aeolipile extends CardImpl { + + public Aeolipile(UUID ownerId) { + super(ownerId, 202, "Aeolipile", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "ME2"; + + // {1}, {tap}, Sacrifice Aeolipile: Aeolipile deals 2 damage to target creature or player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{1}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public Aeolipile(final Aeolipile card) { + super(card); + } + + @Override + public Aeolipile copy() { + return new Aeolipile(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/BarbedSextant.java b/Mage.Sets/src/mage/sets/masterseditionii/BarbedSextant.java new file mode 100644 index 00000000000..64eb1ca5d74 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/BarbedSextant.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class BarbedSextant extends mage.sets.iceage.BarbedSextant { + + public BarbedSextant(UUID ownerId) { + super(ownerId); + this.cardNumber = 204; + this.expansionSetCode = "ME2"; + } + + public BarbedSextant(final BarbedSextant card) { + super(card); + } + + @Override + public BarbedSextant copy() { + return new BarbedSextant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.java b/Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.java new file mode 100644 index 00000000000..38a2dad555f --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.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.masterseditionii; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class GorillaShaman extends mage.sets.alliances.GorillaShaman { + + public GorillaShaman(UUID ownerId) { + super(ownerId); + this.cardNumber = 129; + this.expansionSetCode = "ME2"; + this.rarity = Rarity.UNCOMMON; + } + + public GorillaShaman(final GorillaShaman card) { + super(card); + } + + @Override + public GorillaShaman copy() { + return new GorillaShaman(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/WallOfKelp.java b/Mage.Sets/src/mage/sets/masterseditionii/WallOfKelp.java new file mode 100644 index 00000000000..46ee3344444 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/WallOfKelp.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.masterseditionii; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class WallOfKelp extends mage.sets.homelands.WallOfKelp { + + public WallOfKelp(UUID ownerId) { + super(ownerId); + this.cardNumber = 74; + this.expansionSetCode = "ME2"; + this.rarity = Rarity.COMMON; + } + + public WallOfKelp(final WallOfKelp card) { + super(card); + } + + @Override + public WallOfKelp copy() { + return new WallOfKelp(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/Astrolabe.java b/Mage.Sets/src/mage/sets/masterseditioniii/Astrolabe.java new file mode 100644 index 00000000000..ee37519a079 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/Astrolabe.java @@ -0,0 +1,73 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class Astrolabe extends CardImpl { + + public Astrolabe(UUID ownerId) { + super(ownerId, 189, "Astrolabe", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "ME3"; + + // {1}, {tap}, Sacrifice Astrolabe: Add two mana of any one color to your mana pool. Draw a card at the beginning of the next turn's upkeep. + SimpleManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(2), new ManaCostsImpl("{1}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + public Astrolabe(final Astrolabe card) { + super(card); + } + + @Override + public Astrolabe copy() { + return new Astrolabe(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/Reconstruction.java b/Mage.Sets/src/mage/sets/masterseditioniv/Reconstruction.java new file mode 100644 index 00000000000..c4658e255d3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/Reconstruction.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditioniv; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Reconstruction extends mage.sets.antiquities.Reconstruction { + + public Reconstruction(UUID ownerId) { + super(ownerId); + this.cardNumber = 59; + this.expansionSetCode = "ME4"; + } + + public Reconstruction(final Reconstruction card) { + super(card); + } + + @Override + public Reconstruction copy() { + return new Reconstruction(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/JungleTroll.java b/Mage.Sets/src/mage/sets/mirage/JungleTroll.java new file mode 100644 index 00000000000..90d9e7671bf --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/JungleTroll.java @@ -0,0 +1,68 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class JungleTroll extends CardImpl { + + public JungleTroll(UUID ownerId) { + super(ownerId, 329, "Jungle Troll", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{G}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Troll"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // {R}: Regenerate Jungle Troll. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{R}"))); + + // {G}: Regenerate Jungle Troll. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{G}"))); + } + + public JungleTroll(final JungleTroll card) { + super(card); + } + + @Override + public JungleTroll copy() { + return new JungleTroll(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/LocustSwarm.java b/Mage.Sets/src/mage/sets/mirage/LocustSwarm.java new file mode 100644 index 00000000000..03326978950 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/LocustSwarm.java @@ -0,0 +1,74 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.abilities.effects.common.UntapSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class LocustSwarm extends CardImpl { + + public LocustSwarm(UUID ownerId) { + super(ownerId, 124, "Locust Swarm", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Insect"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {G}: Regenerate Locust Swarm. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{G}"))); + + // {G}: Untap Locust Swarm. Activate this ability only once each turn. + this.addAbility(new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new ManaCostsImpl("{G}"))); + } + + public LocustSwarm(final LocustSwarm card) { + super(card); + } + + @Override + public LocustSwarm copy() { + return new LocustSwarm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/OverlaidTerrain.java b/Mage.Sets/src/mage/sets/nemesis/OverlaidTerrain.java new file mode 100644 index 00000000000..ef23eb8a4fa --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/OverlaidTerrain.java @@ -0,0 +1,106 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class OverlaidTerrain extends CardImpl { + + public OverlaidTerrain(UUID ownerId) { + super(ownerId, 108, "Overlaid Terrain", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}"); + this.expansionSetCode = "NMS"; + + // As Overlaid Terrain enters the battlefield, sacrifice all lands you control. + this.addAbility(new AsEntersBattlefieldAbility(new SacrificeAllLandEffect())); + + // Lands you control have "{tap}: Add two mana of any one color to your mana pool." + SimpleManaAbility manaAbility = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(2), new TapSourceCost()); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(manaAbility, Duration.WhileOnBattlefield, new FilterLandPermanent(), false))); + } + + public OverlaidTerrain(final OverlaidTerrain card) { + super(card); + } + + @Override + public OverlaidTerrain copy() { + return new OverlaidTerrain(this); + } +} + +class SacrificeAllLandEffect extends OneShotEffect { + + SacrificeAllLandEffect() { + super(Outcome.Detriment); + staticText = "sacrifice all lands you control"; + } + + SacrificeAllLandEffect(final SacrificeAllLandEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + for(Permanent permanent : game.getBattlefield().getActivePermanents(new FilterControlledLandPermanent(), source.getControllerId(), game)){ + permanent.sacrifice(source.getControllerId(), game); + } + return true; + } + return false; + } + + @Override + public SacrificeAllLandEffect copy() { + return new SacrificeAllLandEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/onslaught/EssenceFracture.java b/Mage.Sets/src/mage/sets/onslaught/EssenceFracture.java new file mode 100644 index 00000000000..4484fadd996 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/EssenceFracture.java @@ -0,0 +1,68 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class EssenceFracture extends CardImpl { + + public EssenceFracture(UUID ownerId) { + super(ownerId, 82, "Essence Fracture", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{U}{U}"); + this.expansionSetCode = "ONS"; + + // Return two target creatures to their owners' hands. + Effect effect = new ReturnToHandTargetEffect(); + effect.setText("Return two target creatures to their owners' hands"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(2)); + + // Cycling {2}{U} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}{U}"))); + } + + public EssenceFracture(final EssenceFracture card) { + super(card); + } + + @Override + public EssenceFracture copy() { + return new EssenceFracture(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalsecondage/BloodcurdlingScream.java b/Mage.Sets/src/mage/sets/portalsecondage/BloodcurdlingScream.java new file mode 100644 index 00000000000..6bd616fc6a8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/BloodcurdlingScream.java @@ -0,0 +1,63 @@ +/* + * 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.portalsecondage; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.ExileFromHandCostCardConvertedMana; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class BloodcurdlingScream extends CardImpl { + + public BloodcurdlingScream(UUID ownerId) { + super(ownerId, 3, "Bloodcurdling Scream", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{X}{B}"); + this.expansionSetCode = "PO2"; + + // Target creature gets +X/+0 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(new ExileFromHandCostCardConvertedMana(), new StaticValue(0), Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public BloodcurdlingScream(final BloodcurdlingScream card) { + super(card); + } + + @Override + public BloodcurdlingScream copy() { + return new BloodcurdlingScream(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalsecondage/Undo.java b/Mage.Sets/src/mage/sets/portalsecondage/Undo.java new file mode 100644 index 00000000000..a12965707ff --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/Undo.java @@ -0,0 +1,52 @@ +/* + * 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.portalsecondage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Undo extends mage.sets.starter1999.Undo { + + public Undo(UUID ownerId) { + super(ownerId); + this.cardNumber = 59; + this.expansionSetCode = "PO2"; + } + + public Undo(final Undo card) { + super(card); + } + + @Override + public Undo copy() { + return new Undo(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/Counterintelligence.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/Counterintelligence.java new file mode 100644 index 00000000000..923bfb50c67 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/Counterintelligence.java @@ -0,0 +1,60 @@ +/* + * 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.portalthreekingdoms; + +import java.util.UUID; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Counterintelligence extends CardImpl { + + public Counterintelligence(UUID ownerId) { + super(ownerId, 41, "Counterintelligence", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{U}{U}"); + this.expansionSetCode = "PTK"; + + // Return one or two target creatures to their owners' hands. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(1, 2)); + } + + public Counterintelligence(final Counterintelligence card) { + super(card); + } + + @Override + public Counterintelligence copy() { + return new Counterintelligence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/revisededition/Reconstruction.java b/Mage.Sets/src/mage/sets/revisededition/Reconstruction.java new file mode 100644 index 00000000000..4f26241469e --- /dev/null +++ b/Mage.Sets/src/mage/sets/revisededition/Reconstruction.java @@ -0,0 +1,52 @@ +/* + * 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.revisededition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Reconstruction extends mage.sets.antiquities.Reconstruction { + + public Reconstruction(UUID ownerId) { + super(ownerId); + this.cardNumber = 77; + this.expansionSetCode = "3ED"; + } + + public Reconstruction(final Reconstruction card) { + super(card); + } + + @Override + public Reconstruction copy() { + return new Reconstruction(this); + } +} diff --git a/Mage.Sets/src/mage/sets/starter1999/Undo.java b/Mage.Sets/src/mage/sets/starter1999/Undo.java new file mode 100644 index 00000000000..61d44673f30 --- /dev/null +++ b/Mage.Sets/src/mage/sets/starter1999/Undo.java @@ -0,0 +1,60 @@ +/* + * 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.starter1999; + +import java.util.UUID; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Undo extends CardImpl { + + public Undo(UUID ownerId) { + super(ownerId, 58, "Undo", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{U}{U}"); + this.expansionSetCode = "S99"; + + // Return two target creatures to their owners' hands. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(2)); + } + + public Undo(final Undo card) { + super(card); + } + + @Override + public Undo copy() { + return new Undo(this); + } +} diff --git a/Mage.Sets/src/mage/sets/visions/Undo.java b/Mage.Sets/src/mage/sets/visions/Undo.java new file mode 100644 index 00000000000..9addffe6d72 --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/Undo.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.visions; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Undo extends mage.sets.starter1999.Undo { + + public Undo(UUID ownerId) { + super(ownerId); + this.cardNumber = 47; + this.expansionSetCode = "VIS"; + this.rarity = Rarity.COMMON; + } + + public Undo(final Undo card) { + super(card); + } + + @Override + public Undo copy() { + return new Undo(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 7dde083ccd7..2a635f134ab 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -14232,7 +14232,7 @@ Discombobulate|Onslaught|79|U|{2}{U}{U}|Instant|||Counter target spell. Look at Aven Soulgazer|Onslaught|8|U|{3}{W}{W}|Creature - Bird Cleric|3|3|Flying${2}{W}: Look at target face-down creature.| Dispersing Orb|Onslaught|80|U|{3}{U}|Enchantment|||{3}{U}, Sacrifice a permanent: Return target permanent to its owner's hand.| Disruptive Pitmage|Onslaught|81|C|{2}{U}|Creature - Human Wizard|1|1|{tap}: Counter target spell unless its controller pays {1}.$Morph {U} You may cast this card face downn as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)| -Essence Fracture|Onslaught|82|U|{3}{U}|Sorcery|||Return two target creatures to their owners' hands.$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)| +Essence Fracture|Onslaught|82|U|{3}{U}{U}|Sorcery|||Return two target creatures to their owners' hands.$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)| Fleeting Aven|Onslaught|83|U|{1}{U}{U}|Creature - Bird Wizard|2|2|Flying$Whenever a player cycles a card, return Fleeting Aven to its owner's hand.| Future Sight|Onslaught|84|R|{2}{U}{U}{U}|Enchantment|||Play with the top card of your library revealed.$You may play the top card of your library.| Ghosthelm Courier|Onslaught|85|U|{2}{U}|Creature - Human Wizard|2|1|You may choose not to untap Ghosthelm Courier during your untap step.${2}{U}, {tap}: Target Wizard creature gets +2/+2 and has shroud for as long as Ghosthelm Courier remains tapped. (It can't be the target of spells or abilities.)| From 61f0feca377226948bf37854bc0f485064efc03e Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 20 Jul 2015 16:52:53 -0500 Subject: [PATCH 124/375] Implemented Icefall, Resize, Grim Harvest, Krovikan Rot, and Controvert --- .../src/mage/sets/coldsnap/Controvert.java | 65 ++++++++++++++++ .../src/mage/sets/coldsnap/GrimHarvest.java | 68 +++++++++++++++++ Mage.Sets/src/mage/sets/coldsnap/Icefall.java | 76 +++++++++++++++++++ .../src/mage/sets/coldsnap/KrovikanRot.java | 74 ++++++++++++++++++ Mage.Sets/src/mage/sets/coldsnap/Resize.java | 66 ++++++++++++++++ 5 files changed, 349 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/coldsnap/Controvert.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/GrimHarvest.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/Icefall.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/KrovikanRot.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/Resize.java diff --git a/Mage.Sets/src/mage/sets/coldsnap/Controvert.java b/Mage.Sets/src/mage/sets/coldsnap/Controvert.java new file mode 100644 index 00000000000..9c5ee267ffe --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/Controvert.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.coldsnap; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.keyword.RecoverAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class Controvert extends CardImpl { + + public Controvert(UUID ownerId) { + super(ownerId, 30, "Controvert", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); + this.expansionSetCode = "CSP"; + + // Counter target spell. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetSpell()); + + // Recover {2}{U}{U} + this.addAbility(new RecoverAbility(new ManaCostsImpl("{2}{U}{U}"), this)); + } + + public Controvert(final Controvert card) { + super(card); + } + + @Override + public Controvert copy() { + return new Controvert(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/GrimHarvest.java b/Mage.Sets/src/mage/sets/coldsnap/GrimHarvest.java new file mode 100644 index 00000000000..853cd7e6d8b --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/GrimHarvest.java @@ -0,0 +1,68 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.RecoverAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class GrimHarvest extends CardImpl { + + private static FilterCreatureCard filter = new FilterCreatureCard("creature card from your graveyard"); + + public GrimHarvest(UUID ownerId) { + super(ownerId, 58, "Grim Harvest", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "CSP"; + + // Return target creature card from your graveyard to your hand. + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + + // Recover {2}{B} + this.addAbility(new RecoverAbility(new ManaCostsImpl("{2}{B}"), this)); + } + + public GrimHarvest(final GrimHarvest card) { + super(card); + } + + @Override + public GrimHarvest copy() { + return new GrimHarvest(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/Icefall.java b/Mage.Sets/src/mage/sets/coldsnap/Icefall.java new file mode 100644 index 00000000000..4033532b71f --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/Icefall.java @@ -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.coldsnap; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.RecoverAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class Icefall extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact or land"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.LAND))); + } + + public Icefall(UUID ownerId) { + super(ownerId, 85, "Icefall", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{R}{R}"); + this.expansionSetCode = "CSP"; + + // Destroy target artifact or land. + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + + // Recover {R}{R} + this.addAbility(new RecoverAbility(new ManaCostsImpl("{R}{R}"), this)); + } + + public Icefall(final Icefall card) { + super(card); + } + + @Override + public Icefall copy() { + return new Icefall(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/KrovikanRot.java b/Mage.Sets/src/mage/sets/coldsnap/KrovikanRot.java new file mode 100644 index 00000000000..aa39e567721 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/KrovikanRot.java @@ -0,0 +1,74 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.RecoverAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class KrovikanRot extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power 2 or less"); + + static { + filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, 3)); + } + + public KrovikanRot(UUID ownerId) { + super(ownerId, 63, "Krovikan Rot", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{B}"); + this.expansionSetCode = "CSP"; + + // Destroy target creature with power 2 or less. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + + // Recover {1}{B}{B} + this.addAbility(new RecoverAbility(new ManaCostsImpl("{1}{B}{B}"), this)); + } + + public KrovikanRot(final KrovikanRot card) { + super(card); + } + + @Override + public KrovikanRot copy() { + return new KrovikanRot(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/Resize.java b/Mage.Sets/src/mage/sets/coldsnap/Resize.java new file mode 100644 index 00000000000..c18f25cc007 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/Resize.java @@ -0,0 +1,66 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.RecoverAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Resize extends CardImpl { + + public Resize(UUID ownerId) { + super(ownerId, 117, "Resize", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{G}"); + this.expansionSetCode = "CSP"; + + // Target creature gets +3/+3 until end of turn. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); + + // Recover {1}{G} + this.addAbility(new RecoverAbility(new ManaCostsImpl("{1}{G}"), this)); + } + + public Resize(final Resize card) { + super(card); + } + + @Override + public Resize copy() { + return new Resize(this); + } +} From 8685dd3465a23185e9111e68f3f46c9434bb75ed Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 20 Jul 2015 20:35:02 -0500 Subject: [PATCH 125/375] Implemented Muzzio, Visionary Architect; Prowling Nightstalker, and a lots of Islandhome creatures --- .../mage/sets/commander/SlipstreamEel.java | 52 ++++++ .../conspiracy/MuzzioVisionaryArchitect.java | 159 +++++++++++++++++ .../sets/fallenempires/VodalianKnights.java | 112 ++++++++++++ .../src/mage/sets/homelands/Marjhan.java | 52 ++++++ .../src/mage/sets/iceage/GorillaPack.java | 105 +++++++++++ .../mage/sets/lorwyn/EtherealWhiskergill.java | 69 ++++++++ .../sets/mastersedition/VodalianKnights.java | 54 ++++++ .../mage/sets/masterseditionii/Marjhan.java | 140 +++++++++++++++ .../masterseditionii/RedCliffsArmada.java | 66 +++++++ .../sets/masterseditioniii/WuWarship.java | 66 +++++++ .../ProwlingNightstalker.java | 125 +++++++++++++ .../src/mage/sets/mirage/KukemssaSerpent.java | 125 +++++++++++++ .../mage/sets/morningtide/Floodchaser.java | 84 +++++++++ .../mage/sets/onslaught/SlipstreamEel.java | 71 ++++++++ .../src/mage/sets/planarchaos/BogSerpent.java | 105 +++++++++++ .../src/mage/sets/portal/DeepSeaSerpent.java | 65 +++++++ .../sets/portalsecondage/ArmoredGalleon.java | 66 +++++++ .../portalsecondage/ProwlingNightstalker.java | 52 ++++++ .../sets/portalsecondage/SteamFrigate.java | 66 +++++++ .../portalthreekingdoms/RedCliffsArmada.java | 54 ++++++ .../sets/portalthreekingdoms/WuWarship.java | 52 ++++++ .../ZhouYuChiefCommander.java | 67 +++++++ .../sets/timespiral/SlipstreamSerpent.java | 104 +++++++++++ .../MuzzioVisionaryArchitect.java | 52 ++++++ .../src/mage/sets/weatherlight/MantaRay.java | 165 ++++++++++++++++++ 25 files changed, 2128 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/commander/SlipstreamEel.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java create mode 100644 Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java create mode 100644 Mage.Sets/src/mage/sets/homelands/Marjhan.java create mode 100644 Mage.Sets/src/mage/sets/iceage/GorillaPack.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/EtherealWhiskergill.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/VodalianKnights.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/Marjhan.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/RedCliffsArmada.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/WuWarship.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java create mode 100644 Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java create mode 100644 Mage.Sets/src/mage/sets/morningtide/Floodchaser.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/BogSerpent.java create mode 100644 Mage.Sets/src/mage/sets/portal/DeepSeaSerpent.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/ArmoredGalleon.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/ProwlingNightstalker.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/SteamFrigate.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/RedCliffsArmada.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/WuWarship.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/ZhouYuChiefCommander.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java create mode 100644 Mage.Sets/src/mage/sets/vintagemasters/MuzzioVisionaryArchitect.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/MantaRay.java diff --git a/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java b/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java new file mode 100644 index 00000000000..acd4a3c155d --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class SlipstreamEel extends mage.sets.onslaught.SlipstreamEel { + + public SlipstreamEel(UUID ownerId) { + super(ownerId); + this.cardNumber = 62; + this.expansionSetCode = "CMD"; + } + + public SlipstreamEel(final SlipstreamEel card) { + super(card); + } + + @Override + public SlipstreamEel copy() { + return new SlipstreamEel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java b/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java new file mode 100644 index 00000000000..195d592eae5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java @@ -0,0 +1,159 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.conspiracy; + +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +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.FilterCard; +import mage.filter.common.FilterArtifactCard; +import mage.filter.common.FilterArtifactPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author fireshoes + */ +public class MuzzioVisionaryArchitect extends CardImpl { + + public MuzzioVisionaryArchitect(UUID ownerId) { + super(ownerId, 23, "Muzzio, Visionary Architect", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); + this.expansionSetCode = "CNS"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Artificer"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // {3}{U}, {tap}: Look at the top X cards of your library, where X is the highest converted mana cost among artifacts you control. You may reveal an artifact card from among them and put it onto the battlefield. Put the rest on the bottom of your library in any order. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MuzzioVisionaryArchitectEffect(), new ManaCostsImpl("{3}{U}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + public MuzzioVisionaryArchitect(final MuzzioVisionaryArchitect card) { + super(card); + } + + @Override + public MuzzioVisionaryArchitect copy() { + return new MuzzioVisionaryArchitect(this); + } +} + +class MuzzioVisionaryArchitectEffect extends OneShotEffect { + + public MuzzioVisionaryArchitectEffect() { + super(Outcome.Benefit); + this.staticText = "Look at the top X cards of your library, where X is the highest converted mana cost among artifacts you control. You may reveal an artifact card from among them and put it onto the battlefield. Put the rest on the bottom of your library in any order"; + } + + public MuzzioVisionaryArchitectEffect(final MuzzioVisionaryArchitectEffect effect) { + super(effect); + } + + @Override + public MuzzioVisionaryArchitectEffect copy() { + return new MuzzioVisionaryArchitectEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (player == null || sourcePermanent == null) { + return false; + } + + int highCMC = 0; + List controlledArtifacts = game.getBattlefield().getAllActivePermanents(new FilterArtifactPermanent(), player.getId(), game); + for (Permanent permanent : controlledArtifacts) { + if (permanent.getSpellAbility() != null) { + int cmc = permanent.getSpellAbility().getManaCosts().convertedManaCost(); + if (cmc > highCMC) { + highCMC = cmc; + } + } + } + + Cards cards = new CardsImpl(); + + for (int i = 0; i < highCMC; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + cards.add(card); + } + } + player.lookAtCards(sourcePermanent.getName(), cards, game); + + if (!cards.isEmpty()) { + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterArtifactCard("artifact card to put onto the battlefield")); + if (target.canChoose(source.getSourceId(), player.getId(), game) && player.choose(Outcome.Benefit, cards, target, game)) { + Card card = cards.get(target.getFirstTarget(), game); + if (card != null) { + player.revealCards(sourcePermanent.getName(), new CardsImpl(card), game); + cards.remove(card); + player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId()); + } + } + } + + + TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); + while (player.isInGame() && cards.size() > 1) { + player.choose(Outcome.Neutral, cards, target, game); + Card card = cards.get(target.getFirstTarget(), game); + if (card != null) { + cards.remove(card); + card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); + } + target.clearChosen(); + } + if (cards.size() == 1) { + Card card = cards.get(cards.iterator().next(), game); + card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java b/Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java new file mode 100644 index 00000000000..58c9190592e --- /dev/null +++ b/Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java @@ -0,0 +1,112 @@ +/* + * 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.fallenempires; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class VodalianKnights extends CardImpl { + + public VodalianKnights(UUID ownerId) { + super(ownerId, 58, "Vodalian Knights", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); + this.expansionSetCode = "FEM"; + this.subtype.add("Merfolk"); + this.subtype.add("Knight"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Vodalian Knights can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // When you control no Islands, sacrifice Vodalian Knights. + this.addAbility(new VodalianKnightsTriggeredAbility()); + + // {U}: Vodalian Knights gains flying until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{U}"))); + } + + public VodalianKnights(final VodalianKnights card) { + super(card); + } + + @Override + public VodalianKnights copy() { + return new VodalianKnights(this); + } +} + +class VodalianKnightsTriggeredAbility extends StateTriggeredAbility { + + public VodalianKnightsTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public VodalianKnightsTriggeredAbility(final VodalianKnightsTriggeredAbility ability) { + super(ability); + } + + @Override + public VodalianKnightsTriggeredAbility copy() { + return new VodalianKnightsTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); + } + + @Override + public String getRule() { + return "When you control no islands, sacrifice {this}."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/homelands/Marjhan.java b/Mage.Sets/src/mage/sets/homelands/Marjhan.java new file mode 100644 index 00000000000..d29651eddc9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/Marjhan.java @@ -0,0 +1,52 @@ +/* + * 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.homelands; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Marjhan extends mage.sets.masterseditionii.Marjhan { + + public Marjhan(UUID ownerId) { + super(ownerId); + this.cardNumber = 39; + this.expansionSetCode = "HML"; + } + + public Marjhan(final Marjhan card) { + super(card); + } + + @Override + public Marjhan copy() { + return new Marjhan(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/GorillaPack.java b/Mage.Sets/src/mage/sets/iceage/GorillaPack.java new file mode 100644 index 00000000000..3227d984018 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/GorillaPack.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.iceage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class GorillaPack extends CardImpl { + + public GorillaPack(UUID ownerId) { + super(ownerId, 135, "Gorilla Pack", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "ICE"; + this.subtype.add("Ape"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Gorilla Pack can't attack unless defending player controls a Forest. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Forest","a Forest")))); + + // When you control no Forests, sacrifice Gorilla Pack. + this.addAbility(new GorillaPackTriggeredAbility()); + } + + public GorillaPack(final GorillaPack card) { + super(card); + } + + @Override + public GorillaPack copy() { + return new GorillaPack(this); + } +} + +class GorillaPackTriggeredAbility extends StateTriggeredAbility { + + public static final FilterLandPermanent filter = new FilterLandPermanent("Forest"); + + { + filter.add(new SubtypePredicate("Forest")); + } + + public GorillaPackTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public GorillaPackTriggeredAbility(final GorillaPackTriggeredAbility ability) { + super(ability); + } + + @Override + public GorillaPackTriggeredAbility copy() { + return new GorillaPackTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return (game.getBattlefield().countAll(filter, controllerId, game) == 0); + } + + @Override + public String getRule() { + return "When you control no forests, sacrifice {this}."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/lorwyn/EtherealWhiskergill.java b/Mage.Sets/src/mage/sets/lorwyn/EtherealWhiskergill.java new file mode 100644 index 00000000000..9bea327e587 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/EtherealWhiskergill.java @@ -0,0 +1,69 @@ +/* + * 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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class EtherealWhiskergill extends CardImpl { + + public EtherealWhiskergill(UUID ownerId) { + super(ownerId, 60, "Ethereal Whiskergill", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Elemental"); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Ethereal Whiskergill can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + } + + public EtherealWhiskergill(final EtherealWhiskergill card) { + super(card); + } + + @Override + public EtherealWhiskergill copy() { + return new EtherealWhiskergill(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/VodalianKnights.java b/Mage.Sets/src/mage/sets/mastersedition/VodalianKnights.java new file mode 100644 index 00000000000..7fc270f0757 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/VodalianKnights.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.mastersedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class VodalianKnights extends mage.sets.fallenempires.VodalianKnights { + + public VodalianKnights(UUID ownerId) { + super(ownerId); + this.cardNumber = 55; + this.expansionSetCode = "MED"; + this.rarity = Rarity.UNCOMMON; + } + + public VodalianKnights(final VodalianKnights card) { + super(card); + } + + @Override + public VodalianKnights copy() { + return new VodalianKnights(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/Marjhan.java b/Mage.Sets/src/mage/sets/masterseditionii/Marjhan.java new file mode 100644 index 00000000000..d7974514f82 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/Marjhan.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.masterseditionii; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.UntapSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Marjhan extends CardImpl { + + private static final FilterAttackingCreature filter = new FilterAttackingCreature("attacking creature without flying"); + + static { + filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + } + + public Marjhan(UUID ownerId) { + super(ownerId, 54, "Marjhan", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "ME2"; + this.subtype.add("Leviathan"); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // Marjhan doesn't untap during your untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepSourceEffect())); + + // {U}{U}, Sacrifice a creature: Untap Marjhan. Activate this ability only during your upkeep. + Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, + new UntapSourceEffect(), new ManaCostsImpl("{U}{U}"), new IsStepCondition(PhaseStep.UPKEEP), null); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + this.addAbility(ability); + + // Marjhan can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // {U}{U}: Marjhan gets -1/-0 until end of turn and deals 1 damage to target attacking creature without flying. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(-1, 0, Duration.EndOfTurn), new ManaCostsImpl("{U}{U}")); + Effect effect = new DamageTargetEffect(1); + ability.addEffect(effect); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + // When you control no Islands, sacrifice Marjhan. + this.addAbility(new MarjhanTriggeredAbility()); + } + + public Marjhan(final Marjhan card) { + super(card); + } + + @Override + public Marjhan copy() { + return new Marjhan(this); + } +} + +class MarjhanTriggeredAbility extends StateTriggeredAbility { + + public MarjhanTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public MarjhanTriggeredAbility(final MarjhanTriggeredAbility ability) { + super(ability); + } + + @Override + public MarjhanTriggeredAbility copy() { + return new MarjhanTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); + } + + @Override + public String getRule() { + return "When you control no islands, sacrifice {this}."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/masterseditionii/RedCliffsArmada.java b/Mage.Sets/src/mage/sets/masterseditionii/RedCliffsArmada.java new file mode 100644 index 00000000000..58337a7778f --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/RedCliffsArmada.java @@ -0,0 +1,66 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class RedCliffsArmada extends CardImpl { + + public RedCliffsArmada(UUID ownerId) { + super(ownerId, 62, "Red Cliffs Armada", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}"); + this.expansionSetCode = "ME2"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // Red Cliffs Armada can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + } + + public RedCliffsArmada(final RedCliffsArmada card) { + super(card); + } + + @Override + public RedCliffsArmada copy() { + return new RedCliffsArmada(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/WuWarship.java b/Mage.Sets/src/mage/sets/masterseditioniii/WuWarship.java new file mode 100644 index 00000000000..06fc2fa12f0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/WuWarship.java @@ -0,0 +1,66 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class WuWarship extends CardImpl { + + public WuWarship(UUID ownerId) { + super(ownerId, 56, "Wu Warship", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "ME3"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Wu Warship can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + } + + public WuWarship(final WuWarship card) { + super(card); + } + + @Override + public WuWarship copy() { + return new WuWarship(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java b/Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java new file mode 100644 index 00000000000..f2351cdee4f --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java @@ -0,0 +1,125 @@ +/* + * 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.masterseditioniv; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.EvasionAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author fireshoes + */ +public class ProwlingNightstalker extends CardImpl { + + public ProwlingNightstalker(UUID ownerId) { + super(ownerId, 93, "Prowling Nightstalker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "ME4"; + this.subtype.add("Nightstalker"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Prowling Nightstalker can't be blocked except by black creatures. + this.addAbility(ProwlingNightstalkerAbility.getInstance()); + } + + public ProwlingNightstalker(final ProwlingNightstalker card) { + super(card); + } + + @Override + public ProwlingNightstalker copy() { + return new ProwlingNightstalker(this); + } +} + +class ProwlingNightstalkerAbility extends EvasionAbility { + + private static ProwlingNightstalkerAbility instance; + + public static ProwlingNightstalkerAbility getInstance() { + if (instance == null) { + instance = new ProwlingNightstalkerAbility(); + } + return instance; + } + + private ProwlingNightstalkerAbility() { + this.addEffect(new ProwlingNightstalkerEffect()); + } + + @Override + public String getRule() { + return "{this} can't be blocked except by black creatures."; + } + + @Override + public ProwlingNightstalkerAbility copy() { + return getInstance(); + } +} + +class ProwlingNightstalkerEffect extends RestrictionEffect { + + public ProwlingNightstalkerEffect() { + super(Duration.WhileOnBattlefield); + } + + public ProwlingNightstalkerEffect(final ProwlingNightstalkerEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + if (permanent.getAbilities().containsKey(ProwlingNightstalkerAbility.getInstance().getId())) { + return true; + } + return false; + } + + @Override + public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { + if (blocker.getColor(game).isBlack()) { + return true; + } + return false; + } + + @Override + public ProwlingNightstalkerEffect copy() { + return new ProwlingNightstalkerEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java b/Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java new file mode 100644 index 00000000000..3a3764fada9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java @@ -0,0 +1,125 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class KukemssaSerpent extends CardImpl { + + private static final FilterLandPermanent filterOpponentLand = new FilterLandPermanent("land an opponent controls"); + private static final FilterControlledLandPermanent filterControlledLand = new FilterControlledLandPermanent("an Island"); + + static { + filterOpponentLand.add(new ControllerPredicate(TargetController.OPPONENT)); + filterControlledLand.add(new SubtypePredicate("Island")); + } + + public KukemssaSerpent(UUID ownerId) { + super(ownerId, 72, "Kukemssa Serpent", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Serpent"); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Kukemssa Serpent can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // {U}, Sacrifice an Island: Target land an opponent controls becomes an Island until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new ManaCostsImpl("{U}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filterControlledLand, true))); + ability.addTarget(new TargetLandPermanent(filterOpponentLand)); + this.addAbility(ability); + + // When you control no Islands, sacrifice Kukemssa Serpent. + this.addAbility(new KukemssaSerpentTriggeredAbility()); + } + + public KukemssaSerpent(final KukemssaSerpent card) { + super(card); + } + + @Override + public KukemssaSerpent copy() { + return new KukemssaSerpent(this); + } +} + +class KukemssaSerpentTriggeredAbility extends StateTriggeredAbility { + + public KukemssaSerpentTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public KukemssaSerpentTriggeredAbility(final KukemssaSerpentTriggeredAbility ability) { + super(ability); + } + + @Override + public KukemssaSerpentTriggeredAbility copy() { + return new KukemssaSerpentTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); + } + + @Override + public String getRule() { + return "When you control no islands, sacrifice {this}."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/morningtide/Floodchaser.java b/Mage.Sets/src/mage/sets/morningtide/Floodchaser.java new file mode 100644 index 00000000000..a2988fa30a7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/Floodchaser.java @@ -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.morningtide; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterLandPermanent; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class Floodchaser extends CardImpl { + + public Floodchaser(UUID ownerId) { + super(ownerId, 34, "Floodchaser", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}"); + this.expansionSetCode = "MOR"; + this.subtype.add("Elemental"); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Floodchaser enters the battlefield with six +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(6)), "{this} enters the battlefield with six +1/+1 counters on it")); + + // Floodchaser can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // {U}, Remove a +1/+1 counter from Floodchaser: Target land becomes an Island until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new ManaCostsImpl("{U}")); + ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance(1))); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public Floodchaser(final Floodchaser card) { + super(card); + } + + @Override + public Floodchaser copy() { + return new Floodchaser(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java new file mode 100644 index 00000000000..a75ba50b483 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java @@ -0,0 +1,71 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class SlipstreamEel extends CardImpl { + + public SlipstreamEel(UUID ownerId) { + super(ownerId, 114, "Slipstream Eel", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Fish"); + this.subtype.add("Beast"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Slipstream Eel can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // Cycling {1}{U} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{U}"))); + } + + public SlipstreamEel(final SlipstreamEel card) { + super(card); + } + + @Override + public SlipstreamEel copy() { + return new SlipstreamEel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/BogSerpent.java b/Mage.Sets/src/mage/sets/planarchaos/BogSerpent.java new file mode 100644 index 00000000000..6af2a29dded --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/BogSerpent.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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class BogSerpent extends CardImpl { + + public BogSerpent(UUID ownerId) { + super(ownerId, 84, "Bog Serpent", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{B}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Serpent"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Bog Serpent can't attack unless defending player controls a Swamp. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Swamp","a Swamp")))); + + // When you control no Swamps, sacrifice Bog Serpent. + this.addAbility(new BogSerpentTriggeredAbility()); + } + + public BogSerpent(final BogSerpent card) { + super(card); + } + + @Override + public BogSerpent copy() { + return new BogSerpent(this); + } +} + +class BogSerpentTriggeredAbility extends StateTriggeredAbility { + + public static final FilterLandPermanent filter = new FilterLandPermanent("Swamp"); + + { + filter.add(new SubtypePredicate("Swamp")); + } + + public BogSerpentTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public BogSerpentTriggeredAbility(final BogSerpentTriggeredAbility ability) { + super(ability); + } + + @Override + public BogSerpentTriggeredAbility copy() { + return new BogSerpentTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return (game.getBattlefield().countAll(filter, controllerId, game) == 0); + } + + @Override + public String getRule() { + return "When you control no swamps, sacrifice {this}."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/portal/DeepSeaSerpent.java b/Mage.Sets/src/mage/sets/portal/DeepSeaSerpent.java new file mode 100644 index 00000000000..c33ac24a92c --- /dev/null +++ b/Mage.Sets/src/mage/sets/portal/DeepSeaSerpent.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.portal; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class DeepSeaSerpent extends CardImpl { + + public DeepSeaSerpent(UUID ownerId) { + super(ownerId, 52, "Deep-Sea Serpent", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{U}{U}"); + this.expansionSetCode = "POR"; + this.subtype.add("Serpent"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Deep-Sea Serpent can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + } + + public DeepSeaSerpent(final DeepSeaSerpent card) { + super(card); + } + + @Override + public DeepSeaSerpent copy() { + return new DeepSeaSerpent(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalsecondage/ArmoredGalleon.java b/Mage.Sets/src/mage/sets/portalsecondage/ArmoredGalleon.java new file mode 100644 index 00000000000..24580763ab4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/ArmoredGalleon.java @@ -0,0 +1,66 @@ +/* + * 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.portalsecondage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class ArmoredGalleon extends CardImpl { + + public ArmoredGalleon(UUID ownerId) { + super(ownerId, 33, "Armored Galleon", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{U}"); + this.expansionSetCode = "PO2"; + this.subtype.add("Human"); + this.subtype.add("Pirate"); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // Armored Galleon can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + } + + public ArmoredGalleon(final ArmoredGalleon card) { + super(card); + } + + @Override + public ArmoredGalleon copy() { + return new ArmoredGalleon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalsecondage/ProwlingNightstalker.java b/Mage.Sets/src/mage/sets/portalsecondage/ProwlingNightstalker.java new file mode 100644 index 00000000000..5a641ffa069 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/ProwlingNightstalker.java @@ -0,0 +1,52 @@ +/* + * 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.portalsecondage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class ProwlingNightstalker extends mage.sets.masterseditioniv.ProwlingNightstalker { + + public ProwlingNightstalker(UUID ownerId) { + super(ownerId); + this.cardNumber = 23; + this.expansionSetCode = "PO2"; + } + + public ProwlingNightstalker(final ProwlingNightstalker card) { + super(card); + } + + @Override + public ProwlingNightstalker copy() { + return new ProwlingNightstalker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalsecondage/SteamFrigate.java b/Mage.Sets/src/mage/sets/portalsecondage/SteamFrigate.java new file mode 100644 index 00000000000..2d3a736da45 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/SteamFrigate.java @@ -0,0 +1,66 @@ +/* + * 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.portalsecondage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class SteamFrigate extends CardImpl { + + public SteamFrigate(UUID ownerId) { + super(ownerId, 47, "Steam Frigate", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "PO2"; + this.subtype.add("Human"); + this.subtype.add("Pirate"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Steam Frigate can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + } + + public SteamFrigate(final SteamFrigate card) { + super(card); + } + + @Override + public SteamFrigate copy() { + return new SteamFrigate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/RedCliffsArmada.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/RedCliffsArmada.java new file mode 100644 index 00000000000..0e96a287aa6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/RedCliffsArmada.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.portalthreekingdoms; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class RedCliffsArmada extends mage.sets.masterseditionii.RedCliffsArmada { + + public RedCliffsArmada(UUID ownerId) { + super(ownerId); + this.cardNumber = 51; + this.expansionSetCode = "PTK"; + this.rarity = Rarity.UNCOMMON; + } + + public RedCliffsArmada(final RedCliffsArmada card) { + super(card); + } + + @Override + public RedCliffsArmada copy() { + return new RedCliffsArmada(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/WuWarship.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/WuWarship.java new file mode 100644 index 00000000000..d73e452ecac --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/WuWarship.java @@ -0,0 +1,52 @@ +/* + * 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.portalthreekingdoms; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class WuWarship extends mage.sets.masterseditioniii.WuWarship { + + public WuWarship(UUID ownerId) { + super(ownerId); + this.cardNumber = 64; + this.expansionSetCode = "PTK"; + } + + public WuWarship(final WuWarship card) { + super(card); + } + + @Override + public WuWarship copy() { + return new WuWarship(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhouYuChiefCommander.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhouYuChiefCommander.java new file mode 100644 index 00000000000..5fc93faaccd --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhouYuChiefCommander.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.portalthreekingdoms; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class ZhouYuChiefCommander extends CardImpl { + + public ZhouYuChiefCommander(UUID ownerId) { + super(ownerId, 65, "Zhou Yu, Chief Commander", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "PTK"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // Zhou Yu, Chief Commander can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + } + + public ZhouYuChiefCommander(final ZhouYuChiefCommander card) { + super(card); + } + + @Override + public ZhouYuChiefCommander copy() { + return new ZhouYuChiefCommander(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java b/Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java new file mode 100644 index 00000000000..1addde37c93 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java @@ -0,0 +1,104 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class SlipstreamSerpent extends CardImpl { + + public SlipstreamSerpent(UUID ownerId) { + super(ownerId, 77, "Slipstream Serpent", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{7}{U}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Serpent"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Slipstream Serpent can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // When you control no Islands, sacrifice Slipstream Serpent. + this.addAbility(new SlipstreamSerpentTriggeredAbility()); + + // Morph {5}{U} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{5}{U}"))); + } + + public SlipstreamSerpent(final SlipstreamSerpent card) { + super(card); + } + + @Override + public SlipstreamSerpent copy() { + return new SlipstreamSerpent(this); + } +} + +class SlipstreamSerpentTriggeredAbility extends StateTriggeredAbility { + + public SlipstreamSerpentTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public SlipstreamSerpentTriggeredAbility(final SlipstreamSerpentTriggeredAbility ability) { + super(ability); + } + + @Override + public SlipstreamSerpentTriggeredAbility copy() { + return new SlipstreamSerpentTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); + } + + @Override + public String getRule() { + return "When you control no islands, sacrifice {this}."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/vintagemasters/MuzzioVisionaryArchitect.java b/Mage.Sets/src/mage/sets/vintagemasters/MuzzioVisionaryArchitect.java new file mode 100644 index 00000000000..6af2163443b --- /dev/null +++ b/Mage.Sets/src/mage/sets/vintagemasters/MuzzioVisionaryArchitect.java @@ -0,0 +1,52 @@ +/* + * 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.vintagemasters; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class MuzzioVisionaryArchitect extends mage.sets.conspiracy.MuzzioVisionaryArchitect { + + public MuzzioVisionaryArchitect(UUID ownerId) { + super(ownerId); + this.cardNumber = 82; + this.expansionSetCode = "VMA"; + } + + public MuzzioVisionaryArchitect(final MuzzioVisionaryArchitect card) { + super(card); + } + + @Override + public MuzzioVisionaryArchitect copy() { + return new MuzzioVisionaryArchitect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/MantaRay.java b/Mage.Sets/src/mage/sets/weatherlight/MantaRay.java new file mode 100644 index 00000000000..4c3235fbed6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/MantaRay.java @@ -0,0 +1,165 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.EvasionAbility; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author fireshoes + */ +public class MantaRay extends CardImpl { + + public MantaRay(UUID ownerId) { + super(ownerId, 42, "Manta Ray", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Fish"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Manta Ray can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // Manta Ray can't be blocked except by blue creatures. + this.addAbility(MantaRayAbility.getInstance()); + + // When you control no Islands, sacrifice Manta Ray. + this.addAbility(new MantaRayTriggeredAbility()); + } + + public MantaRay(final MantaRay card) { + super(card); + } + + @Override + public MantaRay copy() { + return new MantaRay(this); + } +} + +class MantaRayTriggeredAbility extends StateTriggeredAbility { + + public MantaRayTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public MantaRayTriggeredAbility(final MantaRayTriggeredAbility ability) { + super(ability); + } + + @Override + public MantaRayTriggeredAbility copy() { + return new MantaRayTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); + } + + @Override + public String getRule() { + return "When you control no islands, sacrifice {this}."; + } +} + +class MantaRayAbility extends EvasionAbility { + + private static MantaRayAbility instance; + + public static MantaRayAbility getInstance() { + if (instance == null) { + instance = new MantaRayAbility(); + } + return instance; + } + + private MantaRayAbility() { + this.addEffect(new MantaRayEffect()); + } + + @Override + public String getRule() { + return "{this} can't be blocked except by blue creatures."; + } + + @Override + public MantaRayAbility copy() { + return getInstance(); + } +} + +class MantaRayEffect extends RestrictionEffect { + + public MantaRayEffect() { + super(Duration.WhileOnBattlefield); + } + + public MantaRayEffect(final MantaRayEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + if (permanent.getAbilities().containsKey(MantaRayAbility.getInstance().getId())) { + return true; + } + return false; + } + + @Override + public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { + if (blocker.getColor(game).isBlue()) { + return true; + } + return false; + } + + @Override + public MantaRayEffect copy() { + return new MantaRayEffect(this); + } +} \ No newline at end of file From 21b7022515db226db688475af28611ff66f3d4f0 Mon Sep 17 00:00:00 2001 From: brodee Date: Mon, 20 Jul 2015 20:09:38 -0700 Subject: [PATCH 126/375] Fixed: Garruk Apex Predator was using the wrong image for the beast tokens. They are correctly implemented as 3/3 deathtouch black beasts, but the tokens it showed are 3/3 beasts with no abilities. --- Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java b/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java index 7bcaa7023c1..abf19090026 100644 --- a/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java +++ b/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java @@ -148,7 +148,7 @@ class GarrukApexPredatorBeastToken extends Token { public GarrukApexPredatorBeastToken() { super("Beast", "3/3 black Beast creature token with deathtouch"); setOriginalExpansionSetCode("M15"); - setTokenType(2); + setTokenType(1); cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add("Beast"); From 69df7e63e27077c65fb41f1fd70f7d2012be2da7 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 20 Jul 2015 23:00:09 -0500 Subject: [PATCH 127/375] [CNS] Implemented Split Decision and Extract from Darkness --- .../sets/conspiracy/ExtractFromDarkness.java | 141 ++++++++++++++++++ .../mage/sets/conspiracy/SplitDecision.java | 119 +++++++++++++++ 2 files changed, 260 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/SplitDecision.java diff --git a/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java b/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java new file mode 100644 index 00000000000..0af8c57cf18 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java @@ -0,0 +1,141 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCardInGraveyard; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class ExtractFromDarkness extends CardImpl { + + public ExtractFromDarkness(UUID ownerId) { + super(ownerId, 45, "Extract from Darkness", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{U}{B}"); + this.expansionSetCode = "CNS"; + + // Each player puts the top two cards of his or her library into his or her graveyard. + this.getSpellAbility().addEffect(new ExtractFromDarknessMillEffect()); + // Then put a creature card from a graveyard onto the battlefield under your control. + this.getSpellAbility().addEffect(new ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect()); + } + + public ExtractFromDarkness(final ExtractFromDarkness card) { + super(card); + } + + @Override + public ExtractFromDarkness copy() { + return new ExtractFromDarkness(this); + } +} + +class ExtractFromDarknessMillEffect extends OneShotEffect { + + ExtractFromDarknessMillEffect() { + super(Outcome.Detriment); + staticText = "Each player puts the top two cards of his or her library into his or her graveyard"; + } + + ExtractFromDarknessMillEffect(final ExtractFromDarknessMillEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + for (UUID playerId : game.getPlayerList()) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.moveCards(player.getLibrary().getTopCards(game, 2), Zone.LIBRARY, Zone.GRAVEYARD, source, game); + } + } + return true; + } + + @Override + public ExtractFromDarknessMillEffect copy() { + return new ExtractFromDarknessMillEffect(this); + } +} + +class ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect extends OneShotEffect { + + public ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect() { + super(Outcome.PutCreatureInPlay); + staticText = "Put a creature card from a graveyard onto the battlefield under your control"; + } + + public ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect(final ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect effect) { + super(effect); + } + + @Override + public ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect copy() { + return new ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + Target target = new TargetCardInGraveyard(new FilterCreatureCard()); + target.setNotTarget(true); + if (target.canChoose(source.getSourceId(), source.getControllerId(), game) + && player.chooseTarget(outcome, target, source, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + if (card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId())) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(card.getId())); + game.addEffect(effect, source); + } + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/conspiracy/SplitDecision.java b/Mage.Sets/src/mage/sets/conspiracy/SplitDecision.java new file mode 100644 index 00000000000..09733d97720 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/SplitDecision.java @@ -0,0 +1,119 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class SplitDecision extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.SORCERY))); + } + + public SplitDecision(UUID ownerId) { + super(ownerId, 25, "Split Decision", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "CNS"; + + // Will of the council - Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter the spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy. + this.getSpellAbility().addEffect(new SplitDecisionEffect()); + this.getSpellAbility().addTarget(new TargetSpell(filter)); + } + + public SplitDecision(final SplitDecision card) { + super(card); + } + + @Override + public SplitDecision copy() { + return new SplitDecision(this); + } +} + +class SplitDecisionEffect extends OneShotEffect { + + SplitDecisionEffect() { + super(Outcome.Benefit); + this.staticText = "Will of the council - Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter the spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy"; + } + + SplitDecisionEffect(final SplitDecisionEffect effect) { + super(effect); + } + + @Override + public SplitDecisionEffect copy() { + return new SplitDecisionEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int denialCount = 0; + int duplicationCount = 0; + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + if (player.chooseUse(Outcome.ExtraTurn, "Choose denial?", source, game)) { + denialCount++; + game.informPlayers(player.getLogName() + " has chosen: denial"); + } else { + duplicationCount++; + game.informPlayers(player.getLogName() + " has chosen: duplication"); + } + } + } + if (denialCount > duplicationCount) { + return game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game); + } else { + return new CopyTargetSpellEffect().apply(game, source); + } + } + return false; + } +} \ No newline at end of file From 00e4e3be6c0316291761960552dd3e513d0b1d45 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 21 Jul 2015 11:11:54 +0200 Subject: [PATCH 128/375] * Coastal Drake - Fixed that the activated ability did only return the Coastal Drake itself to owners hand. --- .../src/mage/sets/apocalypse/CoastalDrake.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/apocalypse/CoastalDrake.java b/Mage.Sets/src/mage/sets/apocalypse/CoastalDrake.java index 3be0c8808e2..c310b13a6e2 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/CoastalDrake.java +++ b/Mage.Sets/src/mage/sets/apocalypse/CoastalDrake.java @@ -28,18 +28,19 @@ package mage.sets.apocalypse; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; /** * @@ -54,12 +55,13 @@ public class CoastalDrake extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - - // Flying + + // Flying this.addAbility(FlyingAbility.getInstance()); - + // {1}{U}, {T} : Return target Kavu to its owner's hand. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), new ManaCostsImpl("{1}{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(true), new ManaCostsImpl("{1}{U}")); + ability.addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("Kavu", "Kavu"))); ability.addCost(new TapSourceCost()); this.addAbility(ability); } From 1728eb01e03c2f7b87f3aae718941d0572ad5b59 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 21 Jul 2015 14:55:15 +0200 Subject: [PATCH 129/375] * Replaced some card classes by framework classes. Some minor changes to cards. --- .../EndrekSahrMasterBreeder.java | 45 +-- .../mage/sets/elvesvsgoblins/SkirkShaman.java | 7 +- .../src/mage/sets/eventide/NoggleBandit.java | 13 +- .../mage/sets/fallenempires/Seasinger.java | 36 +- .../sets/fallenempires/VodalianKnights.java | 44 +-- .../src/mage/sets/fifthedition/Dandan.java | 42 +-- .../fifthedition/EvilEyeOfOrmsByGore.java | 3 +- .../src/mage/sets/iceage/GorillaPack.java | 44 +-- .../khansoftarkir/MysticOfTheHiddenWay.java | 3 +- .../sets/khansoftarkir/WarNameAspirant.java | 18 +- .../mage/sets/limitedalpha/PirateShip.java | 44 +-- .../mage/sets/limitedalpha/SeaSerpent.java | 38 +- .../mage/sets/lorwyn/GoldmeadowDodger.java | 7 +- .../src/mage/sets/magic2010/DreadWarlock.java | 81 +--- .../sets/magic2015/ScuttlingDoomEngine.java | 10 +- .../mage/sets/masterseditionii/Marjhan.java | 52 +-- .../src/mage/sets/mirage/KukemssaSerpent.java | 44 +-- .../mage/sets/nemesis/SneakyHomunculus.java | 13 +- .../src/mage/sets/onslaught/ElvenRiders.java | 7 +- .../src/mage/sets/planarchaos/BogSerpent.java | 46 +-- .../src/mage/sets/ravnica/VindictiveMob.java | 9 +- .../src/mage/sets/scourge/TreetopScout.java | 8 +- .../sets/shadowmoor/BarrentonCragtreads.java | 5 +- .../sets/shadowmoor/LureboundScarecrow.java | 15 +- .../shadowmoor/WanderbrineRootcutters.java | 11 +- .../tempestremastered/EndangeredArmodon.java | 50 +-- Mage.Sets/src/mage/sets/thedark/BogRats.java | 7 +- .../src/mage/sets/theros/DaxosOfMeletis.java | 4 +- .../sets/timespiral/SlipstreamSerpent.java | 42 +-- .../mage/sets/urzassaga/TreetopRangers.java | 7 +- .../sets/vintagemasters/CityInABottle.java | 347 +++++------------- .../src/mage/sets/weatherlight/MantaRay.java | 119 ++---- ...sPermanentsControllerTriggeredAbility.java | 96 +++++ 33 files changed, 406 insertions(+), 911 deletions(-) create mode 100644 Mage/src/mage/abilities/common/ControlsPermanentsControllerTriggeredAbility.java diff --git a/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java b/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java index 9396551ffe3..dfed94b5507 100644 --- a/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java +++ b/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java @@ -30,7 +30,7 @@ package mage.sets.commander2013; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -40,12 +40,11 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.FilterSpell; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.token.Token; import mage.game.stack.Spell; import mage.target.targetpointer.FixedTarget; @@ -57,6 +56,7 @@ import mage.target.targetpointer.FixedTarget; public class EndrekSahrMasterBreeder extends CardImpl { private static final FilterSpell filter = new FilterSpell("a creature spell"); + static { filter.add(new CardTypePredicate(CardType.CREATURE)); } @@ -74,7 +74,9 @@ public class EndrekSahrMasterBreeder extends CardImpl { // Whenever you cast a creature spell, put X 1/1 black Thrull creature tokens onto the battlefield, where X is that spell's converted mana cost. this.addAbility(new SpellCastControllerTriggeredAbility(new EndrekSahrMasterBreederEffect(), filter, false, true)); // When you control seven or more Thrulls, sacrifice Endrek Sahr, Master Breeder. - this.addAbility(new EndrekSahrMasterBreederTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterCreaturePermanent("Thrull", "seven or more Thrulls"), Filter.ComparisonType.GreaterThan, 6, + new SacrificeSourceEffect())); } public EndrekSahrMasterBreeder(final EndrekSahrMasterBreeder card) { @@ -87,37 +89,6 @@ public class EndrekSahrMasterBreeder extends CardImpl { } } -class EndrekSahrMasterBreederTriggeredAbility extends StateTriggeredAbility { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - static { - filter.add(new SubtypePredicate("Thrull")); - } - - public EndrekSahrMasterBreederTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public EndrekSahrMasterBreederTriggeredAbility(final EndrekSahrMasterBreederTriggeredAbility ability) { - super(ability); - } - - @Override - public EndrekSahrMasterBreederTriggeredAbility copy() { - return new EndrekSahrMasterBreederTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(filter, this.getControllerId(), game) >= 7); - } - - @Override - public String getRule() { - return "When you control seven or more Thrulls, sacrifice {this}."; - } -} - class EndrekSahrMasterBreederEffect extends OneShotEffect { public EndrekSahrMasterBreederEffect() { @@ -138,8 +109,8 @@ class EndrekSahrMasterBreederEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); if (spell == null) { - spell = (Spell) game.getLastKnownInformation(((FixedTarget)getTargetPointer()).getTarget(), Zone.STACK); - } + spell = (Spell) game.getLastKnownInformation(((FixedTarget) getTargetPointer()).getTarget(), Zone.STACK); + } if (spell != null) { int cmc = spell.getConvertedManaCost(); if (cmc > 0) { diff --git a/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkShaman.java b/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkShaman.java index a6279964877..e6bad1d45fa 100644 --- a/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkShaman.java +++ b/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkShaman.java @@ -30,13 +30,12 @@ package mage.sets.elvesvsgoblins; import java.util.UUID; import mage.MageInt; import mage.ObjectColor; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -55,7 +54,7 @@ public class SkirkShaman extends CardImpl { Predicates.or( Predicates.and(new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE)), Predicates.and(new CardTypePredicate(CardType.CREATURE), new ColorPredicate(ObjectColor.RED) - )))); + )))); } public SkirkShaman(UUID ownerId) { @@ -68,7 +67,7 @@ public class SkirkShaman extends CardImpl { this.toughness = new MageInt(2); // Skirk Shaman can't be blocked except by artifact creatures and/or red creatures. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } diff --git a/Mage.Sets/src/mage/sets/eventide/NoggleBandit.java b/Mage.Sets/src/mage/sets/eventide/NoggleBandit.java index 6c6b494ac48..42a29a32357 100644 --- a/Mage.Sets/src/mage/sets/eventide/NoggleBandit.java +++ b/Mage.Sets/src/mage/sets/eventide/NoggleBandit.java @@ -29,14 +29,13 @@ package mage.sets.eventide; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; @@ -44,12 +43,12 @@ import mage.filter.predicate.mageobject.AbilityPredicate; /** * * @author jeffwadsworth - + * */ public class NoggleBandit extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("except by creatures with defender"); - + static { filter.add(Predicates.not(new AbilityPredicate(DefenderAbility.class))); } @@ -64,8 +63,8 @@ public class NoggleBandit extends CardImpl { this.toughness = new MageInt(2); // Noggle Bandit can't be blocked except by creatures with defender. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); - + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + } public NoggleBandit(final NoggleBandit card) { diff --git a/Mage.Sets/src/mage/sets/fallenempires/Seasinger.java b/Mage.Sets/src/mage/sets/fallenempires/Seasinger.java index d5e757065c7..3ded18de716 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/Seasinger.java +++ b/Mage.Sets/src/mage/sets/fallenempires/Seasinger.java @@ -32,7 +32,7 @@ import java.util.UUID; import mage.constants.*; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SkipUntapOptionalAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; @@ -42,13 +42,13 @@ import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.cards.CardImpl; +import mage.filter.Filter; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.CardIdPredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; import mage.target.common.TargetCreaturePermanent; import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; @@ -80,7 +80,9 @@ public class Seasinger extends CardImpl { seasinger.add(new CardIdPredicate(this.getId())); // When you control no Islands, sacrifice Seasinger. - this.addAbility(new SeasingerTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); // You may choose not to untap Seasinger during your untap step. this.addAbility(new SkipUntapOptionalAbility()); @@ -104,29 +106,3 @@ public class Seasinger extends CardImpl { return new Seasinger(this); } } - -class SeasingerTriggeredAbility extends StateTriggeredAbility { - - public SeasingerTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public SeasingerTriggeredAbility(final SeasingerTriggeredAbility ability) { - super(ability); - } - - @Override - public SeasingerTriggeredAbility copy() { - return new SeasingerTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} diff --git a/Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java b/Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java index 58c9190592e..54ea81b3d42 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java +++ b/Mage.Sets/src/mage/sets/fallenempires/VodalianKnights.java @@ -29,7 +29,7 @@ package mage.sets.fallenempires; import java.util.UUID; import mage.MageInt; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -43,10 +43,8 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; /** * @@ -64,13 +62,15 @@ public class VodalianKnights extends CardImpl { // First strike this.addAbility(FirstStrikeAbility.getInstance()); - + // Vodalian Knights can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + // When you control no Islands, sacrifice Vodalian Knights. - this.addAbility(new VodalianKnightsTriggeredAbility()); - + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + // {U}: Vodalian Knights gains flying until end of turn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{U}"))); } @@ -84,29 +84,3 @@ public class VodalianKnights extends CardImpl { return new VodalianKnights(this); } } - -class VodalianKnightsTriggeredAbility extends StateTriggeredAbility { - - public VodalianKnightsTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public VodalianKnightsTriggeredAbility(final VodalianKnightsTriggeredAbility ability) { - super(ability); - } - - @Override - public VodalianKnightsTriggeredAbility copy() { - return new VodalianKnightsTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/fifthedition/Dandan.java b/Mage.Sets/src/mage/sets/fifthedition/Dandan.java index 4d901bd4eee..3d47fc87d5c 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/Dandan.java +++ b/Mage.Sets/src/mage/sets/fifthedition/Dandan.java @@ -29,21 +29,19 @@ package mage.sets.fifthedition; import java.util.UUID; import mage.MageInt; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; import mage.cards.CardImpl; import mage.constants.*; +import mage.filter.Filter; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; /** * * @author KholdFuzion - + * */ public class Dandan extends CardImpl { @@ -56,10 +54,12 @@ public class Dandan extends CardImpl { this.toughness = new MageInt(1); // Dandan can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + // When you control no Islands, sacrifice Dandan. - this.addAbility(new DandanTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); } public Dandan(final Dandan card) { @@ -71,29 +71,3 @@ public class Dandan extends CardImpl { return new Dandan(this); } } - -class DandanTriggeredAbility extends StateTriggeredAbility { - - public DandanTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public DandanTriggeredAbility(final DandanTriggeredAbility ability) { - super(ability); - } - - @Override - public DandanTriggeredAbility copy() { - return new DandanTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no Islands, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/fifthedition/EvilEyeOfOrmsByGore.java b/Mage.Sets/src/mage/sets/fifthedition/EvilEyeOfOrmsByGore.java index dbf4cce772d..d3b7008d0c8 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/EvilEyeOfOrmsByGore.java +++ b/Mage.Sets/src/mage/sets/fifthedition/EvilEyeOfOrmsByGore.java @@ -29,6 +29,7 @@ package mage.sets.fifthedition; import java.util.UUID; import mage.MageInt; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.combat.CantAttackAnyPlayerAllEffect; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; @@ -70,7 +71,7 @@ public class EvilEyeOfOrmsByGore extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackAnyPlayerAllEffect(Duration.WhileOnBattlefield, cantAttackFilter))); // Evil Eye of Orms-by-Gore can't be blocked except by Walls. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(cantBeBlockedByFilter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(cantBeBlockedByFilter, Duration.WhileOnBattlefield))); } public EvilEyeOfOrmsByGore(final EvilEyeOfOrmsByGore card) { diff --git a/Mage.Sets/src/mage/sets/iceage/GorillaPack.java b/Mage.Sets/src/mage/sets/iceage/GorillaPack.java index 3227d984018..8e7d6c4e10e 100644 --- a/Mage.Sets/src/mage/sets/iceage/GorillaPack.java +++ b/Mage.Sets/src/mage/sets/iceage/GorillaPack.java @@ -29,7 +29,7 @@ package mage.sets.iceage; import java.util.UUID; import mage.MageInt; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; @@ -37,10 +37,8 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.events.GameEvent; /** * @@ -56,10 +54,12 @@ public class GorillaPack extends CardImpl { this.toughness = new MageInt(3); // Gorilla Pack can't attack unless defending player controls a Forest. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Forest","a Forest")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Forest", "a Forest")))); // When you control no Forests, sacrifice Gorilla Pack. - this.addAbility(new GorillaPackTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Forest", "no Forests"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); } public GorillaPack(final GorillaPack card) { @@ -71,35 +71,3 @@ public class GorillaPack extends CardImpl { return new GorillaPack(this); } } - -class GorillaPackTriggeredAbility extends StateTriggeredAbility { - - public static final FilterLandPermanent filter = new FilterLandPermanent("Forest"); - - { - filter.add(new SubtypePredicate("Forest")); - } - - public GorillaPackTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public GorillaPackTriggeredAbility(final GorillaPackTriggeredAbility ability) { - super(ability); - } - - @Override - public GorillaPackTriggeredAbility copy() { - return new GorillaPackTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no forests, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MysticOfTheHiddenWay.java b/Mage.Sets/src/mage/sets/khansoftarkir/MysticOfTheHiddenWay.java index 31cc916d8b7..b305db9becc 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MysticOfTheHiddenWay.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MysticOfTheHiddenWay.java @@ -30,9 +30,8 @@ package mage.sets.khansoftarkir; import java.util.UUID; import mage.MageInt; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; -import mage.abilities.keyword.MorphAbility; import mage.abilities.keyword.CantBeBlockedSourceAbility; +import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/WarNameAspirant.java b/Mage.Sets/src/mage/sets/khansoftarkir/WarNameAspirant.java index de69d67f53d..d319410e590 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/WarNameAspirant.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/WarNameAspirant.java @@ -30,7 +30,7 @@ package mage.sets.khansoftarkir; import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.condition.common.RaidCondition; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -38,7 +38,6 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.Filter; import mage.filter.common.FilterCreaturePermanent; @@ -50,8 +49,9 @@ import mage.watchers.common.PlayerAttackedWatcher; * @author emerald000 */ public class WarNameAspirant extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with power 1 or less"); + static { filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, 2)); } @@ -66,15 +66,15 @@ public class WarNameAspirant extends CardImpl { this.toughness = new MageInt(1); // Raid - War-Name Aspirant enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1), false), - RaidCondition.getInstance(), - true, - "Raid - {this} enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn", - "{this} enters the battlefield with a +1/+1 counter"), + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1), false), + RaidCondition.getInstance(), + true, + "Raid - {this} enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn", + "{this} enters the battlefield with a +1/+1 counter"), new PlayerAttackedWatcher()); // War-Name Aspirant can't be blocked by creatures with power 1 or less. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } public WarNameAspirant(final WarNameAspirant card) { diff --git a/Mage.Sets/src/mage/sets/limitedalpha/PirateShip.java b/Mage.Sets/src/mage/sets/limitedalpha/PirateShip.java index f350c41d9b9..e74e2995916 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/PirateShip.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/PirateShip.java @@ -30,7 +30,7 @@ package mage.sets.limitedalpha; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; @@ -38,17 +38,17 @@ import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; import mage.cards.CardImpl; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; import mage.target.common.TargetCreatureOrPlayer; /** * * @author KholdFuzion - + * */ public class PirateShip extends CardImpl { @@ -62,13 +62,15 @@ public class PirateShip extends CardImpl { this.toughness = new MageInt(3); // Pirate Ship can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); // {tap}: Pirate Ship deals 1 damage to target creature or player. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); // When you control no Islands, sacrifice Pirate Ship. - this.addAbility(new PirateShipTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); } public PirateShip(final PirateShip card) { @@ -80,29 +82,3 @@ public class PirateShip extends CardImpl { return new PirateShip(this); } } - -class PirateShipTriggeredAbility extends StateTriggeredAbility { - - public PirateShipTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public PirateShipTriggeredAbility(final PirateShipTriggeredAbility ability) { - super(ability); - } - - @Override - public PirateShipTriggeredAbility copy() { - return new PirateShipTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/limitedalpha/SeaSerpent.java b/Mage.Sets/src/mage/sets/limitedalpha/SeaSerpent.java index 9ef628a1817..2a34b6d3ffd 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/SeaSerpent.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/SeaSerpent.java @@ -29,7 +29,7 @@ package mage.sets.limitedalpha; import java.util.UUID; import mage.MageInt; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; @@ -37,16 +37,14 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; /** * * @author KholdFuzion - + * */ public class SeaSerpent extends CardImpl { @@ -67,7 +65,9 @@ public class SeaSerpent extends CardImpl { // Sea Serpent can't attack unless defending player controls an Island. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(filter))); // When you control no Islands, sacrifice Sea Serpent. - this.addAbility(new SeaSerpentTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); } public SeaSerpent(final SeaSerpent card) { @@ -79,29 +79,3 @@ public class SeaSerpent extends CardImpl { return new SeaSerpent(this); } } - -class SeaSerpentTriggeredAbility extends StateTriggeredAbility { - - public SeaSerpentTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public SeaSerpentTriggeredAbility(final SeaSerpentTriggeredAbility ability) { - super(ability); - } - - @Override - public SeaSerpentTriggeredAbility copy() { - return new SeaSerpentTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} diff --git a/Mage.Sets/src/mage/sets/lorwyn/GoldmeadowDodger.java b/Mage.Sets/src/mage/sets/lorwyn/GoldmeadowDodger.java index a957e34130f..802b0fda7ec 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/GoldmeadowDodger.java +++ b/Mage.Sets/src/mage/sets/lorwyn/GoldmeadowDodger.java @@ -29,13 +29,12 @@ package mage.sets.lorwyn; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.Filter; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; @@ -51,7 +50,7 @@ public class GoldmeadowDodger extends CardImpl { static { filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 3)); } - + public GoldmeadowDodger(UUID ownerId) { super(ownerId, 16, "Goldmeadow Dodger", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}"); this.expansionSetCode = "LRW"; @@ -61,7 +60,7 @@ public class GoldmeadowDodger extends CardImpl { this.toughness = new MageInt(1); // Goldmeadow Dodger can't be blocked by creatures with power 4 or greater. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } public GoldmeadowDodger(final GoldmeadowDodger card) { diff --git a/Mage.Sets/src/mage/sets/magic2010/DreadWarlock.java b/Mage.Sets/src/mage/sets/magic2010/DreadWarlock.java index 4d6639a4fc5..555286fb413 100644 --- a/Mage.Sets/src/mage/sets/magic2010/DreadWarlock.java +++ b/Mage.Sets/src/mage/sets/magic2010/DreadWarlock.java @@ -28,16 +28,17 @@ package mage.sets.magic2010; import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; +import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.effects.RestrictionEffect; -import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; /** * @@ -45,6 +46,12 @@ import mage.game.permanent.Permanent; */ public class DreadWarlock extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("except by black creatures"); + + static { + filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK))); + } + public DreadWarlock(UUID ownerId) { super(ownerId, 94, "Dread Warlock", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); this.expansionSetCode = "M10"; @@ -55,7 +62,7 @@ public class DreadWarlock extends CardImpl { this.toughness = new MageInt(2); // Dread Warlock can't be blocked except by black creatures. - this.addAbility(DreadWarlockAbility.getInstance()); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } public DreadWarlock(final DreadWarlock card) { @@ -67,61 +74,3 @@ public class DreadWarlock extends CardImpl { return new DreadWarlock(this); } } - -class DreadWarlockAbility extends EvasionAbility { - - private static DreadWarlockAbility instance; - - public static DreadWarlockAbility getInstance() { - if (instance == null) { - instance = new DreadWarlockAbility(); - } - return instance; - } - - private DreadWarlockAbility() { - this.addEffect(new DreadWarlockEffect()); - } - - @Override - public String getRule() { - return "{this} can't be blocked except by black creatures."; - } - - @Override - public DreadWarlockAbility copy() { - return getInstance(); - } -} - -class DreadWarlockEffect extends RestrictionEffect { - - public DreadWarlockEffect() { - super(Duration.WhileOnBattlefield); - } - - public DreadWarlockEffect(final DreadWarlockEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getAbilities().containsKey(DreadWarlockAbility.getInstance().getId())) { - return true; - } - return false; - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (blocker.getColor(game).isBlack()) { - return true; - } - return false; - } - - @Override - public DreadWarlockEffect copy() { - return new DreadWarlockEffect(this); - } -} diff --git a/Mage.Sets/src/mage/sets/magic2015/ScuttlingDoomEngine.java b/Mage.Sets/src/mage/sets/magic2015/ScuttlingDoomEngine.java index 9372ebf2010..8cbfe7e7b42 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ScuttlingDoomEngine.java +++ b/Mage.Sets/src/mage/sets/magic2015/ScuttlingDoomEngine.java @@ -31,14 +31,13 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.Filter; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; @@ -49,14 +48,15 @@ import mage.target.common.TargetOpponent; * @author emerald000 */ public class ScuttlingDoomEngine 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 ScuttlingDoomEngine(UUID ownerId) { - + super(ownerId, 229, "Scuttling Doom Engine", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}"); this.expansionSetCode = "M15"; this.subtype.add("Construct"); @@ -65,7 +65,7 @@ public class ScuttlingDoomEngine extends CardImpl { this.toughness = new MageInt(6); // Scuttling Doom Engine can't be blocked by creatures with power 2 or less. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); // When Scuttling Doom Engine dies, it deals 6 damage to target opponnent Ability ability = new DiesTriggeredAbility(new DamageTargetEffect(6), false); ability.addTarget(new TargetOpponent()); diff --git a/Mage.Sets/src/mage/sets/masterseditionii/Marjhan.java b/Mage.Sets/src/mage/sets/masterseditionii/Marjhan.java index d7974514f82..f980073b9f6 100644 --- a/Mage.Sets/src/mage/sets/masterseditionii/Marjhan.java +++ b/Mage.Sets/src/mage/sets/masterseditionii/Marjhan.java @@ -30,7 +30,7 @@ package mage.sets.masterseditionii; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.IsStepCondition; @@ -51,13 +51,11 @@ import mage.constants.Duration; import mage.constants.PhaseStep; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterAttackingCreature; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; @@ -66,9 +64,9 @@ import mage.target.common.TargetCreaturePermanent; * @author fireshoes */ public class Marjhan extends CardImpl { - + private static final FilterAttackingCreature filter = new FilterAttackingCreature("attacking creature without flying"); - + static { filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); } @@ -82,25 +80,27 @@ public class Marjhan extends CardImpl { // Marjhan doesn't untap during your untap step. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepSourceEffect())); - + // {U}{U}, Sacrifice a creature: Untap Marjhan. Activate this ability only during your upkeep. - Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, + Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new ManaCostsImpl("{U}{U}"), new IsStepCondition(PhaseStep.UPKEEP), null); ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); this.addAbility(ability); - + // Marjhan can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + // {U}{U}: Marjhan gets -1/-0 until end of turn and deals 1 damage to target attacking creature without flying. ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(-1, 0, Duration.EndOfTurn), new ManaCostsImpl("{U}{U}")); Effect effect = new DamageTargetEffect(1); ability.addEffect(effect); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); - + // When you control no Islands, sacrifice Marjhan. - this.addAbility(new MarjhanTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); } public Marjhan(final Marjhan card) { @@ -112,29 +112,3 @@ public class Marjhan extends CardImpl { return new Marjhan(this); } } - -class MarjhanTriggeredAbility extends StateTriggeredAbility { - - public MarjhanTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public MarjhanTriggeredAbility(final MarjhanTriggeredAbility ability) { - super(ability); - } - - @Override - public MarjhanTriggeredAbility copy() { - return new MarjhanTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java b/Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java index 3a3764fada9..783848eb3a4 100644 --- a/Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java +++ b/Mage.Sets/src/mage/sets/mirage/KukemssaSerpent.java @@ -30,7 +30,7 @@ package mage.sets.mirage; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.SacrificeTargetCost; @@ -44,13 +44,11 @@ import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetLandPermanent; @@ -59,7 +57,7 @@ import mage.target.common.TargetLandPermanent; * @author fireshoes */ public class KukemssaSerpent extends CardImpl { - + private static final FilterLandPermanent filterOpponentLand = new FilterLandPermanent("land an opponent controls"); private static final FilterControlledLandPermanent filterControlledLand = new FilterControlledLandPermanent("an Island"); @@ -76,16 +74,18 @@ public class KukemssaSerpent extends CardImpl { this.toughness = new MageInt(3); // Kukemssa Serpent can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + // {U}, Sacrifice an Island: Target land an opponent controls becomes an Island until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, "Island"), new ManaCostsImpl("{U}")); ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filterControlledLand, true))); ability.addTarget(new TargetLandPermanent(filterOpponentLand)); this.addAbility(ability); - + // When you control no Islands, sacrifice Kukemssa Serpent. - this.addAbility(new KukemssaSerpentTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); } public KukemssaSerpent(final KukemssaSerpent card) { @@ -97,29 +97,3 @@ public class KukemssaSerpent extends CardImpl { return new KukemssaSerpent(this); } } - -class KukemssaSerpentTriggeredAbility extends StateTriggeredAbility { - - public KukemssaSerpentTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public KukemssaSerpentTriggeredAbility(final KukemssaSerpentTriggeredAbility ability) { - super(ability); - } - - @Override - public KukemssaSerpentTriggeredAbility copy() { - return new KukemssaSerpentTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/nemesis/SneakyHomunculus.java b/Mage.Sets/src/mage/sets/nemesis/SneakyHomunculus.java index 35ab78e728f..f388d9cee91 100644 --- a/Mage.Sets/src/mage/sets/nemesis/SneakyHomunculus.java +++ b/Mage.Sets/src/mage/sets/nemesis/SneakyHomunculus.java @@ -30,14 +30,14 @@ package mage.sets.nemesis; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.effects.common.combat.CantBlockCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.Filter; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; @@ -49,6 +49,7 @@ import mage.filter.predicate.mageobject.PowerPredicate; public class SneakyHomunculus extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with power 2 or greater"); + static { filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 1)); } @@ -63,8 +64,12 @@ public class SneakyHomunculus extends CardImpl { this.toughness = new MageInt(1); // Sneaky Homunculus can't block or be blocked by creatures with power 2 or greater. - Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield)); - ability.addEffect(new CantBlockCreaturesSourceEffect(filter)); + Effect effect = new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield); + effect.setText("{this} can't block"); + Ability ability = new SimpleEvasionAbility(effect); + effect = new CantBlockCreaturesSourceEffect(filter); + effect.setText("or be blocked by creatures with power 2 or greater"); + ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/onslaught/ElvenRiders.java b/Mage.Sets/src/mage/sets/onslaught/ElvenRiders.java index adf8229110d..b9413277a4b 100644 --- a/Mage.Sets/src/mage/sets/onslaught/ElvenRiders.java +++ b/Mage.Sets/src/mage/sets/onslaught/ElvenRiders.java @@ -29,14 +29,13 @@ package mage.sets.onslaught; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; @@ -53,7 +52,7 @@ public class ElvenRiders extends CardImpl { static { filter.add(Predicates.not(Predicates.or(new SubtypePredicate("Wall"), new AbilityPredicate(FlyingAbility.class)))); } - + public ElvenRiders(UUID ownerId) { super(ownerId, 254, "Elven Riders", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); this.expansionSetCode = "ONS"; @@ -63,7 +62,7 @@ public class ElvenRiders extends CardImpl { this.toughness = new MageInt(3); // Elven Riders can't be blocked except by Walls and/or creatures with flying. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } public ElvenRiders(final ElvenRiders card) { diff --git a/Mage.Sets/src/mage/sets/planarchaos/BogSerpent.java b/Mage.Sets/src/mage/sets/planarchaos/BogSerpent.java index 6af2a29dded..ca1f6bdcf33 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/BogSerpent.java +++ b/Mage.Sets/src/mage/sets/planarchaos/BogSerpent.java @@ -29,7 +29,7 @@ package mage.sets.planarchaos; import java.util.UUID; import mage.MageInt; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; @@ -37,10 +37,8 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.events.GameEvent; /** * @@ -56,10 +54,12 @@ public class BogSerpent extends CardImpl { this.toughness = new MageInt(5); // Bog Serpent can't attack unless defending player controls a Swamp. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Swamp","a Swamp")))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Swamp", "a Swamp")))); + // When you control no Swamps, sacrifice Bog Serpent. - this.addAbility(new BogSerpentTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Swamp", "no Swamps"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); } public BogSerpent(final BogSerpent card) { @@ -71,35 +71,3 @@ public class BogSerpent extends CardImpl { return new BogSerpent(this); } } - -class BogSerpentTriggeredAbility extends StateTriggeredAbility { - - public static final FilterLandPermanent filter = new FilterLandPermanent("Swamp"); - - { - filter.add(new SubtypePredicate("Swamp")); - } - - public BogSerpentTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public BogSerpentTriggeredAbility(final BogSerpentTriggeredAbility ability) { - super(ability); - } - - @Override - public BogSerpentTriggeredAbility copy() { - return new BogSerpentTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no swamps, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ravnica/VindictiveMob.java b/Mage.Sets/src/mage/sets/ravnica/VindictiveMob.java index f2b57af28e7..06d5b1f531a 100644 --- a/Mage.Sets/src/mage/sets/ravnica/VindictiveMob.java +++ b/Mage.Sets/src/mage/sets/ravnica/VindictiveMob.java @@ -30,14 +30,13 @@ package mage.sets.ravnica; import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; @@ -52,7 +51,7 @@ public class VindictiveMob extends CardImpl { static { filter.add(new SubtypePredicate("Saproling")); } - + public VindictiveMob(UUID ownerId) { super(ownerId, 112, "Vindictive Mob", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); this.expansionSetCode = "RAV"; @@ -63,9 +62,9 @@ public class VindictiveMob extends CardImpl { // When Vindictive Mob enters the battlefield, sacrifice a creature. this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterCreaturePermanent(), 1, null))); - + // Vindictive Mob can't be blocked by Saprolings. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } public VindictiveMob(final VindictiveMob card) { diff --git a/Mage.Sets/src/mage/sets/scourge/TreetopScout.java b/Mage.Sets/src/mage/sets/scourge/TreetopScout.java index 200e3b941fe..94326c9140e 100644 --- a/Mage.Sets/src/mage/sets/scourge/TreetopScout.java +++ b/Mage.Sets/src/mage/sets/scourge/TreetopScout.java @@ -29,15 +29,13 @@ package mage.sets.scourge; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesAllEffect; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; @@ -64,9 +62,7 @@ public class TreetopScout extends CardImpl { this.toughness = new MageInt(1); // Treetop Scout can't be blocked except by creatures with flying. - this.addAbility(new SimpleStaticAbility( - Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(onlyFlyingCreatures, Duration.WhileOnBattlefield) - )); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(onlyFlyingCreatures, Duration.WhileOnBattlefield))); } public TreetopScout(final TreetopScout card) { diff --git a/Mage.Sets/src/mage/sets/shadowmoor/BarrentonCragtreads.java b/Mage.Sets/src/mage/sets/shadowmoor/BarrentonCragtreads.java index ee6dbb6cab3..ec7034d8362 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/BarrentonCragtreads.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/BarrentonCragtreads.java @@ -30,13 +30,12 @@ package mage.sets.shadowmoor; import java.util.UUID; import mage.MageInt; import mage.ObjectColor; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ColorPredicate; @@ -62,7 +61,7 @@ public class BarrentonCragtreads extends CardImpl { this.toughness = new MageInt(3); // Barrenton Cragtreads can't be blocked by red creatures. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java b/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java index 0ee0aabd1b4..fc6cd8c6cef 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java @@ -64,7 +64,7 @@ public class LureboundScarecrow extends CardImpl { // As Lurebound Scarecrow enters the battlefield, choose a color. this.addAbility(new AsEntersBattlefieldAbility(new LureboundScarecrowChooseColorEffect())); - + // When you control no permanents of the chosen color, sacrifice Lurebound Scarecrow. this.addAbility(new LureboundScarecrowTriggeredAbility()); } @@ -80,7 +80,7 @@ public class LureboundScarecrow extends CardImpl { } class LureboundScarecrowChooseColorEffect extends OneShotEffect { - + public LureboundScarecrowChooseColorEffect() { super(Outcome.BoostCreature); staticText = "choose a color"; @@ -110,11 +110,11 @@ class LureboundScarecrowChooseColorEffect extends OneShotEffect { public LureboundScarecrowChooseColorEffect copy() { return new LureboundScarecrowChooseColorEffect(this); } - + } class LureboundScarecrowTriggeredAbility extends StateTriggeredAbility { - + private static final String staticText = "When you control no permanents of the chosen color, sacrifice {this}."; public LureboundScarecrowTriggeredAbility() { @@ -127,16 +127,17 @@ class LureboundScarecrowTriggeredAbility extends StateTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE || event.getType() == GameEvent.EventType.LOST_CONTROL + if (event.getType() == GameEvent.EventType.ZONE_CHANGE || event.getType() == GameEvent.EventType.LOST_CONTROL || event.getType() == GameEvent.EventType.COLOR_CHANGED || event.getType() == GameEvent.EventType.SPELL_CAST) { Card card = game.getCard(this.getSourceId()); if (card != null) { ObjectColor color = (ObjectColor) game.getState().getValue(card.getId() + "_color"); if (color != null) { - for (Permanent perm: game.getBattlefield().getAllActivePermanents(controllerId)) { - if (perm.getColor(game).contains(color)) + for (Permanent perm : game.getBattlefield().getAllActivePermanents(controllerId)) { + if (perm.getColor(game).contains(color)) { return false; + } } return true; } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/WanderbrineRootcutters.java b/Mage.Sets/src/mage/sets/shadowmoor/WanderbrineRootcutters.java index 7752b605606..03135e41add 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/WanderbrineRootcutters.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/WanderbrineRootcutters.java @@ -30,13 +30,12 @@ package mage.sets.shadowmoor; import java.util.UUID; import mage.MageInt; import mage.ObjectColor; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ColorPredicate; @@ -45,9 +44,9 @@ import mage.filter.predicate.mageobject.ColorPredicate; * @author jeffwadsworth */ public class WanderbrineRootcutters extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("green creatures"); - + static { filter.add(new ColorPredicate(ObjectColor.GREEN)); } @@ -61,8 +60,8 @@ public class WanderbrineRootcutters extends CardImpl { this.toughness = new MageInt(3); // Wanderbrine Rootcutters can't be blocked by green creatures. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); - + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + } public WanderbrineRootcutters(final WanderbrineRootcutters card) { diff --git a/Mage.Sets/src/mage/sets/tempestremastered/EndangeredArmodon.java b/Mage.Sets/src/mage/sets/tempestremastered/EndangeredArmodon.java index 3aac6873f3d..e246e942bba 100644 --- a/Mage.Sets/src/mage/sets/tempestremastered/EndangeredArmodon.java +++ b/Mage.Sets/src/mage/sets/tempestremastered/EndangeredArmodon.java @@ -29,17 +29,14 @@ package mage.sets.tempestremastered; import java.util.UUID; import mage.MageInt; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.Zone; -import mage.filter.Filter.ComparisonType; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ToughnessPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; /** * @@ -47,6 +44,12 @@ import mage.game.events.GameEvent; */ public class EndangeredArmodon extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 2 or less"); + + static { + filter.add(new ToughnessPredicate(Filter.ComparisonType.LessThan, 3)); + } + public EndangeredArmodon(UUID ownerId) { super(ownerId, 171, "Endangered Armodon", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); this.expansionSetCode = "TPR"; @@ -55,7 +58,9 @@ public class EndangeredArmodon extends CardImpl { this.toughness = new MageInt(5); // When you control a creature with toughness 2 or less, sacrifice Endangered Armodon. - this.addAbility(new EndangeredArmodonStateTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + filter, Filter.ComparisonType.GreaterThan, 0, + new SacrificeSourceEffect())); } public EndangeredArmodon(final EndangeredArmodon card) { @@ -67,34 +72,3 @@ public class EndangeredArmodon extends CardImpl { return new EndangeredArmodon(this); } } - -class EndangeredArmodonStateTriggeredAbility extends StateTriggeredAbility { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature with toughness 2 or less"); - static { - filter.add(new ToughnessPredicate(ComparisonType.LessThan, 3)); - } - - EndangeredArmodonStateTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - EndangeredArmodonStateTriggeredAbility(final EndangeredArmodonStateTriggeredAbility ability) { - super(ability); - } - - @Override - public EndangeredArmodonStateTriggeredAbility copy() { - return new EndangeredArmodonStateTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return game.getBattlefield().contains(filter, this.getControllerId(), game, 1); - } - - @Override - public String getRule() { - return "When you control a creature with toughness 2 or less, sacrifice {this}."; - } -} diff --git a/Mage.Sets/src/mage/sets/thedark/BogRats.java b/Mage.Sets/src/mage/sets/thedark/BogRats.java index 7522c2f1473..987cc41538b 100644 --- a/Mage.Sets/src/mage/sets/thedark/BogRats.java +++ b/Mage.Sets/src/mage/sets/thedark/BogRats.java @@ -29,13 +29,12 @@ package mage.sets.thedark; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; @@ -50,7 +49,7 @@ public class BogRats extends CardImpl { static { filter.add(new SubtypePredicate("Wall")); } - + public BogRats(UUID ownerId) { super(ownerId, 4, "Bog Rats", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}"); this.expansionSetCode = "DRK"; @@ -60,7 +59,7 @@ public class BogRats extends CardImpl { this.toughness = new MageInt(1); // Bog Rats can't be blocked by Walls. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); } public BogRats(final BogRats card) { diff --git a/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java b/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java index 2fa81356036..555da66687d 100644 --- a/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java +++ b/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; @@ -77,7 +77,7 @@ public class DaxosOfMeletis extends CardImpl { this.toughness = new MageInt(2); // Daxos of Meletis can't be blocked by creatures with power 3 or greater. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); // Whenever Daxos of Meletis deals combat damage to a player, exile the top card of that player's library. You gain life equal to that card's converted mana cost. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DaxosOfMeletisEffect(), false, true)); diff --git a/Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java b/Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java index 1addde37c93..298b8f3c143 100644 --- a/Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java +++ b/Mage.Sets/src/mage/sets/timespiral/SlipstreamSerpent.java @@ -29,7 +29,7 @@ package mage.sets.timespiral; import java.util.UUID; import mage.MageInt; -import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.SacrificeSourceEffect; @@ -39,10 +39,8 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; /** * @@ -58,11 +56,13 @@ public class SlipstreamSerpent extends CardImpl { this.toughness = new MageInt(6); // Slipstream Serpent can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + // When you control no Islands, sacrifice Slipstream Serpent. - this.addAbility(new SlipstreamSerpentTriggeredAbility()); - + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + // Morph {5}{U} this.addAbility(new MorphAbility(this, new ManaCostsImpl("{5}{U}"))); } @@ -76,29 +76,3 @@ public class SlipstreamSerpent extends CardImpl { return new SlipstreamSerpent(this); } } - -class SlipstreamSerpentTriggeredAbility extends StateTriggeredAbility { - - public SlipstreamSerpentTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public SlipstreamSerpentTriggeredAbility(final SlipstreamSerpentTriggeredAbility ability) { - super(ability); - } - - @Override - public SlipstreamSerpentTriggeredAbility copy() { - return new SlipstreamSerpentTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzassaga/TreetopRangers.java b/Mage.Sets/src/mage/sets/urzassaga/TreetopRangers.java index f9d06be1e4e..9f14c6abba6 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/TreetopRangers.java +++ b/Mage.Sets/src/mage/sets/urzassaga/TreetopRangers.java @@ -29,14 +29,13 @@ package mage.sets.urzassaga; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; @@ -62,9 +61,7 @@ public class TreetopRangers extends CardImpl { this.toughness = new MageInt(2); // Treetop Rangers can't be blocked except by creatures with flying. - this.addAbility(new SimpleStaticAbility( - Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(onlyFlyingCreatures, Duration.WhileOnBattlefield) - )); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(onlyFlyingCreatures, Duration.WhileOnBattlefield))); } public TreetopRangers(final TreetopRangers card) { diff --git a/Mage.Sets/src/mage/sets/vintagemasters/CityInABottle.java b/Mage.Sets/src/mage/sets/vintagemasters/CityInABottle.java index e1439fae1f8..abb456a4e2a 100644 --- a/Mage.Sets/src/mage/sets/vintagemasters/CityInABottle.java +++ b/Mage.Sets/src/mage/sets/vintagemasters/CityInABottle.java @@ -27,6 +27,8 @@ */ package mage.sets.vintagemasters; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.StateTriggeredAbility; @@ -49,14 +51,13 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; +import static mage.sets.vintagemasters.CityInABottle.getArabianNightsNamePredicates; /** * * @author emerald000 */ public class CityInABottle extends CardImpl { - - private static final FilterCard filterCard = new FilterCard("cards originally printed in the Arabian Nights expansion"); public CityInABottle(UUID ownerId) { super(ownerId, 265, "City in a Bottle", Rarity.MYTHIC, new CardType[]{CardType.ARTIFACT}, "{2}"); @@ -64,7 +65,7 @@ public class CityInABottle extends CardImpl { // Whenever a nontoken permanent originally printed in the Arabian Nights expansion other than City in a Bottle is on the battlefield, its controller sacrifices it. this.addAbility(new CityInABottleStateTriggeredAbility()); - + // Players can't play cards originally printed in the Arabian Nights expansion. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CityInABottleCantPlayEffect())); } @@ -77,92 +78,99 @@ public class CityInABottle extends CardImpl { public CityInABottle copy() { return new CityInABottle(this); } + + static public List getArabianNightsNamePredicates() { + List namePredicatesArabianNights = new ArrayList<>(); + namePredicatesArabianNights.add(new NamePredicate("Abu Ja'far")); + namePredicatesArabianNights.add(new NamePredicate("Aladdin")); + namePredicatesArabianNights.add(new NamePredicate("Aladdin's Lamp")); + namePredicatesArabianNights.add(new NamePredicate("Aladdin's Ring")); + namePredicatesArabianNights.add(new NamePredicate("Ali Baba")); + namePredicatesArabianNights.add(new NamePredicate("Ali from Cairo")); + namePredicatesArabianNights.add(new NamePredicate("Army of Allah")); + namePredicatesArabianNights.add(new NamePredicate("Bazaar of Baghdad")); + namePredicatesArabianNights.add(new NamePredicate("Bird Maiden")); + namePredicatesArabianNights.add(new NamePredicate("Bottle of Suleiman")); + namePredicatesArabianNights.add(new NamePredicate("Brass Man")); + namePredicatesArabianNights.add(new NamePredicate("Camel")); + namePredicatesArabianNights.add(new NamePredicate("City of Brass")); + namePredicatesArabianNights.add(new NamePredicate("Cuombajj Witches")); + namePredicatesArabianNights.add(new NamePredicate("Cyclone")); + namePredicatesArabianNights.add(new NamePredicate("Dancing Scimitar")); + namePredicatesArabianNights.add(new NamePredicate("Dandân")); + namePredicatesArabianNights.add(new NamePredicate("Desert")); + namePredicatesArabianNights.add(new NamePredicate("Desert Nomads")); + namePredicatesArabianNights.add(new NamePredicate("Desert Twister")); + namePredicatesArabianNights.add(new NamePredicate("Diamond Valley")); + namePredicatesArabianNights.add(new NamePredicate("Drop of Honey")); + namePredicatesArabianNights.add(new NamePredicate("Ebony Horse")); + namePredicatesArabianNights.add(new NamePredicate("El-Hajjâj")); + namePredicatesArabianNights.add(new NamePredicate("Elephant Graveyard")); + namePredicatesArabianNights.add(new NamePredicate("Erg Raiders")); + namePredicatesArabianNights.add(new NamePredicate("Erhnam Djinn")); + namePredicatesArabianNights.add(new NamePredicate("Eye for an Eye")); + namePredicatesArabianNights.add(new NamePredicate("Fishliver Oil")); + namePredicatesArabianNights.add(new NamePredicate("Flying Carpet")); + namePredicatesArabianNights.add(new NamePredicate("Flying Men")); + namePredicatesArabianNights.add(new NamePredicate("Ghazbán Ogre")); + namePredicatesArabianNights.add(new NamePredicate("Giant Tortoise")); + namePredicatesArabianNights.add(new NamePredicate("Guardian Beast")); + namePredicatesArabianNights.add(new NamePredicate("Hasran Ogress")); + namePredicatesArabianNights.add(new NamePredicate("Hurr Jackal")); + namePredicatesArabianNights.add(new NamePredicate("Ifh-Bíff Efreet")); + namePredicatesArabianNights.add(new NamePredicate("Island Fish Jasconius")); + namePredicatesArabianNights.add(new NamePredicate("Island of Wak-Wak")); + namePredicatesArabianNights.add(new NamePredicate("Jandor's Ring")); + namePredicatesArabianNights.add(new NamePredicate("Jandor's Saddlebags")); + namePredicatesArabianNights.add(new NamePredicate("Jeweled Bird")); + namePredicatesArabianNights.add(new NamePredicate("Jihad")); + namePredicatesArabianNights.add(new NamePredicate("Junún Efreet")); + namePredicatesArabianNights.add(new NamePredicate("Juzám Djinn")); + namePredicatesArabianNights.add(new NamePredicate("Khabál Ghoul")); + namePredicatesArabianNights.add(new NamePredicate("King Suleiman")); + namePredicatesArabianNights.add(new NamePredicate("Kird Ape")); + namePredicatesArabianNights.add(new NamePredicate("Library of Alexandria")); + namePredicatesArabianNights.add(new NamePredicate("Magnetic Mountain")); + namePredicatesArabianNights.add(new NamePredicate("Merchant Ship")); + namePredicatesArabianNights.add(new NamePredicate("Metamorphosis")); + namePredicatesArabianNights.add(new NamePredicate("Mijae Djinn")); + namePredicatesArabianNights.add(new NamePredicate("Moorish Cavalry")); + namePredicatesArabianNights.add(new NamePredicate("Nafs Asp")); + namePredicatesArabianNights.add(new NamePredicate("Oasis")); + namePredicatesArabianNights.add(new NamePredicate("Old Man of the Sea")); + namePredicatesArabianNights.add(new NamePredicate("Oubliette")); + namePredicatesArabianNights.add(new NamePredicate("Piety")); + namePredicatesArabianNights.add(new NamePredicate("Pyramids")); + namePredicatesArabianNights.add(new NamePredicate("Repentant Blacksmith")); + namePredicatesArabianNights.add(new NamePredicate("Ring of Ma'rûf")); + namePredicatesArabianNights.add(new NamePredicate("Rukh Egg")); + namePredicatesArabianNights.add(new NamePredicate("Sandals of Abdallah")); + namePredicatesArabianNights.add(new NamePredicate("Sandstorm")); + namePredicatesArabianNights.add(new NamePredicate("Serendib Djinn")); + namePredicatesArabianNights.add(new NamePredicate("Serendib Efreet")); + namePredicatesArabianNights.add(new NamePredicate("Shahrazad")); + namePredicatesArabianNights.add(new NamePredicate("Sindbad")); + namePredicatesArabianNights.add(new NamePredicate("Singing Tree")); + namePredicatesArabianNights.add(new NamePredicate("Sorceress Queen")); + namePredicatesArabianNights.add(new NamePredicate("Stone-Throwing Devils")); + namePredicatesArabianNights.add(new NamePredicate("Unstable Mutation")); + namePredicatesArabianNights.add(new NamePredicate("War Elephant")); + namePredicatesArabianNights.add(new NamePredicate("Wyluli Wolf")); + namePredicatesArabianNights.add(new NamePredicate("Ydwen Efreet")); + return namePredicatesArabianNights; + } } class CityInABottleStateTriggeredAbility extends StateTriggeredAbility { - + private static final FilterPermanent filter = new FilterPermanent("a nontoken permanent originally printed in the Arabian Nights expansion other than City in a Bottle"); + static { filter.add(Predicates.not(new TokenPredicate())); - filter.add(Predicates.or( - new NamePredicate("Abu Ja'far"), - new NamePredicate("Aladdin"), - new NamePredicate("Aladdin's Lamp"), - new NamePredicate("Aladdin's Ring"), - new NamePredicate("Ali Baba"), - new NamePredicate("Ali from Cairo"), - new NamePredicate("Army of Allah"), - new NamePredicate("Bazaar of Baghdad"), - new NamePredicate("Bird Maiden"), - new NamePredicate("Bottle of Suleiman"), - new NamePredicate("Brass Man"), - new NamePredicate("Camel"), - new NamePredicate("City of Brass"), - new NamePredicate("Cuombajj Witches"), - new NamePredicate("Cyclone"), - new NamePredicate("Dancing Scimitar"), - new NamePredicate("Dandân"), - new NamePredicate("Desert"), - new NamePredicate("Desert Nomads"), - new NamePredicate("Desert Twister"), - new NamePredicate("Diamond Valley"), - new NamePredicate("Drop of Honey"), - new NamePredicate("Ebony Horse"), - new NamePredicate("El-Hajjâj"), - new NamePredicate("Elephant Graveyard"), - new NamePredicate("Erg Raiders"), - new NamePredicate("Erhnam Djinn"), - new NamePredicate("Eye for an Eye"), - new NamePredicate("Fishliver Oil"), - new NamePredicate("Flying Carpet"), - new NamePredicate("Flying Men"), - new NamePredicate("Ghazbán Ogre"), - new NamePredicate("Giant Tortoise"), - new NamePredicate("Guardian Beast"), - new NamePredicate("Hasran Ogress"), - new NamePredicate("Hurr Jackal"), - new NamePredicate("Ifh-Bíff Efreet"), - new NamePredicate("Island Fish Jasconius"), - new NamePredicate("Island of Wak-Wak"), - new NamePredicate("Jandor's Ring"), - new NamePredicate("Jandor's Saddlebags"), - new NamePredicate("Jeweled Bird"), - new NamePredicate("Jihad"), - new NamePredicate("Junún Efreet"), - new NamePredicate("Juzám Djinn"), - new NamePredicate("Khabál Ghoul"), - new NamePredicate("King Suleiman"), - new NamePredicate("Kird Ape"), - new NamePredicate("Library of Alexandria"), - new NamePredicate("Magnetic Mountain"), - new NamePredicate("Merchant Ship"), - new NamePredicate("Metamorphosis"), - new NamePredicate("Mijae Djinn"), - new NamePredicate("Moorish Cavalry"), - new NamePredicate("Nafs Asp"), - new NamePredicate("Oasis"), - new NamePredicate("Old Man of the Sea"), - new NamePredicate("Oubliette"), - new NamePredicate("Piety"), - new NamePredicate("Pyramids"), - new NamePredicate("Repentant Blacksmith"), - new NamePredicate("Ring of Ma'rûf"), - new NamePredicate("Rukh Egg"), - new NamePredicate("Sandals of Abdallah"), - new NamePredicate("Sandstorm"), - new NamePredicate("Serendib Djinn"), - new NamePredicate("Serendib Efreet"), - new NamePredicate("Shahrazad"), - new NamePredicate("Sindbad"), - new NamePredicate("Singing Tree"), - new NamePredicate("Sorceress Queen"), - new NamePredicate("Stone-Throwing Devils"), - new NamePredicate("Unstable Mutation"), - new NamePredicate("War Elephant"), - new NamePredicate("Wyluli Wolf"), - new NamePredicate("Ydwen Efreet"))); + filter.add(Predicates.or(getArabianNightsNamePredicates())); + } - + CityInABottleStateTriggeredAbility() { super(Zone.BATTLEFIELD, new CityInABottleSacrificeEffect()); } @@ -188,103 +196,28 @@ class CityInABottleStateTriggeredAbility extends StateTriggeredAbility { } class CityInABottleSacrificeEffect extends OneShotEffect { - + private static final FilterPermanent filter = new FilterPermanent("a nontoken permanent originally printed in the Arabian Nights expansion other than City in a Bottle"); + static { filter.add(Predicates.not(new TokenPredicate())); - filter.add(Predicates.or( - new NamePredicate("Abu Ja'far"), - new NamePredicate("Aladdin"), - new NamePredicate("Aladdin's Lamp"), - new NamePredicate("Aladdin's Ring"), - new NamePredicate("Ali Baba"), - new NamePredicate("Ali from Cairo"), - new NamePredicate("Army of Allah"), - new NamePredicate("Bazaar of Baghdad"), - new NamePredicate("Bird Maiden"), - new NamePredicate("Bottle of Suleiman"), - new NamePredicate("Brass Man"), - new NamePredicate("Camel"), - new NamePredicate("City of Brass"), - new NamePredicate("Cuombajj Witches"), - new NamePredicate("Cyclone"), - new NamePredicate("Dancing Scimitar"), - new NamePredicate("Dandân"), - new NamePredicate("Desert"), - new NamePredicate("Desert Nomads"), - new NamePredicate("Desert Twister"), - new NamePredicate("Diamond Valley"), - new NamePredicate("Drop of Honey"), - new NamePredicate("Ebony Horse"), - new NamePredicate("El-Hajjâj"), - new NamePredicate("Elephant Graveyard"), - new NamePredicate("Erg Raiders"), - new NamePredicate("Erhnam Djinn"), - new NamePredicate("Eye for an Eye"), - new NamePredicate("Fishliver Oil"), - new NamePredicate("Flying Carpet"), - new NamePredicate("Flying Men"), - new NamePredicate("Ghazbán Ogre"), - new NamePredicate("Giant Tortoise"), - new NamePredicate("Guardian Beast"), - new NamePredicate("Hasran Ogress"), - new NamePredicate("Hurr Jackal"), - new NamePredicate("Ifh-Bíff Efreet"), - new NamePredicate("Island Fish Jasconius"), - new NamePredicate("Island of Wak-Wak"), - new NamePredicate("Jandor's Ring"), - new NamePredicate("Jandor's Saddlebags"), - new NamePredicate("Jeweled Bird"), - new NamePredicate("Jihad"), - new NamePredicate("Junún Efreet"), - new NamePredicate("Juzám Djinn"), - new NamePredicate("Khabál Ghoul"), - new NamePredicate("King Suleiman"), - new NamePredicate("Kird Ape"), - new NamePredicate("Library of Alexandria"), - new NamePredicate("Magnetic Mountain"), - new NamePredicate("Merchant Ship"), - new NamePredicate("Metamorphosis"), - new NamePredicate("Mijae Djinn"), - new NamePredicate("Moorish Cavalry"), - new NamePredicate("Nafs Asp"), - new NamePredicate("Oasis"), - new NamePredicate("Old Man of the Sea"), - new NamePredicate("Oubliette"), - new NamePredicate("Piety"), - new NamePredicate("Pyramids"), - new NamePredicate("Repentant Blacksmith"), - new NamePredicate("Ring of Ma'rûf"), - new NamePredicate("Rukh Egg"), - new NamePredicate("Sandals of Abdallah"), - new NamePredicate("Sandstorm"), - new NamePredicate("Serendib Djinn"), - new NamePredicate("Serendib Efreet"), - new NamePredicate("Shahrazad"), - new NamePredicate("Sindbad"), - new NamePredicate("Singing Tree"), - new NamePredicate("Sorceress Queen"), - new NamePredicate("Stone-Throwing Devils"), - new NamePredicate("Unstable Mutation"), - new NamePredicate("War Elephant"), - new NamePredicate("Wyluli Wolf"), - new NamePredicate("Ydwen Efreet"))); + filter.add(Predicates.or(getArabianNightsNamePredicates())); } - + CityInABottleSacrificeEffect() { super(Outcome.Sacrifice); this.staticText = "its controller sacrifices it"; } - + CityInABottleSacrificeEffect(final CityInABottleSacrificeEffect effect) { super(effect); } - + @Override public CityInABottleSacrificeEffect copy() { return new CityInABottleSacrificeEffect(this); } - + @Override public boolean apply(Game game, Ability source) { for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { @@ -295,87 +228,11 @@ class CityInABottleSacrificeEffect extends OneShotEffect { } class CityInABottleCantPlayEffect extends ContinuousRuleModifyingEffectImpl { - + private static final FilterCard filter = new FilterCard("cards originally printed in the Arabian Nights expansion"); + static { - filter.add(Predicates.or( - new NamePredicate("Abu Ja'far"), - new NamePredicate("Aladdin"), - new NamePredicate("Aladdin's Lamp"), - new NamePredicate("Aladdin's Ring"), - new NamePredicate("Ali Baba"), - new NamePredicate("Ali from Cairo"), - new NamePredicate("Army of Allah"), - new NamePredicate("Bazaar of Baghdad"), - new NamePredicate("Bird Maiden"), - new NamePredicate("Bottle of Suleiman"), - new NamePredicate("Brass Man"), - new NamePredicate("Camel"), - new NamePredicate("City in a Bottle"), - new NamePredicate("City of Brass"), - new NamePredicate("Cuombajj Witches"), - new NamePredicate("Cyclone"), - new NamePredicate("Dancing Scimitar"), - new NamePredicate("Dandân"), - new NamePredicate("Desert"), - new NamePredicate("Desert Nomads"), - new NamePredicate("Desert Twister"), - new NamePredicate("Diamond Valley"), - new NamePredicate("Drop of Honey"), - new NamePredicate("Ebony Horse"), - new NamePredicate("El-Hajjâj"), - new NamePredicate("Elephant Graveyard"), - new NamePredicate("Erg Raiders"), - new NamePredicate("Erhnam Djinn"), - new NamePredicate("Eye for an Eye"), - new NamePredicate("Fishliver Oil"), - new NamePredicate("Flying Carpet"), - new NamePredicate("Flying Men"), - new NamePredicate("Ghazbán Ogre"), - new NamePredicate("Giant Tortoise"), - new NamePredicate("Guardian Beast"), - new NamePredicate("Hasran Ogress"), - new NamePredicate("Hurr Jackal"), - new NamePredicate("Ifh-Bíff Efreet"), - new NamePredicate("Island Fish Jasconius"), - new NamePredicate("Island of Wak-Wak"), - new NamePredicate("Jandor's Ring"), - new NamePredicate("Jandor's Saddlebags"), - new NamePredicate("Jeweled Bird"), - new NamePredicate("Jihad"), - new NamePredicate("Junún Efreet"), - new NamePredicate("Juzám Djinn"), - new NamePredicate("Khabál Ghoul"), - new NamePredicate("King Suleiman"), - new NamePredicate("Kird Ape"), - new NamePredicate("Library of Alexandria"), - new NamePredicate("Magnetic Mountain"), - new NamePredicate("Merchant Ship"), - new NamePredicate("Metamorphosis"), - new NamePredicate("Mijae Djinn"), - new NamePredicate("Moorish Cavalry"), - new NamePredicate("Nafs Asp"), - new NamePredicate("Oasis"), - new NamePredicate("Old Man of the Sea"), - new NamePredicate("Oubliette"), - new NamePredicate("Piety"), - new NamePredicate("Pyramids"), - new NamePredicate("Repentant Blacksmith"), - new NamePredicate("Ring of Ma'rûf"), - new NamePredicate("Rukh Egg"), - new NamePredicate("Sandals of Abdallah"), - new NamePredicate("Sandstorm"), - new NamePredicate("Serendib Djinn"), - new NamePredicate("Serendib Efreet"), - new NamePredicate("Shahrazad"), - new NamePredicate("Sindbad"), - new NamePredicate("Singing Tree"), - new NamePredicate("Sorceress Queen"), - new NamePredicate("Stone-Throwing Devils"), - new NamePredicate("Unstable Mutation"), - new NamePredicate("War Elephant"), - new NamePredicate("Wyluli Wolf"), - new NamePredicate("Ydwen Efreet"))); + filter.add(Predicates.or(getArabianNightsNamePredicates())); } CityInABottleCantPlayEffect() { @@ -401,12 +258,12 @@ class CityInABottleCantPlayEffect extends ContinuousRuleModifyingEffectImpl { public String getInfoMessage(Ability source, GameEvent event, Game game) { return "You can't play cards originally printed in the Arabian Nights expansion"; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.PLAY_LAND || event.getType() == EventType.CAST_SPELL; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { Card card = game.getCard(event.getSourceId()); diff --git a/Mage.Sets/src/mage/sets/weatherlight/MantaRay.java b/Mage.Sets/src/mage/sets/weatherlight/MantaRay.java index 4c3235fbed6..8a649c14744 100644 --- a/Mage.Sets/src/mage/sets/weatherlight/MantaRay.java +++ b/Mage.Sets/src/mage/sets/weatherlight/MantaRay.java @@ -29,23 +29,23 @@ package mage.sets.weatherlight; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.StateTriggeredAbility; +import mage.ObjectColor; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.RestrictionEffect; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.permanent.ControllerControlsIslandPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; /** * @@ -53,6 +53,12 @@ import mage.game.permanent.Permanent; */ public class MantaRay extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("except by blue creatures"); + + static { + filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLUE))); + } + public MantaRay(UUID ownerId) { super(ownerId, 42, "Manta Ray", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); this.expansionSetCode = "WTH"; @@ -61,13 +67,16 @@ public class MantaRay extends CardImpl { this.toughness = new MageInt(3); // Manta Ray can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + // Manta Ray can't be blocked except by blue creatures. - this.addAbility(MantaRayAbility.getInstance()); - + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + // When you control no Islands, sacrifice Manta Ray. - this.addAbility(new MantaRayTriggeredAbility()); + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + } public MantaRay(final MantaRay card) { @@ -79,87 +88,3 @@ public class MantaRay extends CardImpl { return new MantaRay(this); } } - -class MantaRayTriggeredAbility extends StateTriggeredAbility { - - public MantaRayTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - } - - public MantaRayTriggeredAbility(final MantaRayTriggeredAbility ability) { - super(ability); - } - - @Override - public MantaRayTriggeredAbility copy() { - return new MantaRayTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return (game.getBattlefield().countAll(ControllerControlsIslandPredicate.filter, controllerId, game) == 0); - } - - @Override - public String getRule() { - return "When you control no islands, sacrifice {this}."; - } -} - -class MantaRayAbility extends EvasionAbility { - - private static MantaRayAbility instance; - - public static MantaRayAbility getInstance() { - if (instance == null) { - instance = new MantaRayAbility(); - } - return instance; - } - - private MantaRayAbility() { - this.addEffect(new MantaRayEffect()); - } - - @Override - public String getRule() { - return "{this} can't be blocked except by blue creatures."; - } - - @Override - public MantaRayAbility copy() { - return getInstance(); - } -} - -class MantaRayEffect extends RestrictionEffect { - - public MantaRayEffect() { - super(Duration.WhileOnBattlefield); - } - - public MantaRayEffect(final MantaRayEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getAbilities().containsKey(MantaRayAbility.getInstance().getId())) { - return true; - } - return false; - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (blocker.getColor(game).isBlue()) { - return true; - } - return false; - } - - @Override - public MantaRayEffect copy() { - return new MantaRayEffect(this); - } -} \ No newline at end of file diff --git a/Mage/src/mage/abilities/common/ControlsPermanentsControllerTriggeredAbility.java b/Mage/src/mage/abilities/common/ControlsPermanentsControllerTriggeredAbility.java new file mode 100644 index 00000000000..56fb65590e8 --- /dev/null +++ b/Mage/src/mage/abilities/common/ControlsPermanentsControllerTriggeredAbility.java @@ -0,0 +1,96 @@ +/* + * 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.abilities.common; + +import mage.abilities.StateTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.filter.Filter.ComparisonType; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * State triggered ability that triggers if the ability controller controlls the + * defined number of permanents. + * + * @author LevelX2 + */ +public class ControlsPermanentsControllerTriggeredAbility extends StateTriggeredAbility { + + protected final FilterPermanent filter; + protected final ComparisonType type; + protected final int value; + + public ControlsPermanentsControllerTriggeredAbility(FilterPermanent filter, ComparisonType type, int value, Effect effect) { + super(Zone.BATTLEFIELD, effect); + this.filter = filter; + this.value = value; + this.type = type; + } + + public ControlsPermanentsControllerTriggeredAbility(final ControlsPermanentsControllerTriggeredAbility ability) { + super(ability); + this.filter = ability.filter; + this.type = ability.type; + this.value = ability.value; + } + + @Override + public ControlsPermanentsControllerTriggeredAbility copy() { + return new ControlsPermanentsControllerTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + int inputValue = game.getBattlefield().countAll(filter, getControllerId(), game); + switch (type) { + case Equal: + if (inputValue != value) { + return false; + } + break; + case GreaterThan: + if (inputValue <= value) { + return false; + } + break; + case LessThan: + if (inputValue >= value) { + return false; + } + break; + } + return true; + } + + @Override + public String getRule() { + return "When you control " + filter.getMessage() + ", " + super.getRule(); + } +} From d8c23071538b5305a1d4c2d8aa348f83c60ff681 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 21 Jul 2015 15:21:35 +0200 Subject: [PATCH 130/375] * Omniscience - Fixed that by Omniscience playable cards were no longer marked as playable. --- Mage.Sets/src/mage/sets/magic2013/Omniscience.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/magic2013/Omniscience.java b/Mage.Sets/src/mage/sets/magic2013/Omniscience.java index 1b2f082a670..155d366fce3 100644 --- a/Mage.Sets/src/mage/sets/magic2013/Omniscience.java +++ b/Mage.Sets/src/mage/sets/magic2013/Omniscience.java @@ -122,10 +122,14 @@ class IsBeingCastFromHandCondition implements Condition { UUID splitCardId = ((Card) object).getMainCard().getId(); object = game.getObject(splitCardId); } - if (object instanceof Spell) { + if (object instanceof Spell) { // needed to check if it can be cast by alternate cost Spell spell = (Spell) object; return spell.getFromZone() == Zone.HAND; } + if (object instanceof Card) { // needed for the check what's playable + Card card = (Card) object; + return game.getPlayer(card.getOwnerId()).getHand().get(card.getId(), game) != null; + } return false; } From c82a6c88cd56c9fe4f48bcb99bbb13a251f46775 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 21 Jul 2015 09:54:36 -0500 Subject: [PATCH 131/375] Reworked Muzzio and Nessian Game Warden to use player.putCardsOnBottomOfLibrary. Reworked Extract from Dark to use player.putOntoBattlefieldWithInfo and removed wrongly used Haste. Fixed that Firebrand Ranger wrongly put the land into play tapped. Added Avatar of Slaughter. --- .../sets/commander/AvatarOfSlaughter.java | 76 +++++ .../sets/conspiracy/ExtractFromDarkness.java | 13 +- .../conspiracy/MuzzioVisionaryArchitect.java | 17 +- .../mage/sets/invasion/FirebrandRanger.java | 9 +- .../journeyintonyx/NessianGameWarden.java | 287 +++++++++--------- Utils/mtg-cards-data.txt | 4 +- 6 files changed, 218 insertions(+), 188 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java diff --git a/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java new file mode 100644 index 00000000000..bfe50914d20 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java @@ -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.commander; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class AvatarOfSlaughter extends CardImpl { + + public AvatarOfSlaughter(UUID ownerId) { + super(ownerId, 111, "Avatar of Slaughter", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{R}{R}"); + this.expansionSetCode = "CMD"; + this.subtype.add("Avatar"); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // All creatures have double strike and attack each turn if able. + Effect effect = new GainAbilityAllEffect(DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield); + effect.setText("All creatures have double strike"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures")); + effect.setText("and attack each turn if able"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public AvatarOfSlaughter(final AvatarOfSlaughter card) { + super(card); + } + + @Override + public AvatarOfSlaughter copy() { + return new AvatarOfSlaughter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java b/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java index 0af8c57cf18..9b30e45ef2c 100644 --- a/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java +++ b/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java @@ -29,14 +29,10 @@ package mage.sets.conspiracy; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; -import mage.abilities.keyword.HasteAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; @@ -45,7 +41,6 @@ import mage.game.Game; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetpointer.FixedTarget; /** * @@ -126,13 +121,7 @@ class ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect extends OneShotE if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && player.chooseTarget(outcome, target, source, game)) { Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - if (card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId())) { - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); - } - } + player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId()); } return true; } diff --git a/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java b/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java index 195d592eae5..71a562bab0f 100644 --- a/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java +++ b/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java @@ -43,7 +43,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.FilterCard; import mage.filter.common.FilterArtifactCard; import mage.filter.common.FilterArtifactPermanent; import mage.game.Game; @@ -139,21 +138,7 @@ class MuzzioVisionaryArchitectEffect extends OneShotEffect { } } - - TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { - player.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } + player.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java b/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java index 0f293697d6e..17e16b89c30 100644 --- a/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java +++ b/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java @@ -41,12 +41,10 @@ import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.common.FilterLandCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SupertypePredicate; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInHand; @@ -82,7 +80,7 @@ public class FirebrandRanger extends CardImpl { class PutLandOnBattlefieldEffect extends OneShotEffect { - private static final FilterCard filter = new FilterCard("card other than a basic land card"); + private static final FilterCard filter = new FilterCard("basic land card"); static { filter.add(Predicates.and(new CardTypePredicate(CardType.LAND), new SupertypePredicate("Basic"))); @@ -116,10 +114,7 @@ class PutLandOnBattlefieldEffect extends OneShotEffect { Card card = game.getCard(target.getFirstTarget()); if (card != null) { card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - Permanent permanent = game.getPermanent(card.getId()); - if (permanent != null) { - permanent.setTapped(true); - } + return true; } } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java b/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java index 4fc4e9d651e..c0da2b6ed25 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java @@ -1,151 +1,136 @@ -/* - * 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.journeyintonyx; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.OneShotEffect; -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.FilterCard; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.TargetCard; - -/** - * - * @author LevelX2 - */ -public class NessianGameWarden extends CardImpl { - - public NessianGameWarden(UUID ownerId) { - super(ownerId, 132, "Nessian Game Warden", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); - this.expansionSetCode = "JOU"; - this.subtype.add("Beast"); - - this.power = new MageInt(4); - this.toughness = new MageInt(5); - - // When Nessian Game Warden enters the battlefield, look at the top X cards of your library, where X is the number of forests you control. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order. - this.addAbility(new EntersBattlefieldTriggeredAbility(new NessianGameWardenEffect(), false)); - } - - public NessianGameWarden(final NessianGameWarden card) { - super(card); - } - - @Override - public NessianGameWarden copy() { - return new NessianGameWarden(this); - } -} - -class NessianGameWardenEffect extends OneShotEffect { - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("forests you control"); - - static { - filter.add(new SubtypePredicate("Forest")); - } - - public NessianGameWardenEffect() { - super(Outcome.DrawCard); - this.staticText = "look at the top X cards of your library, where X is the number of forests you control. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order"; - } - - public NessianGameWardenEffect(final NessianGameWardenEffect effect) { - super(effect); - } - - @Override - public NessianGameWardenEffect copy() { - return new NessianGameWardenEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (player == null || sourcePermanent == null) { - return false; - } - - Cards cards = new CardsImpl(); - int count = new PermanentsOnBattlefieldCount(filter).calculate(game, source, this); - count = Math.min(player.getLibrary().size(), count); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards(sourcePermanent.getName(), cards, game); - - if (!cards.isEmpty()) { - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to put into your hand")); - if (target.canChoose(source.getSourceId(), player.getId(), game) && player.choose(Outcome.DrawCard, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - player.revealCards(sourcePermanent.getName(), new CardsImpl(card), game); - cards.remove(card); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - } - } - } - - - TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { - player.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - return true; - } -} +/* + * 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.journeyintonyx; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.OneShotEffect; +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.common.FilterControlledPermanent; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author LevelX2 + */ +public class NessianGameWarden extends CardImpl { + + public NessianGameWarden(UUID ownerId) { + super(ownerId, 132, "Nessian Game Warden", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + this.expansionSetCode = "JOU"; + this.subtype.add("Beast"); + + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // When Nessian Game Warden enters the battlefield, look at the top X cards of your library, where X is the number of forests you control. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new NessianGameWardenEffect(), false)); + } + + public NessianGameWarden(final NessianGameWarden card) { + super(card); + } + + @Override + public NessianGameWarden copy() { + return new NessianGameWarden(this); + } +} + +class NessianGameWardenEffect extends OneShotEffect { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("forests you control"); + + static { + filter.add(new SubtypePredicate("Forest")); + } + + public NessianGameWardenEffect() { + super(Outcome.DrawCard); + this.staticText = "look at the top X cards of your library, where X is the number of forests you control. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order"; + } + + public NessianGameWardenEffect(final NessianGameWardenEffect effect) { + super(effect); + } + + @Override + public NessianGameWardenEffect copy() { + return new NessianGameWardenEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (player == null || sourcePermanent == null) { + return false; + } + + Cards cards = new CardsImpl(); + int count = new PermanentsOnBattlefieldCount(filter).calculate(game, source, this); + count = Math.min(player.getLibrary().size(), count); + for (int i = 0; i < count; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + cards.add(card); + } + } + player.lookAtCards(sourcePermanent.getName(), cards, game); + + if (!cards.isEmpty()) { + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to put into your hand")); + if (target.canChoose(source.getSourceId(), player.getId(), game) && player.choose(Outcome.DrawCard, cards, target, game)) { + Card card = cards.get(target.getFirstTarget(), game); + if (card != null) { + player.revealCards(sourcePermanent.getName(), new CardsImpl(card), game); + cards.remove(card); + player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + } + } + } + + player.putCardsOnBottomOfLibrary(cards, game, source, true); + return true; + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 2a635f134ab..1b5eb9831c3 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -11088,7 +11088,7 @@ Faerie Noble|Masters Edition III|117|U|{2}{G}|Creature - Faerie|1|2|Flying$Other Fire Sprites|Masters Edition III|118|C|{1}{G}|Creature - Faerie|1|1|Flying${G}, {tap}: Add {R} to your mana pool.| Freyalise's Winds|Masters Edition III|119|R|{2}{G}{G}|Enchantment|||Whenever a permanent becomes tapped, put a wind counter on it.$If a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead.| Guan Yu, Sainted Warrior|Masters Edition III|12|U|{3}{W}{W}|Legendary Creature - Human Soldier Warrior|3|5|Horsemanship (This creature can't be blocked except by creatures with horsemanship.)$When Guan Yu, Sainted Warrior is put into your graveyard from the battlefield, you may shuffle Guan Yu into your library.| -Gaea's Touch|Masters Edition III|120|U|{G}{G}|Enchantment|||You may play an additional land during your turn if that land is a basic Forest.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| +Gaea's Touch|Masters Edition III|120|U|{G}{G}|Enchantment|||You may put a basic Forest card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery and only once each turn.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| Giant Growth|Masters Edition III|121|C|{G}|Instant|||Target creature gets +3/+3 until end of turn.| Heavy Fog|Masters Edition III|122|C|{1}{G}|Instant|||Cast Heavy Fog only during the declare attackers step and only if you've been attacked this step.$Prevent all damage that would be dealt to you this turn by attacking creatures.| Hua Tuo, Honored Physician|Masters Edition III|123|R|{1}{G}{G}|Legendary Creature - Human|1|2|{tap}: Put target creature card from your graveyard on top of your library. Activate this ability only during your turn, before attackers are declared.| @@ -19206,7 +19206,7 @@ Riptide|The Dark|38|C|{U}|Instant|||Tap all blue creatures.| Carnivorous Plant|The Dark|38|C|{3}{G}|Creature - Plant Wall|4|5|Defender| Elves of Deep Shadow|The Dark|39|U|{G}|Creature - Elf Druid|1|1|{tap}: Add {B} to your mana pool. Elves of Deep Shadow deals 1 damage to you.| Bog Rats|The Dark|4|C|{B}|Creature - Rat|1|1|Bog Rats can't be blocked by Walls.| -Gaea's Touch|The Dark|40|C|{G}{G}|Enchantment|||You may play an additional land during your turn if that land is a basic Forest.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| +Gaea's Touch|The Dark|40|C|{G}{G}|Enchantment|||You may put a basic Forest card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery and only once each turn.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| Hidden Path|The Dark|41|R|{2}{G}{G}{G}{G}|Enchantment|||Green creatures have forestwalk.| Land Leeches|The Dark|42|C|{1}{G}{G}|Creature - Leech|2|2|First strike| Marsh Viper|The Dark|44|C|{3}{G}|Creature - Snake|1|2|Whenever Marsh Viper deals damage to a player, that player gets two poison counters. (A player with ten or more poison counters loses the game.)| From eca37467a3f4e296c992bc7d17a1e89f291be2b6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 21 Jul 2015 17:23:10 +0200 Subject: [PATCH 132/375] * Added a auto select color for color choices of mana abilities that ask the human player to select a colo (implements #690). --- .../src/mage/player/human/HumanPlayer.java | 13 +- .../cards/abilities/keywords/MorphTest.java | 254 +++++++++--------- .../org/mage/test/utils/ManaUtilTest.java | 3 + Mage/src/mage/Mana.java | 20 ++ Mage/src/mage/util/ManaUtil.java | 80 +++++- 5 files changed, 228 insertions(+), 142 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 7e1a819fa46..5989d537f46 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -111,6 +111,7 @@ public class HumanPlayer extends PlayerImpl { } protected HashSet autoSelectReplacementEffects = new HashSet<>(); + protected ManaCost currentlyUnpaidMana; public HumanPlayer(String name, RangeOfInfluence range, int skill) { super(name, range); @@ -119,6 +120,8 @@ public class HumanPlayer extends PlayerImpl { public HumanPlayer(final HumanPlayer player) { super(player); + this.autoSelectReplacementEffects.addAll(autoSelectReplacementEffects); + this.currentlyUnpaidMana = player.currentlyUnpaidMana; } protected void waitForResponse(Game game) { @@ -248,6 +251,12 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean choose(Outcome outcome, Choice choice, Game game) { + if (outcome.equals(Outcome.PutManaInPool)) { + if (currentlyUnpaidMana != null + && ManaUtil.tryToAutoSelectAManaColor(choice, currentlyUnpaidMana)) { + return true; + } + } updateGameStatePriority("choose(3)", game); while (!abort) { game.fireChooseChoiceEvent(playerId, choice); @@ -765,8 +774,10 @@ public class HumanPlayer extends PlayerImpl { if (zone != null) { LinkedHashMap useableAbilities = getUseableManaAbilities(object, zone, game); if (useableAbilities != null && useableAbilities.size() > 0) { - useableAbilities = ManaUtil.tryToAutoPay(unpaid, useableAbilities); + useableAbilities = ManaUtil.tryToAutoPay(unpaid, useableAbilities); // eliminates other abilities if one fits perfectly + currentlyUnpaidMana = unpaid; activateAbility(useableAbilities, object, game); + currentlyUnpaidMana = null; } } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java index b3cc3a25c95..60991689d79 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java @@ -39,28 +39,28 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author levelX2 */ - public class MorphTest extends CardTestPlayerBase { /** - * Tests if a creature with Morph is cast normal, it behaves as normal creature + * Tests if a creature with Morph is cast normal, it behaves as normal + * creature * */ @Test public void testCastMoprhCreatureWithoutMorph() { - /* - Pine Walker - Creature - Elemental - 5/5 - Morph {4}{G} (You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.) - Whenever Pine Walker or another creature you control is turned face up, untap that creature. - */ + /* + Pine Walker + Creature - Elemental + 5/5 + Morph {4}{G} (You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.) + Whenever Pine Walker or another creature you control is turned face up, untap that creature. + */ addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 5); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); setChoice(playerA, "No"); // cast it normal as 5/5 - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -69,7 +69,6 @@ public class MorphTest extends CardTestPlayerBase { } - /** * Cast the creature face down as a 2/2 */ @@ -77,10 +76,10 @@ public class MorphTest extends CardTestPlayerBase { public void testCastFaceDown() { addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -88,6 +87,7 @@ public class MorphTest extends CardTestPlayerBase { assertPowerToughness(playerA, "", 2, 2); } + /** * Test triggered turn face up ability of Pine Walker */ @@ -95,29 +95,29 @@ public class MorphTest extends CardTestPlayerBase { public void testTurnFaceUpTrigger() { addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 5); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + attack(3, playerA, ""); - + activateAbility(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "{4}{G}: Turn this face-down permanent face up."); setStopAt(3, PhaseStep.END_TURN); execute(); assertLife(playerB, 18); - + assertPermanentCount(playerA, "", 0); - assertPermanentCount(playerA, "Pine Walker", 1); + assertPermanentCount(playerA, "Pine Walker", 1); assertPowerToughness(playerA, "Pine Walker", 5, 5); assertTapped("Pine Walker", false); } - + /** - * Test that the triggered "turned face up" ability of Pine Walker does not trigger - * as long as Pine Walker is not turned face up. - * + * Test that the triggered "turned face up" ability of Pine Walker does not + * trigger as long as Pine Walker is not turned face up. + * */ @Test public void testDoesNotTriggerFaceDown() { @@ -127,34 +127,35 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Icefeather Aven"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); addCard(Zone.BATTLEFIELD, playerA, "Island", 3); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Icefeather Aven"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Icefeather Aven", NO_TARGET, "Pine Walker", StackClause.WHILE_NOT_ON_STACK); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + attack(3, playerA, ""); attack(3, playerA, ""); activateAbility(3, PhaseStep.DECLARE_BLOCKERS, playerA, "{1}{G}{U}: Turn this face-down permanent face up."); setChoice(playerA, "No"); // Don't use return permanent to hand effect - + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); execute(); assertLife(playerA, 20); assertLife(playerB, 16); - + assertHandCount(playerA, "Pine Walker", 0); assertHandCount(playerA, "Icefeather Aven", 0); assertPermanentCount(playerA, "", 1); - assertPermanentCount(playerA, "Icefeather Aven", 1); + assertPermanentCount(playerA, "Icefeather Aven", 1); assertTapped("Icefeather Aven", true); } /** - * Test that Morph creature do not trigger abilities with their face up attributes - * + * Test that Morph creature do not trigger abilities with their face up + * attributes + * */ @Test public void testMorphedRemovesAttributesCreature() { @@ -162,104 +163,106 @@ public class MorphTest extends CardTestPlayerBase { // Creature - Goblin Warrior // 2/2 // When Ponyback Brigade enters the battlefield or is turned face up, put three 1/1 red Goblin creature tokens onto the battlefield. - // Morph {2}{R}{W}{B}(You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.) + // Morph {2}{R}{W}{B}(You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.) addCard(Zone.HAND, playerA, "Ponyback Brigade"); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); - + addCard(Zone.BATTLEFIELD, playerB, "Soldier of the Pantheon", 1); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ponyback Brigade"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertLife(playerB, 20); // and not 21 - + assertLife(playerB, 20); // and not 21 + assertPermanentCount(playerA, "", 1); assertPermanentCount(playerB, "Soldier of the Pantheon", 1); } - - /** + + /** * Test to copy a morphed 2/2 creature - * + * */ @Test public void testCopyAMorphedCreature() { addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); - + // Clever Impersonator {2}{U}{U} // Creature - Shapeshifter // 0/0 // You may have Clever Impersonator enter the battlefield as a copy of any nonland permanent on the battlefield. addCard(Zone.HAND, playerB, "Clever Impersonator", 1); addCard(Zone.BATTLEFIELD, playerB, "Island", 4); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Clever Impersonator"); setChoice(playerB, "Yes"); // use to copy a nonland permanent addTarget(playerB, ""); // Morphed creature - + setStopAt(2, PhaseStep.BEGIN_COMBAT); execute(); assertLife(playerB, 20); - - assertPermanentCount(playerA, "", 1); - assertPowerToughness(playerA, "", 2,2); - assertPermanentCount(playerB, "", 1); - assertPowerToughness(playerB, "", 2,2); - } - + assertPermanentCount(playerA, "", 1); + assertPowerToughness(playerA, "", 2, 2); + assertPermanentCount(playerB, "", 1); + assertPowerToughness(playerB, "", 2, 2); + + } + /** - * - * + * + * */ @Test public void testPineWalkerWithUnboostEffect() { addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 8); - + // Doomwake Giant {4}{B} // Creature - Giant // 4/6 // Constellation - When Doomwake Giant or another enchantment enters the battlefield under your control, creatures your opponents control get -1/-1 until end of turn. addCard(Zone.HAND, playerB, "Doomwake Giant", 1); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 5); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Doomwake Giant"); // activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "{2}{R}{W}{B}: Turn this face-down permanent face up."); activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "{4}{G}: Turn this face-down permanent face up."); - + setStopAt(2, PhaseStep.END_TURN); execute(); assertLife(playerB, 20); - - assertHandCount(playerA, "Pine Walker", 0); + + assertHandCount(playerA, "Pine Walker", 0); assertHandCount(playerB, "Doomwake Giant", 0); assertPermanentCount(playerA, "", 0); assertPermanentCount(playerB, "Doomwake Giant", 1); assertPermanentCount(playerA, "Pine Walker", 1); - assertPowerToughness(playerA, "Pine Walker", 4,4); + assertPowerToughness(playerA, "Pine Walker", 4, 4); + + } - } /** - * If a morph is on the table and an enemy Doomwake Giant comes down, the morph goes - * down to 1/1 correctly. If you unmorph the 2/2 and is also a 2/2 after umorphing, - * the morph will be erroneously reduced to 0/0 and die. - * + * If a morph is on the table and an enemy Doomwake Giant comes down, the + * morph goes down to 1/1 correctly. If you unmorph the 2/2 and is also a + * 2/2 after umorphing, the morph will be erroneously reduced to 0/0 and + * die. + * */ @Test public void testDoomwakeGiantEffect() { @@ -267,38 +270,40 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6); addCard(Zone.BATTLEFIELD, playerA, "Plains", 6); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6); - + // Doomwake Giant {4}{B} // Creature - Giant // 4/6 // Constellation - When Doomwake Giant or another enchantment enters the battlefield under your control, creatures your opponents control get -1/-1 until end of turn. addCard(Zone.HAND, playerB, "Doomwake Giant", 1); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 5); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ponyback Brigade"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Doomwake Giant"); activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "{2}{R}{W}{B}: Turn this face-down permanent face up."); - + setStopAt(2, PhaseStep.END_TURN); execute(); assertLife(playerB, 20); - - assertHandCount(playerA, "Ponyback Brigade", 0); + + assertHandCount(playerA, "Ponyback Brigade", 0); assertHandCount(playerB, "Doomwake Giant", 0); assertPermanentCount(playerA, "", 0); assertPermanentCount(playerA, "Goblin", 3); - assertPowerToughness(playerA, "Goblin", 1,1,Filter.ComparisonScope.Any); + assertPowerToughness(playerA, "Goblin", 1, 1, Filter.ComparisonScope.Any); assertPermanentCount(playerB, "Doomwake Giant", 1); assertPermanentCount(playerA, "Ponyback Brigade", 1); - assertPowerToughness(playerA, "Ponyback Brigade", 1,1); + assertPowerToughness(playerA, "Ponyback Brigade", 1, 1); } + /** - * Clone a Morph creature that was cast face down and meanwhile was turned face up + * Clone a Morph creature that was cast face down and meanwhile was turned + * face up * */ @Test @@ -326,12 +331,13 @@ public class MorphTest extends CardTestPlayerBase { assertHandCount(playerA, "Clone", 0); assertPermanentCount(playerA, "Sagu Mauler", 2); - assertPowerToughness(playerA, "Sagu Mauler", 6,6,Filter.ComparisonScope.Any); + assertPowerToughness(playerA, "Sagu Mauler", 6, 6, Filter.ComparisonScope.Any); } + /** - * Check that you can't counter a creature cast for it morph costs - * with Disdainful Stroke if it's normal cmc > 3 + * Check that you can't counter a creature cast for it morph costs with + * Disdainful Stroke if it's normal cmc > 3 * */ @Test @@ -366,16 +372,17 @@ public class MorphTest extends CardTestPlayerBase { } /** - * Check that an effect like "Target creature and all other creatures with the same name" does - * only effect one face down creature, also if multiple on the battlefield. Because they have no - * name, they don't have the same name. + * Check that an effect like "Target creature and all other creatures with + * the same name" does only effect one face down creature, also if multiple + * on the battlefield. Because they have no name, they don't have the same + * name. * */ @Test public void testEchoingDecaySameNameEffect() { // Sagu Mauler 6/6 - Creature - Beast // Trample, hexproof - // Morph {3}{G}{B} (You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.) + // Morph {3}{G}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) addCard(Zone.HAND, playerA, "Sagu Mauler", 2); addCard(Zone.BATTLEFIELD, playerA, "Forest", 6); @@ -387,7 +394,7 @@ public class MorphTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler", NO_TARGET, "Sagu Mauler", StackClause.WHILE_NOT_ON_STACK); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Echoing Decay", ""); @@ -405,11 +412,11 @@ public class MorphTest extends CardTestPlayerBase { } /** - * I played a Akroma, Angel of Fury face down, and my opponent tried to counter it. - * The counter failed and Akroma face successfully play face down, when it should have - * been countered. (The card text on akroma should not prevent her from being countered). + * I played a Akroma, Angel of Fury face down, and my opponent tried to + * counter it. The counter failed and Akroma face successfully play face + * down, when it should have been countered. (The card text on akroma should + * not prevent her from being countered). */ - @Test public void testRuleModifyingEffectsFromManifestedCardWontBeAppliedAbilities() { addCard(Zone.HAND, playerA, "Akroma, Angel of Fury", 1); @@ -418,7 +425,6 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Counterspell", 1); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Counterspell", "Akroma, Angel of Fury"); @@ -432,11 +438,11 @@ public class MorphTest extends CardTestPlayerBase { assertGraveyardCount(playerA, "Akroma, Angel of Fury", 1); } - /** - * Check if a face down Morph creature gets exiled, it will - * be face up in exile zone. - */ + /** + * Check if a face down Morph creature gets exiled, it will be face up in + * exile zone. + */ @Test public void testExileFaceDownCreature() { addCard(Zone.HAND, playerA, "Birchlore Rangers", 1); @@ -445,7 +451,6 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Swords to Plowshares", 1); addCard(Zone.BATTLEFIELD, playerB, "Plains", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Birchlore Rangers"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature @@ -460,8 +465,7 @@ public class MorphTest extends CardTestPlayerBase { assertGraveyardCount(playerB, "Swords to Plowshares", 1); assertExileCount("Birchlore Rangers", 1); - - for (Card card: currentGame.getExile().getAllCards(currentGame)) { + for (Card card : currentGame.getExile().getAllCards(currentGame)) { if (card.getName().equals("Birchlore Rangers")) { Assert.assertEquals("Birchlore Rangers has to be face up in exile", false, card.isFaceDown(currentGame)); break; @@ -469,11 +473,11 @@ public class MorphTest extends CardTestPlayerBase { } } - /** - * Check that a DiesTriggeredAbility of a creature does not trigger - * if the creature dies face down - */ + /** + * Check that a DiesTriggeredAbility of a creature does not trigger if the + * creature dies face down + */ @Test public void testDiesTriggeredDoesNotTriggerIfFaceDown() { // Flying @@ -486,7 +490,6 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Lightning Bolt", 1); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature @@ -501,20 +504,19 @@ public class MorphTest extends CardTestPlayerBase { assertGraveyardCount(playerB, "Lightning Bolt", 1); assertGraveyardCount(playerA, "Ashcloud Phoenix", 1); - - for (Card card: playerA.getGraveyard().getCards(currentGame)) { + for (Card card : playerA.getGraveyard().getCards(currentGame)) { if (card.getName().equals("Ashcloud Phoenix")) { Assert.assertEquals("Ashcloud Phoenix has to be face up in graveyard", false, card.isFaceDown(currentGame)); break; } } - } - /** - * Check that a DiesTriggeredAbility of a creature does not trigger - * if the creature dies face down in combat - */ + } + /** + * Check that a DiesTriggeredAbility of a creature does not trigger if the + * creature dies face down in combat + */ @Test public void testDiesTriggeredDoesNotTriggerInCombatIfFaceDown() { // Flying @@ -524,24 +526,22 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Ashcloud Phoenix", 1); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); - // First strike, forestwalk, vigilance + // First strike, forestwalk, vigilance // (This creature deals combat damage before creatures without first strike, it can't be blocked as long as defending player controls a Forest, and attacking doesn't cause this creature to tap.) addCard(Zone.BATTLEFIELD, playerB, "Mirri, Cat Warrior"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature attack(2, playerB, "Mirri, Cat Warrior"); - block(2, playerA, "", "Mirri, Cat Warrior"); + block(2, playerA, "", "Mirri, Cat Warrior"); setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); execute(); assertGraveyardCount(playerA, "Ashcloud Phoenix", 1); - - for (Card card: playerA.getGraveyard().getCards(currentGame)) { + for (Card card : playerA.getGraveyard().getCards(currentGame)) { if (card.getName().equals("Ashcloud Phoenix")) { Assert.assertEquals("Ashcloud Phoenix has to be face up in graveyard", false, card.isFaceDown(currentGame)); break; @@ -551,13 +551,14 @@ public class MorphTest extends CardTestPlayerBase { assertLife(playerA, 20); assertLife(playerB, 20); - } - /** - * Supplant Form does not work correctly with morph creatures. If you bounce and copy - * a face-down morph, the created token should be a colorless 2/2, but the token created - * is instead the face-up of what the morph creature was. - */ + } + /** + * Supplant Form does not work correctly with morph creatures. If you bounce + * and copy a face-down morph, the created token should be a colorless 2/2, + * but the token created is instead the face-up of what the morph creature + * was. + */ @Test public void testSupplantFormWithMorphedCreature() { addCard(Zone.HAND, playerA, "Akroma, Angel of Fury", 1); @@ -567,7 +568,6 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Supplant Form", 1); addCard(Zone.BATTLEFIELD, playerB, "Island", 6); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Supplant Form", ""); @@ -579,18 +579,17 @@ public class MorphTest extends CardTestPlayerBase { assertGraveyardCount(playerB, "Supplant Form", 1); assertHandCount(playerA, "Akroma, Angel of Fury", 1); - + assertPermanentCount(playerB, "Akroma, Angel of Fury", 0); assertPermanentCount(playerB, "", 1); assertPowerToughness(playerB, "", 2, 2); - } - - /** - * Dragonlord Kolaghan passive of 10 damage works when you play a morph creature - * and it isn't suposed to. Because it is nameless. - */ + } + /** + * Dragonlord Kolaghan passive of 10 damage works when you play a morph + * creature and it isn't suposed to. Because it is nameless. + */ @Test public void testDragonlordKolaghan() { addCard(Zone.GRAVEYARD, playerA, "Akroma, Angel of Fury", 1); @@ -602,7 +601,6 @@ public class MorphTest extends CardTestPlayerBase { // Whenever an opponent casts a creature or planeswalker spell with the same name as a card in his or her graveyard, that player loses 10 life. addCard(Zone.BATTLEFIELD, playerB, "Dragonlord Kolaghan", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury"); setChoice(playerA, "Yes"); // cast it face down as 2/2 creature @@ -610,8 +608,8 @@ public class MorphTest extends CardTestPlayerBase { execute(); assertLife(playerA, 20); - + assertPermanentCount(playerA, "", 1); - } + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java index 888bd5fa924..3534b4a6acf 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaUtilTest.java @@ -58,6 +58,9 @@ public class ManaUtilTest extends CardTestPlayerBase { testManaToPayVsLand("{G}{W/R}{W}", "Sacred Foundry", 2, WhiteManaAbility.class); // auto choose for hybrid mana: choose {W} testManaToPayVsLand("{W/B}{W/B}", "Swamp", 1, BlackManaAbility.class); + testManaToPayVsLand("{R}", "Glimmervoid", 1, 1); + testManaToPayVsLand("{R}{1}", "Glimmervoid", 1, 1); + // we can't auto choose here: // let say we auto choose {R}, then we have to use it to pay for {R} not {W/R} (as {W/R} is more generic cost) // but in such case what is left to pay is {W/R}{W} and it is possible that we won't have 2 white sources diff --git a/Mage/src/mage/Mana.java b/Mage/src/mage/Mana.java index 4985b1d7047..e24700d45d0 100644 --- a/Mage/src/mage/Mana.java +++ b/Mage/src/mage/Mana.java @@ -626,4 +626,24 @@ public class Mana implements Comparable, Serializable, Copyable { } return moreMana; } + + public int getDifferentColors() { + int count = 0; + if (blue > 0) { + count++; + } + if (black > 0) { + count++; + } + if (green > 0) { + count++; + } + if (white > 0) { + count++; + } + if (red > 0) { + count++; + } + return count; + } } diff --git a/Mage/src/mage/util/ManaUtil.java b/Mage/src/mage/util/ManaUtil.java index d094f807d39..6ff41cc3f4f 100644 --- a/Mage/src/mage/util/ManaUtil.java +++ b/Mage/src/mage/util/ManaUtil.java @@ -1,7 +1,10 @@ package mage.util; -import java.util.*; - +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Set; +import java.util.UUID; import mage.MageObject; import mage.Mana; import mage.ManaSymbol; @@ -17,6 +20,8 @@ import mage.abilities.mana.ManaAbility; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.Card; +import mage.choices.Choice; +import mage.constants.ColoredManaSymbol; import mage.game.Game; /** @@ -75,6 +80,56 @@ public class ManaUtil { return useableAbilities; } + /** + * For Human players this is called before a player is asked to select a + * mana color to pay a specific cost. If the choice obvious, the color is + * auto picked by this method without bothering the human player + * + * @param choice the color choice to do + * @param unpaid the mana still to pay + * @return + */ + public static boolean tryToAutoSelectAManaColor(Choice choice, ManaCost unpaid) { + String colorToAutoPay = null; + if (unpaid.containsColor(ColoredManaSymbol.W) && choice.getChoices().contains("White")) { + colorToAutoPay = "White"; + } + if (unpaid.containsColor(ColoredManaSymbol.R) && choice.getChoices().contains("Red")) { + if (colorToAutoPay != null) { + return false; + } + colorToAutoPay = "Red"; + } + if (unpaid.containsColor(ColoredManaSymbol.G) && choice.getChoices().contains("Green")) { + if (colorToAutoPay != null) { + return false; + } + colorToAutoPay = "Green"; + } + if (unpaid.containsColor(ColoredManaSymbol.U) && choice.getChoices().contains("Blue")) { + if (colorToAutoPay != null) { + return false; + } + colorToAutoPay = "Blue"; + } + if (unpaid.containsColor(ColoredManaSymbol.B) && choice.getChoices().contains("Black")) { + if (colorToAutoPay != null) { + return false; + } + colorToAutoPay = "Black"; + } + // only colorless to pay so take first choice + if (unpaid.getMana().getDifferentColors() == 0) { + colorToAutoPay = choice.getChoices().iterator().next(); + } + // one possible useful option found + if (colorToAutoPay != null) { + choice.setChoice(colorToAutoPay); + return true; + } + return false; + } + private static LinkedHashMap getManaAbilitiesUsingManaSymbols(LinkedHashMap useableAbilities, ManaSymbols symbols, Mana unpaidMana) { Set countColored = new HashSet<>(); @@ -378,13 +433,12 @@ public class ManaUtil { } } - /** Converts a collection of mana symbols into a single condensed string - * e.g. - * {1}{1}{1}{1}{1}{W} = {5}{W} - * {2}{B}{2}{B}{2}{B} = {6}{B}{B}{B} - * {1}{2}{R}{U}{1}{1} = {5}{R}{U} - * {B}{G}{R} = {B}{G}{R} - * */ + /** + * Converts a collection of mana symbols into a single condensed string e.g. + * {1}{1}{1}{1}{1}{W} = {5}{W} {2}{B}{2}{B}{2}{B} = {6}{B}{B}{B} + * {1}{2}{R}{U}{1}{1} = {5}{R}{U} {B}{G}{R} = {B}{G}{R} + * + */ public static String condenseManaCostString(String rawCost) { int total = 0; int index = 0; @@ -394,7 +448,7 @@ public class ManaUtil { Arrays.sort(splitCost); for (String c : splitCost) { // If the string is a representation of a number - if(c.matches("\\d+")) { + if (c.matches("\\d+")) { total += Integer.parseInt(c); } else { // First non-number we see we can finish as they are sorted @@ -405,15 +459,15 @@ public class ManaUtil { int splitCostLength = splitCost.length; // No need to add {total} to the mana cost if total == 0 int shift = (total > 0) ? 1 : 0; - String [] finalCost = new String[shift + splitCostLength - index]; + String[] finalCost = new String[shift + splitCostLength - index]; // Account for no colourless mana symbols seen - if(total > 0) { + if (total > 0) { finalCost[0] = String.valueOf(total); } System.arraycopy(splitCost, index, finalCost, shift, splitCostLength - index); // Combine the cost back as a mana string StringBuilder sb = new StringBuilder(); - for(String s: finalCost) { + for (String s : finalCost) { sb.append("{" + s + "}"); } // Return the condensed string From 58571c6d1e8d10c18105c05ab98d620726731fd4 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 21 Jul 2015 19:35:34 +0300 Subject: [PATCH 133/375] Implement cards: Horned Cheetah, Llanowar Vanguard, Rampant Elephant, and Restrain --- .../src/mage/sets/invasion/HornedCheetah.java | 62 +++++++++++++++++ .../mage/sets/invasion/LlanowarVanguard.java | 67 ++++++++++++++++++ .../mage/sets/invasion/RampantElephant.java | 69 +++++++++++++++++++ .../src/mage/sets/invasion/Restrain.java | 67 ++++++++++++++++++ 4 files changed, 265 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/invasion/HornedCheetah.java create mode 100644 Mage.Sets/src/mage/sets/invasion/LlanowarVanguard.java create mode 100644 Mage.Sets/src/mage/sets/invasion/RampantElephant.java create mode 100644 Mage.Sets/src/mage/sets/invasion/Restrain.java diff --git a/Mage.Sets/src/mage/sets/invasion/HornedCheetah.java b/Mage.Sets/src/mage/sets/invasion/HornedCheetah.java new file mode 100644 index 00000000000..ce0fe58daa3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/HornedCheetah.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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageGainLifeSourceTriggeredAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class HornedCheetah extends CardImpl { + + public HornedCheetah(UUID ownerId) { + super(ownerId, 251, "Horned Cheetah", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{W}"); + this.expansionSetCode = "INV"; + this.subtype.add("Cat"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Horned Cheetah deals damage, you gain that much life. + this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); + } + + public HornedCheetah(final HornedCheetah card) { + super(card); + } + + @Override + public HornedCheetah copy() { + return new HornedCheetah(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/LlanowarVanguard.java b/Mage.Sets/src/mage/sets/invasion/LlanowarVanguard.java new file mode 100644 index 00000000000..2a64d4a36b9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/LlanowarVanguard.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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class LlanowarVanguard extends CardImpl { + + public LlanowarVanguard(UUID ownerId) { + super(ownerId, 197, "Llanowar Vanguard", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "INV"; + this.subtype.add("Dryad"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {T}: Llanowar Vanguard gets +0/+4 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BoostSourceEffect(0, 4, Duration.EndOfTurn), new TapSourceCost())); + } + + public LlanowarVanguard(final LlanowarVanguard card) { + super(card); + } + + @Override + public LlanowarVanguard copy() { + return new LlanowarVanguard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/RampantElephant.java b/Mage.Sets/src/mage/sets/invasion/RampantElephant.java new file mode 100644 index 00000000000..2d65858275a --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/RampantElephant.java @@ -0,0 +1,69 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.MustBeBlockedByTargetSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class RampantElephant extends CardImpl { + + public RampantElephant(UUID ownerId) { + super(ownerId, 28, "Rampant Elephant", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "INV"; + this.subtype.add("Elephant"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {G}: Target creature blocks Rampant Elephant this turn if able. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MustBeBlockedByTargetSourceEffect(), new ManaCostsImpl("{G}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public RampantElephant(final RampantElephant card) { + super(card); + } + + @Override + public RampantElephant copy() { + return new RampantElephant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/Restrain.java b/Mage.Sets/src/mage/sets/invasion/Restrain.java new file mode 100644 index 00000000000..02883862e1e --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/Restrain.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.invasion; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.PreventDamageByTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetAttackingCreature; + +/** + * + * @author LoneFox + */ +public class Restrain extends CardImpl { + + public Restrain(UUID ownerId) { + super(ownerId, 30, "Restrain", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); + this.expansionSetCode = "INV"; + + // Prevent all combat damage that would be dealt by target attacking creature this turn. + Effect effect = new PreventDamageByTargetEffect(Duration.EndOfTurn, true); + effect.setText("Prevent all combat damage that would be dealt by target attacking creature this turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetAttackingCreature()); + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public Restrain(final Restrain card) { + super(card); + } + + @Override + public Restrain copy() { + return new Restrain(this); + } +} From 9acff5aa9cfad37110a3405f98b895b5eec06a70 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 21 Jul 2015 21:51:27 +0300 Subject: [PATCH 134/375] Add DamageDealtToAttachedTriggeredAbility an use it for existing cards. Implement cards: Binding Agony and Soul Link --- .../src/mage/sets/apocalypse/SoulLink.java | 78 +++++++++++++++ .../sets/championsofkamigawa/RaggedVeins.java | 94 ++---------------- .../sets/darkascension/SpitefulShadows.java | 48 +-------- .../src/mage/sets/mirage/BindingAgony.java | 78 +++++++++++++++ .../src/mage/sets/odyssey/DruidsCall.java | 93 ++---------------- ...DamageDealtToAttachedTriggeredAbility.java | 98 +++++++++++++++++++ 6 files changed, 276 insertions(+), 213 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/SoulLink.java create mode 100644 Mage.Sets/src/mage/sets/mirage/BindingAgony.java create mode 100644 Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/SoulLink.java b/Mage.Sets/src/mage/sets/apocalypse/SoulLink.java new file mode 100644 index 00000000000..dbfb8ef7510 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/SoulLink.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.apocalypse; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageAttachedTriggeredAbility; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class SoulLink extends CardImpl { + + public SoulLink(UUID ownerId) { + super(ownerId, 120, "Soul Link", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{B}"); + this.expansionSetCode = "APC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Whenever enchanted creature deals damage, you gain that much life. + this.addAbility(new DealsDamageAttachedTriggeredAbility(Zone.BATTLEFIELD, + new GainLifeEffect(new NumericSetToEffectValues("that much", "damage")), false)); + // Whenever enchanted creature is dealt damage, you gain that much life. + this.addAbility(new DamageDealtToAttachedTriggeredAbility(new GainLifeEffect(new NumericSetToEffectValues("that much", "damage")), false)); + } + + public SoulLink(final SoulLink card) { + super(card); + } + + @Override + public SoulLink copy() { + return new SoulLink(this); + } +} diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java b/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java index 551f3c750df..2f75078d463 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/RaggedVeins.java @@ -30,24 +30,21 @@ package mage.sets.championsofkamigawa; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -67,11 +64,13 @@ public class RaggedVeins extends CardImpl { // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); this.addAbility(new EnchantAbility(auraTarget.getTargetName())); // Whenever enchanted creature is dealt damage, its controller loses that much life. - this.addAbility(new RaggedVeinsTriggeredAbility()); + Effect effect = new LoseLifeTargetEffect(new NumericSetToEffectValues("that much", "damage")); + effect.setText("its controller loses that much life"); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, effect, false, SetTargetPointer.PLAYER)); } public RaggedVeins(final RaggedVeins card) { @@ -83,78 +82,3 @@ public class RaggedVeins extends CardImpl { return new RaggedVeins(this); } } - -class RaggedVeinsTriggeredAbility extends TriggeredAbilityImpl { - - public RaggedVeinsTriggeredAbility() { - super(Zone.BATTLEFIELD, new RaggedVeinsEffect()); - } - - public RaggedVeinsTriggeredAbility(final RaggedVeinsTriggeredAbility ability) { - super(ability); - } - - @Override - public RaggedVeinsTriggeredAbility copy() { - return new RaggedVeinsTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_CREATURE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - UUID targetId = event.getTargetId(); - if (enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { - this.getEffects().get(0).setValue("damageAmount", event.getAmount()); - this.getEffects().get(0).setTargetPointer(new FixedTarget(targetId)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature is dealt damage, its controller loses that much life."; - } -} - -class RaggedVeinsEffect extends OneShotEffect { - - public RaggedVeinsEffect() { - super(Outcome.Damage); - this.staticText = "its controller loses that much life"; - } - - public RaggedVeinsEffect(final RaggedVeinsEffect effect) { - super(effect); - } - - @Override - public RaggedVeinsEffect copy() { - return new RaggedVeinsEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Integer damageAmount = (Integer) this.getValue("damageAmount"); - UUID targetId = this.targetPointer.getFirst(game, source); - if (damageAmount != null && targetId != null) { - Permanent permanent = game.getPermanent(targetId); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - } - if (permanent != null) { - Player player = game.getPlayer(permanent.getControllerId()); - if (player != null) { - player.loseLife(damageAmount, game); - return true; - } - } - } - return false; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java b/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java index a874f847366..942dc372f51 100644 --- a/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java +++ b/Mage.Sets/src/mage/sets/darkascension/SpitefulShadows.java @@ -29,7 +29,7 @@ package mage.sets.darkascension; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; @@ -37,10 +37,9 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; @@ -65,7 +64,8 @@ public class SpitefulShadows extends CardImpl { this.addAbility(new EnchantAbility(auraTarget.getTargetName())); // Whenever enchanted creature is dealt damage, it deals that much damage to its controller. - this.addAbility(new SpitefulShadowsTriggeredAbility()); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, new SpitefulShadowsEffect(), + false, SetTargetPointer.PERMANENT)); } public SpitefulShadows(final SpitefulShadows card) { @@ -78,44 +78,6 @@ public class SpitefulShadows extends CardImpl { } } -class SpitefulShadowsTriggeredAbility extends TriggeredAbilityImpl { - - public SpitefulShadowsTriggeredAbility() { - super(Zone.BATTLEFIELD, new SpitefulShadowsEffect()); - } - - public SpitefulShadowsTriggeredAbility(final SpitefulShadowsTriggeredAbility ability) { - super(ability); - } - - @Override - public SpitefulShadowsTriggeredAbility copy() { - return new SpitefulShadowsTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_CREATURE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - UUID targetId = event.getTargetId(); - if (enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { - this.getEffects().get(0).setValue("damageAmount", event.getAmount()); - this.getEffects().get(0).setTargetPointer(new FixedTarget(targetId)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature is dealt damage, it deals that much damage to its controller."; - } -} - class SpitefulShadowsEffect extends OneShotEffect { public SpitefulShadowsEffect() { @@ -134,7 +96,7 @@ class SpitefulShadowsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Integer damageAmount = (Integer) this.getValue("damageAmount"); + Integer damageAmount = (Integer) this.getValue("damage"); if (damageAmount != null) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent == null) { diff --git a/Mage.Sets/src/mage/sets/mirage/BindingAgony.java b/Mage.Sets/src/mage/sets/mirage/BindingAgony.java new file mode 100644 index 00000000000..5be6d6400a7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/BindingAgony.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.mirage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class BindingAgony extends CardImpl { + + public BindingAgony(UUID ownerId) { + super(ownerId, 4, "Binding Agony", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Whenever enchanted creature is dealt damage, Binding Agony deals that much damage to that creature's controller. + Effect effect = new DamageTargetEffect(new NumericSetToEffectValues("that much", "damage")); + effect.setText("{this} deals that much damage to that creature's controller"); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, effect, false, SetTargetPointer.PLAYER)); + } + + public BindingAgony(final BindingAgony card) { + super(card); + } + + @Override + public BindingAgony copy() { + return new BindingAgony(this); + } +} diff --git a/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java b/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java index 7746b54f027..3f7f6c922d0 100644 --- a/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java +++ b/Mage.Sets/src/mage/sets/odyssey/DruidsCall.java @@ -29,25 +29,22 @@ package mage.sets.odyssey; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.DamageDealtToAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.game.permanent.token.SquirrelToken; -import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -69,7 +66,9 @@ public class DruidsCall extends CardImpl { this.addAbility(ability); // Whenever enchanted creature is dealt damage, its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield. - this.addAbility(new DruidsCallTriggeredAbility()); + Effect effect = new CreateTokenTargetEffect(new SquirrelToken(), new NumericSetToEffectValues("that much", "damage")); + effect.setText("its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield"); + this.addAbility(new DamageDealtToAttachedTriggeredAbility(Zone.BATTLEFIELD, effect, false, SetTargetPointer.PLAYER)); } public DruidsCall(final DruidsCall card) { @@ -81,79 +80,3 @@ public class DruidsCall extends CardImpl { return new DruidsCall(this); } } - -class DruidsCallTriggeredAbility extends TriggeredAbilityImpl { - - public DruidsCallTriggeredAbility() { - super(Zone.BATTLEFIELD, new DruidsCallEffect()); - } - - public DruidsCallTriggeredAbility(final DruidsCallTriggeredAbility ability) { - super(ability); - } - - @Override - public DruidsCallTriggeredAbility copy() { - return new DruidsCallTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_CREATURE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Permanent enchantment = game.getPermanent(sourceId); - UUID targetId = event.getTargetId(); - if (enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { - this.getEffects().get(0).setValue("damageAmount", event.getAmount()); - this.getEffects().get(0).setTargetPointer(new FixedTarget(targetId)); - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature is dealt damage, its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield."; - } -} - -class DruidsCallEffect extends OneShotEffect { - - public DruidsCallEffect() { - super(Outcome.Damage); - this.staticText = "its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield"; - } - - public DruidsCallEffect(final DruidsCallEffect effect) { - super(effect); - } - - @Override - public DruidsCallEffect copy() { - return new DruidsCallEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Integer damageAmount = (Integer) this.getValue("damageAmount"); - UUID targetId = this.targetPointer.getFirst(game, source); - if (damageAmount != null && targetId != null) { - Permanent permanent = game.getPermanent(targetId); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - } - if (permanent != null) { - Player player = game.getPlayer(permanent.getControllerId()); - if (player != null) { - Token token = new SquirrelToken(); - token.putOntoBattlefield(damageAmount, game, source.getSourceId(), player.getId()); - return true; - } - } - } - return false; - } -} diff --git a/Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java new file mode 100644 index 00000000000..90e4b5fb267 --- /dev/null +++ b/Mage/src/mage/abilities/common/DamageDealtToAttachedTriggeredAbility.java @@ -0,0 +1,98 @@ +/* + * 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.abilities.common; + +import java.util.UUID; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LoneFox + */ +public class DamageDealtToAttachedTriggeredAbility extends TriggeredAbilityImpl { + + protected SetTargetPointer setTargetPointer; + + public DamageDealtToAttachedTriggeredAbility(Effect effect, boolean optional) { + this(Zone.BATTLEFIELD, effect, optional, SetTargetPointer.NONE); + } + + public DamageDealtToAttachedTriggeredAbility(Zone zone, Effect effect, boolean optional, SetTargetPointer setTargetPointer) { + super(zone, effect, optional); + this.setTargetPointer = setTargetPointer; + } + + public DamageDealtToAttachedTriggeredAbility(final DamageDealtToAttachedTriggeredAbility ability) { + super(ability); + this.setTargetPointer = ability.setTargetPointer; + } + + @Override + public DamageDealtToAttachedTriggeredAbility copy() { + return new DamageDealtToAttachedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGED_CREATURE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent enchantment = game.getPermanent(sourceId); + UUID targetId = event.getTargetId(); + if(enchantment != null && enchantment.getAttachedTo() != null && targetId.equals(enchantment.getAttachedTo())) { + for(Effect effect : this.getEffects()) { + effect.setValue("damage", event.getAmount()); + switch(setTargetPointer) { + case PERMANENT: + effect.setTargetPointer(new FixedTarget(targetId)); + break; + case PLAYER: + effect.setTargetPointer(new FixedTarget(game.getPermanentOrLKIBattlefield(targetId).getControllerId())); + break; + } + } + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever enchanted creature is dealt damage, " + super.getRule(); + } +} From f07816307237db3f686158f18b53f18593cc1f7b Mon Sep 17 00:00:00 2001 From: Simown Date: Tue, 21 Jul 2015 22:02:40 +0100 Subject: [PATCH 135/375] Added all the missing "Domain Cards". Draco, Collective Restraint, Samite Pilgrim. --- Mage.Sets/src/mage/sets/ftvdragons/Draco.java | 151 ++++++++++++++++++ .../sets/invasion/CollectiveRestraint.java | 100 ++++++++++++ Mage.Sets/src/mage/sets/planeshift/Draco.java | 52 ++++++ .../mage/sets/planeshift/SamitePilgrim.java | 143 +++++++++++++++++ 4 files changed, 446 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/ftvdragons/Draco.java create mode 100644 Mage.Sets/src/mage/sets/invasion/CollectiveRestraint.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/Draco.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java diff --git a/Mage.Sets/src/mage/sets/ftvdragons/Draco.java b/Mage.Sets/src/mage/sets/ftvdragons/Draco.java new file mode 100644 index 00000000000..e169224878f --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvdragons/Draco.java @@ -0,0 +1,151 @@ +/* + * 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.ftvdragons; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.dynamicvalue.common.DomainValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author Simown + */ +public class Draco extends CardImpl { + + public Draco(UUID ownerId) { + super(ownerId, 3, "Draco", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{16}"); + this.expansionSetCode = "FVD"; + this.subtype.add("Dragon"); + this.power = new MageInt(9); + this.toughness = new MageInt(9); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Domain - Draco costs {2} less to cast for each basic land type among lands you control. + this.addAbility(new SimpleStaticAbility(Zone.STACK, new DracoCostReductionEffect())); + + // Domain - At the beginning of your upkeep, sacrifice Draco unless you pay {10}. This cost is reduced by {2} for each basic land type among lands you control. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DracoSacrificeUnlessPaysEffect(), TargetController.YOU, false)); + } + + public Draco(final Draco card) { + super(card); + } + + @Override + public Draco copy() { + return new Draco(this); + } +} + +class DracoCostReductionEffect extends CostModificationEffectImpl { + + public DracoCostReductionEffect() { + super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = "Domain - {this} costs {2} less to cast for each basic land type among lands you control."; + } + + protected DracoCostReductionEffect(final DracoCostReductionEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + CardUtil.reduceCost(abilityToModify, new DomainValue(2).calculate(game, source, this)); + return true; + } + + public boolean applies(Ability abilityToModify, Ability source, Game game) { + return abilityToModify.getSourceId().equals(source.getSourceId()); + } + + @Override + public DracoCostReductionEffect copy() { + return new DracoCostReductionEffect(this); + } +} + +class DracoSacrificeUnlessPaysEffect extends OneShotEffect { + + public static final int MAX_DOMAIN_VALUE = 10; + + public DracoSacrificeUnlessPaysEffect () { + super(Outcome.Sacrifice); + staticText = "sacrifice {this} unless you pay {10}. This cost is reduced by {2} for each basic land type among lands you control."; + } + + public DracoSacrificeUnlessPaysEffect (final DracoSacrificeUnlessPaysEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (player != null && permanent != null) { + // The cost is reduced by {2} for each basic land type. + int domainValueReduction = new DomainValue(2).calculate(game, source, this); + // Nothing to pay + if (domainValueReduction >= MAX_DOMAIN_VALUE) { + return true; + } + int count = (MAX_DOMAIN_VALUE-domainValueReduction ); + if (player.chooseUse(Outcome.Benefit, "Pay {" + count + "}? Or " + permanent.getName() + " will be sacrificed.", source, game)) { + GenericManaCost cost = new GenericManaCost(count); + if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)) { + return true; + } + } + permanent.sacrifice(source.getSourceId(), game); + return true; + } + return false; + } + + @Override + public DracoSacrificeUnlessPaysEffect copy() { + return new DracoSacrificeUnlessPaysEffect (this); + } + +} + + diff --git a/Mage.Sets/src/mage/sets/invasion/CollectiveRestraint.java b/Mage.Sets/src/mage/sets/invasion/CollectiveRestraint.java new file mode 100644 index 00000000000..2fc2c38da18 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/CollectiveRestraint.java @@ -0,0 +1,100 @@ +/* + * 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.invasion; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostImpl; +import mage.abilities.costs.mana.ManaCosts; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.DomainValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.PayCostToAttackBlockEffectImpl; +import mage.abilities.effects.common.combat.CantAttackYouUnlessPayManaAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterEnchantmentPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author Simown + */ +public class CollectiveRestraint extends CardImpl { + + public CollectiveRestraint(UUID ownerId) { + super(ownerId, 49, "Collective Restraint", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + this.expansionSetCode = "INV"; + + // Domain - Creatures can't attack you unless their controller pays {X} for each creature he or she controls that's attacking you, where X is the number of basic land types you control. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CollectiveRestraintPayManaToAttackAllEffect())); + + } + + public CollectiveRestraint(final CollectiveRestraint card) { + super(card); + } + + @Override + public CollectiveRestraint copy() { + return new CollectiveRestraint(this); + } +} + +class CollectiveRestraintPayManaToAttackAllEffect extends CantAttackYouUnlessPayManaAllEffect { + + CollectiveRestraintPayManaToAttackAllEffect() { + super(null, true); + staticText = "Creatures can't attack you unless their controller pays {X} for each creature he or she controls that's attacking you, where X is the number of basic land types you control."; + } + + CollectiveRestraintPayManaToAttackAllEffect(CollectiveRestraintPayManaToAttackAllEffect effect) { + super(effect); + } + + @Override + public ManaCosts getManaCostToPay(GameEvent event, Ability source, Game game) { + int domainValue = new DomainValue().calculate(game, source, this); + if (domainValue > 0) { + return new ManaCostsImpl<>("{" + domainValue + "}"); + } + return null; + } + + @Override + public CollectiveRestraintPayManaToAttackAllEffect copy() { + return new CollectiveRestraintPayManaToAttackAllEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/planeshift/Draco.java b/Mage.Sets/src/mage/sets/planeshift/Draco.java new file mode 100644 index 00000000000..4de19ca60f4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/Draco.java @@ -0,0 +1,52 @@ +/* + * 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.planeshift; + +import java.util.UUID; + +/** + * + * @author Simown + */ +public class Draco extends mage.sets.ftvdragons.Draco { + + public Draco(UUID ownerId) { + super(ownerId); + this.cardNumber = 131; + this.expansionSetCode = "PLS"; + } + + public Draco(final Draco card) { + super(card); + } + + @Override + public Draco copy() { + return new Draco(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java b/Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java new file mode 100644 index 00000000000..c2fa8ef4db4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java @@ -0,0 +1,143 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.DomainValue; +import mage.abilities.effects.PreventionEffectImpl; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Simown + */ +public class SamitePilgrim extends CardImpl { + + public SamitePilgrim(UUID ownerId) { + super(ownerId, 15, "Samite Pilgrim", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Domain - {tap}: Prevent the next X damage that would be dealt to target creature this turn, where X is the number of basic land types among lands you control. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SamitePilgrimPreventDamageToTargetEffect(), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public SamitePilgrim(final SamitePilgrim card) { + super(card); + } + + @Override + public SamitePilgrim copy() { + return new SamitePilgrim(this); + } +} + +class SamitePilgrimPreventDamageToTargetEffect extends PreventionEffectImpl { + + protected int amount = 0; + + public SamitePilgrimPreventDamageToTargetEffect() { + super(Duration.EndOfTurn); + staticText = "Prevent the next X damage that would be dealt to target creature this turn, where X is the number of basic land types among lands you control."; + } + + public SamitePilgrimPreventDamageToTargetEffect(final SamitePilgrimPreventDamageToTargetEffect effect) { + super(effect); + this.amount = effect.amount; + } + + @Override + public SamitePilgrimPreventDamageToTargetEffect copy() { + return new SamitePilgrimPreventDamageToTargetEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + amount = new DomainValue().calculate(game, source, this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + boolean result = false; + int toPrevent = amount; + if (event.getAmount() < this.amount) { + toPrevent = event.getAmount(); + amount -= event.getAmount(); + } else { + amount = 0; + } + GameEvent preventEvent = new GameEvent(GameEvent.EventType.PREVENT_DAMAGE, source.getControllerId(), source.getSourceId(), source.getControllerId(), toPrevent, false); + if (!game.replaceEvent(preventEvent)) { + Permanent targetCreature = game.getPermanent(source.getFirstTarget()); + if (targetCreature != null) { + if (amount == 0) { + this.used = true; + this.discard(); + } + if (event.getAmount() >= toPrevent) { + event.setAmount(event.getAmount() - toPrevent); + } else { + event.setAmount(0); + result = true; + } + if (toPrevent > 0) { + game.informPlayers(new StringBuilder("Samite Pilgrim ").append("prevented ").append(toPrevent).append(" to ").append(targetCreature.getName()).toString()); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, + source.getControllerId(), source.getSourceId(), source.getControllerId(), toPrevent)); + } + } + } + return result; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return !this.used && super.applies(event, source, game) && event.getTargetId().equals(source.getFirstTarget()); + } + +} From 05a823d9c72b68001f87606b7506a62067387624 Mon Sep 17 00:00:00 2001 From: Simown Date: Tue, 21 Jul 2015 22:04:38 +0100 Subject: [PATCH 136/375] Fixed Matca Rioters to have P/T from the Domain value in all zones --- Mage.Sets/src/mage/sets/conflux/MatcaRioters.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java b/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java index be5574baeb2..c302f8a8a93 100644 --- a/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java +++ b/Mage.Sets/src/mage/sets/conflux/MatcaRioters.java @@ -33,7 +33,7 @@ import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.DomainValue; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; @@ -56,9 +56,9 @@ public class MatcaRioters extends CardImpl { this.toughness = new MageInt(0); // Domain - Matca Rioters's power and toughness are each equal to the number of basic land types among lands you control. - Effect effect = new BoostSourceEffect(new DomainValue(), new DomainValue(), Duration.EndOfGame); + Effect effect = new SetPowerToughnessSourceEffect(new DomainValue(), Duration.EndOfGame); effect.setText("Domain - {this}'s power and toughness are each equal to the number of basic land types among lands you control."); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + this.addAbility(new SimpleStaticAbility(Zone.ALL, effect)); } public MatcaRioters(final MatcaRioters card) { From f805f5111df167674d1fc7ed2a658e2b33266bdb Mon Sep 17 00:00:00 2001 From: fireshoes Date: Wed, 22 Jul 2015 00:16:23 -0500 Subject: [PATCH 137/375] Implmented 21 cards. Fixed Magus of the Tabernacle wrong duration. --- .../mage/sets/alliances/SoldeviDigger.java | 99 +++++++++++ .../src/mage/sets/futuresight/AugurIlVec.java | 75 ++++++++ .../src/mage/sets/judgment/LavaDart.java | 75 ++++++++ .../src/mage/sets/legends/LivingPlane.java | 74 ++++++++ .../sets/masterseditionii/SoldeviDigger.java | 54 ++++++ .../sets/masterseditioniii/LivingPlane.java | 52 ++++++ .../sets/mercadianmasques/ChoArrimLegate.java | 89 ++++++++++ .../sets/mercadianmasques/DeepwoodLegate.java | 87 ++++++++++ .../sets/mercadianmasques/Groundskeeper.java | 52 ++++++ .../sets/mercadianmasques/KyrenLegate.java | 83 +++++++++ .../sets/mercadianmasques/RushwoodLegate.java | 79 +++++++++ .../mercadianmasques/SaprazzanLegate.java | 84 +++++++++ .../mage/sets/mirrodin/VorracBattlehorns.java | 134 +++++++++++++++ Mage.Sets/src/mage/sets/nemesis/Massacre.java | 160 +++++++++--------- .../src/mage/sets/nemesis/MoggSalvage.java | 82 +++++++++ .../src/mage/sets/nemesis/RefreshingRain.java | 81 +++++++++ .../src/mage/sets/nemesis/SivvisRuse.java | 81 +++++++++ .../mage/sets/ninthedition/Groundskeeper.java | 71 ++++++++ .../planarchaos/MagusOfTheTabernacle.java | 154 ++++++++--------- .../mage/sets/planarchaos/RealityAcid.java | 118 +++++++++++++ .../sets/portalsecondage/NorwoodRiders.java | 64 +++++++ .../HuangZhongShuGeneral.java | 66 ++++++++ .../YuanShaoTheIndecisive.java | 71 ++++++++ .../src/mage/sets/ravnica/PerilousForays.java | 84 +++++++++ .../mage/sets/timespiral/TrespasserIlVec.java | 70 ++++++++ Mage.Sets/src/mage/sets/torment/CoralNet.java | 96 +++++++++++ 26 files changed, 2078 insertions(+), 157 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/alliances/SoldeviDigger.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/AugurIlVec.java create mode 100644 Mage.Sets/src/mage/sets/judgment/LavaDart.java create mode 100644 Mage.Sets/src/mage/sets/legends/LivingPlane.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/SoldeviDigger.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/LivingPlane.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/DeepwoodLegate.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/Groundskeeper.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/KyrenLegate.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/RushwoodLegate.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanLegate.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/MoggSalvage.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/RefreshingRain.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/SivvisRuse.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/Groundskeeper.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/NorwoodRiders.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/HuangZhongShuGeneral.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/YuanShaoTheIndecisive.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/PerilousForays.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/TrespasserIlVec.java create mode 100644 Mage.Sets/src/mage/sets/torment/CoralNet.java diff --git a/Mage.Sets/src/mage/sets/alliances/SoldeviDigger.java b/Mage.Sets/src/mage/sets/alliances/SoldeviDigger.java new file mode 100644 index 00000000000..e1b72ee1ae8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/SoldeviDigger.java @@ -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.alliances; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class SoldeviDigger extends CardImpl { + + public SoldeviDigger(UUID ownerId) { + super(ownerId, 174, "Soldevi Digger", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "ALL"; + + // {2}: Put the top card of your graveyard on the bottom of your library. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new SoldeviDiggerEffect(), new ManaCostsImpl("{2}"))); + } + + public SoldeviDigger(final SoldeviDigger card) { + super(card); + } + + @Override + public SoldeviDigger copy() { + return new SoldeviDigger(this); + } +} + +class SoldeviDiggerEffect extends OneShotEffect { + + public SoldeviDiggerEffect() { + super(Outcome.Benefit); + this.staticText = "put the top card of your graveyard on the bottom of your library"; + } + + public SoldeviDiggerEffect(final SoldeviDiggerEffect effect) { + super(effect); + } + + @Override + public SoldeviDiggerEffect copy() { + return new SoldeviDiggerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Card topCard = null; + for (Card card :controller.getGraveyard().getCards(game)) { + topCard = card; + } + if (topCard != null) { + return controller.moveCardToLibraryWithInfo(topCard, source.getSourceId(), game, Zone.GRAVEYARD, false, true); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/AugurIlVec.java b/Mage.Sets/src/mage/sets/futuresight/AugurIlVec.java new file mode 100644 index 00000000000..3b6ffb9b3e0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/AugurIlVec.java @@ -0,0 +1,75 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class AugurIlVec extends CardImpl { + + public AugurIlVec(UUID ownerId) { + super(ownerId, 2, "Augur il-Vec", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Shadow + this.addAbility(ShadowAbility.getInstance()); + + // Sacrifice Augur il-Vec: You gain 4 life. Activate this ability only during your upkeep. + this.addAbility(new ConditionalActivatedAbility(Zone.BATTLEFIELD, + new GainLifeEffect(4), + new SacrificeSourceCost(), + new IsStepCondition(PhaseStep.UPKEEP), null)); + } + + public AugurIlVec(final AugurIlVec card) { + super(card); + } + + @Override + public AugurIlVec copy() { + return new AugurIlVec(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/LavaDart.java b/Mage.Sets/src/mage/sets/judgment/LavaDart.java new file mode 100644 index 00000000000..0d992950f94 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/LavaDart.java @@ -0,0 +1,75 @@ +/* + * 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.judgment; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TimingRule; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class LavaDart extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Mountain"); + + static { + filter.add(new SubtypePredicate("Mountain")); + } + + public LavaDart(UUID ownerId) { + super(ownerId, 94, "Lava Dart", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{R}"); + this.expansionSetCode = "JUD"; + + // Lava Dart deals 1 damage to target creature or player. + this.getSpellAbility().addEffect(new DamageTargetEffect(1)); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + + // Flashback-Sacrifice a Mountain. + this.addAbility(new FlashbackAbility(new SacrificeTargetCost(new TargetControlledPermanent(filter)), TimingRule.INSTANT)); + } + + public LavaDart(final LavaDart card) { + super(card); + } + + @Override + public LavaDart copy() { + return new LavaDart(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/LivingPlane.java b/Mage.Sets/src/mage/sets/legends/LivingPlane.java new file mode 100644 index 00000000000..d495e69b3bc --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/LivingPlane.java @@ -0,0 +1,74 @@ +/* + * 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.legends; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BecomesCreatureAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.game.permanent.token.Token; + +/** + * + * @author fireshoes + */ +public class LivingPlane extends CardImpl { + + public LivingPlane(UUID ownerId) { + super(ownerId, 107, "Living Plane", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}"); + this.expansionSetCode = "LEG"; + this.supertype.add("World"); + + // All lands are 1/1 creatures that are still lands. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new LivingPlaneToken(), "lands", new FilterLandPermanent("lands"), Duration.WhileOnBattlefield))); + } + + public LivingPlane(final LivingPlane card) { + super(card); + } + + @Override + public LivingPlane copy() { + return new LivingPlane(this); + } +} + +class LivingPlaneToken extends Token { + public LivingPlaneToken() { + super("Land", "1/1 creature"); + cardType.add(CardType.CREATURE); + power = new MageInt(1); + toughness = new MageInt(1); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/masterseditionii/SoldeviDigger.java b/Mage.Sets/src/mage/sets/masterseditionii/SoldeviDigger.java new file mode 100644 index 00000000000..bc4d929132d --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/SoldeviDigger.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.masterseditionii; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class SoldeviDigger extends mage.sets.alliances.SoldeviDigger { + + public SoldeviDigger(UUID ownerId) { + super(ownerId); + this.cardNumber = 221; + this.expansionSetCode = "ME2"; + this.rarity = Rarity.UNCOMMON; + } + + public SoldeviDigger(final SoldeviDigger card) { + super(card); + } + + @Override + public SoldeviDigger copy() { + return new SoldeviDigger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/LivingPlane.java b/Mage.Sets/src/mage/sets/masterseditioniii/LivingPlane.java new file mode 100644 index 00000000000..65120905f42 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/LivingPlane.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class LivingPlane extends mage.sets.legends.LivingPlane { + + public LivingPlane(UUID ownerId) { + super(ownerId); + this.cardNumber = 127; + this.expansionSetCode = "ME3"; + } + + public LivingPlane(final LivingPlane card) { + super(card); + } + + @Override + public LivingPlane copy() { + return new LivingPlane(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java b/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java new file mode 100644 index 00000000000..cf007214a62 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java @@ -0,0 +1,89 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class ChoArrimLegate extends CardImpl { + + private static final FilterPermanent filterPlains = new FilterPermanent(); + private static final FilterPermanent filterSwamp = new FilterPermanent(); + private static final FilterCard filter = new FilterCard("Black"); + + static { + filterPlains.add(new SubtypePredicate(("Plains"))); + filterSwamp.add(new SubtypePredicate(("Swamp"))); + filter.add(new ColorPredicate(ObjectColor.BLACK)); + } + + public ChoArrimLegate(UUID ownerId) { + super(ownerId, 10, "Cho-Arrim Legate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Protection from black + this.addAbility(new ProtectionAbility(filter)); + + // If an opponent controls a Swamp and you control a Plains, you may cast Cho-Arrim Legate without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls a Swamp and you control a Plains", + new OpponentControlsPermanentCondition(filterSwamp), + new PermanentsOnTheBattlefieldCondition(filterPlains)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + } + + public ChoArrimLegate(final ChoArrimLegate card) { + super(card); + } + + @Override + public ChoArrimLegate copy() { + return new ChoArrimLegate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/DeepwoodLegate.java b/Mage.Sets/src/mage/sets/mercadianmasques/DeepwoodLegate.java new file mode 100644 index 00000000000..e6d3132a399 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/DeepwoodLegate.java @@ -0,0 +1,87 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class DeepwoodLegate extends CardImpl { + + private static final FilterPermanent filterForest = new FilterPermanent(); + private static final FilterPermanent filterSwamp = new FilterPermanent(); + + static { + filterForest.add(new SubtypePredicate(("Forest"))); + filterSwamp.add(new SubtypePredicate(("Swamp"))); + } + + public DeepwoodLegate(UUID ownerId) { + super(ownerId, 132, "Deepwood Legate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Shade"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // If an opponent controls a Forest and you control a Swamp, you may cast Deepwood Legate without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls a Forest and you control a Swamp", + new OpponentControlsPermanentCondition(filterForest), + new PermanentsOnTheBattlefieldCondition(filterSwamp)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + + // {B}: Deepwood Legate gets +1/+1 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{B}"))); + } + + public DeepwoodLegate(final DeepwoodLegate card) { + super(card); + } + + @Override + public DeepwoodLegate copy() { + return new DeepwoodLegate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Groundskeeper.java b/Mage.Sets/src/mage/sets/mercadianmasques/Groundskeeper.java new file mode 100644 index 00000000000..3c4157e5900 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Groundskeeper.java @@ -0,0 +1,52 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Groundskeeper extends mage.sets.ninthedition.Groundskeeper { + + public Groundskeeper(UUID ownerId) { + super(ownerId); + this.cardNumber = 250; + this.expansionSetCode = "MMQ"; + } + + public Groundskeeper(final Groundskeeper card) { + super(card); + } + + @Override + public Groundskeeper copy() { + return new Groundskeeper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/KyrenLegate.java b/Mage.Sets/src/mage/sets/mercadianmasques/KyrenLegate.java new file mode 100644 index 00000000000..2ab15e70803 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/KyrenLegate.java @@ -0,0 +1,83 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class KyrenLegate extends CardImpl { + + private static final FilterPermanent filterPlains = new FilterPermanent(); + private static final FilterPermanent filterMountain = new FilterPermanent(); + + static { + filterPlains.add(new SubtypePredicate(("Plains"))); + filterMountain.add(new SubtypePredicate(("Mountain"))); + } + + public KyrenLegate(UUID ownerId) { + super(ownerId, 197, "Kyren Legate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Goblin"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // If an opponent controls a Plains and you control a Mountain, you may cast Kyren Legate without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls a Plains and you control a Mountain", + new OpponentControlsPermanentCondition(filterPlains), + new PermanentsOnTheBattlefieldCondition(filterMountain)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + } + + public KyrenLegate(final KyrenLegate card) { + super(card); + } + + @Override + public KyrenLegate copy() { + return new KyrenLegate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/RushwoodLegate.java b/Mage.Sets/src/mage/sets/mercadianmasques/RushwoodLegate.java new file mode 100644 index 00000000000..7283f179eae --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/RushwoodLegate.java @@ -0,0 +1,79 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class RushwoodLegate extends CardImpl { + + private static final FilterPermanent filterIsland = new FilterPermanent(); + private static final FilterPermanent filterForest = new FilterPermanent(); + + static { + filterForest.add(new SubtypePredicate(("Forest"))); + filterIsland.add(new SubtypePredicate(("Island"))); + } + + public RushwoodLegate(UUID ownerId) { + super(ownerId, 266, "Rushwood Legate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Dryad"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // If an opponent controls an Island and you control a Forest, you may cast Rushwood Legate without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls an Island and you control a Forest", + new OpponentControlsPermanentCondition(filterIsland), + new PermanentsOnTheBattlefieldCondition(filterForest)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + } + + public RushwoodLegate(final RushwoodLegate card) { + super(card); + } + + @Override + public RushwoodLegate copy() { + return new RushwoodLegate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanLegate.java b/Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanLegate.java new file mode 100644 index 00000000000..cdc5afabcb2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanLegate.java @@ -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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class SaprazzanLegate extends CardImpl { + + private static final FilterPermanent filterMountain = new FilterPermanent(); + private static final FilterPermanent filterIsland = new FilterPermanent(); + + static { + filterMountain.add(new SubtypePredicate(("Mountain"))); + filterIsland.add(new SubtypePredicate(("Island"))); + } + + public SaprazzanLegate(UUID ownerId) { + super(ownerId, 100, "Saprazzan Legate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Merfolk"); + this.subtype.add("Soldier"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // If an opponent controls a Mountain and you control an Island, you may cast Saprazzan Legate without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls a Mountain and you control an Island", + new OpponentControlsPermanentCondition(filterMountain), + new PermanentsOnTheBattlefieldCondition(filterIsland)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + } + + public SaprazzanLegate(final SaprazzanLegate card) { + super(card); + } + + @Override + public SaprazzanLegate copy() { + return new SaprazzanLegate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java new file mode 100644 index 00000000000..0ad2534db0c --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java @@ -0,0 +1,134 @@ +/* + * 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.mirrodin; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +/** + * + * @author fireshoes + */ +public class VorracBattlehorns extends CardImpl { + + public VorracBattlehorns(UUID ownerId) { + super(ownerId, 271, "Vorrac Battlehorns", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "MRD"; + this.subtype.add("Equipment"); + + // Equipped creature has trample and can't be blocked by more than one creature. + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.EQUIPMENT)); + ability.addEffect(new CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType.EQUIPMENT, 1)); + this.addAbility(ability); + + // Equip {1} + this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(1))); + } + + public VorracBattlehorns(final VorracBattlehorns card) { + super(card); + } + + @Override + public VorracBattlehorns copy() { + return new VorracBattlehorns(this); + } +} + +class CantBeBlockedByMoreThanOneAttachedEffect extends ContinuousEffectImpl { + + protected int amount; + protected AttachmentType attachmentType; + + public CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType attachmentType, int amount) { + this(attachmentType, amount, Duration.WhileOnBattlefield); + } + + public CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType attachmentType, int amount, Duration duration) { + super(duration, Outcome.Benefit); + this.amount = amount; + this.attachmentType = attachmentType; + staticText = (attachmentType.equals(AttachmentType.AURA) ? "Enchanted" : "Equipped") + " creature can't be blocked by more than " + CardUtil.numberToText(amount) + " creature" + (amount==1 ?"":"s"); + } + + public CantBeBlockedByMoreThanOneAttachedEffect(final CantBeBlockedByMoreThanOneAttachedEffect effect) { + super(effect); + this.amount = effect.amount; + this.attachmentType = effect.attachmentType; + } + + @Override + public CantBeBlockedByMoreThanOneAttachedEffect copy() { + return new CantBeBlockedByMoreThanOneAttachedEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + switch (layer) { + case RulesEffects: + Permanent attachment = game.getPermanent(source.getSourceId()); + if (attachment != null && attachment.getAttachedTo() != null) { + Permanent perm = game.getPermanent(attachment.getAttachedTo()); + if (perm != null) { + perm.setMaxBlockedBy(amount); + return true; + } + } + break; + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.RulesEffects; + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/Massacre.java b/Mage.Sets/src/mage/sets/nemesis/Massacre.java index ded7f68f0d6..45412174b20 100644 --- a/Mage.Sets/src/mage/sets/nemesis/Massacre.java +++ b/Mage.Sets/src/mage/sets/nemesis/Massacre.java @@ -1,80 +1,80 @@ -/* - * 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.nemesis; - -import java.util.UUID; -import mage.abilities.condition.CompoundCondition; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.condition.common.OpponentControlsPermanentCondition; -import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.effects.common.continuous.BoostAllEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; -import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; - -/** - * - * @author Plopman - */ -public class Massacre extends CardImpl { - - private static final FilterPermanent filterPlains = new FilterPermanent(); - private static final FilterPermanent filterSwamp = new FilterPermanent(); - - static { - filterPlains.add(new SubtypePredicate(("Plains"))); - filterSwamp.add(new SubtypePredicate(("Swamp"))); - } - - public Massacre(UUID ownerId) { - super(ownerId, 58, "Massacre", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{B}{B}"); - this.expansionSetCode = "NMS"; - - - // If an opponent controls a Plains and you control a Swamp, you may cast Massacre without paying its mana cost. - Condition condition = new CompoundCondition("If an opponent controls a Plains and you control a Swamp", - new OpponentControlsPermanentCondition(filterPlains), - new PermanentsOnTheBattlefieldCondition(filterSwamp)); - this.addAbility(new AlternativeCostSourceAbility(null, condition)); - // All creatures get -2/-2 until end of turn. - this.getSpellAbility().addEffect(new BoostAllEffect(-2, -2, Duration.EndOfTurn)); - } - - public Massacre(final Massacre card) { - super(card); - } - - @Override - public Massacre copy() { - return new Massacre(this); - } -} +/* + * 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.nemesis; + +import java.util.UUID; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author Plopman + */ +public class Massacre extends CardImpl { + + private static final FilterPermanent filterPlains = new FilterPermanent(); + private static final FilterPermanent filterSwamp = new FilterPermanent(); + + static { + filterPlains.add(new SubtypePredicate(("Plains"))); + filterSwamp.add(new SubtypePredicate(("Swamp"))); + } + + public Massacre(UUID ownerId) { + super(ownerId, 58, "Massacre", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{B}{B}"); + this.expansionSetCode = "NMS"; + + + // If an opponent controls a Plains and you control a Swamp, you may cast Massacre without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls a Plains and you control a Swamp", + new OpponentControlsPermanentCondition(filterPlains), + new PermanentsOnTheBattlefieldCondition(filterSwamp)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + // All creatures get -2/-2 until end of turn. + this.getSpellAbility().addEffect(new BoostAllEffect(-2, -2, Duration.EndOfTurn)); + } + + public Massacre(final Massacre card) { + super(card); + } + + @Override + public Massacre copy() { + return new Massacre(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/MoggSalvage.java b/Mage.Sets/src/mage/sets/nemesis/MoggSalvage.java new file mode 100644 index 00000000000..2ea3f3643b6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/MoggSalvage.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.nemesis; + +import java.util.UUID; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class MoggSalvage extends CardImpl { + + private static final FilterPermanent filterMountain = new FilterPermanent(); + private static final FilterPermanent filterIsland = new FilterPermanent(); + + static { + filterMountain.add(new SubtypePredicate(("Mountain"))); + filterIsland.add(new SubtypePredicate(("Island"))); + } + + public MoggSalvage(UUID ownerId) { + super(ownerId, 94, "Mogg Salvage", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{R}"); + this.expansionSetCode = "NMS"; + + // If an opponent controls an Island and you control a Mountain, you may cast Mogg Salvage without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls an Island and you control a Mountain", + new OpponentControlsPermanentCondition(filterIsland), + new PermanentsOnTheBattlefieldCondition(filterMountain)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + + // Destroy target artifact. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactPermanent())); + } + + public MoggSalvage(final MoggSalvage card) { + super(card); + } + + @Override + public MoggSalvage copy() { + return new MoggSalvage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/RefreshingRain.java b/Mage.Sets/src/mage/sets/nemesis/RefreshingRain.java new file mode 100644 index 00000000000..1e48e618691 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/RefreshingRain.java @@ -0,0 +1,81 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.effects.common.GainLifeTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class RefreshingRain extends CardImpl { + + private static final FilterPermanent filterForest = new FilterPermanent(); + private static final FilterPermanent filterSwamp = new FilterPermanent(); + + static { + filterForest.add(new SubtypePredicate(("Forest"))); + filterSwamp.add(new SubtypePredicate(("Swamp"))); + } + + public RefreshingRain(UUID ownerId) { + super(ownerId, 110, "Refreshing Rain", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{G}"); + this.expansionSetCode = "NMS"; + + // If an opponent controls a Swamp and you control a Forest, you may cast Refreshing Rain without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls a Swamp and you control a Forest", + new OpponentControlsPermanentCondition(filterSwamp), + new PermanentsOnTheBattlefieldCondition(filterForest)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + + // Target player gains 6 life. + this.getSpellAbility().addEffect(new GainLifeTargetEffect(6)); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public RefreshingRain(final RefreshingRain card) { + super(card); + } + + @Override + public RefreshingRain copy() { + return new RefreshingRain(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/SivvisRuse.java b/Mage.Sets/src/mage/sets/nemesis/SivvisRuse.java new file mode 100644 index 00000000000..05598de0e6d --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/SivvisRuse.java @@ -0,0 +1,81 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsPermanentCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.effects.common.PreventAllDamageToAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreatureInPlay; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class SivvisRuse extends CardImpl { + + private static final FilterPermanent filterMountain = new FilterPermanent(); + private static final FilterPermanent filterPlains = new FilterPermanent(); + + static { + filterMountain.add(new SubtypePredicate(("Mountain"))); + filterPlains.add(new SubtypePredicate(("Plains"))); + } + + public SivvisRuse(UUID ownerId) { + super(ownerId, 21, "Sivvi's Ruse", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}{W}"); + this.expansionSetCode = "NMS"; + + // If an opponent controls a Mountain and you control a Plains, you may cast Sivvi's Ruse without paying its mana cost. + Condition condition = new CompoundCondition("If an opponent controls a Mountain and you control a Plains", + new OpponentControlsPermanentCondition(filterMountain), + new PermanentsOnTheBattlefieldCondition(filterPlains)); + this.addAbility(new AlternativeCostSourceAbility(null, condition)); + + // Prevent all damage that would be dealt this turn to creatures you control. + this.getSpellAbility().addEffect(new PreventAllDamageToAllEffect(Duration.EndOfTurn, new FilterControlledCreatureInPlay())); + } + + public SivvisRuse(final SivvisRuse card) { + super(card); + } + + @Override + public SivvisRuse copy() { + return new SivvisRuse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/Groundskeeper.java b/Mage.Sets/src/mage/sets/ninthedition/Groundskeeper.java new file mode 100644 index 00000000000..a447da81b88 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/Groundskeeper.java @@ -0,0 +1,71 @@ +/* + * 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.ninthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterBasicLandCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class Groundskeeper extends CardImpl { + + public Groundskeeper(UUID ownerId) { + super(ownerId, 247, "Groundskeeper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{G}"); + this.expansionSetCode = "9ED"; + this.subtype.add("Human"); + this.subtype.add("Druid"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}{G}: Return target basic land card from your graveyard to your hand. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new ManaCostsImpl("{1}{G}")); + ability.addTarget(new TargetCardInYourGraveyard(new FilterBasicLandCard("basic land card from your graveyard"))); + this.addAbility(ability); + } + + public Groundskeeper(final Groundskeeper card) { + super(card); + } + + @Override + public Groundskeeper copy() { + return new Groundskeeper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheTabernacle.java b/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheTabernacle.java index 96580e1a7d3..b71a27efed8 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheTabernacle.java +++ b/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheTabernacle.java @@ -1,77 +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.planarchaos; - -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; -import mage.abilities.effects.common.continuous.GainAbilityAllEffect; -import mage.cards.CardImpl; -import mage.filter.common.FilterCreaturePermanent; - -/** - * - * @author LevelX2 - */ -public class MagusOfTheTabernacle extends CardImpl { - - static private final String rule = "All creatures have \"At the beginning of your upkeep, sacrifice this creature unless you pay {1}\""; - - public MagusOfTheTabernacle(UUID ownerId) { - super(ownerId, 8, "Magus of the Tabernacle", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{W}"); - this.expansionSetCode = "PLC"; - this.subtype.add("Human"); - this.subtype.add("Wizard"); - - this.color.setWhite(true); - this.power = new MageInt(2); - this.toughness = new MageInt(6); - - // All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." - Ability abilityToGain = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new GenericManaCost(1)), TargetController.YOU, false); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(abilityToGain, Duration.WhileInGraveyard, new FilterCreaturePermanent(), rule))); - } - - public MagusOfTheTabernacle(final MagusOfTheTabernacle card) { - super(card); - } - - @Override - public MagusOfTheTabernacle copy() { - return new MagusOfTheTabernacle(this); - } -} +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class MagusOfTheTabernacle extends CardImpl { + + static private final String rule = "All creatures have \"At the beginning of your upkeep, sacrifice this creature unless you pay {1}\""; + + public MagusOfTheTabernacle(UUID ownerId) { + super(ownerId, 8, "Magus of the Tabernacle", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.color.setWhite(true); + this.power = new MageInt(2); + this.toughness = new MageInt(6); + + // All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." + Ability abilityToGain = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new GenericManaCost(1)), TargetController.YOU, false); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(abilityToGain, Duration.WhileOnBattlefield, new FilterCreaturePermanent(), rule))); + } + + public MagusOfTheTabernacle(final MagusOfTheTabernacle card) { + super(card); + } + + @Override + public MagusOfTheTabernacle copy() { + return new MagusOfTheTabernacle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java new file mode 100644 index 00000000000..efce801ac89 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java @@ -0,0 +1,118 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class RealityAcid extends CardImpl { + + public RealityAcid(UUID ownerId) { + super(ownerId, 45, "Reality Acid", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Aura"); + + // Enchant permanent + TargetPermanent auraTarget = new TargetPermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.GainControl)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Vanishing 3 + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3)))); + this.addAbility(new VanishingUpkeepAbility(3)); + this.addAbility(new VanishingSacrificeAbility()); + + // When Reality Acid leaves the battlefield, enchanted permanent's controller sacrifices it. + this.addAbility(new LeavesBattlefieldTriggeredAbility(new RealityAcidLeavesBattlefieldTriggeredEffect(), false)); + } + + public RealityAcid(final RealityAcid card) { + super(card); + } + + @Override + public RealityAcid copy() { + return new RealityAcid(this); + } +} + +class RealityAcidLeavesBattlefieldTriggeredEffect extends OneShotEffect { + + public RealityAcidLeavesBattlefieldTriggeredEffect() { + super(Outcome.Benefit); + this.staticText = "enchanted permanent's controller sacrifices it"; + } + + public RealityAcidLeavesBattlefieldTriggeredEffect(final RealityAcidLeavesBattlefieldTriggeredEffect effect) { + super(effect); + } + + @Override + public RealityAcidLeavesBattlefieldTriggeredEffect copy() { + return new RealityAcidLeavesBattlefieldTriggeredEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (controller != null && sourcePermanent != null) { + if (sourcePermanent.getAttachedTo() != null) { + Permanent attachedTo = game.getPermanent(sourcePermanent.getAttachedTo()); + if (attachedTo != null) { + attachedTo.sacrifice(source.getSourceId(), game); + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/portalsecondage/NorwoodRiders.java b/Mage.Sets/src/mage/sets/portalsecondage/NorwoodRiders.java new file mode 100644 index 00000000000..0fdf6682c23 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/NorwoodRiders.java @@ -0,0 +1,64 @@ +/* + * 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.portalsecondage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class NorwoodRiders extends CardImpl { + + public NorwoodRiders(UUID ownerId) { + super(ownerId, 79, "Norwood Riders", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "PO2"; + this.subtype.add("Elf"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Norwood Riders can't be blocked by more than one creature. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByMoreThanOneSourceEffect())); + } + + public NorwoodRiders(final NorwoodRiders card) { + super(card); + } + + @Override + public NorwoodRiders copy() { + return new NorwoodRiders(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/HuangZhongShuGeneral.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/HuangZhongShuGeneral.java new file mode 100644 index 00000000000..5eb6e23db0e --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/HuangZhongShuGeneral.java @@ -0,0 +1,66 @@ +/* + * 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.portalthreekingdoms; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class HuangZhongShuGeneral extends CardImpl { + + public HuangZhongShuGeneral(UUID ownerId) { + super(ownerId, 8, "Huang Zhong, Shu General", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); + this.expansionSetCode = "PTK"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Huang Zhong, Shu General can't be blocked by more than one creature. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByMoreThanOneSourceEffect())); + } + + public HuangZhongShuGeneral(final HuangZhongShuGeneral card) { + super(card); + } + + @Override + public HuangZhongShuGeneral copy() { + return new HuangZhongShuGeneral(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/YuanShaoTheIndecisive.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/YuanShaoTheIndecisive.java new file mode 100644 index 00000000000..b1870e08954 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/YuanShaoTheIndecisive.java @@ -0,0 +1,71 @@ +/* + * 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.portalthreekingdoms; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneAllEffect; +import mage.abilities.keyword.HorsemanshipAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class YuanShaoTheIndecisive extends CardImpl { + + public YuanShaoTheIndecisive(UUID ownerId) { + super(ownerId, 128, "Yuan Shao, the Indecisive", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{R}"); + this.expansionSetCode = "PTK"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Horsemanship + this.addAbility(HorsemanshipAbility.getInstance()); + + // Each creature you control can't be blocked by more than one creature. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByMoreThanOneAllEffect(new FilterControlledCreaturePermanent()))); + } + + public YuanShaoTheIndecisive(final YuanShaoTheIndecisive card) { + super(card); + } + + @Override + public YuanShaoTheIndecisive copy() { + return new YuanShaoTheIndecisive(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/PerilousForays.java b/Mage.Sets/src/mage/sets/ravnica/PerilousForays.java new file mode 100644 index 00000000000..452c6e1f7af --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/PerilousForays.java @@ -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.ravnica; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class PerilousForays extends CardImpl { + + private static final FilterLandCard filter = new FilterLandCard("land card with a basic land type"); + + static { + filter.add(Predicates.or( + new SubtypePredicate("Plains"), + new SubtypePredicate("Island"), + new SubtypePredicate("Swamp"), + new SubtypePredicate("Forest"), + new SubtypePredicate("Mountain"))); + } + + public PerilousForays(UUID ownerId) { + super(ownerId, 176, "Perilous Forays", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{G}"); + this.expansionSetCode = "RAV"; + + // {1}, Sacrifice a creature: Search your library for a land card with a basic land type and put it onto the battlefield tapped. Then shuffle your library. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true, Outcome.PutLandInPlay), + new ManaCostsImpl("{1}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + this.addAbility(ability); + } + + public PerilousForays(final PerilousForays card) { + super(card); + } + + @Override + public PerilousForays copy() { + return new PerilousForays(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/TrespasserIlVec.java b/Mage.Sets/src/mage/sets/timespiral/TrespasserIlVec.java new file mode 100644 index 00000000000..aa4bd8a938f --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/TrespasserIlVec.java @@ -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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class TrespasserIlVec extends CardImpl { + + public TrespasserIlVec(UUID ownerId) { + super(ownerId, 138, "Trespasser il-Vec", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Discard a card: Trespasser il-Vec gains shadow until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new GainAbilitySourceEffect(ShadowAbility.getInstance(), Duration.EndOfTurn), + new DiscardCardCost())); + } + + public TrespasserIlVec(final TrespasserIlVec card) { + super(card); + } + + @Override + public TrespasserIlVec copy() { + return new TrespasserIlVec(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/CoralNet.java b/Mage.Sets/src/mage/sets/torment/CoralNet.java new file mode 100644 index 00000000000..154f49307c2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/CoralNet.java @@ -0,0 +1,96 @@ +/* + * 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.torment; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CoralNet extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("green or white creature"); + + static { + filter.add(Predicates.or( + new ColorPredicate(ObjectColor.WHITE), + new ColorPredicate(ObjectColor.GREEN))); + } + + static private final String rule = "Enchanted creature has \"At the beginning of your upkeep, sacrifice this creature unless you discard a card.\""; + + public CoralNet(UUID ownerId) { + super(ownerId, 35, "Coral Net", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Aura"); + + // Enchant green or white creature + TargetPermanent auraTarget = new TargetCreaturePermanent(filter); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // Enchanted creature has "At the beginning of your upkeep, sacrifice this creature unless you discard a card." + Ability abilityToGain = new BeginningOfUpkeepTriggeredAbility( + new SacrificeSourceUnlessPaysEffect(new DiscardCardCost()), TargetController.YOU, false); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new GainAbilityAttachedEffect(abilityToGain, AttachmentType.AURA, Duration.WhileOnBattlefield, rule))); + } + + public CoralNet(final CoralNet card) { + super(card); + } + + @Override + public CoralNet copy() { + return new CoralNet(this); + } +} From 929a95a74d1b77b96a3214f621748b0a5c6e5021 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Wed, 22 Jul 2015 01:46:00 -0500 Subject: [PATCH 138/375] Added effect.setText to Vorrac Battlehorns and Alpha Authority. Removed capitalization from black on Cho-Arrim Legate and Knight of Glory. --- .../mage/sets/gatecrash/AlphaAuthority.java | 286 +++++++++--------- .../mage/sets/magic2013/KnightOfGlory.java | 154 +++++----- .../sets/mercadianmasques/ChoArrimLegate.java | 2 +- .../mage/sets/mirrodin/VorracBattlehorns.java | 5 +- 4 files changed, 226 insertions(+), 221 deletions(-) diff --git a/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java b/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java index c80d59df1c4..06000331586 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java +++ b/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java @@ -1,142 +1,144 @@ -/* - * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of BetaSteward_at_googlemail.com. - */ -package mage.sets.gatecrash; - -import java.util.UUID; - -import mage.constants.AttachmentType; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.SubLayer; -import mage.constants.Zone; -import mage.abilities.Ability; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; -import mage.abilities.keyword.EnchantAbility; -import mage.abilities.keyword.HexproofAbility; -import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.TargetPermanent; -import mage.target.common.TargetCreaturePermanent; -import mage.util.CardUtil; - -/** - * - * @author LevelX2 - */ -public class AlphaAuthority extends CardImpl { - - public AlphaAuthority(UUID ownerId) { - super(ownerId, 114, "Alpha Authority", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); - this.expansionSetCode = "GTC"; - - this.subtype.add("Aura"); - - // Enchant creature - TargetPermanent auraTarget = new TargetCreaturePermanent(); - this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); - Ability ability = new EnchantAbility(auraTarget.getTargetName()); - this.addAbility(ability); - - // Enchanted creature has hexproof and can't be blocked by more than one creature. - ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HexproofAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield)); - ability.addEffect(new CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType.AURA,1)); - this.addAbility(ability); - } - - public AlphaAuthority(final AlphaAuthority card) { - super(card); - } - - @Override - public AlphaAuthority copy() { - return new AlphaAuthority(this); - } -} - -class CantBeBlockedByMoreThanOneAttachedEffect extends ContinuousEffectImpl { - - protected int amount; - protected AttachmentType attachmentType; - - public CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType attachmentType, int amount) { - this(attachmentType, amount, Duration.WhileOnBattlefield); - } - - public CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType attachmentType, int amount, Duration duration) { - super(duration, Outcome.Benefit); - this.amount = amount; - this.attachmentType = attachmentType; - staticText = (attachmentType.equals(AttachmentType.AURA) ? "Enchanted" : "Equipped") + " creature can't be blocked by more than " + CardUtil.numberToText(amount) + " creature" + (amount==1 ?"":"s"); - } - - public CantBeBlockedByMoreThanOneAttachedEffect(final CantBeBlockedByMoreThanOneAttachedEffect effect) { - super(effect); - this.amount = effect.amount; - this.attachmentType = effect.attachmentType; - } - - @Override - public CantBeBlockedByMoreThanOneAttachedEffect copy() { - return new CantBeBlockedByMoreThanOneAttachedEffect(this); - } - - @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - switch (layer) { - case RulesEffects: - Permanent attachment = game.getPermanent(source.getSourceId()); - if (attachment != null && attachment.getAttachedTo() != null) { - Permanent perm = game.getPermanent(attachment.getAttachedTo()); - if (perm != null) { - perm.setMaxBlockedBy(amount); - return true; - } - } - break; - } - return false; - } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public boolean hasLayer(Layer layer) { - return layer == Layer.RulesEffects; - } -} +/* + * 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.gatecrash; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.HexproofAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; + +/** + * + * @author LevelX2 + */ +public class AlphaAuthority extends CardImpl { + + public AlphaAuthority(UUID ownerId) { + super(ownerId, 114, "Alpha Authority", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + this.expansionSetCode = "GTC"; + + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature has hexproof and can't be blocked by more than one creature. + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HexproofAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield)); + Effect effect = new CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType.AURA,1); + effect.setText(" and can't be blocked by more than one creature"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public AlphaAuthority(final AlphaAuthority card) { + super(card); + } + + @Override + public AlphaAuthority copy() { + return new AlphaAuthority(this); + } +} + +class CantBeBlockedByMoreThanOneAttachedEffect extends ContinuousEffectImpl { + + protected int amount; + protected AttachmentType attachmentType; + + public CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType attachmentType, int amount) { + this(attachmentType, amount, Duration.WhileOnBattlefield); + } + + public CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType attachmentType, int amount, Duration duration) { + super(duration, Outcome.Benefit); + this.amount = amount; + this.attachmentType = attachmentType; + staticText = (attachmentType.equals(AttachmentType.AURA) ? "Enchanted" : "Equipped") + " creature can't be blocked by more than " + CardUtil.numberToText(amount) + " creature" + (amount==1 ?"":"s"); + } + + public CantBeBlockedByMoreThanOneAttachedEffect(final CantBeBlockedByMoreThanOneAttachedEffect effect) { + super(effect); + this.amount = effect.amount; + this.attachmentType = effect.attachmentType; + } + + @Override + public CantBeBlockedByMoreThanOneAttachedEffect copy() { + return new CantBeBlockedByMoreThanOneAttachedEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + switch (layer) { + case RulesEffects: + Permanent attachment = game.getPermanent(source.getSourceId()); + if (attachment != null && attachment.getAttachedTo() != null) { + Permanent perm = game.getPermanent(attachment.getAttachedTo()); + if (perm != null) { + perm.setMaxBlockedBy(amount); + return true; + } + } + break; + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.RulesEffects; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2013/KnightOfGlory.java b/Mage.Sets/src/mage/sets/magic2013/KnightOfGlory.java index 53572bddc40..eec4e15a582 100644 --- a/Mage.Sets/src/mage/sets/magic2013/KnightOfGlory.java +++ b/Mage.Sets/src/mage/sets/magic2013/KnightOfGlory.java @@ -1,77 +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.magic2013; - -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.MageInt; -import mage.ObjectColor; -import mage.abilities.keyword.ExaltedAbility; -import mage.abilities.keyword.ProtectionAbility; -import mage.cards.CardImpl; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.ColorPredicate; - -/** - * - * @author jeffwadsworth - */ -public class KnightOfGlory extends CardImpl { - - private static final FilterCard filter = new FilterCard("Black"); - - static { - filter.add(new ColorPredicate(ObjectColor.BLACK)); - } - - public KnightOfGlory(UUID ownerId) { - super(ownerId, 21, "Knight of Glory", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); - this.expansionSetCode = "M13"; - this.subtype.add("Human"); - this.subtype.add("Knight"); - - this.power = new MageInt(2); - this.toughness = new MageInt(1); - - // Protection from black - this.addAbility(new ProtectionAbility(filter)); - - // Exalted - this.addAbility(new ExaltedAbility()); - } - - public KnightOfGlory(final KnightOfGlory card) { - super(card); - } - - @Override - public KnightOfGlory copy() { - return new KnightOfGlory(this); - } -} +/* + * 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.magic2013; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.keyword.ExaltedAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author jeffwadsworth + */ +public class KnightOfGlory extends CardImpl { + + private static final FilterCard filter = new FilterCard("black"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLACK)); + } + + public KnightOfGlory(UUID ownerId) { + super(ownerId, 21, "Knight of Glory", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "M13"; + this.subtype.add("Human"); + this.subtype.add("Knight"); + + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Protection from black + this.addAbility(new ProtectionAbility(filter)); + + // Exalted + this.addAbility(new ExaltedAbility()); + } + + public KnightOfGlory(final KnightOfGlory card) { + super(card); + } + + @Override + public KnightOfGlory copy() { + return new KnightOfGlory(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java b/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java index cf007214a62..208c1e41a3f 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimLegate.java @@ -52,7 +52,7 @@ public class ChoArrimLegate extends CardImpl { private static final FilterPermanent filterPlains = new FilterPermanent(); private static final FilterPermanent filterSwamp = new FilterPermanent(); - private static final FilterCard filter = new FilterCard("Black"); + private static final FilterCard filter = new FilterCard("black"); static { filterPlains.add(new SubtypePredicate(("Plains"))); diff --git a/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java index 0ad2534db0c..33236990398 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java @@ -32,6 +32,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.TrampleAbility; @@ -61,7 +62,9 @@ public class VorracBattlehorns extends CardImpl { // Equipped creature has trample and can't be blocked by more than one creature. Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.EQUIPMENT)); - ability.addEffect(new CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType.EQUIPMENT, 1)); + Effect effect = new CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType.EQUIPMENT, 1); + effect.setText(" and can't be blocked by more than one creature"); + ability.addEffect(effect); this.addAbility(ability); // Equip {1} From 5da1efa877a03568287f7457f05f1047ad2af623 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 22 Jul 2015 12:22:47 +0300 Subject: [PATCH 139/375] Implement cards: Foul Presence, Fungal Shambler, Shimmering Mirage, and Suffocating Blast --- .../mage/sets/apocalypse/FoulPresence.java | 87 +++++++++++++++++++ .../mage/sets/apocalypse/FungalShambler.java | 76 ++++++++++++++++ .../sets/apocalypse/ShimmeringMirage.java | 64 ++++++++++++++ .../sets/apocalypse/SuffocatingBlast.java | 67 ++++++++++++++ .../sets/prereleaseevents/FungalShambler.java | 54 ++++++++++++ 5 files changed, 348 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/FoulPresence.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/ShimmeringMirage.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/SuffocatingBlast.java create mode 100644 Mage.Sets/src/mage/sets/prereleaseevents/FungalShambler.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/FoulPresence.java b/Mage.Sets/src/mage/sets/apocalypse/FoulPresence.java new file mode 100644 index 00000000000..67ad72ed4e1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/FoulPresence.java @@ -0,0 +1,87 @@ +/* + * 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.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class FoulPresence extends CardImpl { + + public FoulPresence(UUID ownerId) { + super(ownerId, 39, "Foul Presence", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + this.expansionSetCode = "APC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.UnboostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature gets -1/-1 and has "{T}: Target creature gets -1/-1 until end of turn." + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(-1, -1, Duration.WhileOnBattlefield)); + Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BoostTargetEffect(-1, -1, Duration.EndOfTurn), new TapSourceCost()); + gainedAbility.addTarget(new TargetCreaturePermanent()); + Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); + effect.setText("and has \"{T}: Target creature gets -1/-1 until end of turn.\""); + ability.addEffect(effect); + this.addAbility(ability); + } + + public FoulPresence(final FoulPresence card) { + super(card); + } + + @Override + public FoulPresence copy() { + return new FoulPresence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java b/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java new file mode 100644 index 00000000000..e8f9d48bd5d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java @@ -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.apocalypse; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class FungalShambler extends CardImpl { + + public FungalShambler(UUID ownerId) { + super(ownerId, 100, "Fungal Shambler", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{G}{U}{B}"); + this.expansionSetCode = "APC"; + this.subtype.add("Fungus"); + this.subtype.add("Beast"); + this.power = new MageInt(6); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + // Whenever Fungal Shambler deals damage to an opponent, you draw a card and that opponent discards a card. + Effect effect = new DrawCardSourceControllerEffect(1); + effect.setText("you draw a card"); + Ability ability = new DealsDamageToOpponentTriggeredAbility(effect, false); + effect = new DiscardTargetEffect(1); + effect.setText("and that opponent discards a card"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public FungalShambler(final FungalShambler card) { + super(card); + } + + @Override + public FungalShambler copy() { + return new FungalShambler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/ShimmeringMirage.java b/Mage.Sets/src/mage/sets/apocalypse/ShimmeringMirage.java new file mode 100644 index 00000000000..34e9fd56802 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/ShimmeringMirage.java @@ -0,0 +1,64 @@ +/* + * 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.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LoneFox + */ +public class ShimmeringMirage extends CardImpl { + + public ShimmeringMirage(UUID ownerId) { + super(ownerId, 30, "Shimmering Mirage", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "APC"; + + // Target land becomes the basic land type of your choice until end of turn. + this.getSpellAbility().addEffect(new BecomesBasicLandTargetEffect(Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetLandPermanent()); + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public ShimmeringMirage(final ShimmeringMirage card) { + super(card); + } + + @Override + public ShimmeringMirage copy() { + return new ShimmeringMirage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/SuffocatingBlast.java b/Mage.Sets/src/mage/sets/apocalypse/SuffocatingBlast.java new file mode 100644 index 00000000000..b0e3f6ee67e --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/SuffocatingBlast.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.apocalypse; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetSpell; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class SuffocatingBlast extends CardImpl { + + public SuffocatingBlast(UUID ownerId) { + super(ownerId, 124, "Suffocating Blast", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{U}{U}{R}"); + this.expansionSetCode = "APC"; + + // Counter target spell and Suffocating Blast deals 3 damage to target creature. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetSpell()); + Effect effect = new DamageTargetEffect(3); + effect.setText("and {this} deals 3 damage to target creature"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public SuffocatingBlast(final SuffocatingBlast card) { + super(card); + } + + @Override + public SuffocatingBlast copy() { + return new SuffocatingBlast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prereleaseevents/FungalShambler.java b/Mage.Sets/src/mage/sets/prereleaseevents/FungalShambler.java new file mode 100644 index 00000000000..5bd1f2ef1bd --- /dev/null +++ b/Mage.Sets/src/mage/sets/prereleaseevents/FungalShambler.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.prereleaseevents; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class FungalShambler extends mage.sets.apocalypse.FungalShambler { + + public FungalShambler(UUID ownerId) { + super(ownerId); + this.cardNumber = 14; + this.expansionSetCode = "PTC"; + this.rarity = Rarity.SPECIAL; + } + + public FungalShambler(final FungalShambler card) { + super(card); + } + + @Override + public FungalShambler copy() { + return new FungalShambler(this); + } +} From 4afcd3be6df0c75eb7740c8597670935ff270000 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 22 Jul 2015 13:31:57 +0200 Subject: [PATCH 140/375] ChampionAbility - If subtypes parameter is set to null, Champion ability works with all creatures. --- .../abilities/keyword/ChampionAbility.java | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/Mage/src/mage/abilities/keyword/ChampionAbility.java b/Mage/src/mage/abilities/keyword/ChampionAbility.java index b020ee46945..02e71516026 100644 --- a/Mage/src/mage/abilities/keyword/ChampionAbility.java +++ b/Mage/src/mage/abilities/keyword/ChampionAbility.java @@ -68,42 +68,53 @@ import mage.util.CardUtil; * the former as the direct result of a champion ability. # * */ - public class ChampionAbility extends StaticAbility { protected String[] subtypes; protected String objectDescription; - public ChampionAbility(Card card, String subtype) { this(card, new String[]{subtype}); } - + + /** + * Champion one or more creature types or if the subtype array is empty + * champion every creature. + * + * @param card + * @param subtypes subtypes to champion with, if empty all creatures can be + * used + */ public ChampionAbility(Card card, String[] subtypes) { super(Zone.BATTLEFIELD, null); this.subtypes = subtypes; - StringBuilder sb = new StringBuilder("another "); ArrayList> subtypesPredicates = new ArrayList<>(); - int i = 0; - for (String subtype : this.subtypes) { - subtypesPredicates.add(new SubtypePredicate(subtype)); - if (i == 0) { - sb.append(subtype); - } else { - sb.append(" or ").append(subtype); + if (subtypes != null) { + int i = 0; + for (String subtype : this.subtypes) { + subtypesPredicates.add(new SubtypePredicate(subtype)); + if (i == 0) { + sb.append(subtype); + } else { + sb.append(" or ").append(subtype); + } + i++; } - i++; + } else { + sb.append("creature"); } this.objectDescription = sb.toString(); FilterControlledPermanent filter = new FilterControlledPermanent(objectDescription); - filter.add(Predicates.or(subtypesPredicates)); + if (subtypes != null) { + filter.add(Predicates.or(subtypesPredicates)); + } filter.add(new AnotherPredicate()); // When this permanent enters the battlefield, sacrifice it unless you exile another [object] you control. Ability ability1 = new EntersBattlefieldTriggeredAbility( - new SacrificeSourceUnlessPaysEffect(new ChampionExileCost(filter, new StringBuilder(card.getName()).append(" championed permanents").toString())),false); + new SacrificeSourceUnlessPaysEffect(new ChampionExileCost(filter, new StringBuilder(card.getName()).append(" championed permanents").toString())), false); ability1.setRuleVisible(false); addSubAbility(ability1); @@ -139,7 +150,7 @@ class ChampionExileCost extends CostImpl { private String exileZone = null; public ChampionExileCost(FilterControlledPermanent filter, String exileZone) { - this.addTarget(new TargetControlledPermanent(1,1,filter, true)); + this.addTarget(new TargetControlledPermanent(1, 1, filter, true)); this.text = "exile " + filter.getMessage() + " you control"; this.exileZone = exileZone; } @@ -152,11 +163,11 @@ class ChampionExileCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { Player controller = game.getPlayer(controllerId); - MageObject sourceObject = ability.getSourceObject(game); + MageObject sourceObject = ability.getSourceObject(game); if (controller != null && sourceObject != null) { if (targets.choose(Outcome.Exile, controllerId, sourceId, game)) { UUID exileId = CardUtil.getExileZoneId(game, ability.getSourceId(), ability.getSourceObjectZoneChangeCounter()); - for (UUID targetId: targets.get(0).getTargets()) { + for (UUID targetId : targets.get(0).getTargets()) { Permanent permanent = game.getPermanent(targetId); if (permanent == null) { return false; From a6bb51decaa31cd451ac0a02287ab114d2d74b26 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 22 Jul 2015 13:53:09 +0200 Subject: [PATCH 141/375] Added Jolrael, Empress of Beasts. --- .../sets/prophecy/JolraelEmpressOfBeasts.java | 122 ++++++++++++++++++ .../timeshifted/JolraelEmpressOfBeasts.java | 54 ++++++++ 2 files changed, 176 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java create mode 100644 Mage.Sets/src/mage/sets/timeshifted/JolraelEmpressOfBeasts.java diff --git a/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java b/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java new file mode 100644 index 00000000000..b0f0fe3aa8b --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java @@ -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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BecomesCreatureAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.other.PlayerIdPredicate; +import mage.game.Game; +import mage.game.permanent.token.Token; +import mage.players.Player; +import mage.target.common.TargetCardInHand; + +/** + * + * @author LevelX2 + */ +public class JolraelEmpressOfBeasts extends CardImpl { + + public JolraelEmpressOfBeasts(UUID ownerId) { + super(ownerId, 115, "Jolrael, Empress of Beasts", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + this.expansionSetCode = "PCY"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {2}{G}, {tap}, Discard two cards: All lands target player controls become 3/3 creatures until end of turn. They're still lands. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new JolraelEmpressOfBeastsEffect(), new ManaCostsImpl<>("{2}{G}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, new FilterCard("two cards")))); + this.addAbility(ability); + } + + public JolraelEmpressOfBeasts(final JolraelEmpressOfBeasts card) { + super(card); + } + + @Override + public JolraelEmpressOfBeasts copy() { + return new JolraelEmpressOfBeasts(this); + } +} + +class JolraelEmpressOfBeastsEffect extends OneShotEffect { + + public JolraelEmpressOfBeastsEffect() { + super(Outcome.Benefit); + this.staticText = "All lands target player controls become 3/3 creatures until end of turn. They're still lands."; + } + + public JolraelEmpressOfBeastsEffect(final JolraelEmpressOfBeastsEffect effect) { + super(effect); + } + + @Override + public JolraelEmpressOfBeastsEffect copy() { + return new JolraelEmpressOfBeastsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (targetPlayer != null) { + FilterPermanent filter = new FilterPermanent(); + filter.add(new PlayerIdPredicate(targetPlayer.getId())); + game.addEffect(new BecomesCreatureAllEffect(new JolraelLandsToken(), "lands", filter, Duration.EndOfTurn), source); + return true; + } + return false; + } +} + +class JolraelLandsToken extends Token { + + public JolraelLandsToken() { + super("", "3/3 creature"); + cardType.add(CardType.CREATURE); + power = new MageInt(3); + toughness = new MageInt(3); + } +} diff --git a/Mage.Sets/src/mage/sets/timeshifted/JolraelEmpressOfBeasts.java b/Mage.Sets/src/mage/sets/timeshifted/JolraelEmpressOfBeasts.java new file mode 100644 index 00000000000..7df8b372995 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/JolraelEmpressOfBeasts.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.timeshifted; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class JolraelEmpressOfBeasts extends mage.sets.prophecy.JolraelEmpressOfBeasts { + + public JolraelEmpressOfBeasts(UUID ownerId) { + super(ownerId); + this.cardNumber = 81; + this.expansionSetCode = "TSB"; + this.rarity = Rarity.SPECIAL; + } + + public JolraelEmpressOfBeasts(final JolraelEmpressOfBeasts card) { + super(card); + } + + @Override + public JolraelEmpressOfBeasts copy() { + return new JolraelEmpressOfBeasts(this); + } +} From 8fd006caa5a74aaf61ade1f3be88e62277af913e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 22 Jul 2015 13:57:18 +0200 Subject: [PATCH 142/375] Added Jolrael, Empress of Beasts (added target). --- Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java b/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java index b0f0fe3aa8b..2bda3a4344a 100644 --- a/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java +++ b/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java @@ -48,6 +48,7 @@ import mage.filter.predicate.other.PlayerIdPredicate; import mage.game.Game; import mage.game.permanent.token.Token; import mage.players.Player; +import mage.target.TargetPlayer; import mage.target.common.TargetCardInHand; /** @@ -69,6 +70,7 @@ public class JolraelEmpressOfBeasts extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new JolraelEmpressOfBeastsEffect(), new ManaCostsImpl<>("{2}{G}")); ability.addCost(new TapSourceCost()); ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, new FilterCard("two cards")))); + ability.addTarget(new TargetPlayer()); this.addAbility(ability); } From 1e2c4a894a23102ec3e0fb33897e025e6093f2e6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 22 Jul 2015 13:58:26 +0200 Subject: [PATCH 143/375] Added Jolrael, Empress of Beasts (added land filter). --- Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java b/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java index 2bda3a4344a..b2c681bde0f 100644 --- a/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java +++ b/Mage.Sets/src/mage/sets/prophecy/JolraelEmpressOfBeasts.java @@ -44,6 +44,7 @@ import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.FilterPermanent; +import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.other.PlayerIdPredicate; import mage.game.Game; import mage.game.permanent.token.Token; @@ -104,7 +105,7 @@ class JolraelEmpressOfBeastsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); if (targetPlayer != null) { - FilterPermanent filter = new FilterPermanent(); + FilterPermanent filter = new FilterLandPermanent(); filter.add(new PlayerIdPredicate(targetPlayer.getId())); game.addEffect(new BecomesCreatureAllEffect(new JolraelLandsToken(), "lands", filter, Duration.EndOfTurn), source); return true; From 3bb4e7599fd6b851677c755a9396a184ff4308e6 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Wed, 22 Jul 2015 08:41:30 -0500 Subject: [PATCH 144/375] Implemented Changeling Berserker and Changeling Titan. Modified effect.setText on Vorrac Battlehorns and Alpha Authority. --- .../mage/sets/gatecrash/AlphaAuthority.java | 2 +- .../mage/sets/lorwyn/ChangelingBerserker.java | 70 +++++++++++++++++++ .../src/mage/sets/lorwyn/ChangelingTitan.java | 66 +++++++++++++++++ .../mage/sets/mirrodin/VorracBattlehorns.java | 2 +- 4 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java diff --git a/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java b/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java index 06000331586..c6adbca77b1 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java +++ b/Mage.Sets/src/mage/sets/gatecrash/AlphaAuthority.java @@ -73,7 +73,7 @@ public class AlphaAuthority extends CardImpl { // Enchanted creature has hexproof and can't be blocked by more than one creature. ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HexproofAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield)); Effect effect = new CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType.AURA,1); - effect.setText(" and can't be blocked by more than one creature"); + effect.setText("and can't be blocked by more than one creature"); ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java b/Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java new file mode 100644 index 00000000000..58cc77814be --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java @@ -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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.ChampionAbility; +import mage.abilities.keyword.ChangelingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class ChangelingBerserker extends CardImpl { + + public ChangelingBerserker(UUID ownerId) { + super(ownerId, 160, "Changeling Berserker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Shapeshifter"); + this.power = new MageInt(5); + this.toughness = new MageInt(3); + + // Changeling + this.addAbility(ChangelingAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Champion a creature + this.addAbility(new ChampionAbility(this, null); + } + + public ChangelingBerserker(final ChangelingBerserker card) { + super(card); + } + + @Override + public ChangelingBerserker copy() { + return new ChangelingBerserker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java b/Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java new file mode 100644 index 00000000000..c2c4f0d8153 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java @@ -0,0 +1,66 @@ +/* + * 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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.ChampionAbility; +import mage.abilities.keyword.ChangelingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class ChangelingTitan extends CardImpl { + + public ChangelingTitan(UUID ownerId) { + super(ownerId, 200, "Changeling Titan", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Shapeshifter"); + this.power = new MageInt(7); + this.toughness = new MageInt(7); + + // Changeling + this.addAbility(ChangelingAbility.getInstance()); + + // Champion a creature + this.addAbility(new ChampionAbility(this, null); + } + + public ChangelingTitan(final ChangelingTitan card) { + super(card); + } + + @Override + public ChangelingTitan copy() { + return new ChangelingTitan(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java index 33236990398..b3033e3265c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java @@ -63,7 +63,7 @@ public class VorracBattlehorns extends CardImpl { // Equipped creature has trample and can't be blocked by more than one creature. Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.EQUIPMENT)); Effect effect = new CantBeBlockedByMoreThanOneAttachedEffect(AttachmentType.EQUIPMENT, 1); - effect.setText(" and can't be blocked by more than one creature"); + effect.setText("and can't be blocked by more than one creature"); ability.addEffect(effect); this.addAbility(ability); From ae675942e2b2018cf714b60d513f45c03f81a97d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 22 Jul 2015 17:23:07 +0200 Subject: [PATCH 145/375] Added Dwarven Landslide. --- .../sets/apocalypse/DwarvenLandslide.java | 80 +++++++++++++++++++ .../costs/OptionalAdditionalCost.java | 14 ++-- .../mage/abilities/keyword/KickerAbility.java | 43 ++++++---- 3 files changed, 114 insertions(+), 23 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java b/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java new file mode 100644 index 00000000000..4edae4f5649 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java @@ -0,0 +1,80 @@ +/* + * 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.abilities.Ability; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.costs.Cost; +import mage.abilities.costs.Costs; +import mage.abilities.costs.CostsImpl; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LevelX2 + */ +public class DwarvenLandslide extends CardImpl { + + public DwarvenLandslide(UUID ownerId) { + super(ownerId, 60, "Dwarven Landslide", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{3}{R}"); + this.expansionSetCode = "APC"; + + // Kicker-{2}{R}, Sacrifice a land. + Costs kickerCosts = new CostsImpl<>(); + kickerCosts.add(new ManaCostsImpl<>("{2}{R}")); + kickerCosts.add(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); + this.addAbility(new KickerAbility(kickerCosts)); + // Destroy target land. If Dwarven Landslide was kicked, destroy another target land. + getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target land. If {this} was kicked, destroy another target land")); + } + + public DwarvenLandslide(final DwarvenLandslide card) { + super(card); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + ability.addTarget(new TargetLandPermanent(KickedCondition.getInstance().apply(game, ability) ? 2 : 1)); + } + + @Override + public DwarvenLandslide copy() { + return new DwarvenLandslide(this); + } +} diff --git a/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java b/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java index 75f75c5a414..949bbdfe45c 100644 --- a/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java +++ b/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java @@ -25,13 +25,12 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.costs; /** * @author LevelX2 */ -public interface OptionalAdditionalCost extends Cost { +public interface OptionalAdditionalCost extends Costs { String getName(); @@ -52,15 +51,15 @@ public interface OptionalAdditionalCost extends Cost { String getReminderText(); /** - * Returns a text suffix for the game log, that can be added to - * the cast message. + * Returns a text suffix for the game log, that can be added to the cast + * message. * - * @param position - if there are multiple costs, it's the postion the cost is set (starting with 0) + * @param position - if there are multiple costs, it's the postion the cost + * is set (starting with 0) * @return */ String getCastSuffixMessage(int position); - /** * If the player intends to pay the cost, the cost will be activated * @@ -96,8 +95,9 @@ public interface OptionalAdditionalCost extends Cost { /** * Returns the number of times the cost was activated + * * @return */ int getActivateCount(); - + } diff --git a/Mage/src/mage/abilities/keyword/KickerAbility.java b/Mage/src/mage/abilities/keyword/KickerAbility.java index bab41782814..b262a3cc295 100644 --- a/Mage/src/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/mage/abilities/keyword/KickerAbility.java @@ -37,6 +37,7 @@ import mage.abilities.SpellAbility; import mage.abilities.StaticAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; +import mage.abilities.costs.CostsImpl; import mage.abilities.costs.OptionalAdditionalCost; import mage.abilities.costs.OptionalAdditionalCostImpl; import mage.abilities.costs.OptionalAdditionalSourceCosts; @@ -217,26 +218,16 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo if (kickerCost.canPay(ability, sourceId, controllerId, game) && player.chooseUse(Outcome.Benefit, "Pay " + times + kickerCost.getText(false) + " ?", ability, game)) { this.activateKicker(kickerCost, ability, game); - for (Iterator it = ((Costs) kickerCost).iterator(); it.hasNext();) { - Cost cost = (Cost) it.next(); - if (cost instanceof ManaCostsImpl) { - List varCosts = ((ManaCostsImpl) cost).getVariableCosts(); - if (!varCosts.isEmpty()) { - // use only first variable cost - xManaValue = game.getPlayer(this.controllerId).announceXMana(varCosts.get(0).getMinX(), Integer.MAX_VALUE, "Announce kicker value for " + varCosts.get(0).getText(), game, this); - // kicker variable X costs handled internally as multikicker with {1} cost (no multikicker on card) - if (!game.isSimulation()) { - game.informPlayers(game.getPlayer(this.controllerId).getLogName() + " announced a value of " + xManaValue + " for " + " kicker X "); - } - ability.getManaCostsToPay().add(new GenericManaCost(xManaValue)); - } else { - ability.getManaCostsToPay().add((ManaCostsImpl) cost.copy()); + for (Iterator itKickerCost = kickerCost.iterator(); itKickerCost.hasNext();) { + Object kickerCostObject = itKickerCost.next(); + if ((kickerCostObject instanceof Costs) || (kickerCostObject instanceof CostsImpl)) { + for (@SuppressWarnings("unchecked") Iterator itDetails = ((Costs) kickerCostObject).iterator(); itDetails.hasNext();) { + addKickerCostsToAbility(itDetails.next(), ability, game); } } else { - ability.getCosts().add(cost.copy()); + addKickerCostsToAbility((Cost) kickerCostObject, ability, game); } } - again = kickerCost.isRepeatable(); } else { again = false; @@ -247,6 +238,26 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo } } + private void addKickerCostsToAbility(Cost cost, Ability ability, Game game) { + if (cost instanceof ManaCostsImpl) { + @SuppressWarnings("unchecked") + List varCosts = ((ManaCostsImpl) cost).getVariableCosts(); + if (!varCosts.isEmpty()) { + // use only first variable cost + xManaValue = game.getPlayer(this.controllerId).announceXMana(varCosts.get(0).getMinX(), Integer.MAX_VALUE, "Announce kicker value for " + varCosts.get(0).getText(), game, this); + // kicker variable X costs handled internally as multikicker with {1} cost (no multikicker on card) + if (!game.isSimulation()) { + game.informPlayers(game.getPlayer(this.controllerId).getLogName() + " announced a value of " + xManaValue + " for " + " kicker X "); + } + ability.getManaCostsToPay().add(new GenericManaCost(xManaValue)); + } else { + ability.getManaCostsToPay().add((ManaCostsImpl) cost.copy()); + } + } else { + ability.getCosts().add(cost.copy()); + } + } + @Override public String getRule() { StringBuilder sb = new StringBuilder(); From 11ef6e87476f5c0657de28d34c5194c7b39686ac Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 22 Jul 2015 18:33:26 +0300 Subject: [PATCH 146/375] Implement cards: Canopy Surge, Divine Presence, Rewards of Diversity, and Tidal Visionary --- .../src/mage/sets/invasion/CanopySurge.java | 74 ++++++++++++ .../mage/sets/invasion/DivinePresence.java | 110 ++++++++++++++++++ .../sets/invasion/RewardsOfDiversity.java | 70 +++++++++++ .../mage/sets/invasion/TidalVisionary.java | 72 ++++++++++++ 4 files changed, 326 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/invasion/CanopySurge.java create mode 100644 Mage.Sets/src/mage/sets/invasion/DivinePresence.java create mode 100644 Mage.Sets/src/mage/sets/invasion/RewardsOfDiversity.java create mode 100644 Mage.Sets/src/mage/sets/invasion/TidalVisionary.java diff --git a/Mage.Sets/src/mage/sets/invasion/CanopySurge.java b/Mage.Sets/src/mage/sets/invasion/CanopySurge.java new file mode 100644 index 00000000000..60d7b425bab --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/CanopySurge.java @@ -0,0 +1,74 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author LoneFox + */ +public class CanopySurge extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public CanopySurge(UUID ownerId) { + super(ownerId, 184, "Canopy Surge", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{G}"); + this.expansionSetCode = "INV"; + + // Kicker {2} + this.addAbility(new KickerAbility("{2}")); + // Canopy Surge deals 1 damage to each creature with flying and each player. If Canopy Surge was kicked, it deals 4 damage to each creature with flying and each player instead. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DamageEverythingEffect(4, filter), + new DamageEverythingEffect(1, filter), KickedCondition.getInstance(), + "{this} deals 1 damage to each creature with flying and each player. If {this} was kicked, it deals 4 damage to each creature with flying and each player instead.")); + } + + public CanopySurge(final CanopySurge card) { + super(card); + } + + @Override + public CanopySurge copy() { + return new CanopySurge(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/DivinePresence.java b/Mage.Sets/src/mage/sets/invasion/DivinePresence.java new file mode 100644 index 00000000000..99deb0039ba --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/DivinePresence.java @@ -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.invasion; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; + +/** + * + * @author LoneFox + */ +public class DivinePresence extends CardImpl { + + public DivinePresence(UUID ownerId) { + super(ownerId, 15, "Divine Presence", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + this.expansionSetCode = "INV"; + + // If a source would deal 4 or more damage to a creature or player, that source deals 3 damage to that creature or player instead. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DivinePresenceEffect())); + } + + public DivinePresence(final DivinePresence card) { + super(card); + } + + @Override + public DivinePresence copy() { + return new DivinePresence(this); + } +} + +class DivinePresenceEffect extends ReplacementEffectImpl { + + public DivinePresenceEffect() { + super(Duration.WhileOnBattlefield, Outcome.Neutral); + staticText = "If a source would deal 4 or more damage to a creature or player, that source deals 3 damage to that creature or player instead."; + } + + public DivinePresenceEffect(final DivinePresenceEffect effect) { + super(effect); + } + + @Override + public DivinePresenceEffect copy() { + return new DivinePresenceEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + switch(event.getType()) { + case DAMAGE_CREATURE: + case DAMAGE_PLAYER: + return true; + default: + return false; + } + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getAmount() > 3; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(3); + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/RewardsOfDiversity.java b/Mage.Sets/src/mage/sets/invasion/RewardsOfDiversity.java new file mode 100644 index 00000000000..5505662f76d --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/RewardsOfDiversity.java @@ -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.invasion; + +import java.util.UUID; +import mage.abilities.common.SpellCastOpponentTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.FilterSpell; +import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LoneFox + */ +public class RewardsOfDiversity extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("multicolored spell"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + filter.add(new MulticoloredPredicate()); + } + + public RewardsOfDiversity(UUID ownerId) { + super(ownerId, 32, "Rewards of Diversity", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + this.expansionSetCode = "INV"; + + // Whenever an opponent casts a multicolored spell, you gain 4 life. + this.addAbility(new SpellCastOpponentTriggeredAbility(new GainLifeEffect(4), filter, false)); + } + + public RewardsOfDiversity(final RewardsOfDiversity card) { + super(card); + } + + @Override + public RewardsOfDiversity copy() { + return new RewardsOfDiversity(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/TidalVisionary.java b/Mage.Sets/src/mage/sets/invasion/TidalVisionary.java new file mode 100644 index 00000000000..8bbbc694c72 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/TidalVisionary.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BecomesColorTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class TidalVisionary extends CardImpl { + + public TidalVisionary(UUID ownerId) { + super(ownerId, 80, "Tidal Visionary", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{U}"); + this.expansionSetCode = "INV"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {T}: Target creature becomes the color of your choice until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorTargetEffect(Duration.EndOfTurn), + new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public TidalVisionary(final TidalVisionary card) { + super(card); + } + + @Override + public TidalVisionary copy() { + return new TidalVisionary(this); + } +} From d9f88fdd6e215ab09121153b7db7d22a33bfe474 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 22 Jul 2015 21:02:04 +0200 Subject: [PATCH 147/375] * ChampionAbility - Fixed to work for all creatures. --- Mage/src/mage/abilities/keyword/ChampionAbility.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage/src/mage/abilities/keyword/ChampionAbility.java b/Mage/src/mage/abilities/keyword/ChampionAbility.java index 02e71516026..568a1ef9463 100644 --- a/Mage/src/mage/abilities/keyword/ChampionAbility.java +++ b/Mage/src/mage/abilities/keyword/ChampionAbility.java @@ -91,7 +91,7 @@ public class ChampionAbility extends StaticAbility { this.subtypes = subtypes; StringBuilder sb = new StringBuilder("another "); ArrayList> subtypesPredicates = new ArrayList<>(); - if (subtypes != null) { + if (!subtypes[0].isEmpty()) { int i = 0; for (String subtype : this.subtypes) { subtypesPredicates.add(new SubtypePredicate(subtype)); @@ -107,7 +107,7 @@ public class ChampionAbility extends StaticAbility { } this.objectDescription = sb.toString(); FilterControlledPermanent filter = new FilterControlledPermanent(objectDescription); - if (subtypes != null) { + if (!subtypesPredicates.isEmpty()) { filter.add(Predicates.or(subtypesPredicates)); } filter.add(new AnotherPredicate()); From 4b7270672caf3edcacefa277b4df7c2f065cbf65 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 22 Jul 2015 21:46:32 +0200 Subject: [PATCH 148/375] Added Bane of the Living. --- .../mage/sets/legions/BaneOfTheLiving.java | 73 ++++++++++++++++++ .../abilities/common/TurnFaceUpAbility.java | 76 ++++++++++--------- .../common/ManacostVariableValue.java | 2 +- .../common/MorphManacostVariableValue.java | 42 ++++++++++ .../common/continuous/BoostAllEffect.java | 69 +++++++++-------- 5 files changed, 191 insertions(+), 71 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/legions/BaneOfTheLiving.java create mode 100644 Mage/src/mage/abilities/dynamicvalue/common/MorphManacostVariableValue.java diff --git a/Mage.Sets/src/mage/sets/legions/BaneOfTheLiving.java b/Mage.Sets/src/mage/sets/legions/BaneOfTheLiving.java new file mode 100644 index 00000000000..d78865f6a06 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legions/BaneOfTheLiving.java @@ -0,0 +1,73 @@ +/* + * 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.legions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.MorphManacostVariableValue; +import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class BaneOfTheLiving extends CardImpl { + + public BaneOfTheLiving(UUID ownerId) { + super(ownerId, 60, "Bane of the Living", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + this.expansionSetCode = "LGN"; + this.subtype.add("Insect"); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Morph {X}{B}{B} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{X}{B}{B}"))); + // When Bane of the Living is turned face up, all creatures get -X/-X until end of turn. + DynamicValue morphX = new SignInversionDynamicValue(new MorphManacostVariableValue()); + this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BoostAllEffect(morphX, morphX, Duration.EndOfTurn, new FilterCreaturePermanent(), false, "", true))); + } + + public BaneOfTheLiving(final BaneOfTheLiving card) { + super(card); + } + + @Override + public BaneOfTheLiving copy() { + return new BaneOfTheLiving(this); + } +} diff --git a/Mage/src/mage/abilities/common/TurnFaceUpAbility.java b/Mage/src/mage/abilities/common/TurnFaceUpAbility.java index 0b6b9e0a0d3..f08922dbaba 100644 --- a/Mage/src/mage/abilities/common/TurnFaceUpAbility.java +++ b/Mage/src/mage/abilities/common/TurnFaceUpAbility.java @@ -1,38 +1,37 @@ /* -* 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. -*/ - + * 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.abilities.common; import mage.abilities.Ability; -import mage.abilities.ActivatedAbilityImpl; import mage.abilities.SpecialAction; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; +import mage.abilities.costs.mana.ManaCost; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.constants.AbilityType; @@ -47,17 +46,23 @@ import mage.players.Player; * * @author LevelX2 */ - -public class TurnFaceUpAbility extends SpecialAction { +public class TurnFaceUpAbility extends SpecialAction { public TurnFaceUpAbility(Costs costs) { this(costs, false); } - + public TurnFaceUpAbility(Costs costs, boolean megamorph) { super(Zone.BATTLEFIELD); this.addEffect(new TurnFaceUpEffect(megamorph)); - this.addCost(costs); + for (Cost cost : costs) { + if (cost instanceof ManaCost) { + this.addManaCost((ManaCost) cost); + } else { + this.addCost(cost); + } + } + this.usesStack = false; this.abilityType = AbilityType.SPECIAL_ACTION; this.setRuleVisible(false); // will be made visible only to controller in CardView @@ -76,10 +81,10 @@ public class TurnFaceUpAbility extends SpecialAction { class TurnFaceUpEffect extends OneShotEffect { private final boolean megamorph; - + public TurnFaceUpEffect(boolean megamorph) { super(Outcome.Benefit); - this.staticText = "Turn this face-down permanent face up" +(megamorph ? " and put a +1/+1 counter on it":""); + this.staticText = "Turn this face-down permanent face up" + (megamorph ? " and put a +1/+1 counter on it" : ""); this.megamorph = megamorph; } @@ -97,13 +102,14 @@ class TurnFaceUpEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Card card = game.getCard(source.getSourceId()); - if (controller != null && card !=null) { + if (controller != null && card != null) { Permanent sourcePermanent = game.getPermanent(source.getSourceId()); if (sourcePermanent != null) { if (sourcePermanent.turnFaceUp(game, source.getControllerId())) { if (megamorph) { sourcePermanent.addCounters(CounterType.P1P1.createInstance(), game); } + game.getState().setValue(source.getSourceId().toString() + "TurnFaceUpX", source.getManaCostsToPay().getX()); return true; } } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ManacostVariableValue.java b/Mage/src/mage/abilities/dynamicvalue/common/ManacostVariableValue.java index 38b6968264b..b6e7e2d6037 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ManacostVariableValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ManacostVariableValue.java @@ -13,7 +13,7 @@ public class ManacostVariableValue implements DynamicValue { } @Override - public DynamicValue copy() { + public ManacostVariableValue copy() { return new ManacostVariableValue(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/MorphManacostVariableValue.java b/Mage/src/mage/abilities/dynamicvalue/common/MorphManacostVariableValue.java new file mode 100644 index 00000000000..44c85ea4fa8 --- /dev/null +++ b/Mage/src/mage/abilities/dynamicvalue/common/MorphManacostVariableValue.java @@ -0,0 +1,42 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.dynamicvalue.common; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ +public class MorphManacostVariableValue implements DynamicValue { + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + Integer xValue = (Integer) game.getState().getValue(sourceAbility.getSourceId().toString() + "TurnFaceUpX"); + if (xValue instanceof Integer) { + return xValue; + } + return 0; + } + + @Override + public MorphManacostVariableValue copy() { + return new MorphManacostVariableValue(); + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return ""; + } +} diff --git a/Mage/src/mage/abilities/effects/common/continuous/BoostAllEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BoostAllEffect.java index d050cfe0f5d..70622957cea 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BoostAllEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BoostAllEffect.java @@ -1,43 +1,42 @@ /* -* 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. -*/ - + * 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.abilities.effects.common.continuous; import java.util.Iterator; import mage.MageObjectReference; -import mage.constants.Duration; -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.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -84,9 +83,9 @@ public class BoostAllEffect extends ContinuousEffectImpl { this.toughness = toughness; this.filter = filter; this.excludeSource = excludeSource; - + this.lockedInPT = lockedInPT; - if (rule == null) { + if (rule == null || rule.isEmpty()) { setText(); } else { this.staticText = rule; @@ -111,7 +110,7 @@ public class BoostAllEffect extends ContinuousEffectImpl { public void init(Ability source, Game game) { super.init(source, game); if (this.affectedObjectsSet) { - for (Permanent perm: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { + for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { if (!(excludeSource && perm.getId().equals(source.getSourceId()))) { affectedObjectList.add(new MageObjectReference(perm, game)); } @@ -143,7 +142,7 @@ public class BoostAllEffect extends ContinuousEffectImpl { } } - } + } return true; } From 0e0678f9d1f35f270ea0b6a4be5859cb41661231 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 00:23:00 +0200 Subject: [PATCH 149/375] Added workaround to random booster drafr booster generation to prevent endless loops (#1136). --- Mage/src/mage/cards/ExpansionSet.java | 31 ++++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index a7b968c724c..5c307480558 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -120,8 +120,13 @@ public abstract class ExpansionSet implements Serializable { List theBooster = this.createBooster(); List commons = getCardsByRarity(Rarity.COMMON); - while (15 > theBooster.size()) { + int iterations = 0; + while (15 > theBooster.size() && !commons.isEmpty()) { addToBooster(theBooster, commons); + iterations++; + if (iterations > 14) { + break; + } } while (theBooster.size() > 15) { @@ -131,6 +136,18 @@ public abstract class ExpansionSet implements Serializable { return theBooster; } + protected void addToBooster(List booster, List cards) { + if (!cards.isEmpty()) { + CardInfo cardInfo = cards.remove(rnd.nextInt(cards.size())); + if (cardInfo != null) { + Card card = cardInfo.getCard(); + if (card != null) { + booster.add(card); + } + } + } + } + public List createBooster() { List booster = new ArrayList<>(); if (!hasBoosters) { @@ -257,18 +274,6 @@ public abstract class ExpansionSet implements Serializable { } } - protected void addToBooster(List booster, List cards) { - if (!cards.isEmpty()) { - CardInfo cardInfo = cards.remove(rnd.nextInt(cards.size())); - if (cardInfo != null) { - Card card = cardInfo.getCard(); - if (card != null) { - booster.add(card); - } - } - } - } - public boolean hasBoosters() { return hasBoosters; } From f77fd14b1effdf59aca76d3430c5f79902c517d4 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 01:04:46 +0200 Subject: [PATCH 150/375] Added Cyclical Evolution. --- .../sets/futuresight/CyclicalEvolution.java | 75 +++++++++++++++++++ .../mage/sets/magicorigins/ElementalBond.java | 5 +- 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/futuresight/CyclicalEvolution.java diff --git a/Mage.Sets/src/mage/sets/futuresight/CyclicalEvolution.java b/Mage.Sets/src/mage/sets/futuresight/CyclicalEvolution.java new file mode 100644 index 00000000000..45bcce89468 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/CyclicalEvolution.java @@ -0,0 +1,75 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ExileSpellEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.SuspendAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class CyclicalEvolution extends CardImpl { + + public CyclicalEvolution(UUID ownerId) { + super(ownerId, 125, "Cyclical Evolution", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{G}{G}"); + this.expansionSetCode = "FUT"; + + // Target creature gets +3/+3 until end of turn. Exile Cyclical Evolution with three time counters on it. + getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); + getSpellAbility().addTarget(new TargetCreaturePermanent()); + getSpellAbility().addEffect(ExileSpellEffect.getInstance()); + Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), new StaticValue(3), true, true); + effect.setText("with 3 time counters on it"); + getSpellAbility().addEffect(effect); + + // Suspend 3-{2}{G} + this.addAbility(new SuspendAbility(3, new ManaCostsImpl<>("{2}{G}"), this)); + } + + public CyclicalEvolution(final CyclicalEvolution card) { + super(card); + } + + @Override + public CyclicalEvolution copy() { + return new CyclicalEvolution(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/ElementalBond.java b/Mage.Sets/src/mage/sets/magicorigins/ElementalBond.java index 4c0b67a0c3f..c0f1d5fbbda 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/ElementalBond.java +++ b/Mage.Sets/src/mage/sets/magicorigins/ElementalBond.java @@ -43,8 +43,9 @@ import mage.filter.predicate.mageobject.PowerPredicate; * @author emerald000 */ public class ElementalBond extends CardImpl { - - private static final FilterPermanent filter = new FilterControlledCreaturePermanent("creature with power 3 or greater"); + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("a creature with power 3 or greater"); + static { filter.add(new PowerPredicate(ComparisonType.GreaterThan, 2)); } From 363915075cf0129d602b2d9f7f31b2364c2d8f05 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 12:39:28 +0200 Subject: [PATCH 151/375] * City of Shadows - Fixed that the first ability was missing. --- Mage.Sets/src/mage/sets/thedark/CityOfShadows.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/thedark/CityOfShadows.java b/Mage.Sets/src/mage/sets/thedark/CityOfShadows.java index 6e4381050e3..8651daa4ad0 100644 --- a/Mage.Sets/src/mage/sets/thedark/CityOfShadows.java +++ b/Mage.Sets/src/mage/sets/thedark/CityOfShadows.java @@ -45,7 +45,7 @@ import mage.target.common.TargetControlledCreaturePermanent; /** * - * @author anonymous + * @author Luna Skyrise */ public class CityOfShadows extends CardImpl { @@ -53,12 +53,14 @@ public class CityOfShadows extends CardImpl { super(ownerId, 113, "City of Shadows", Rarity.RARE, new CardType[]{CardType.LAND}, ""); this.expansionSetCode = "DRK"; - // {tap}, Exile a creature you control: Put a storage counter on City of Shadows. + // {T}, Exile a creature you control: Put a storage counter on City of Shadows. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.STORAGE.createInstance()), new TapSourceCost()); ability.addCost(new ExileTargetCost(new TargetControlledCreaturePermanent())); - // {tap}: Add {X} to your mana pool, where X is the number of storage counters on City of Shadows. + this.addAbility(ability); + + // {T}: Add {X} to your mana pool, where X is the number of storage counters on City of Shadows. ability = new DynamicManaAbility(Mana.ColorlessMana, new CountersCount(CounterType.STORAGE), - "{tap}: Add {X} to your mana pool, where X is the number of storage counters on City of Shadows"); + "{tap}: Add {X} to your mana pool, where X is the number of storage counters on {this}"); this.addAbility(ability); } From b169e7e6c7c2d56ca2e4226aa97d1fc51f13266b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 12:42:02 +0200 Subject: [PATCH 152/375] * Mage-Ring Network - Fixed calculation of available mana. --- .../sets/magicorigins/MageRingNetwork.java | 20 ++++++---- .../org/mage/test/utils/ManaOptionsTest.java | 38 +++++++++++++++++++ Mage/src/mage/Mana.java | 11 +++--- .../dynamicvalue/common/CountersCount.java | 3 +- .../effects/common/DynamicManaEffect.java | 37 +++++++++++++----- .../abilities/mana/DynamicManaAbility.java | 24 ++++++++++-- Mage/src/mage/abilities/mana/ManaOptions.java | 2 +- Mage/src/mage/players/PlayerImpl.java | 6 +-- 8 files changed, 110 insertions(+), 31 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/MageRingNetwork.java b/Mage.Sets/src/mage/sets/magicorigins/MageRingNetwork.java index 6ee273ea26e..fe953e08e6d 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/MageRingNetwork.java +++ b/Mage.Sets/src/mage/sets/magicorigins/MageRingNetwork.java @@ -34,6 +34,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; @@ -47,7 +48,7 @@ import mage.counters.CounterType; /** * * @author LoneFox - + * */ public class MageRingNetwork extends CardImpl { @@ -55,17 +56,22 @@ public class MageRingNetwork extends CardImpl { super(ownerId, 249, "Mage-Ring Network", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, ""); this.expansionSetCode = "ORI"; - // {t}: Add {1} to your mana pool. + // {T}: Add {1} to your mana pool. this.addAbility(new ColorlessManaAbility()); - // {1}, {t}: Put a storage counter on Mage-Ring Network. + // {1}, {T}: Put a storage counter on Mage-Ring Network. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.STORAGE.createInstance()), - new ManaCostsImpl("{1}")); + new ManaCostsImpl("{1}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); - // {t}, Remove X storage counters from Mage-Ring Network: Add {x} to your mana pool. - ability = new DynamicManaAbility(Mana.ColorlessMana, new RemovedCountersForCostValue(), "Add {X} to your mana pool"); + // {T}, Remove X storage counters from Mage-Ring Network: Add {x} to your mana pool. + ability = new DynamicManaAbility( + Mana.ColorlessMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {X} to your mana pool", + true, new CountersCount(CounterType.STORAGE)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), - "Remove X storage counters from {this}")); + "Remove X storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java index b4b40dd99e2..2f0af102cbf 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java @@ -30,6 +30,7 @@ package org.mage.test.utils; import mage.abilities.mana.ManaOptions; import mage.constants.PhaseStep; import mage.constants.Zone; +import mage.counters.CounterType; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; @@ -290,6 +291,43 @@ public class ManaOptionsTest extends CardTestPlayerBase { Assert.assertEquals("{B}{B}{B}", getManaOption(1, manaOptions)); } + @Test + public void testMageRingNetwork() { + // {T}: Add {1} to your mana pool. + // {T}, {1} : Put a storage counter on Mage-Ring Network. + // {T}, Remove X storage counters from Mage-Ring Network: Add {X} to your mana pool. + addCard(Zone.BATTLEFIELD, playerA, "Mage-Ring Network", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); + Assert.assertEquals("{1}{W}{B}", getManaOption(0, manaOptions)); + } + + @Test + public void testMageRingNetwork2() { + // {T}: Add {1} to your mana pool. + // {T}, {1} : Put a storage counter on Mage-Ring Network. + // {T}, Remove X storage counters from Mage-Ring Network: Add {X} to your mana pool. + addCard(Zone.BATTLEFIELD, playerA, "Mage-Ring Network", 1); + addCounters(1, PhaseStep.UPKEEP, playerA, "Mage-Ring Network", CounterType.STORAGE, 4); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); + + setStopAt(1, PhaseStep.DRAW); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); + Assert.assertEquals("{4}{W}{B}", getManaOption(0, manaOptions)); + } + @Test @Ignore // TriggeredManaAbilities not supported yet for getAvailableMana public void testCryptGhast() { diff --git a/Mage/src/mage/Mana.java b/Mage/src/mage/Mana.java index e24700d45d0..b9b3e04c8fa 100644 --- a/Mage/src/mage/Mana.java +++ b/Mage/src/mage/Mana.java @@ -597,10 +597,11 @@ public class Mana implements Comparable, Serializable, Copyable { } /** - * Returns the mana that is more colored but does not contain one less mana - * in any color but colorless if you call with {1}{W}{R} and {G}{W}{R} you - * get back {G}{W}{R} if you call with {G}{W}{R} and {G}{W}{R} you get back - * {G}{W}{R} if you call with {G}{W}{B} and {G}{W}{R} you get back null + * Returns the mana that is more colored or has a greater amount but does + * not contain one less mana in any color but colorless if you call with + * {1}{W}{R} and {G}{W}{R} you get back {G}{W}{R} if you call with {G}{W}{R} + * and {G}{W}{R} you get back {G}{W}{R} if you call with {G}{W}{B} and + * {G}{W}{R} you get back null * * @param mana1 * @param mana2 @@ -609,7 +610,7 @@ public class Mana implements Comparable, Serializable, Copyable { public static Mana getMoreValuableMana(Mana mana1, Mana mana2) { Mana moreMana; Mana lessMana; - if (mana2.count() > mana1.count() || mana2.getAny() > mana1.getAny() || mana2.getColorless() < mana1.getColorless()) { + if (mana2.countColored() > mana1.countColored() || mana2.getAny() > mana1.getAny() || mana2.count() > mana1.count()) { moreMana = mana2; lessMana = mana1; } else { diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java index fd0e3926190..9f6a5312a62 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java @@ -1,15 +1,14 @@ package mage.abilities.dynamicvalue.common; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; -import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; public class CountersCount implements DynamicValue { + private final CounterType counter; public CountersCount(CounterType counter) { diff --git a/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java b/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java index 7747f360756..80df2007eb2 100644 --- a/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java +++ b/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java @@ -44,32 +44,39 @@ public class DynamicManaEffect extends BasicManaEffect { private final Mana computedMana; private final DynamicValue amount; + private final DynamicValue netAmount; private String text = null; private boolean oneChoice; public DynamicManaEffect(Mana mana, DynamicValue amount) { - super(mana); - this.amount = amount; - computedMana = new Mana(); + this(mana, amount, null); } public DynamicManaEffect(Mana mana, DynamicValue amount, String text) { this(mana, amount, text, false); } + public DynamicManaEffect(Mana mana, DynamicValue amount, String text, boolean oneChoice) { + this(mana, amount, text, oneChoice, null); + } + /** * * @param mana * @param amount * @param text - * @param oneChoice is all mana from the same colour or if false the player can choose different colours + * @param oneChoice is all mana from the same colour or if false the player + * can choose different colours + * @param netAmount a dynamic value that calculates the possible available + * mana (e.g. if you have to pay by removing counters from source) */ - public DynamicManaEffect(Mana mana, DynamicValue amount, String text, boolean oneChoice) { + public DynamicManaEffect(Mana mana, DynamicValue amount, String text, boolean oneChoice, DynamicValue netAmount) { super(mana); this.amount = amount; computedMana = new Mana(); this.text = text; this.oneChoice = oneChoice; + this.netAmount = netAmount; } public DynamicManaEffect(final DynamicManaEffect effect) { @@ -78,6 +85,11 @@ public class DynamicManaEffect extends BasicManaEffect { this.amount = effect.amount.copy(); this.text = effect.text; this.oneChoice = effect.oneChoice; + if (effect.netAmount != null) { + this.netAmount = effect.netAmount.copy(); + } else { + this.netAmount = null; + } } @Override @@ -106,9 +118,16 @@ public class DynamicManaEffect extends BasicManaEffect { return null; } - public Mana computeMana(boolean netMana ,Game game, Ability source){ + public Mana computeMana(boolean netMana, Game game, Ability source) { this.computedMana.clear(); - int count = amount.calculate(game, source, this); + int count; + if (netMana && netAmount != null) { + // calculate the maximum available mana + count = netAmount.calculate(game, source, this); + } else { + count = amount.calculate(game, source, this); + } + if (mana.getBlack() > 0) { computedMana.setBlack(count); } else if (mana.getBlue() > 0) { @@ -126,7 +145,7 @@ public class DynamicManaEffect extends BasicManaEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { ChoiceColor choiceColor = new ChoiceColor(); - for(int i = 0; i < count; i++){ + for (int i = 0; i < count; i++) { if (!choiceColor.isChosen()) { while (!controller.choose(Outcome.Benefit, choiceColor, game)) { if (!controller.isInGame()) { @@ -150,7 +169,7 @@ public class DynamicManaEffect extends BasicManaEffect { } } } - } + } } else { computedMana.setColorless(count); } diff --git a/Mage/src/mage/abilities/mana/DynamicManaAbility.java b/Mage/src/mage/abilities/mana/DynamicManaAbility.java index 72336b74e08..15a44b71c3f 100644 --- a/Mage/src/mage/abilities/mana/DynamicManaAbility.java +++ b/Mage/src/mage/abilities/mana/DynamicManaAbility.java @@ -48,6 +48,7 @@ public class DynamicManaAbility extends ManaAbility { /** * TapSourceCost added by default + * * @param mana * @param amount */ @@ -74,10 +75,24 @@ public class DynamicManaAbility extends ManaAbility { } public DynamicManaAbility(Mana mana, DynamicValue amount, Cost cost, String text, boolean oneChoice) { - super(Zone.BATTLEFIELD, new DynamicManaEffect(mana, amount, text, oneChoice), cost); - manaEffect = (DynamicManaEffect) this.getEffects().get(0); + this(mana, amount, cost, text, oneChoice, null); } + /** + * + * @param mana + * @param amount + * @param cost + * @param text + * @param oneChoice is all mana from the same colour or if false the player + * can choose different colours + * @param netAmount a dynamic value that calculates the possible available + * mana (e.g. if you have to pay by removing counters from source) + */ + public DynamicManaAbility(Mana mana, DynamicValue amount, Cost cost, String text, boolean oneChoice, DynamicValue netAmount) { + super(Zone.BATTLEFIELD, new DynamicManaEffect(mana, amount, text, oneChoice, netAmount), cost); + manaEffect = (DynamicManaEffect) this.getEffects().get(0); + } public DynamicManaAbility(final DynamicManaAbility ability) { super(ability); @@ -95,8 +110,9 @@ public class DynamicManaAbility extends ManaAbility { List newNetMana = new ArrayList<>(); if (game != null) { // TODO: effects from replacement effects like Mana Reflection are not considered yet + // TODO: effects that need a X payment (e.g. Mage-Ring Network) return always 0 newNetMana.add(manaEffect.computeMana(true, game, this)); - } - return newNetMana; + } + return newNetMana; } } diff --git a/Mage/src/mage/abilities/mana/ManaOptions.java b/Mage/src/mage/abilities/mana/ManaOptions.java index 4965a650b13..bb5977e813f 100644 --- a/Mage/src/mage/abilities/mana/ManaOptions.java +++ b/Mage/src/mage/abilities/mana/ManaOptions.java @@ -95,7 +95,7 @@ public class ManaOptions extends ArrayList { Mana moreValuable = Mana.getMoreValuableMana(newMana, existingMana); if (moreValuable != null) { // only keep the more valuable mana - existingMana.setToMana(newMana); + existingMana.setToMana(moreValuable); continue SkipAddMana; } } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index a285cde583f..0bc26e40f1f 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2164,7 +2164,7 @@ public abstract class PlayerImpl implements Player, Serializable { public ManaOptions getManaAvailable(Game game) { ManaOptions available = new ManaOptions(); - List> sourceWithoutCosts = new ArrayList<>(); + List> sourceWithoutManaCosts = new ArrayList<>(); List> sourceWithCosts = new ArrayList<>(); for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { boolean canAdd = false; @@ -2183,12 +2183,12 @@ public abstract class PlayerImpl implements Player, Serializable { if (withCost) { sourceWithCosts.add(manaAbilities); } else { - sourceWithoutCosts.add(manaAbilities); + sourceWithoutManaCosts.add(manaAbilities); } } } - for (Abilities manaAbilities : sourceWithoutCosts) { + for (Abilities manaAbilities : sourceWithoutManaCosts) { available.addMana(manaAbilities, game); } for (Abilities manaAbilities : sourceWithCosts) { From 7d3ff0551dfb1a7124c5b80d7f1386a72abdbff6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 15:58:10 +0200 Subject: [PATCH 153/375] Added a test. --- .../sets/magicorigins/NissaSageAnimist.java | 1 - .../sets/zendikar/QuestForTheGravelord.java | 4 +- .../test/cards/planeswalker/UginTest.java | 91 +++++++++++++++++++ .../java/org/mage/test/player/TestPlayer.java | 3 + .../base/impl/CardTestPlayerAPIImpl.java | 13 ++- Mage/src/mage/game/GameImpl.java | 15 ++- 6 files changed, 117 insertions(+), 10 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/UginTest.java diff --git a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java index 6f256623cda..7959cf7f6b3 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java +++ b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java @@ -67,7 +67,6 @@ public class NissaSageAnimist extends CardImpl { this.color.setGreen(true); this.nightCard = true; - this.canTransform = true; this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false)); diff --git a/Mage.Sets/src/mage/sets/zendikar/QuestForTheGravelord.java b/Mage.Sets/src/mage/sets/zendikar/QuestForTheGravelord.java index 540570e9664..ddba7cf5ceb 100644 --- a/Mage.Sets/src/mage/sets/zendikar/QuestForTheGravelord.java +++ b/Mage.Sets/src/mage/sets/zendikar/QuestForTheGravelord.java @@ -32,7 +32,6 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; import mage.MageInt; -import mage.ObjectColor; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveCountersSourceCost; @@ -53,7 +52,6 @@ public class QuestForTheGravelord extends CardImpl { super(ownerId, 108, "Quest for the Gravelord", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}"); this.expansionSetCode = "ZEN"; - // Whenever a creature dies, you may put a quest counter on Quest for the Gravelord. this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.QUEST.createInstance()), true)); // Remove three quest counters from Quest for the Gravelord and sacrifice it: Put a 5/5 black Zombie Giant creature token onto the battlefield. @@ -86,4 +84,4 @@ class ZombieToken extends Token { power = new MageInt(5); toughness = new MageInt(5); } -} \ No newline at end of file +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/UginTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/UginTest.java new file mode 100644 index 00000000000..bc396fbfd04 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/UginTest.java @@ -0,0 +1,91 @@ +/* + * 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 org.mage.test.cards.planeswalker; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class UginTest extends CardTestPlayerBase { + + @Test + public void testCard() { + // +2: Ugin, the Spirit Dragon deals 3 damage to target creature or player. + // -X: Exile each permanent with converted mana cost X or less that's one or more colors. + // -10: You gain 7 life, draw 7 cards, then put up to seven permanent cards from your hand onto the battlefield. + addCard(Zone.BATTLEFIELD, playerA, "Ugin, the Spirit Dragon"); // starts with 7 Loyality counters + // Whenever a creature dies, you may put a quest counter on Quest for the Gravelord. + addCard(Zone.BATTLEFIELD, playerA, "Quest for the Gravelord"); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion"); + + addCard(Zone.LIBRARY, playerB, "Forest", 2); + addCard(Zone.BATTLEFIELD, playerB, "Forest", 6); + // When Nissa, Vastwood Seer enters the battlefield, you may search your library for a basic Forest card, reveal it, put it into your hand, then shuffle your library. + // Whenever a land enters the battlefield under your control, if you control seven or more lands, exile Nissa, then return her to the battlefield transformed under her owner's control. + // +1: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. + // -2: Put a legendary 4/4 green Elemental creature token named Ashaya, the Awoken World onto the battlefield. + // -7: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands. + addCard(Zone.HAND, playerB, "Nissa, Vastwood Seer"); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to target creature or player.", playerB); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Nissa, Vastwood Seer"); + playLand(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Forest"); + activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "-2: Put a legendary 4/4 green Elemental creature token named Ashaya, the Awoken World onto the battlefield."); + + attack(3, playerA, "Silvercoat Lion"); + block(3, playerB, "Ashaya, the Awoken World", "Silvercoat Lion"); + + activateAbility(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "-X: Exile each permanent with converted mana cost X or less that's one or more colors"); + setChoice(playerA, "X=0"); + + setStopAt(3, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Ugin, the Spirit Dragon", 1); + assertCounterCount("Ugin, the Spirit Dragon", CounterType.LOYALTY, 9); // 7 + 2 - 0 + + assertGraveyardCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerB, "Ashaya, the Awoken World", 0); + + assertExileCount("Nissa, Vastwood Seer", 1); + + assertCounterCount("Quest for the Gravelord", CounterType.QUEST, 1); + + assertLife(playerA, 20); + assertLife(playerB, 17); + + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 683c11da3e7..4b8baa125c1 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -253,6 +253,9 @@ public class TestPlayer implements Player { int targetsSet = 0; for (Player player : game.getPlayers().values()) { if (player.getName().equals(target)) { + if (ability.getTargets().isEmpty()) { + throw new UnsupportedOperationException("Ability has no targets, but there is a player target set - " + ability.toString()); + } ability.getTargets().get(0).addTarget(player.getId(), ability, game); targetsSet++; break; diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 25b40da1869..d40b5113bff 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -219,6 +219,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * * @param player {@link Player} to remove all library cards from. */ + @Override public void removeAllCardsFromLibrary(TestPlayer player) { getCommands(player).put(Zone.LIBRARY, "clear"); } @@ -241,6 +242,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * playerB. * @param cardName Card name in string format. */ + @Override public void addCard(Zone gameZone, TestPlayer player, String cardName) { addCard(gameZone, player, cardName, 1, false); } @@ -254,6 +256,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * @param cardName Card name in string format. * @param count Amount of cards to be added. */ + @Override public void addCard(Zone gameZone, TestPlayer player, String cardName, int count) { addCard(gameZone, player, cardName, count, false); } @@ -270,6 +273,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * permanent should be tapped. In case gameZone is other than Battlefield, * {@link IllegalArgumentException} is thrown */ + @Override public void addCard(Zone gameZone, TestPlayer player, String cardName, int count, boolean tapped) { if (gameZone.equals(Zone.BATTLEFIELD)) { @@ -324,6 +328,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * @param player {@link Player} to set life count for. * @param life Life count to set. */ + @Override public void setLife(TestPlayer player, int life) { getCommands(player).put(Zone.OUTSIDE, "life:" + String.valueOf(life)); } @@ -714,16 +719,16 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement /** * Assert whether X permanents of the same name are tapped or not. * - * @param cardName Name of the permanent that should be checked. - * @param tapped Whether the permanent is tapped or not - * @param count The amount of this permanents that should be tapped + * @param cardName Name of the permanent that should be checked. + * @param tapped Whether the permanent is tapped or not + * @param count The amount of this permanents that should be tapped */ public void assertTappedCount(String cardName, boolean tapped, int count) throws AssertionError { int tappedAmount = 0; Permanent found = null; for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) { if (permanent.getName().equals(cardName)) { - if(permanent.isTapped() == tapped) { + if (permanent.isTapped() == tapped) { tappedAmount++; } found = permanent; diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 07fb43d5805..b14cd2908a0 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -44,6 +44,7 @@ import java.util.Random; import java.util.Set; import java.util.Stack; import java.util.UUID; +import mage.MageException; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; @@ -1173,6 +1174,7 @@ public abstract class GameImpl implements Game, Serializable { @Override public void playPriority(UUID activePlayerId, boolean resuming) { + int errorContinueCounter = 0; int bookmark = 0; clearAllBookmarks(); try { @@ -1239,11 +1241,19 @@ public abstract class GameImpl implements Game, Serializable { } } catch (Exception ex) { logger.fatal("Game exception gameId: " + getId(), ex); - ex.printStackTrace(); this.fireErrorEvent("Game exception occurred: ", ex); restoreState(bookmark, ""); bookmark = 0; - continue; + Player activePlayer = this.getPlayer(getActivePlayerId()); + if (errorContinueCounter > 15) { + throw new MageException("Iterated player priority after game exception too often, game ends!"); + } + if (activePlayer != null && !activePlayer.isTestMode()) { + errorContinueCounter++; + continue; + } else { + throw new MageException("Error in testclass"); + } } state.getPlayerList().getNext(); } @@ -1251,6 +1261,7 @@ public abstract class GameImpl implements Game, Serializable { } catch (Exception ex) { logger.fatal("Game exception ", ex); this.fireErrorEvent("Game exception occurred: ", ex); + this.end(); } finally { resetLKI(); clearAllBookmarks(); From 2e01d2ec52abbaaeefa25d489834d8aeb27715ae Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 16:00:15 +0200 Subject: [PATCH 154/375] * Swift Warkite - Fixed that it returned object also if the object changed zone meanwhile. --- .../sets/dragonsoftarkir/SwiftWarkite.java | 8 ++--- .../sets/returntoravnica/GraveBetrayal.java | 35 +++++++------------ .../sets/scarsofmirrodin/ArgentSphinx.java | 24 +++++++------ .../scarsofmirrodin/VenserTheSojourner.java | 8 ++--- 4 files changed, 33 insertions(+), 42 deletions(-) diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/SwiftWarkite.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/SwiftWarkite.java index d3a8b1757eb..7cf4b87280b 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/SwiftWarkite.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/SwiftWarkite.java @@ -126,10 +126,10 @@ class SwiftWarkiteEffect extends OneShotEffect { Permanent creature = game.getPermanent(card.getId()); if (creature != null) { ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - effect.setTargetPointer(new FixedTarget(creature.getId())); + effect.setTargetPointer(new FixedTarget(creature.getId(), creature.getZoneChangeCounter(game))); game.addEffect(effect, source); Effect effect2 = new ReturnToHandTargetEffect(); - effect2.setTargetPointer(new FixedTarget(creature.getId())); + effect2.setTargetPointer(new FixedTarget(creature.getId(), creature.getZoneChangeCounter(game))); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect2); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.setSourceId(source.getSourceId()); @@ -147,10 +147,10 @@ class SwiftWarkiteEffect extends OneShotEffect { Permanent creature = game.getPermanent(card.getId()); if (creature != null) { ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - effect.setTargetPointer(new FixedTarget(creature.getId())); + effect.setTargetPointer(new FixedTarget(creature.getId(), creature.getZoneChangeCounter(game))); game.addEffect(effect, source); Effect effect2 = new ReturnToHandTargetEffect(); - effect2.setTargetPointer(new FixedTarget(creature.getId())); + effect2.setTargetPointer(new FixedTarget(creature.getId(), creature.getZoneChangeCounter(game))); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect2); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.setSourceId(source.getSourceId()); diff --git a/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java b/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java index d28418b9095..dab0ee466f1 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.returntoravnica; import java.util.UUID; @@ -58,21 +57,19 @@ import mage.target.targetpointer.FixedTarget; * * @author LevelX2 */ - public class GraveBetrayal extends CardImpl { - public GraveBetrayal (UUID ownerId) { + public GraveBetrayal(UUID ownerId) { super(ownerId, 67, "Grave Betrayal", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{5}{B}{B}"); this.expansionSetCode = "RTR"; - // Whenever a creature you don't control dies, return it to the battlefield under // your control with an additional +1/+1 counter on it at the beginning of the // next end step. That creature is a black Zombie in addition to its other colors and types. this.addAbility(new GraveBetrayalTriggeredAbility()); } - public GraveBetrayal (final GraveBetrayal card) { + public GraveBetrayal(final GraveBetrayal card) { super(card); } @@ -108,13 +105,10 @@ class GraveBetrayalTriggeredAbility extends TriggeredAbilityImpl { && ((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) { Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); if (permanent != null && !permanent.getControllerId().equals(this.getControllerId()) && permanent.getCardType().contains(CardType.CREATURE)) { - Card card = (Card)game.getObject(permanent.getId()); + Card card = (Card) game.getObject(permanent.getId()); if (card != null) { Effect effect = new GraveBetrayalEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); - Integer zoneChanges = card.getZoneChangeCounter(game); - effect.setValue("zoneChanges", zoneChanges); - + effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(this.getSourceId()); delayedAbility.setControllerId(this.getControllerId()); @@ -153,17 +147,14 @@ class GraveBetrayalEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Card card = game.getCard(targetPointer.getFirst(game, source)); if (card != null) { - Integer zoneChanges = (Integer) getValue("zoneChanges"); - if (card.getZoneChangeCounter(game) == zoneChanges) { - Zone currentZone = game.getState().getZone(card.getId()); - if (card.putOntoBattlefield(game, currentZone, source.getSourceId(), source.getControllerId())) { - Permanent creature = game.getPermanent(card.getId()); - creature.addCounters(CounterType.P1P1.createInstance(), game); - ContinuousEffect effect = new GraveBetrayalContiniousEffect(); - effect.setTargetPointer(new FixedTarget(creature.getId())); - game.addEffect(effect, source); - return true; - } + Zone currentZone = game.getState().getZone(card.getId()); + if (card.putOntoBattlefield(game, currentZone, source.getSourceId(), source.getControllerId())) { + Permanent creature = game.getPermanent(card.getId()); + creature.addCounters(CounterType.P1P1.createInstance(), game); + ContinuousEffect effect = new GraveBetrayalContiniousEffect(); + effect.setTargetPointer(new FixedTarget(creature.getId())); + game.addEffect(effect, source); + return true; } } return false; @@ -220,4 +211,4 @@ class GraveBetrayalContiniousEffect extends ContinuousEffectImpl { return layer == Layer.ColorChangingEffects_5 || layer == Layer.TypeChangingEffects_4; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java index 3613ce6d0d4..3863832e516 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java @@ -25,15 +25,11 @@ * 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.Rarity; -import mage.constants.Zone; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; @@ -43,7 +39,10 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnFromExileEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; @@ -53,7 +52,7 @@ import mage.game.permanent.Permanent; */ public class ArgentSphinx extends CardImpl { - public ArgentSphinx (UUID ownerId) { + public ArgentSphinx(UUID ownerId) { super(ownerId, 28, "Argent Sphinx", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); this.expansionSetCode = "SOM"; this.subtype.add("Sphinx"); @@ -66,7 +65,7 @@ public class ArgentSphinx extends CardImpl { this.addAbility(ability); } - public ArgentSphinx (final ArgentSphinx card) { + public ArgentSphinx(final ArgentSphinx card) { super(card); } @@ -81,7 +80,7 @@ class ArgentSphinxEffect extends OneShotEffect { private static final String effectText = "Exile {this}. Return it to the battlefield under your control at the beginning of the next end step"; - ArgentSphinxEffect ( ) { + ArgentSphinxEffect() { super(Outcome.Benefit); staticText = effectText; } @@ -93,10 +92,13 @@ class ArgentSphinxEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - if (permanent.moveToExile(source.getSourceId(), "Argent Sphinx Exile", source.getSourceId(), game)) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (permanent != null && sourceObject != null) { + if (permanent.moveToExile(source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game)) { //create delayed triggered ability - AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); + AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility + = new AtTheBeginOfNextEndStepDelayedTriggeredAbility( + new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.setSourceObject(source.getSourceObject(game), game); diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java index 2182a3dd8a6..2f4def3ecfd 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java @@ -25,7 +25,6 @@ * 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; @@ -81,8 +80,6 @@ public class VenserTheSojourner extends CardImpl { this.expansionSetCode = "SOM"; this.subtype.add("Venser"); - - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false)); // +2: Exile target permanent you own. Return it to the battlefield under your control at the beginning of the next end step. @@ -131,7 +128,7 @@ class VenserTheSojournerEffect extends OneShotEffect { if (getTargetPointer().getFirst(game, source) != null) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent != null) { - if (controller.moveCardToExileWithInfo(permanent, source.getSourceId(), sourceObject.getName(), source.getSourceId(), game, Zone.BATTLEFIELD, true)) { + if (controller.moveCardToExileWithInfo(permanent, source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true)) { //create delayed triggered ability AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); @@ -174,7 +171,8 @@ class VenserTheSojournerSpellCastTriggeredAbility extends TriggeredAbilityImpl { protected FilterSpell filter; /** - * If true, the source that triggered the ability will be set as target to effect. + * If true, the source that triggered the ability will be set as target to + * effect. */ protected boolean rememberSource = false; From 05e35bcae77b2641f3e90629aa045bde8cdd8b1f Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 19:53:34 +0200 Subject: [PATCH 155/375] Fixed build problem with OptionalAdditionalCostImpl. --- .../costs/OptionalAdditionalCost.java | 2 +- .../costs/OptionalAdditionalCostImpl.java | 44 ++++++++++--------- .../mage/abilities/keyword/KickerAbility.java | 18 +++++--- 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java b/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java index 949bbdfe45c..83aa204299e 100644 --- a/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java +++ b/Mage/src/mage/abilities/costs/OptionalAdditionalCost.java @@ -30,7 +30,7 @@ package mage.abilities.costs; /** * @author LevelX2 */ -public interface OptionalAdditionalCost extends Costs { +public interface OptionalAdditionalCost extends Cost { String getName(); diff --git a/Mage/src/mage/abilities/costs/OptionalAdditionalCostImpl.java b/Mage/src/mage/abilities/costs/OptionalAdditionalCostImpl.java index 6132df52fc8..489d8690ea7 100644 --- a/Mage/src/mage/abilities/costs/OptionalAdditionalCostImpl.java +++ b/Mage/src/mage/abilities/costs/OptionalAdditionalCostImpl.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.costs; /** @@ -33,10 +32,7 @@ package mage.abilities.costs; * @author LevelX2 * @param */ - - -public class OptionalAdditionalCostImpl extends CostsImpl implements OptionalAdditionalCost{ - +public class OptionalAdditionalCostImpl extends CostsImpl implements OptionalAdditionalCost { protected String name; protected String reminderText; @@ -104,26 +100,26 @@ public class OptionalAdditionalCostImpl e } /** - * Returns a text suffix for the game log, that can be added to - * the cast message. + * Returns a text suffix for the game log, that can be added to the cast + * message. * - * @param position - if there are multiple costs, it's the postion the cost is set (starting with 0) + * @param position - if there are multiple costs, it's the postion the cost + * is set (starting with 0) * @return */ @Override public String getCastSuffixMessage(int position) { StringBuilder sb = new StringBuilder(); if (isActivated() && (!isRepeatable() || getActivateCount() > 0)) { - sb.append(position > 0 ? " and ":"").append(" with "); + sb.append(position > 0 ? " and " : "").append(" with "); if (isRepeatable()) { - sb.append(getActivateCount()).append(getActivateCount() > 1? " times ":" time "); + sb.append(getActivateCount()).append(getActivateCount() > 1 ? " times " : " time "); } sb.append(name); } - return sb.toString(); + return sb.toString(); } - /** * If the player intends to pay the cost, the cost will be activated * @@ -132,7 +128,9 @@ public class OptionalAdditionalCostImpl e public void activate() { activated = true; ++activatedCounter; - }; + } + + ; /** * Reset the activate and count information @@ -152,7 +150,7 @@ public class OptionalAdditionalCostImpl e @Override public void setRepeatable(boolean repeatable) { this.repeatable = repeatable; - } + } /** * Can the cost be multiple times activated @@ -162,7 +160,9 @@ public class OptionalAdditionalCostImpl e @Override public boolean isRepeatable() { return repeatable; - }; + } + + ; /** * Returns if the cost was activated @@ -170,20 +170,24 @@ public class OptionalAdditionalCostImpl e * @return */ @Override - public boolean isActivated(){ + public boolean isActivated() { return activated; - }; + } + + ; /** * Returns the number of times the cost was activated * @return */ @Override - public int getActivateCount(){ + public int getActivateCount() { return activatedCounter; - }; + } + + ; + - @Override public OptionalAdditionalCostImpl copy() { return new OptionalAdditionalCostImpl(this); diff --git a/Mage/src/mage/abilities/keyword/KickerAbility.java b/Mage/src/mage/abilities/keyword/KickerAbility.java index b262a3cc295..9056b7bc2e1 100644 --- a/Mage/src/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/mage/abilities/keyword/KickerAbility.java @@ -218,15 +218,19 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo if (kickerCost.canPay(ability, sourceId, controllerId, game) && player.chooseUse(Outcome.Benefit, "Pay " + times + kickerCost.getText(false) + " ?", ability, game)) { this.activateKicker(kickerCost, ability, game); - for (Iterator itKickerCost = kickerCost.iterator(); itKickerCost.hasNext();) { - Object kickerCostObject = itKickerCost.next(); - if ((kickerCostObject instanceof Costs) || (kickerCostObject instanceof CostsImpl)) { - for (@SuppressWarnings("unchecked") Iterator itDetails = ((Costs) kickerCostObject).iterator(); itDetails.hasNext();) { - addKickerCostsToAbility(itDetails.next(), ability, game); + if (kickerCost instanceof Costs) { + for (Iterator itKickerCost = ((Costs) kickerCost).iterator(); itKickerCost.hasNext();) { + Object kickerCostObject = itKickerCost.next(); + if ((kickerCostObject instanceof Costs) || (kickerCostObject instanceof CostsImpl)) { + for (@SuppressWarnings("unchecked") Iterator itDetails = ((Costs) kickerCostObject).iterator(); itDetails.hasNext();) { + addKickerCostsToAbility(itDetails.next(), ability, game); + } + } else { + addKickerCostsToAbility((Cost) kickerCostObject, ability, game); } - } else { - addKickerCostsToAbility((Cost) kickerCostObject, ability, game); } + } else { + addKickerCostsToAbility((Cost) kickerCost, ability, game); } again = kickerCost.isRepeatable(); } else { From 0f6fab52489b35442c5356e56bb40048b866f3db Mon Sep 17 00:00:00 2001 From: Simown Date: Wed, 22 Jul 2015 22:01:02 +0100 Subject: [PATCH 156/375] Small fixes to "Domain" cards Draco, Fettergeist and Samite Pilgrim. --- .../mage/sets/avacynrestored/Fettergeist.java | 5 +-- Mage.Sets/src/mage/sets/ftvdragons/Draco.java | 6 +-- .../mage/sets/planeshift/SamitePilgrim.java | 42 ++----------------- 3 files changed, 5 insertions(+), 48 deletions(-) diff --git a/Mage.Sets/src/mage/sets/avacynrestored/Fettergeist.java b/Mage.Sets/src/mage/sets/avacynrestored/Fettergeist.java index 6b8cec80c85..cd1e936ab91 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/Fettergeist.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/Fettergeist.java @@ -102,10 +102,7 @@ class FettergeistUnlessPaysEffect extends OneShotEffect { if (player != null && permanent != null) { PermanentsOnBattlefieldCount amount = new PermanentsOnBattlefieldCount(filter, 1); int count = amount.calculate(game, source, this); - if (count == 0) { - return true; - } - if (player.chooseUse(Outcome.Benefit, "Pay " + count + "?", source, game)) { + if (player.chooseUse(Outcome.Benefit, "Pay " + count + "? Or " + permanent.getName() + " will be sacrificed.", source, game)) { GenericManaCost cost = new GenericManaCost(count); if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)) { return true; diff --git a/Mage.Sets/src/mage/sets/ftvdragons/Draco.java b/Mage.Sets/src/mage/sets/ftvdragons/Draco.java index e169224878f..2335c0a2e92 100644 --- a/Mage.Sets/src/mage/sets/ftvdragons/Draco.java +++ b/Mage.Sets/src/mage/sets/ftvdragons/Draco.java @@ -124,11 +124,7 @@ class DracoSacrificeUnlessPaysEffect extends OneShotEffect { if (player != null && permanent != null) { // The cost is reduced by {2} for each basic land type. int domainValueReduction = new DomainValue(2).calculate(game, source, this); - // Nothing to pay - if (domainValueReduction >= MAX_DOMAIN_VALUE) { - return true; - } - int count = (MAX_DOMAIN_VALUE-domainValueReduction ); + int count = MAX_DOMAIN_VALUE - domainValueReduction; if (player.chooseUse(Outcome.Benefit, "Pay {" + count + "}? Or " + permanent.getName() + " will be sacrificed.", source, game)) { GenericManaCost cost = new GenericManaCost(count); if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)) { diff --git a/Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java b/Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java index c2fa8ef4db4..81ea8fbc8ee 100644 --- a/Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java +++ b/Mage.Sets/src/mage/sets/planeshift/SamitePilgrim.java @@ -55,7 +55,7 @@ public class SamitePilgrim extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // Domain - {tap}: Prevent the next X damage that would be dealt to target creature this turn, where X is the number of basic land types among lands you control. + // Domain - {T}: Prevent the next X damage that would be dealt to target creature this turn, where X is the number of basic land types among lands you control. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SamitePilgrimPreventDamageToTargetEffect(), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); @@ -73,16 +73,14 @@ public class SamitePilgrim extends CardImpl { class SamitePilgrimPreventDamageToTargetEffect extends PreventionEffectImpl { - protected int amount = 0; public SamitePilgrimPreventDamageToTargetEffect() { - super(Duration.EndOfTurn); + super(Duration.EndOfTurn, Integer.MAX_VALUE, false, true); staticText = "Prevent the next X damage that would be dealt to target creature this turn, where X is the number of basic land types among lands you control."; } public SamitePilgrimPreventDamageToTargetEffect(final SamitePilgrimPreventDamageToTargetEffect effect) { super(effect); - this.amount = effect.amount; } @Override @@ -93,7 +91,7 @@ class SamitePilgrimPreventDamageToTargetEffect extends PreventionEffectImpl { @Override public void init(Ability source, Game game) { super.init(source, game); - amount = new DomainValue().calculate(game, source, this); + amountToPrevent = new DomainValue().calculate(game, source, this); } @Override @@ -101,40 +99,6 @@ class SamitePilgrimPreventDamageToTargetEffect extends PreventionEffectImpl { return true; } - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - boolean result = false; - int toPrevent = amount; - if (event.getAmount() < this.amount) { - toPrevent = event.getAmount(); - amount -= event.getAmount(); - } else { - amount = 0; - } - GameEvent preventEvent = new GameEvent(GameEvent.EventType.PREVENT_DAMAGE, source.getControllerId(), source.getSourceId(), source.getControllerId(), toPrevent, false); - if (!game.replaceEvent(preventEvent)) { - Permanent targetCreature = game.getPermanent(source.getFirstTarget()); - if (targetCreature != null) { - if (amount == 0) { - this.used = true; - this.discard(); - } - if (event.getAmount() >= toPrevent) { - event.setAmount(event.getAmount() - toPrevent); - } else { - event.setAmount(0); - result = true; - } - if (toPrevent > 0) { - game.informPlayers(new StringBuilder("Samite Pilgrim ").append("prevented ").append(toPrevent).append(" to ").append(targetCreature.getName()).toString()); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, - source.getControllerId(), source.getSourceId(), source.getControllerId(), toPrevent)); - } - } - } - return result; - } - @Override public boolean applies(GameEvent event, Ability source, Game game) { return !this.used && super.applies(event, source, game) && event.getTargetId().equals(source.getFirstTarget()); From 6e4b63dfd9c9493f585f4b7b1059415fa99b26f5 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 23 Jul 2015 23:38:05 +0200 Subject: [PATCH 157/375] * Heartstone - Fixed that it can also reduce mana costs of abilities that include only 1 colorless mana and some colored mana. --- .../mage/sets/morningtide/SigilTracer.java | 7 +- .../src/mage/sets/stronghold/Heartstone.java | 48 ++++++------ .../cost/modification/HeartstoneTest.java | 73 +++++++++++++++++++ 3 files changed, 100 insertions(+), 28 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/HeartstoneTest.java diff --git a/Mage.Sets/src/mage/sets/morningtide/SigilTracer.java b/Mage.Sets/src/mage/sets/morningtide/SigilTracer.java index b5e5499dfa0..f97d3fdc29c 100644 --- a/Mage.Sets/src/mage/sets/morningtide/SigilTracer.java +++ b/Mage.Sets/src/mage/sets/morningtide/SigilTracer.java @@ -28,9 +28,6 @@ package mage.sets.morningtide; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -38,6 +35,8 @@ import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CopyTargetSpellEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.FilterSpell; import mage.filter.common.FilterControlledCreaturePermanent; @@ -72,6 +71,8 @@ public class SigilTracer extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); + + // {1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl("{1}{U}")); ability.addTarget(new TargetSpell(filterInstorSorc)); ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(2, 2, filter, false))); diff --git a/Mage.Sets/src/mage/sets/stronghold/Heartstone.java b/Mage.Sets/src/mage/sets/stronghold/Heartstone.java index e30efda2bc9..4b4af5e2c9a 100644 --- a/Mage.Sets/src/mage/sets/stronghold/Heartstone.java +++ b/Mage.Sets/src/mage/sets/stronghold/Heartstone.java @@ -25,28 +25,26 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.stronghold; +package mage.sets.stronghold; - import java.util.LinkedHashSet; - import java.util.Set; - import java.util.UUID; - import mage.Mana; - import mage.abilities.Ability; - import mage.abilities.common.SimpleStaticAbility; - import mage.abilities.effects.common.cost.CostModificationEffectImpl; - import mage.cards.CardImpl; - import mage.constants.AbilityType; - import mage.constants.CardType; - import mage.constants.CostModificationType; - import mage.constants.Duration; - import mage.constants.Outcome; - import mage.constants.Rarity; - import mage.constants.Zone; - import mage.filter.common.FilterCreaturePermanent; - import mage.game.Game; - import mage.game.permanent.Permanent; - import mage.players.Player; - import mage.util.CardUtil; +import java.util.UUID; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.cards.CardImpl; +import mage.constants.AbilityType; +import mage.constants.CardType; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.util.CardUtil; /** * @@ -89,14 +87,14 @@ class HeartstoneEffect extends CostModificationEffectImpl { @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { Player controller = game.getPlayer(abilityToModify.getControllerId()); - if (controller != null){ + if (controller != null) { Mana mana = abilityToModify.getManaCostsToPay().getMana(); - if (mana.getColorless() > 1){ - CardUtil.reduceCost(abilityToModify, 1); + if (mana.count() > 1 && mana.getColorless() > 0) { + CardUtil.reduceCost(abilityToModify, 1); } return true; } - return false; + return false; } @Override diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/HeartstoneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/HeartstoneTest.java new file mode 100644 index 00000000000..60253c99c6e --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/HeartstoneTest.java @@ -0,0 +1,73 @@ +/* + * 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 org.mage.test.cards.cost.modification; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class HeartstoneTest extends CardTestPlayerBase { + + /** + * Heartstone is not reducing the cost of Sigil Tracer 's activated ability + */ + @Test + public void testSigilTracer() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + // {1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy. + addCard(Zone.BATTLEFIELD, playerA, "Sigil Tracer"); + // Activated abilities of creatures cost {1} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. + addCard(Zone.BATTLEFIELD, playerA, "Heartstone"); + addCard(Zone.BATTLEFIELD, playerA, "Fugitive Wizard"); + + addCard(Zone.BATTLEFIELD, playerB, "Mountain"); + addCard(Zone.HAND, playerB, "Lightning Bolt"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", playerA); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{U},Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy.", "Lightning Bolt"); + setChoice(playerA, "Yes"); + addTarget(playerA, playerB); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerB, "Lightning Bolt", 1); + + assertTapped("Fugitive Wizard", true); + assertLife(playerA, 17); + assertLife(playerB, 17); + + assertTappedCount("Island", true, 1); + + } + +} From 3a28372ae7736edd0bad14e88a689f749d3de942 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Thu, 23 Jul 2015 17:45:25 -0500 Subject: [PATCH 158/375] Implemented Changeling Berserker and Changeling Titan. Added FTV: Angel reprint Avacyn, Angel of Hope and Iona, Shield of Emeria. Added Ultimate Price FNM promo. --- .../sets/fridaynightmagic/UltimatePrice.java | 52 +++++++++++++++++++ .../sets/ftvangels/AvacynAngelOfHope.java | 52 +++++++++++++++++++ .../sets/ftvangels/IonaShieldOfEmeria.java | 52 +++++++++++++++++++ .../mage/sets/lorwyn/ChangelingBerserker.java | 2 +- .../src/mage/sets/lorwyn/ChangelingTitan.java | 2 +- Utils/mtg-cards-data.txt | 5 +- 6 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/fridaynightmagic/UltimatePrice.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/AvacynAngelOfHope.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/IonaShieldOfEmeria.java diff --git a/Mage.Sets/src/mage/sets/fridaynightmagic/UltimatePrice.java b/Mage.Sets/src/mage/sets/fridaynightmagic/UltimatePrice.java new file mode 100644 index 00000000000..a4e9057911a --- /dev/null +++ b/Mage.Sets/src/mage/sets/fridaynightmagic/UltimatePrice.java @@ -0,0 +1,52 @@ +/* + * 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.fridaynightmagic; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class UltimatePrice extends mage.sets.returntoravnica.UltimatePrice { + + public UltimatePrice(UUID ownerId) { + super(ownerId); + this.cardNumber = 185; + this.expansionSetCode = "FNMP"; + } + + public UltimatePrice(final UltimatePrice card) { + super(card); + } + + @Override + public UltimatePrice copy() { + return new UltimatePrice(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/AvacynAngelOfHope.java b/Mage.Sets/src/mage/sets/ftvangels/AvacynAngelOfHope.java new file mode 100644 index 00000000000..15fe6961aba --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/AvacynAngelOfHope.java @@ -0,0 +1,52 @@ +/* + * 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.ftvangels; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class AvacynAngelOfHope extends mage.sets.avacynrestored.AvacynAngelOfHope { + + public AvacynAngelOfHope(UUID ownerId) { + super(ownerId); + this.cardNumber = 5; + this.expansionSetCode = "V15"; + } + + public AvacynAngelOfHope(final AvacynAngelOfHope card) { + super(card); + } + + @Override + public AvacynAngelOfHope copy() { + return new AvacynAngelOfHope(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/IonaShieldOfEmeria.java b/Mage.Sets/src/mage/sets/ftvangels/IonaShieldOfEmeria.java new file mode 100644 index 00000000000..498697ebd3b --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/IonaShieldOfEmeria.java @@ -0,0 +1,52 @@ +/* + * 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.ftvangels; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class IonaShieldOfEmeria extends mage.sets.zendikar.IonaShieldOfEmeria { + + public IonaShieldOfEmeria(UUID ownerId) { + super(ownerId); + this.cardNumber = 9; + this.expansionSetCode = "V15"; + } + + public IonaShieldOfEmeria(final IonaShieldOfEmeria card) { + super(card); + } + + @Override + public IonaShieldOfEmeria copy() { + return new IonaShieldOfEmeria(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java b/Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java index 58cc77814be..524432df7b4 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java +++ b/Mage.Sets/src/mage/sets/lorwyn/ChangelingBerserker.java @@ -56,7 +56,7 @@ public class ChangelingBerserker extends CardImpl { this.addAbility(HasteAbility.getInstance()); // Champion a creature - this.addAbility(new ChampionAbility(this, null); + this.addAbility(new ChampionAbility(this, "")); } public ChangelingBerserker(final ChangelingBerserker card) { diff --git a/Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java b/Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java index c2c4f0d8153..99915222520 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java +++ b/Mage.Sets/src/mage/sets/lorwyn/ChangelingTitan.java @@ -52,7 +52,7 @@ public class ChangelingTitan extends CardImpl { this.addAbility(ChangelingAbility.getInstance()); // Champion a creature - this.addAbility(new ChampionAbility(this, null); + this.addAbility(new ChampionAbility(this, "")); } public ChangelingTitan(final ChangelingTitan card) { diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 1b5eb9831c3..41cb0676554 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -5892,6 +5892,7 @@ Frost Walker|Friday Night Magic|181|U|{1}{U}|Creature - Elemental|4|1|When Frost Path to Exile|Friday Night Magic|182|U|{W}|Instant|||Exile target creature. Its controller may search his or her library for a basic land card, put that card onto the battlefield tapped, then shuffle his or her library.| Serum Visions|Friday Night Magic|183|C|{U}|Sorcery|||Draw a card.$Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)| Orator of Ojutai|Friday Night Magic|184|U|{1}{W}|Creature - Bird Monk|0|4|Defneder, flying$As an additional cost to cast Orator of Ojutai, you may reveal a Dragon card from your hand.$When Orator of Ojutai enters the battlefield, if you revealed a Dragon card or controlled a Dragon as you cast Orator of Ojutai, draw a card.| +Ultimate Price|Friday Night Magic|185|U|{1}{B}|Instant|||Destroy target monocolored creature.| Angel of Salvation|Future Sight|1|R|{6}{W}{W}|Creature - Angel|5|5|Flash; convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)$Flying$When Angel of Salvation enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose.| Knight of Sursi|Future Sight|10|C|{3}{W}|Creature - Human Knight|2|2|Flying; flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)$Suspend 3-{W} (Rather than cast this card from your hand, you may pay {W} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.)| Haze of Rage|Future Sight|100|U|{1}{R}|Sorcery|||Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.)$Creatures you control get +1/+0 until end of turn.$Storm (When you cast this spell, copy it for each spell cast before it this turn.)| @@ -27233,4 +27234,6 @@ Swamp|Premium Deck Series: Slivers|39|L||Basic Land - Swamp|||B| Mountain|Premium Deck Series: Slivers|40|L||Basic Land - Mountain|||R| Forest|Premium Deck Series: Slivers|41|L||Basic Land - Forest|||G| Akroma, Angel of Fury|From the Vault: Angels|1|M|{5}{R}{R}{R}|Legendary Creature - Angel|6|6|Akroma, Angel of Fury can't be countered.$Flying, trample, protection from white and from blue${R}: Akroma, Angel of Fury gets +1/+0 until end of turn.$Morph {3}{R}{R}{R} You may cast this card face downn as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)| -Akroma, Angel of Wrath|From the Vault: Angels|2|M|{5}{W}{W}{W}|Legendary Creature - Angel|6|6|Flying, first strike, vigilance, trample, haste, protection from black and from red| \ No newline at end of file +Akroma, Angel of Wrath|From the Vault: Angels|2|M|{5}{W}{W}{W}|Legendary Creature - Angel|6|6|Flying, first strike, vigilance, trample, haste, protection from black and from red| +Avacyn, Angel of Hope|From the Vault: Angels|5|M|{5}{W}{W}{W}|Legendary Creature - Angel|8|8|Flying, vigilance$Avacyn, Angel of Hope and other permanents you control are indestructible.| +Iona, Shield of Emeria|From the Vault: Angels|9|M|{6}{W}{W}{W}|Legendary Creature - Angel|7|7|Flying$As Iona, Shield of Emeria enters the battlefield, choose a color.$Your opponents can't cast spells of the chosen color.| \ No newline at end of file From 5897f1595a591a27b83d53888975aceec284983e Mon Sep 17 00:00:00 2001 From: fireshoes Date: Fri, 24 Jul 2015 00:21:32 -0500 Subject: [PATCH 159/375] Implemented Glissa Sunseeker, Phyrexian Furnace, Flickering Ward, Cho-Manno's Blessing, Meng Huo Barbarian King, Sword of the Chosen, Pentarch Ward, Order of the Stars, Ancestral Mask, Jedit Ojanen of Efrava, Krosan Restorer, & Nature's Kiss. Added set Battle for Zendikar and spoiled Evolving Wilds. --- .../plugins/card/dl/sources/GathererSets.java | 3 +- .../dl/sources/MagicCardsImageSource.java | 1 + .../dl/sources/WizardCardsImageSource.java | 1 + .../src/main/resources/card-pictures-tok.txt | 13 ++ .../src/main/resources/image.url.properties | 4 +- .../src/mage/sets/BattleForZendikar.java | 60 +++++++++ .../sets/battleforzendikar/EvolvingWilds.java | 52 ++++++++ .../mage/sets/guildpact/OrderOfTheStars.java | 113 ++++++++++++++++ .../MengHuoBarbarianKing.java | 52 ++++++++ .../sets/mercadianmasques/AncestralMask.java | 83 ++++++++++++ .../mercadianmasques/ChoMannosBlessing.java | 122 +++++++++++++++++ .../mage/sets/mirrodin/GlissaSunseeker.java | 116 ++++++++++++++++ .../sets/planarchaos/JeditOjanenOfEfrava.java | 85 ++++++++++++ .../src/mage/sets/planeshift/VoiceOfAll.java | 4 +- .../MengHuoBarbarianKing.java | 80 +++++++++++ .../sets/stronghold/SwordOfTheChosen.java | 75 +++++++++++ .../src/mage/sets/tempest/FlickeringWard.java | 125 +++++++++++++++++ .../mage/sets/timespiral/PentarchWard.java | 123 +++++++++++++++++ .../src/mage/sets/torment/KrosanRestorer.java | 82 ++++++++++++ .../mage/sets/weatherlight/NaturesKiss.java | 126 ++++++++++++++++++ .../sets/weatherlight/PhyrexianFurnace.java | 113 ++++++++++++++++ Utils/known-sets.txt | 1 + Utils/mtg-cards-data.txt | 3 +- Utils/mtg-sets-data.txt | 1 + 24 files changed, 1432 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/BattleForZendikar.java create mode 100644 Mage.Sets/src/mage/sets/battleforzendikar/EvolvingWilds.java create mode 100644 Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/MengHuoBarbarianKing.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/AncestralMask.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/MengHuoBarbarianKing.java create mode 100644 Mage.Sets/src/mage/sets/stronghold/SwordOfTheChosen.java create mode 100644 Mage.Sets/src/mage/sets/tempest/FlickeringWard.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/PentarchWard.java create mode 100644 Mage.Sets/src/mage/sets/torment/KrosanRestorer.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/PhyrexianFurnace.java diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java index 4723b78aa69..4ad6037eccd 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java @@ -48,7 +48,8 @@ public class GathererSets implements Iterable { "MMA", "MM2", "THS", "BNG", "JOU", "CNS", "VMA", "TPR", - "KTK", "FRF", "DTK"}; + "KTK", "FRF", "DTK", + "BFZ"}; private static final HashMap symbolsReplacements = new HashMap<>(); static { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java index c5f817eb14d..bec0386a467 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java @@ -16,6 +16,7 @@ public class MagicCardsImageSource implements CardImageSource { private static final Map setNameTokenReplacement = new HashMap() { { + put("BFZ", "battle-for-zendikar"); put("FVL", "from-the-vault-legends"); put("FVD", "from-the-vault-dragons"); put("FVE", "from-the-vault-exiled"); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java index 40d6f90b1eb..08a6a7287d8 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java @@ -92,6 +92,7 @@ public class WizardCardsImageSource implements CardImageSource { setsAliases.put("ATH", "Anthologies"); setsAliases.put("ATQ", "Antiquities"); setsAliases.put("AVR", "Avacyn Restored"); + setsAliases.put("BFZ", "Battle for Zendikar"); setsAliases.put("BNG", "Born of the Gods"); setsAliases.put("BOK", "Betrayers of Kamigawa"); setsAliases.put("BRB", "Battle Royale Box Set"); diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 406edd79263..9cf60742b90 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -26,7 +26,20 @@ #Generate|TOK:TPR|Thopter| #Generate|TOK:TPR|Zombie| +#|Generate|TOK:ORI|Ashaya, the Awoken World| +#|Generate|TOK:ORI|Angel| +#|Generate|TOK:ORI|Demon| +#|Generate|TOK:ORI|Elemental| +#|Generate|TOK:ORI|Elf Warrior| +#|Generate|TOK:ORI|Goblin| +#|Generate|TOK:ORI|Knight| +#|Generate|TOK:ORI|Soldier| +#|Generate|TOK:ORI|Thopter 1| +#|Generate|TOK:ORI|Thopter 2| #|Generate|TOK:ORI|Zombie| +#|Generate|EMBLEM!:ORI|Emblem Chandra, Roaring Flame| +#|Generate|EMBLEM!:ORI|Emblem Jace, Telepath Unbound| +#|Generate|EMBLEM!:ORI|Emblem Liliana, Defiant Necromancer| #|Generate|TOK:PTC|Angel| #|Generate|TOK:PTC|Avatar| diff --git a/Mage.Client/src/main/resources/image.url.properties b/Mage.Client/src/main/resources/image.url.properties index f558b0933de..fb9c408f3ab 100644 --- a/Mage.Client/src/main/resources/image.url.properties +++ b/Mage.Client/src/main/resources/image.url.properties @@ -64,6 +64,6 @@ ddd=gvl unh=uh dde=pvc # Remove setname as soon as the images can be downloaded -ignore.urls=TOK,MM2,V15 +ignore.urls=TOK,MM2,V15,BFZ # sets ordered by release time (newest goes first) -token.lookup.order=FVD,FVE,FVL,FVR,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC \ No newline at end of file +token.lookup.order=BFZ,FVD,FVE,FVL,FVR,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/BattleForZendikar.java b/Mage.Sets/src/mage/sets/BattleForZendikar.java new file mode 100644 index 00000000000..b6dc6ad2d77 --- /dev/null +++ b/Mage.Sets/src/mage/sets/BattleForZendikar.java @@ -0,0 +1,60 @@ +/* + * 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; + +import java.util.GregorianCalendar; +import mage.cards.ExpansionSet; +import mage.constants.SetType; + +/** + * + * @author fireshoes + */ + +public class BattleForZendikar extends ExpansionSet { + + private static final BattleForZendikar fINSTANCE = new BattleForZendikar(); + + public static BattleForZendikar getInstance() { + return fINSTANCE; + } + + private BattleForZendikar() { + super("Battle for Zendikar", "BFZ", "mage.sets.battleforzendikar", new GregorianCalendar(2015, 10, 2).getTime(), SetType.EXPANSION); + this.blockName = "Battle for Zendikar"; + this.hasBoosters = true; + this.hasBasicLands = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + } + +} diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EvolvingWilds.java b/Mage.Sets/src/mage/sets/battleforzendikar/EvolvingWilds.java new file mode 100644 index 00000000000..eb1aec5ff81 --- /dev/null +++ b/Mage.Sets/src/mage/sets/battleforzendikar/EvolvingWilds.java @@ -0,0 +1,52 @@ +/* + * 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.battleforzendikar; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class EvolvingWilds extends mage.sets.riseoftheeldrazi.EvolvingWilds { + + public EvolvingWilds(UUID ownerId) { + super(ownerId); + this.cardNumber = 236; + this.expansionSetCode = "BFZ"; + } + + public EvolvingWilds(final EvolvingWilds card) { + super(card); + } + + @Override + public EvolvingWilds copy() { + return new EvolvingWilds(this); + } +} diff --git a/Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java b/Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java new file mode 100644 index 00000000000..404e171b6ab --- /dev/null +++ b/Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java @@ -0,0 +1,113 @@ +/* + * 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.guildpact; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class OrderOfTheStars extends CardImpl { + + public OrderOfTheStars(UUID ownerId) { + super(ownerId, 13, "Order of the Stars", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "GPT"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(0); + this.toughness = new MageInt(1); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // As Order of the Stars enters the battlefield, choose a color. + // Order of the Stars has protection from the chosen color. + this.addAbility(new AsEntersBattlefieldAbility(new OrderOfTheStarsEffect())); + } + + public OrderOfTheStars(final OrderOfTheStars card) { + super(card); + } + + @Override + public OrderOfTheStars copy() { + return new OrderOfTheStars(this); + } +} + +class OrderOfTheStarsEffect extends OneShotEffect { + + public OrderOfTheStarsEffect() { + super(Outcome.Protect); + this.staticText = "{this} gains protection from the color of your choice"; + } + + public OrderOfTheStarsEffect(final OrderOfTheStarsEffect effect) { + super(effect); + } + + @Override + public OrderOfTheStarsEffect copy() { + return new OrderOfTheStarsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + ChoiceColor choice = new ChoiceColor(); + choice.setMessage("Choose color to get protection from"); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && controller.choose(outcome, choice, game)) { + FilterCard protectionFilter = new FilterCard(); + protectionFilter.add(new ColorPredicate(choice.getColor())); + protectionFilter.setMessage(choice.getChoice().toLowerCase()); + ContinuousEffect effect = new GainAbilitySourceEffect(new ProtectionAbility(protectionFilter), Duration.WhileOnBattlefield); + game.addEffect(effect, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/MengHuoBarbarianKing.java b/Mage.Sets/src/mage/sets/masterseditioniii/MengHuoBarbarianKing.java new file mode 100644 index 00000000000..7b638613517 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/MengHuoBarbarianKing.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class MengHuoBarbarianKing extends mage.sets.portalthreekingdoms.MengHuoBarbarianKing { + + public MengHuoBarbarianKing(UUID ownerId) { + super(ownerId); + this.cardNumber = 128; + this.expansionSetCode = "ME3"; + } + + public MengHuoBarbarianKing(final MengHuoBarbarianKing card) { + super(card); + } + + @Override + public MengHuoBarbarianKing copy() { + return new MengHuoBarbarianKing(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/AncestralMask.java b/Mage.Sets/src/mage/sets/mercadianmasques/AncestralMask.java new file mode 100644 index 00000000000..fe79df7e3f0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/AncestralMask.java @@ -0,0 +1,83 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterEnchantmentPermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class AncestralMask extends CardImpl { + + private static final FilterEnchantmentPermanent filter = new FilterEnchantmentPermanent("each other enchantment on the battlefield"); + + static { + filter.add(new AnotherPredicate()); + } + + public AncestralMask(UUID ownerId) { + super(ownerId, 229, "Ancestral Mask", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // Enchanted creature gets +2/+2 for each other enchantment on the battlefield. + PermanentsOnBattlefieldCount countEnchantments = new PermanentsOnBattlefieldCount(new FilterEnchantmentPermanent(filter), 2); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(countEnchantments, countEnchantments, Duration.WhileOnBattlefield))); + } + + public AncestralMask(final AncestralMask card) { + super(card); + } + + @Override + public AncestralMask copy() { + return new AncestralMask(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java b/Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java new file mode 100644 index 00000000000..446967ff672 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java @@ -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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class ChoMannosBlessing extends CardImpl { + + public ChoMannosBlessing(UUID ownerId) { + super(ownerId, 12, "Cho-Manno's Blessing", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}{W}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Aura"); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Protect)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // As Cho-Manno's Blessing enters the battlefield, choose a color. + // Enchanted creature has protection from the chosen color. This effect doesn't remove Cho-Manno's Blessing. + this.addAbility(new AsEntersBattlefieldAbility(new ChoMannosBlessingEffect())); + } + + public ChoMannosBlessing(final ChoMannosBlessing card) { + super(card); + } + + @Override + public ChoMannosBlessing copy() { + return new ChoMannosBlessing(this); + } +} + +class ChoMannosBlessingEffect extends OneShotEffect { + + public ChoMannosBlessingEffect() { + super(Outcome.Protect); + this.staticText = "enchanted creature has protection from the chosen color. This effect doesn't remove {this}"; + } + + public ChoMannosBlessingEffect(final ChoMannosBlessingEffect effect) { + super(effect); + } + + @Override + public ChoMannosBlessingEffect copy() { + return new ChoMannosBlessingEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + ChoiceColor choice = new ChoiceColor(); + choice.setMessage("Choose color to get protection from"); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && controller.choose(outcome, choice, game)) { + FilterCard protectionFilter = new FilterCard(); + protectionFilter.add(new ColorPredicate(choice.getColor())); + protectionFilter.setMessage(choice.getChoice().toLowerCase()); + ProtectionAbility protectionAbility = new ProtectionAbility(protectionFilter); + protectionAbility.setRemovesAuras(false); + ContinuousEffect effect = new GainAbilityAttachedEffect(protectionAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); + game.addEffect(effect, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java b/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java new file mode 100644 index 00000000000..90b32862e54 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java @@ -0,0 +1,116 @@ +/* + * 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.mirrodin; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.ManaPool; +import mage.players.Player; +import mage.target.common.TargetArtifactPermanent; + +/** + * + * @author fireshoes + */ +public class GlissaSunseeker extends CardImpl { + + public GlissaSunseeker(UUID ownerId) { + super(ownerId, 120, "Glissa Sunseeker", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + this.expansionSetCode = "MRD"; + this.supertype.add("Legendary"); + this.subtype.add("Elf"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // {tap}: Destroy target artifact if its converted mana cost is equal to the amount of mana in your mana pool. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GlissaSunseekerEffect(), new TapSourceCost()); + ability.addTarget(new TargetArtifactPermanent()); + this.addAbility(ability); + } + + public GlissaSunseeker(final GlissaSunseeker card) { + super(card); + } + + @Override + public GlissaSunseeker copy() { + return new GlissaSunseeker(this); + } +} + +class GlissaSunseekerEffect extends OneShotEffect { + + public GlissaSunseekerEffect() { + super(Outcome.DestroyPermanent); + this.staticText = "Destroy target artifact if its converted mana cost is equal to the amount of mana in your mana pool"; + } + + public GlissaSunseekerEffect(final GlissaSunseekerEffect effect) { + super(effect); + } + + @Override + public GlissaSunseekerEffect copy() { + return new GlissaSunseekerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + ManaPool pool = controller.getManaPool(); + int blackMana = pool.getBlack(); + int whiteMana = pool.getWhite(); + int blueMana = pool.getBlue(); + int greenMana = pool.getGreen(); + int redMana = pool.getRed(); + int colorlessMana = pool.getColorless(); + int manaPoolTotal = blackMana + whiteMana + blueMana + greenMana + redMana + colorlessMana; + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (controller != null) { + if (permanent.getManaCost().convertedManaCost() == manaPoolTotal) { + return permanent.destroy(source.getSourceId(), game, false); + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java b/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java new file mode 100644 index 00000000000..d8335051280 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java @@ -0,0 +1,85 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksOrBlocksTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.ForestwalkAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.game.permanent.token.Token; + +/** + * + * @author fireshoes + */ +public class JeditOjanenOfEfrava extends CardImpl { + + public JeditOjanenOfEfrava(UUID ownerId) { + super(ownerId, 131, "Jedit Ojanen of Efrava", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}{G}{G}"); + this.expansionSetCode = "PLC"; + this.supertype.add("Legendary"); + this.subtype.add("Cat"); + this.subtype.add("Warrior"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Forestwalk + this.addAbility(new ForestwalkAbility()); + + // Whenever Jedit Ojanen of Efrava attacks or blocks, put a 2/2 green Cat Warrior creature token with forestwalk onto the battlefield. + this.addAbility(new AttacksOrBlocksTriggeredAbility(new CreateTokenEffect(new CatWarriorToken()), false)); + } + + public JeditOjanenOfEfrava(final JeditOjanenOfEfrava card) { + super(card); + } + + @Override + public JeditOjanenOfEfrava copy() { + return new JeditOjanenOfEfrava(this); + } +} + +class CatWarriorToken extends Token { + + CatWarriorToken() { + super("Cat Warrior", "2/2 green Cat Warrior creature token with forestwalk"); + this.setOriginalExpansionSetCode("PLC"); + this.getPower().initValue(2); + this.getToughness().initValue(2); + this.color.setGreen(true); + this.getSubtype().add("Cat"); + this.getSubtype().add("Warrior"); + this.getCardType().add(CardType.CREATURE); + this.addAbility(new ForestwalkAbility()); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java b/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java index a82a64c7acd..13af2c0a280 100644 --- a/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java +++ b/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java @@ -30,7 +30,7 @@ package mage.sets.planeshift; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; @@ -64,7 +64,7 @@ public class VoiceOfAll extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // As Voice of All enters the battlefield, choose a color. // Voice of All has protection from the chosen color. - this.addAbility(new EntersBattlefieldAbility(new VoiceOfAllEffect())); + this.addAbility(new AsEntersBattlefieldAbility(new VoiceOfAllEffect())); } public VoiceOfAll(final VoiceOfAll card) { diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/MengHuoBarbarianKing.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/MengHuoBarbarianKing.java new file mode 100644 index 00000000000..6cc88ddd808 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/MengHuoBarbarianKing.java @@ -0,0 +1,80 @@ +/* + * 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.portalthreekingdoms; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author fireshoes + */ +public class MengHuoBarbarianKing extends CardImpl { + + private static final FilterCreaturePermanent filterGreen = new FilterCreaturePermanent("green creatures you control"); + + static { + filterGreen.add(new ColorPredicate(ObjectColor.GREEN)); + filterGreen.add(new ControllerPredicate(TargetController.YOU)); + } + + public MengHuoBarbarianKing(UUID ownerId) { + super(ownerId, 142, "Meng Huo, Barbarian King", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + this.expansionSetCode = "PTK"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Barbarian"); + this.subtype.add("Soldier"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Other green creatures you control get +1/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filterGreen, true))); + } + + public MengHuoBarbarianKing(final MengHuoBarbarianKing card) { + super(card); + } + + @Override + public MengHuoBarbarianKing copy() { + return new MengHuoBarbarianKing(this); + } +} diff --git a/Mage.Sets/src/mage/sets/stronghold/SwordOfTheChosen.java b/Mage.Sets/src/mage/sets/stronghold/SwordOfTheChosen.java new file mode 100644 index 00000000000..960be1ac057 --- /dev/null +++ b/Mage.Sets/src/mage/sets/stronghold/SwordOfTheChosen.java @@ -0,0 +1,75 @@ +/* + * 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.stronghold; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SupertypePredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class SwordOfTheChosen extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("legendary creature"); + + static { + filter.add(new SupertypePredicate("Legendary")); + } + + public SwordOfTheChosen(UUID ownerId) { + super(ownerId, 135, "Sword of the Chosen", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "STH"; + this.supertype.add("Legendary"); + + // {tap}: Target legendary creature gets +2/+2 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(2, 2, Duration.EndOfTurn), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public SwordOfTheChosen(final SwordOfTheChosen card) { + super(card); + } + + @Override + public SwordOfTheChosen copy() { + return new SwordOfTheChosen(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/FlickeringWard.java b/Mage.Sets/src/mage/sets/tempest/FlickeringWard.java new file mode 100644 index 00000000000..a712716d586 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/FlickeringWard.java @@ -0,0 +1,125 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class FlickeringWard extends CardImpl { + + public FlickeringWard(UUID ownerId) { + super(ownerId, 231, "Flickering Ward", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + this.expansionSetCode = "TMP"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Protect)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // As Flickering Ward enters the battlefield, choose a color. + // Enchanted creature has protection from the chosen color. This effect doesn't remove Flickering Ward. + this.addAbility(new AsEntersBattlefieldAbility(new FlickeringWardEffect())); + + // {W}: Return Flickering Ward to its owner's hand. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(), new ManaCostsImpl("{W}"))); + } + + public FlickeringWard(final FlickeringWard card) { + super(card); + } + + @Override + public FlickeringWard copy() { + return new FlickeringWard(this); + } +} + +class FlickeringWardEffect extends OneShotEffect { + + public FlickeringWardEffect() { + super(Outcome.Protect); + this.staticText = "enchanted creature has protection from the chosen color. This effect doesn't remove {this}"; + } + + public FlickeringWardEffect(final FlickeringWardEffect effect) { + super(effect); + } + + @Override + public FlickeringWardEffect copy() { + return new FlickeringWardEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + ChoiceColor choice = new ChoiceColor(); + choice.setMessage("Choose color to get protection from"); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && controller.choose(outcome, choice, game)) { + FilterCard protectionFilter = new FilterCard(); + protectionFilter.add(new ColorPredicate(choice.getColor())); + protectionFilter.setMessage(choice.getChoice().toLowerCase()); + ProtectionAbility protectionAbility = new ProtectionAbility(protectionFilter); + protectionAbility.setRemovesAuras(false); + ContinuousEffect effect = new GainAbilityAttachedEffect(protectionAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); + game.addEffect(effect, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/PentarchWard.java b/Mage.Sets/src/mage/sets/timespiral/PentarchWard.java new file mode 100644 index 00000000000..92ac9fb407a --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/PentarchWard.java @@ -0,0 +1,123 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class PentarchWard extends CardImpl { + + public PentarchWard(UUID ownerId) { + super(ownerId, 33, "Pentarch Ward", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Protect)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // When Pentarch Ward enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + + // As Pentarch Ward enters the battlefield, choose a color. + // Enchanted creature has protection from the chosen color. This effect doesn't remove Pentarch Ward. + this.addAbility(new AsEntersBattlefieldAbility(new PentarchWardEffect())); + } + + public PentarchWard(final PentarchWard card) { + super(card); + } + + @Override + public PentarchWard copy() { + return new PentarchWard(this); + } +} + +class PentarchWardEffect extends OneShotEffect { + + public PentarchWardEffect() { + super(Outcome.Protect); + this.staticText = "enchanted creature has protection from the chosen color. This effect doesn't remove {this}"; + } + + public PentarchWardEffect(final PentarchWardEffect effect) { + super(effect); + } + + @Override + public PentarchWardEffect copy() { + return new PentarchWardEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + ChoiceColor choice = new ChoiceColor(); + choice.setMessage("Choose color to get protection from"); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && controller.choose(outcome, choice, game)) { + FilterCard protectionFilter = new FilterCard(); + protectionFilter.add(new ColorPredicate(choice.getColor())); + protectionFilter.setMessage(choice.getChoice().toLowerCase()); + ProtectionAbility protectionAbility = new ProtectionAbility(protectionFilter); + protectionAbility.setRemovesAuras(false); + ContinuousEffect effect = new GainAbilityAttachedEffect(protectionAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); + game.addEffect(effect, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/torment/KrosanRestorer.java b/Mage.Sets/src/mage/sets/torment/KrosanRestorer.java new file mode 100644 index 00000000000..83b0dcc2f8a --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/KrosanRestorer.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.torment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class KrosanRestorer extends CardImpl { + + public KrosanRestorer(UUID ownerId) { + super(ownerId, 130, "Krosan Restorer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Human"); + this.subtype.add("Druid"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // {tap}: Untap target land. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new TapSourceCost()); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + + // Threshold - {tap}: Untap up to three target lands. Activate this ability only if seven or more cards are in your graveyard. + ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, + new UntapTargetEffect(), + new TapSourceCost(), + new CardsInControllerGraveCondition(7), + "Threshold - {T}: Untap up to three target lands. Activate this ability only if seven or more cards are in your graveyard."); + ability.addTarget(new TargetLandPermanent(0, 3, new FilterLandPermanent(), false)); + this.addAbility(ability); + } + + public KrosanRestorer(final KrosanRestorer card) { + super(card); + } + + @Override + public KrosanRestorer copy() { + return new KrosanRestorer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java b/Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java new file mode 100644 index 00000000000..c0f1bbeec55 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java @@ -0,0 +1,126 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.CostImpl; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class NaturesKiss extends CardImpl { + + public NaturesKiss(UUID ownerId) { + super(ownerId, 78, "Nature's Kiss", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + // {1}, Exile the top card of your graveyard: Enchanted creature gets +1/+1 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{1}")); + ability.addCost(new ExileFromTopOfGraveyardCost(1)); + this.addAbility(ability); + } + + public NaturesKiss(final NaturesKiss card) { + super(card); + } + + @Override + public NaturesKiss copy() { + return new NaturesKiss(this); + } +} + +class ExileFromTopOfGraveyardCost extends CostImpl { + + private final int amount; + + public ExileFromTopOfGraveyardCost(int amount) { + this.amount = amount; + this.text = "Exile the top card of your graveyard"; + } + + public ExileFromTopOfGraveyardCost(ExileFromTopOfGraveyardCost cost) { + super(cost); + this.amount = cost.amount; + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + Player controller = game.getPlayer(controllerId); + if(controller == null) { + return false; + } + return controller.getGraveyard().size() >= amount; + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { + Player controller = game.getPlayer(controllerId); + if(controller != null) { + Card topCard = null; + for (Card card :controller.getGraveyard().getCards(game)) { + topCard = card; + } + if (topCard != null) { + controller.moveCardToExileWithInfo(topCard, null, "", ability.getSourceId(), game, Zone.GRAVEYARD, true); + paid = true; + } + } + return paid; + } + + @Override + public ExileFromTopOfGraveyardCost copy() { + return new ExileFromTopOfGraveyardCost(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/weatherlight/PhyrexianFurnace.java b/Mage.Sets/src/mage/sets/weatherlight/PhyrexianFurnace.java new file mode 100644 index 00000000000..3c324921697 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/PhyrexianFurnace.java @@ -0,0 +1,113 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author fireshoes + */ +public class PhyrexianFurnace extends CardImpl { + + public PhyrexianFurnace(UUID ownerId) { + super(ownerId, 155, "Phyrexian Furnace", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "WTH"; + + // {tap}: Exile the bottom card of target player's graveyard. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PhyrexianFurnaceEffect(), new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + + // {1}, Sacrifice Phyrexian Furnace: Exile target card from a graveyard. Draw a card. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl("{1}")); + ability.addTarget(new TargetCardInGraveyard()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + this.addAbility(ability); + } + + public PhyrexianFurnace(final PhyrexianFurnace card) { + super(card); + } + + @Override + public PhyrexianFurnace copy() { + return new PhyrexianFurnace(this); + } +} + +class PhyrexianFurnaceEffect extends OneShotEffect { + + public PhyrexianFurnaceEffect() { + super(Outcome.Benefit); + this.staticText = "exile the bottom card of target player's graveyard"; + } + + public PhyrexianFurnaceEffect(final PhyrexianFurnaceEffect effect) { + super(effect); + } + + @Override + public PhyrexianFurnaceEffect copy() { + return new PhyrexianFurnaceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player != null) { + Card bottomCard = null; + for (Card card :player.getGraveyard().getCards(game)) { + bottomCard = card; + break; + } + if (bottomCard != null) { + return player.moveCardToExileWithInfo(bottomCard, null, "", source.getSourceId(), game, Zone.GRAVEYARD, true); + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Utils/known-sets.txt b/Utils/known-sets.txt index e1055743c5f..37bea9d00ae 100644 --- a/Utils/known-sets.txt +++ b/Utils/known-sets.txt @@ -5,6 +5,7 @@ Apocalypse|apocalypse| Archenemy|archenemy| Arabian Nights|arabiannights| Avacyn Restored|avacynrestored| +Battle for Zendikar|battleforzendikar| Betrayers of Kamigawa|betrayersofkamigawa| Born of the Gods|bornofthegods| Champions of Kamigawa|championsofkamigawa| diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 41cb0676554..9104f393604 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -27236,4 +27236,5 @@ Forest|Premium Deck Series: Slivers|41|L||Basic Land - Forest|||G| Akroma, Angel of Fury|From the Vault: Angels|1|M|{5}{R}{R}{R}|Legendary Creature - Angel|6|6|Akroma, Angel of Fury can't be countered.$Flying, trample, protection from white and from blue${R}: Akroma, Angel of Fury gets +1/+0 until end of turn.$Morph {3}{R}{R}{R} You may cast this card face downn as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)| Akroma, Angel of Wrath|From the Vault: Angels|2|M|{5}{W}{W}{W}|Legendary Creature - Angel|6|6|Flying, first strike, vigilance, trample, haste, protection from black and from red| Avacyn, Angel of Hope|From the Vault: Angels|5|M|{5}{W}{W}{W}|Legendary Creature - Angel|8|8|Flying, vigilance$Avacyn, Angel of Hope and other permanents you control are indestructible.| -Iona, Shield of Emeria|From the Vault: Angels|9|M|{6}{W}{W}{W}|Legendary Creature - Angel|7|7|Flying$As Iona, Shield of Emeria enters the battlefield, choose a color.$Your opponents can't cast spells of the chosen color.| \ No newline at end of file +Iona, Shield of Emeria|From the Vault: Angels|9|M|{6}{W}{W}{W}|Legendary Creature - Angel|7|7|Flying$As Iona, Shield of Emeria enters the battlefield, choose a color.$Your opponents can't cast spells of the chosen color.| +Evolving Wilds|Battle for Zendikar|236|C||Land|||{T}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library.| \ No newline at end of file diff --git a/Utils/mtg-sets-data.txt b/Utils/mtg-sets-data.txt index c14da882fa5..090a2e72212 100644 --- a/Utils/mtg-sets-data.txt +++ b/Utils/mtg-sets-data.txt @@ -15,6 +15,7 @@ Anthologies|ATH| Antiquities|ATQ| Archenemy|ARC| Avacyn Restored|AVR| +Battle for Zendikar|BFZ| Betrayers of Kamigawa|BOK| Battle Royale Box Set|BRB| Beatdown Box Set|BTD| From c4deaf325014715e34d226fcc54ff0594a37fbda Mon Sep 17 00:00:00 2001 From: emerald000 Date: Fri, 24 Jul 2015 03:32:31 -0400 Subject: [PATCH 160/375] Added Peer Pressure, Terraformer and Wave of Indifference. --- .../src/mage/sets/onslaught/PeerPressure.java | 132 ++++++++++++ .../sets/onslaught/WaveOfIndifference.java | 76 +++++++ .../src/mage/sets/ravnica/Terraformer.java | 190 ++++++++++++++++++ .../mage/sets/shadowmoor/ElsewhereFlask.java | 17 +- .../common/ChooseCreatureTypeEffect.java | 3 +- 5 files changed, 413 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/onslaught/PeerPressure.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/WaveOfIndifference.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/Terraformer.java diff --git a/Mage.Sets/src/mage/sets/onslaught/PeerPressure.java b/Mage.Sets/src/mage/sets/onslaught/PeerPressure.java new file mode 100644 index 00000000000..af01dc3a377 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/PeerPressure.java @@ -0,0 +1,132 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.cards.CardImpl; +import mage.cards.repository.CardRepository; +import mage.choices.Choice; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author emerald000 + */ +public class PeerPressure extends CardImpl { + + public PeerPressure(UUID ownerId) { + super(ownerId, 101, "Peer Pressure", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}"); + this.expansionSetCode = "ONS"; + + // Choose a creature type. If you control more creatures of that type than each other player, you gain control of all creatures of that type. + this.getSpellAbility().addEffect(new PeerPressureEffect()); + } + + public PeerPressure(final PeerPressure card) { + super(card); + } + + @Override + public PeerPressure copy() { + return new PeerPressure(this); + } +} + +class PeerPressureEffect extends OneShotEffect { + + PeerPressureEffect() { + super(Outcome.GainControl); + this.staticText = "Choose a creature type. If you control more creatures of that type than each other player, you gain control of all creatures of that type"; + } + + PeerPressureEffect(final PeerPressureEffect effect) { + super(effect); + } + + @Override + public PeerPressureEffect copy() { + return new PeerPressureEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Choice choice = new ChoiceImpl(true); + choice.setMessage("Choose creature type"); + choice.setChoices(CardRepository.instance.getCreatureTypes()); + while (!controller.choose(Outcome.GainControl, choice, game)) { + if (!controller.isInGame()) { + return false; + } + } + String chosenType = choice.getChoice(); + if (!game.isSimulation()) { + game.informPlayers(controller.getLogName() + " has chosen " + chosenType); + } + UUID playerWithMost = null; + int maxControlled = 0; + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + FilterPermanent filter = new FilterCreaturePermanent(chosenType, chosenType); + filter.add(new ControllerIdPredicate(playerId)); + int controlled = new PermanentsOnBattlefieldCount(filter).calculate(game, source, this); + if (controlled > maxControlled) { + maxControlled = controlled; + playerWithMost = playerId; + } else if (controlled == maxControlled) { + playerWithMost = null; // Do nothing in case of tie + } + } + if (playerWithMost != null && playerWithMost.equals(controller.getId())) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(chosenType, chosenType), controller.getId(), source.getSourceId(), game)) { + ContinuousEffect effect = new GainControlTargetEffect(Duration.EndOfGame); + effect.setTargetPointer(new FixedTarget(permanent.getId())); + game.addEffect(effect, source); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/WaveOfIndifference.java b/Mage.Sets/src/mage/sets/onslaught/WaveOfIndifference.java new file mode 100644 index 00000000000..6376ddddbe4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/WaveOfIndifference.java @@ -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.onslaught; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author emerald000 + */ +public class WaveOfIndifference extends CardImpl { + + public WaveOfIndifference(UUID ownerId) { + super(ownerId, 243, "Wave of Indifference", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{X}{R}"); + this.expansionSetCode = "ONS"; + + // X target creatures can't block this turn. + Effect effect = new CantBlockTargetEffect(Duration.EndOfTurn); + effect.setText("X target creatures can't block this turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, new FilterCreaturePermanent(), false)); + } + + public WaveOfIndifference(final WaveOfIndifference card) { + super(card); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability instanceof SpellAbility) { + ability.getTargets().clear(); + ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX())); + } + } + + @Override + public WaveOfIndifference copy() { + return new WaveOfIndifference(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/Terraformer.java b/Mage.Sets/src/mage/sets/ravnica/Terraformer.java new file mode 100644 index 00000000000..13e12446010 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/Terraformer.java @@ -0,0 +1,190 @@ +/* + * 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.ravnica; + +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.mana.BlackManaAbility; +import mage.abilities.mana.BlueManaAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.abilities.mana.RedManaAbility; +import mage.abilities.mana.WhiteManaAbility; +import mage.cards.CardImpl; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author emerald000 + */ +public class Terraformer extends CardImpl { + + public Terraformer(UUID ownerId) { + super(ownerId, 70, "Terraformer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {1}: Choose a basic land type. Each land you control becomes that type until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new TerraformerEffect(), new GenericManaCost(1))); + } + + public Terraformer(final Terraformer card) { + super(card); + } + + @Override + public Terraformer copy() { + return new Terraformer(this); + } +} + +class TerraformerEffect extends OneShotEffect { + + TerraformerEffect() { + super(Outcome.Neutral); + this.staticText = "Choose a basic land type. Each land you control becomes that type until end of turn"; + } + + TerraformerEffect(final TerraformerEffect effect) { + super(effect); + } + + @Override + public TerraformerEffect copy() { + return new TerraformerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + ChoiceImpl choices = new ChoiceImpl(true); + Set choicesSet = choices.getChoices(); + choicesSet.add("Forest"); + choicesSet.add("Plains"); + choicesSet.add("Mountain"); + choicesSet.add("Island"); + choicesSet.add("Swamp"); + if (player.choose(Outcome.Neutral, choices, game)) { + game.getState().setValue(source.getSourceId().toString() + "_Terraformer", choices.getChoice()); + } + game.addEffect(new TerraformerContinuousEffect(), source); + return true; + } + return false; + } +} + +class TerraformerContinuousEffect extends ContinuousEffectImpl { + + private static final FilterControlledPermanent filter = new FilterControlledLandPermanent(); + + TerraformerContinuousEffect() { + super(Duration.EndOfTurn, Outcome.Neutral); + } + + TerraformerContinuousEffect(final TerraformerContinuousEffect effect) { + super(effect); + } + + @Override + public TerraformerContinuousEffect copy() { + return new TerraformerContinuousEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + String choice = (String) game.getState().getValue(source.getSourceId().toString() + "_Terraformer"); + if (choice != null) { + for (Permanent land : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { + if (land != null) { + switch (layer) { + case TypeChangingEffects_4: + if (sublayer == SubLayer.NA) { + land.getSubtype().clear(); + land.getSubtype().add(choice); + } + break; + case AbilityAddingRemovingEffects_6: + if (sublayer == SubLayer.NA) { + land.getAbilities().clear(); + if (choice.equals("Forest")) { + land.addAbility(new GreenManaAbility(), id, game); + } + if (choice.equals("Plains")) { + land.addAbility(new WhiteManaAbility(), id, game); + } + if (choice.equals("Mountain")) { + land.addAbility(new RedManaAbility(), id, game); + } + if (choice.equals("Island")) { + land.addAbility(new BlueManaAbility(), id, game); + } + if (choice.equals("Swamp")) { + land.addAbility(new BlackManaAbility(), id, game); + } + } + break; + } + } + } + return true; + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.TypeChangingEffects_4; + } +} diff --git a/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java b/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java index 4210b34092a..ae8d945447e 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java @@ -29,8 +29,6 @@ package mage.sets.shadowmoor; import java.util.Set; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -38,9 +36,20 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.mana.*; +import mage.abilities.mana.BlackManaAbility; +import mage.abilities.mana.BlueManaAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.abilities.mana.RedManaAbility; +import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledPermanent; import mage.game.Game; @@ -95,7 +104,7 @@ class ElsewhereFlaskEffect extends OneShotEffect { Player player = game.getPlayer(source.getControllerId()); if (player != null) { ChoiceImpl choices = new ChoiceImpl(true); - Set choicesSet = choices.getChoices(); + Set choicesSet = choices.getChoices(); choicesSet.add("Forest"); choicesSet.add("Plains"); choicesSet.add("Mountain"); diff --git a/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java b/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java index b48288ca75e..16fe68f4b1d 100644 --- a/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java +++ b/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java @@ -67,8 +67,9 @@ public class ChooseCreatureTypeEffect extends OneShotEffect { return false; } } - if (!game.isSimulation()) + if (!game.isSimulation()) { game.informPlayers(permanent.getName() + ": " + controller.getLogName() + " has chosen " + typeChoice.getChoice()); + } game.getState().setValue(permanent.getId() + "_type", typeChoice.getChoice()); permanent.addInfo("chosen type", CardUtil.addToolTipMarkTags("Chosen type: " + typeChoice.getChoice()), game); } From 2ca859578916a11014e5e0dab49972d68185e802 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 24 Jul 2015 13:47:22 +0200 Subject: [PATCH 161/375] * Reworked Order of the Stars protection handling. --- .../mage/sets/guildpact/OrderOfTheStars.java | 54 ++--------- .../abilities/ProtectionFromColorTest.java | 43 +++++++++ .../ProtectionChosenColorSourceEffect.java | 90 +++++++++++++++++++ 3 files changed, 141 insertions(+), 46 deletions(-) create mode 100644 Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorSourceEffect.java diff --git a/Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java b/Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java index 404e171b6ab..aa78673766f 100644 --- a/Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java +++ b/Mage.Sets/src/mage/sets/guildpact/OrderOfTheStars.java @@ -29,23 +29,16 @@ package mage.sets.guildpact; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.ChooseColorEffect; +import mage.abilities.effects.keyword.ProtectionChosenColorSourceEffect; import mage.abilities.keyword.DefenderAbility; -import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; -import mage.choices.ChoiceColor; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.players.Player; +import mage.constants.Zone; /** * @@ -63,10 +56,12 @@ public class OrderOfTheStars extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); - + // As Order of the Stars enters the battlefield, choose a color. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit))); + // Order of the Stars has protection from the chosen color. - this.addAbility(new AsEntersBattlefieldAbility(new OrderOfTheStarsEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ProtectionChosenColorSourceEffect())); } public OrderOfTheStars(final OrderOfTheStars card) { @@ -78,36 +73,3 @@ public class OrderOfTheStars extends CardImpl { return new OrderOfTheStars(this); } } - -class OrderOfTheStarsEffect extends OneShotEffect { - - public OrderOfTheStarsEffect() { - super(Outcome.Protect); - this.staticText = "{this} gains protection from the color of your choice"; - } - - public OrderOfTheStarsEffect(final OrderOfTheStarsEffect effect) { - super(effect); - } - - @Override - public OrderOfTheStarsEffect copy() { - return new OrderOfTheStarsEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - ChoiceColor choice = new ChoiceColor(); - choice.setMessage("Choose color to get protection from"); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.choose(outcome, choice, game)) { - FilterCard protectionFilter = new FilterCard(); - protectionFilter.add(new ColorPredicate(choice.getColor())); - protectionFilter.setMessage(choice.getChoice().toLowerCase()); - ContinuousEffect effect = new GainAbilitySourceEffect(new ProtectionAbility(protectionFilter), Duration.WhileOnBattlefield); - game.addEffect(effect, source); - return true; - } - return false; - } -} diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java index 0836462b604..8828f01d06d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java @@ -38,4 +38,47 @@ public class ProtectionFromColorTest extends CardTestPlayerBase { // One should have been destroyed by Royal Assassin assertPermanentCount(playerB, "Runeclaw Bear", 0); } + + @Test + public void testProtectionChosenColor() { + addCard(Zone.BATTLEFIELD, playerA, "Plains"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + // Defender + // As Order of the Stars enters the battlefield, choose a color. + // Order of the Stars has protection from the chosen color. + addCard(Zone.HAND, playerA, "Order of the Stars"); // 0/1 {W} + // Put target creature card from a graveyard onto the battlefield under your control. You lose life equal to its converted mana cost. + addCard(Zone.HAND, playerA, "Reanimate"); // {B} + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 4); + // Seismic Shudder deals 1 damage to each creature without flying. + addCard(Zone.HAND, playerB, "Seismic Shudder", 2); // {1}{R} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Order of the Stars"); + setChoice(playerA, "White"); + + attack(2, playerB, "Silvercoat Lion"); + block(2, playerA, "Order of the Stars", "Silvercoat Lion"); + + castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Seismic Shudder"); + + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Reanimate", "Order of the Stars"); + setChoice(playerA, "Red"); + + castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerB, "Seismic Shudder"); + + setStopAt(3, PhaseStep.END_TURN); + execute(); + + assertGraveyardCount(playerB, "Seismic Shudder", 2); + assertGraveyardCount(playerA, "Reanimate", 1); + assertPermanentCount(playerA, "Order of the Stars", 1); + assertPermanentCount(playerB, "Silvercoat Lion", 1); + + assertLife(playerA, 19); + assertLife(playerB, 20); + + } + } diff --git a/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorSourceEffect.java b/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorSourceEffect.java new file mode 100644 index 00000000000..3674579d581 --- /dev/null +++ b/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorSourceEffect.java @@ -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.abilities.effects.keyword; + +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.ProtectionAbility; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.filter.FilterObject; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class ProtectionChosenColorSourceEffect extends ContinuousEffectImpl { + + protected ObjectColor chosenColor; + protected ProtectionAbility protectionAbility; + + public ProtectionChosenColorSourceEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + staticText = "{source} has protection from the chosen color"; + } + + public ProtectionChosenColorSourceEffect(final ProtectionChosenColorSourceEffect effect) { + super(effect); + if (effect.chosenColor != null) { + this.chosenColor = effect.chosenColor.copy(); + } + if (effect.protectionAbility != null) { + this.protectionAbility = effect.protectionAbility.copy(); + } + } + + @Override + public ProtectionChosenColorSourceEffect copy() { + return new ProtectionChosenColorSourceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color"); + if (color != null && (protectionAbility == null || !color.equals(chosenColor))) { + chosenColor = color; + FilterObject protectionFilter = new FilterObject(chosenColor.getDescription()); + protectionFilter.add(new ColorPredicate(chosenColor)); + protectionAbility = new ProtectionAbility(protectionFilter); + } + if (protectionAbility != null) { + permanent.addAbility(protectionAbility, source.getSourceId(), game); + return true; + } + } + return false; + } +} From 630b2c32d7481f8a938903a4ac70500effdb20e6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 24 Jul 2015 15:04:45 +0200 Subject: [PATCH 162/375] * Reworked Cho-Manno's Blessing protection handling. --- .../mercadianmasques/ChoMannosBlessing.java | 61 ++---------- .../ProtectionChosenColorAttachedEffect.java | 98 +++++++++++++++++++ .../abilities/keyword/ProtectionAbility.java | 69 +++++++------ .../mage/game/permanent/PermanentImpl.java | 5 +- 4 files changed, 153 insertions(+), 80 deletions(-) create mode 100644 Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java b/Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java index 446967ff672..03962c5f987 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/ChoMannosBlessing.java @@ -28,26 +28,18 @@ package mage.sets.mercadianmasques; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.effects.common.ChooseColorEffect; +import mage.abilities.effects.keyword.ProtectionChosenColorAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.FlashAbility; -import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; -import mage.choices.ChoiceColor; -import mage.constants.AttachmentType; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.players.Player; +import mage.constants.Zone; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -64,17 +56,19 @@ public class ChoMannosBlessing extends CardImpl { // Flash this.addAbility(FlashAbility.getInstance()); - + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.Protect)); this.addAbility(new EnchantAbility(auraTarget.getTargetName())); - + // As Cho-Manno's Blessing enters the battlefield, choose a color. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit))); + // Enchanted creature has protection from the chosen color. This effect doesn't remove Cho-Manno's Blessing. - this.addAbility(new AsEntersBattlefieldAbility(new ChoMannosBlessingEffect())); - } + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ProtectionChosenColorAttachedEffect(true))); + } public ChoMannosBlessing(final ChoMannosBlessing card) { super(card); @@ -85,38 +79,3 @@ public class ChoMannosBlessing extends CardImpl { return new ChoMannosBlessing(this); } } - -class ChoMannosBlessingEffect extends OneShotEffect { - - public ChoMannosBlessingEffect() { - super(Outcome.Protect); - this.staticText = "enchanted creature has protection from the chosen color. This effect doesn't remove {this}"; - } - - public ChoMannosBlessingEffect(final ChoMannosBlessingEffect effect) { - super(effect); - } - - @Override - public ChoMannosBlessingEffect copy() { - return new ChoMannosBlessingEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - ChoiceColor choice = new ChoiceColor(); - choice.setMessage("Choose color to get protection from"); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.choose(outcome, choice, game)) { - FilterCard protectionFilter = new FilterCard(); - protectionFilter.add(new ColorPredicate(choice.getColor())); - protectionFilter.setMessage(choice.getChoice().toLowerCase()); - ProtectionAbility protectionAbility = new ProtectionAbility(protectionFilter); - protectionAbility.setRemovesAuras(false); - ContinuousEffect effect = new GainAbilityAttachedEffect(protectionAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); - game.addEffect(effect, source); - return true; - } - return false; - } -} diff --git a/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java b/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java new file mode 100644 index 00000000000..aa514a45dd9 --- /dev/null +++ b/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java @@ -0,0 +1,98 @@ +/* + * 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.abilities.effects.keyword; + +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.ProtectionAbility; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.filter.FilterObject; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class ProtectionChosenColorAttachedEffect extends ContinuousEffectImpl { + + protected ObjectColor chosenColor; + protected ProtectionAbility protectionAbility; + protected boolean notRemoveItself; + + public ProtectionChosenColorAttachedEffect(boolean notRemoveItself) { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + this.notRemoveItself = notRemoveItself; + staticText = "{source} has protection from the chosen color" + (notRemoveItself ? ". This effect doesn't remove {this}" : ""); + } + + public ProtectionChosenColorAttachedEffect(final ProtectionChosenColorAttachedEffect effect) { + super(effect); + if (effect.chosenColor != null) { + this.chosenColor = effect.chosenColor.copy(); + } + if (effect.protectionAbility != null) { + this.protectionAbility = effect.protectionAbility.copy(); + } + } + + @Override + public ProtectionChosenColorAttachedEffect copy() { + return new ProtectionChosenColorAttachedEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent attachement = game.getPermanent(source.getSourceId()); + if (attachement != null && attachement.getAttachedTo() != null) { + ObjectColor color = (ObjectColor) game.getState().getValue(attachement.getId() + "_color"); + if (color != null && (protectionAbility == null || !color.equals(chosenColor))) { + chosenColor = color; + FilterObject protectionFilter = new FilterObject(chosenColor.getDescription()); + protectionFilter.add(new ColorPredicate(chosenColor)); + protectionAbility = new ProtectionAbility(protectionFilter); + if (notRemoveItself) { + protectionAbility.setAuraIdNotToBeRemoved(source.getSourceId()); + } + } + if (protectionAbility != null) { + Permanent attachedTo = game.getPermanent(attachement.getAttachedTo()); + if (attachedTo != null) { + attachement.addAbility(protectionAbility, source.getSourceId(), game); + } + return true; + } + } + return false; + } +} diff --git a/Mage/src/mage/abilities/keyword/ProtectionAbility.java b/Mage/src/mage/abilities/keyword/ProtectionAbility.java index 1cf4a57b8cc..3cacac49811 100644 --- a/Mage/src/mage/abilities/keyword/ProtectionAbility.java +++ b/Mage/src/mage/abilities/keyword/ProtectionAbility.java @@ -1,33 +1,33 @@ /* -* 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. -*/ - + * 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.abilities.keyword; +import java.util.UUID; import mage.MageObject; import mage.abilities.StaticAbility; import mage.cards.Card; @@ -49,17 +49,20 @@ public class ProtectionAbility extends StaticAbility { protected Filter filter; protected boolean removeAuras; + protected UUID auraIdNotToBeRemoved; // defines an Aura objectId that will not be removed from this protection ability public ProtectionAbility(Filter filter) { super(Zone.BATTLEFIELD, null); this.filter = filter; this.removeAuras = true; + this.auraIdNotToBeRemoved = null; } public ProtectionAbility(final ProtectionAbility ability) { super(ability); this.filter = ability.filter.copy(); this.removeAuras = ability.removeAuras; + this.auraIdNotToBeRemoved = ability.auraIdNotToBeRemoved; } @Override @@ -69,7 +72,8 @@ public class ProtectionAbility extends StaticAbility { @Override public String getRule() { - return "Protection from " + filter.getMessage() + (removeAuras ? "":". This effect doesn't remove auras."); + + return "Protection from " + filter.getMessage() + (removeAuras ? "" : ". This effect doesn't remove auras."); } public boolean canTarget(MageObject source, Game game) { @@ -112,4 +116,13 @@ public class ProtectionAbility extends StaticAbility { public boolean removesAuras() { return removeAuras; } + + public UUID getAuraIdNotToBeRemoved() { + return auraIdNotToBeRemoved; + } + + public void setAuraIdNotToBeRemoved(UUID auraIdNotToBeRemoved) { + this.auraIdNotToBeRemoved = auraIdNotToBeRemoved; + } + } diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index eb93cb1d560..3d7941c00b5 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -950,7 +950,10 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { @Override public boolean cantBeEnchantedBy(MageObject source, Game game) { for (ProtectionAbility ability : abilities.getProtectionAbilities()) { - if (!(source.getSubtype().contains("Aura") && !ability.removesAuras()) && !ability.canTarget(source, game)) { + if (!(source.getSubtype().contains("Aura") + && !ability.removesAuras()) + && !source.getId().equals(ability.getAuraIdNotToBeRemoved()) + && !ability.canTarget(source, game)) { return true; } } From d8dc95c16f7158622f529ad3c85208ea375890d2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 24 Jul 2015 15:10:04 +0200 Subject: [PATCH 163/375] * Reworked Cho-Manno's Blessing protection handling (fix). --- .../effects/keyword/ProtectionChosenColorAttachedEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java b/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java index aa514a45dd9..dd363575cef 100644 --- a/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/ProtectionChosenColorAttachedEffect.java @@ -88,7 +88,7 @@ public class ProtectionChosenColorAttachedEffect extends ContinuousEffectImpl { if (protectionAbility != null) { Permanent attachedTo = game.getPermanent(attachement.getAttachedTo()); if (attachedTo != null) { - attachement.addAbility(protectionAbility, source.getSourceId(), game); + attachedTo.addAbility(protectionAbility, source.getSourceId(), game); } return true; } From f9e833409c6828582d7f875b72790adab714ab79 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Fri, 24 Jul 2015 09:56:03 -0500 Subject: [PATCH 164/375] Updated Flickering Ward, Pentarch Ward, and Voice of All with new protection effects and updated Glissa Sunseeker code for npe check. --- .../mage/sets/mirrodin/GlissaSunseeker.java | 2 +- .../src/mage/sets/planeshift/VoiceOfAll.java | 56 +++--------------- .../src/mage/sets/tempest/FlickeringWard.java | 56 +++--------------- .../mage/sets/timespiral/PentarchWard.java | 57 +++---------------- 4 files changed, 25 insertions(+), 146 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java b/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java index 90b32862e54..f4520e50e54 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java @@ -106,7 +106,7 @@ class GlissaSunseekerEffect extends OneShotEffect { int colorlessMana = pool.getColorless(); int manaPoolTotal = blackMana + whiteMana + blueMana + greenMana + redMana + colorlessMana; Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (controller != null) { + if (controller != null && permanent != null) { if (permanent.getManaCost().convertedManaCost() == manaPoolTotal) { return permanent.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java b/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java index 13af2c0a280..76fe140548b 100644 --- a/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java +++ b/Mage.Sets/src/mage/sets/planeshift/VoiceOfAll.java @@ -29,23 +29,16 @@ package mage.sets.planeshift; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.ChooseColorEffect; +import mage.abilities.effects.keyword.ProtectionChosenColorSourceEffect; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; -import mage.choices.ChoiceColor; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.players.Player; +import mage.constants.Zone; /** * @@ -62,9 +55,11 @@ public class VoiceOfAll extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // As Voice of All enters the battlefield, choose a color. - // Voice of All has protection from the chosen color. - this.addAbility(new AsEntersBattlefieldAbility(new VoiceOfAllEffect())); + this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit))); + + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ProtectionChosenColorSourceEffect())); } public VoiceOfAll(final VoiceOfAll card) { @@ -75,37 +70,4 @@ public class VoiceOfAll extends CardImpl { public VoiceOfAll copy() { return new VoiceOfAll(this); } -} - -class VoiceOfAllEffect extends OneShotEffect { - - public VoiceOfAllEffect() { - super(Outcome.Protect); - this.staticText = "{this} gains protection from the color of your choice"; - } - - public VoiceOfAllEffect(final VoiceOfAllEffect effect) { - super(effect); - } - - @Override - public VoiceOfAllEffect copy() { - return new VoiceOfAllEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - ChoiceColor choice = new ChoiceColor(); - choice.setMessage("Choose color to get protection from"); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.choose(outcome, choice, game)) { - FilterCard protectionFilter = new FilterCard(); - protectionFilter.add(new ColorPredicate(choice.getColor())); - protectionFilter.setMessage(choice.getChoice().toLowerCase()); - ContinuousEffect effect = new GainAbilitySourceEffect(new ProtectionAbility(protectionFilter), Duration.WhileOnBattlefield); - game.addEffect(effect, source); - return true; - } - return false; - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/tempest/FlickeringWard.java b/Mage.Sets/src/mage/sets/tempest/FlickeringWard.java index a712716d586..d1f89844a74 100644 --- a/Mage.Sets/src/mage/sets/tempest/FlickeringWard.java +++ b/Mage.Sets/src/mage/sets/tempest/FlickeringWard.java @@ -28,29 +28,20 @@ package mage.sets.tempest; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ChooseColorEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.effects.keyword.ProtectionChosenColorAttachedEffect; import mage.abilities.keyword.EnchantAbility; -import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; -import mage.choices.ChoiceColor; -import mage.constants.AttachmentType; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -72,8 +63,10 @@ public class FlickeringWard extends CardImpl { this.addAbility(new EnchantAbility(auraTarget.getTargetName())); // As Flickering Ward enters the battlefield, choose a color. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit))); + // Enchanted creature has protection from the chosen color. This effect doesn't remove Flickering Ward. - this.addAbility(new AsEntersBattlefieldAbility(new FlickeringWardEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ProtectionChosenColorAttachedEffect(true))); // {W}: Return Flickering Ward to its owner's hand. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(), new ManaCostsImpl("{W}"))); @@ -87,39 +80,4 @@ public class FlickeringWard extends CardImpl { public FlickeringWard copy() { return new FlickeringWard(this); } -} - -class FlickeringWardEffect extends OneShotEffect { - - public FlickeringWardEffect() { - super(Outcome.Protect); - this.staticText = "enchanted creature has protection from the chosen color. This effect doesn't remove {this}"; - } - - public FlickeringWardEffect(final FlickeringWardEffect effect) { - super(effect); - } - - @Override - public FlickeringWardEffect copy() { - return new FlickeringWardEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - ChoiceColor choice = new ChoiceColor(); - choice.setMessage("Choose color to get protection from"); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.choose(outcome, choice, game)) { - FilterCard protectionFilter = new FilterCard(); - protectionFilter.add(new ColorPredicate(choice.getColor())); - protectionFilter.setMessage(choice.getChoice().toLowerCase()); - ProtectionAbility protectionAbility = new ProtectionAbility(protectionFilter); - protectionAbility.setRemovesAuras(false); - ContinuousEffect effect = new GainAbilityAttachedEffect(protectionAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); - game.addEffect(effect, source); - return true; - } - return false; - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/timespiral/PentarchWard.java b/Mage.Sets/src/mage/sets/timespiral/PentarchWard.java index 92ac9fb407a..38169026a3c 100644 --- a/Mage.Sets/src/mage/sets/timespiral/PentarchWard.java +++ b/Mage.Sets/src/mage/sets/timespiral/PentarchWard.java @@ -28,27 +28,19 @@ package mage.sets.timespiral; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ChooseColorEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.effects.keyword.ProtectionChosenColorAttachedEffect; import mage.abilities.keyword.EnchantAbility; -import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; -import mage.choices.ChoiceColor; -import mage.constants.AttachmentType; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.players.Player; +import mage.constants.Zone; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -73,8 +65,10 @@ public class PentarchWard extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); // As Pentarch Ward enters the battlefield, choose a color. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit))); + // Enchanted creature has protection from the chosen color. This effect doesn't remove Pentarch Ward. - this.addAbility(new AsEntersBattlefieldAbility(new PentarchWardEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ProtectionChosenColorAttachedEffect(true))); } public PentarchWard(final PentarchWard card) { @@ -85,39 +79,4 @@ public class PentarchWard extends CardImpl { public PentarchWard copy() { return new PentarchWard(this); } -} - -class PentarchWardEffect extends OneShotEffect { - - public PentarchWardEffect() { - super(Outcome.Protect); - this.staticText = "enchanted creature has protection from the chosen color. This effect doesn't remove {this}"; - } - - public PentarchWardEffect(final PentarchWardEffect effect) { - super(effect); - } - - @Override - public PentarchWardEffect copy() { - return new PentarchWardEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - ChoiceColor choice = new ChoiceColor(); - choice.setMessage("Choose color to get protection from"); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.choose(outcome, choice, game)) { - FilterCard protectionFilter = new FilterCard(); - protectionFilter.add(new ColorPredicate(choice.getColor())); - protectionFilter.setMessage(choice.getChoice().toLowerCase()); - ProtectionAbility protectionAbility = new ProtectionAbility(protectionFilter); - protectionAbility.setRemovesAuras(false); - ContinuousEffect effect = new GainAbilityAttachedEffect(protectionAbility, AttachmentType.AURA, Duration.WhileOnBattlefield); - game.addEffect(effect, source); - return true; - } - return false; - } -} +} \ No newline at end of file From 39c9674f87985f2eb66d656bbb0bc7cdbe8d8947 Mon Sep 17 00:00:00 2001 From: markedagain Date: Thu, 9 Jul 2015 23:25:26 -0400 Subject: [PATCH 165/375] new cards --- .../mage/sets/commander/SlipstreamEel.java | 104 ++++++------ .../mage/sets/lorwyn/KnuckleboneWitch.java | 76 +++++++++ .../mage/sets/mercadianmasques/TidalBore.java | 75 +++++++++ .../src/mage/sets/nemesis/Cloudskate.java | 65 ++++++++ .../mage/sets/onslaught/SlipstreamEel.java | 148 +++++++++--------- .../mage/sets/onslaught/SteelyResolve.java | 97 ++++++++++++ .../sets/prereleaseevents/SoulCollector.java | 52 ++++++ .../src/mage/sets/prophecy/GulfSquid.java | 138 ++++++++-------- .../src/mage/sets/scourge/SoulCollector.java | 54 +++++++ .../mage/sets/timeshifted/SoulCollector.java | 70 +++++++++ 10 files changed, 687 insertions(+), 192 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/Cloudskate.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java create mode 100644 Mage.Sets/src/mage/sets/prereleaseevents/SoulCollector.java create mode 100644 Mage.Sets/src/mage/sets/scourge/SoulCollector.java create mode 100644 Mage.Sets/src/mage/sets/timeshifted/SoulCollector.java diff --git a/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java b/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java index acd4a3c155d..9f46a5c9af4 100644 --- a/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java +++ b/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java @@ -1,52 +1,52 @@ -/* - * 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.commander; - -import java.util.UUID; - -/** - * - * @author fireshoes - */ -public class SlipstreamEel extends mage.sets.onslaught.SlipstreamEel { - - public SlipstreamEel(UUID ownerId) { - super(ownerId); - this.cardNumber = 62; - this.expansionSetCode = "CMD"; - } - - public SlipstreamEel(final SlipstreamEel card) { - super(card); - } - - @Override - public SlipstreamEel copy() { - return new SlipstreamEel(this); - } -} +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class SlipstreamEel extends mage.sets.onslaught.SlipstreamEel { + + public SlipstreamEel(UUID ownerId) { + super(ownerId); + this.cardNumber = 62; + this.expansionSetCode = "CMD"; + } + + public SlipstreamEel(final SlipstreamEel card) { + super(card); + } + + @Override + public SlipstreamEel copy() { + return new SlipstreamEel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java b/Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java new file mode 100644 index 00000000000..1752f327664 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java @@ -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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author markedagain + */ +public class KnuckleboneWitch extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another Goblin you control"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + filter.add(new SubtypePredicate("Goblin")); + } + + public KnuckleboneWitch(UUID ownerId) { + super(ownerId, 120, "Knucklebone Witch", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{B}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Goblin"); + this.subtype.add("Shaman"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever a Goblin you control dies, you may put a +1/+1 counter on Knucklebone Witch. + this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), true, filter )); + } + + public KnuckleboneWitch(final KnuckleboneWitch card) { + super(card); + } + + @Override + public KnuckleboneWitch copy() { + return new KnuckleboneWitch(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java b/Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java new file mode 100644 index 00000000000..abd9bf620da --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java @@ -0,0 +1,75 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.effects.common.MayTapOrUntapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author markedagain + */ +public class TidalBore extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("an Island"); + + static { + filter.add(new SubtypePredicate("Island")); + filter.add(new CardTypePredicate(CardType.LAND)); + } + + public TidalBore(UUID ownerId) { + super(ownerId, 109, "Tidal Bore", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "MMQ"; + + // You may return an Island you control to its owner's hand rather than pay Tidal Bore's mana cost. + this.addAbility(new AlternativeCostSourceAbility(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))); + // You may tap or untap target creature. + this.getSpellAbility().addEffect(new MayTapOrUntapTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public TidalBore(final TidalBore card) { + super(card); + } + + @Override + public TidalBore copy() { + return new TidalBore(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/Cloudskate.java b/Mage.Sets/src/mage/sets/nemesis/Cloudskate.java new file mode 100644 index 00000000000..b21cc3311e0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/Cloudskate.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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.FadingAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author markedagain + */ +public class Cloudskate extends CardImpl { + + public Cloudskate(UUID ownerId) { + super(ownerId, 29, "Cloudskate", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Illusion"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Fading 3 + this.addAbility(new FadingAbility(3, this)); + } + + public Cloudskate(final Cloudskate card) { + super(card); + } + + @Override + public Cloudskate copy() { + return new Cloudskate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java index a75ba50b483..cf5c043e624 100644 --- a/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java +++ b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java @@ -1,71 +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.onslaught; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; -import mage.abilities.keyword.CyclingAbility; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; - -/** - * - * @author fireshoes - */ -public class SlipstreamEel extends CardImpl { - - public SlipstreamEel(UUID ownerId) { - super(ownerId, 114, "Slipstream Eel", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); - this.expansionSetCode = "ONS"; - this.subtype.add("Fish"); - this.subtype.add("Beast"); - this.power = new MageInt(6); - this.toughness = new MageInt(6); - - // Slipstream Eel can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); - - // Cycling {1}{U} - this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{U}"))); - } - - public SlipstreamEel(final SlipstreamEel card) { - super(card); - } - - @Override - public SlipstreamEel copy() { - return new SlipstreamEel(this); - } -} +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author markedagain + */ +public class SlipstreamEel extends CardImpl { + + private static final FilterLandPermanent filter = new FilterLandPermanent("an Island"); + + static { + filter.add(new SubtypePredicate("Island")); + } + + public SlipstreamEel(UUID ownerId) { + super(ownerId, 114, "Slipstream Eel", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Fish"); + this.subtype.add("Beast"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Slipstream Eel can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent(filter)))); + // Cycling {1}{U} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{U}"))); + } + + public SlipstreamEel(final SlipstreamEel card) { + super(card); + } + + @Override + public SlipstreamEel copy() { + return new SlipstreamEel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java b/Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java new file mode 100644 index 00000000000..169d77ca363 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java @@ -0,0 +1,97 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author markedagain + */ +public class SteelyResolve extends CardImpl { + + public SteelyResolve(UUID ownerId) { + super(ownerId, 286, "Steely Resolve", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + this.expansionSetCode = "ONS"; + + // As Steely Resolve enters the battlefield, choose a creature type. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.AddAbility))); + // Creatures of the chosen type have shroud. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ShroudAbility.getInstance(), Duration.WhileOnBattlefield, new FilterSteelyResolve()))); + } + + public SteelyResolve(final SteelyResolve card) { + super(card); + } + + @Override + public SteelyResolve copy() { + return new SteelyResolve(this); + } +} +class FilterSteelyResolve extends FilterCreaturePermanent { + + public FilterSteelyResolve() { + super("All creatures of the chosen type"); + } + + public FilterSteelyResolve(final FilterSteelyResolve filter) { + super(filter); + } + + @Override + public FilterSteelyResolve copy() { + return new FilterSteelyResolve(this); + } + + @Override + public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { + if (super.match(permanent, sourceId, playerId, game)) { + String subtype = (String) game.getState().getValue(sourceId + "_type"); + if (subtype != null && !subtype.equals("") && permanent.hasSubtype(subtype)) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/prereleaseevents/SoulCollector.java b/Mage.Sets/src/mage/sets/prereleaseevents/SoulCollector.java new file mode 100644 index 00000000000..62074e34573 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prereleaseevents/SoulCollector.java @@ -0,0 +1,52 @@ +/* + * 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.prereleaseevents; + +import java.util.UUID; + +/** + * + * @author markedagain + */ +public class SoulCollector extends mage.sets.timeshifted.SoulCollector { + + public SoulCollector(UUID ownerId) { + super(ownerId); + this.cardNumber = 20; + this.expansionSetCode = "PTC"; + } + + public SoulCollector(final SoulCollector card) { + super(card); + } + + @Override + public SoulCollector copy() { + return new SoulCollector(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java b/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java index 5ea725b257a..fc1b084ff38 100644 --- a/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java +++ b/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java @@ -1,69 +1,69 @@ -/* - * 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.prophecy; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.filter.common.FilterLandPermanent; -import mage.target.TargetPlayer; - -/** - * - * @author fireshoes - */ -public class GulfSquid extends CardImpl { - - public GulfSquid(UUID ownerId) { - super(ownerId, 35, "Gulf Squid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); - this.expansionSetCode = "PCY"; - this.subtype.add("Squid"); - this.subtype.add("Beast"); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - - // When Gulf Squid enters the battlefield, tap all lands target player controls. - Ability ability = new EntersBattlefieldTriggeredAbility(new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands"))); - ability.addTarget(new TargetPlayer()); - this.addAbility(ability); - } - - public GulfSquid(final GulfSquid card) { - super(card); - } - - @Override - public GulfSquid copy() { - return new GulfSquid(this); - } -} +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterLandPermanent; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class GulfSquid extends CardImpl { + + public GulfSquid(UUID ownerId) { + super(ownerId, 35, "Gulf Squid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Squid"); + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Gulf Squid enters the battlefield, tap all lands target player controls. + Ability ability = new EntersBattlefieldTriggeredAbility(new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands"))); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public GulfSquid(final GulfSquid card) { + super(card); + } + + @Override + public GulfSquid copy() { + return new GulfSquid(this); + } +} diff --git a/Mage.Sets/src/mage/sets/scourge/SoulCollector.java b/Mage.Sets/src/mage/sets/scourge/SoulCollector.java new file mode 100644 index 00000000000..b1432d441d4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scourge/SoulCollector.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.scourge; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author markedagain + */ +public class SoulCollector extends mage.sets.timeshifted.SoulCollector { + + public SoulCollector(UUID ownerId) { + super(ownerId); + this.cardNumber = 74; + this.expansionSetCode = "SCG"; + this.rarity = Rarity.RARE; + } + + public SoulCollector(final SoulCollector card) { + super(card); + } + + @Override + public SoulCollector copy() { + return new SoulCollector(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timeshifted/SoulCollector.java b/Mage.Sets/src/mage/sets/timeshifted/SoulCollector.java new file mode 100644 index 00000000000..fc35e9e8fa7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/SoulCollector.java @@ -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.timeshifted; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DiesAndDealtDamageThisTurnTriggeredAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author markedagain + */ +public class SoulCollector extends CardImpl { + + public SoulCollector(UUID ownerId) { + super(ownerId, 47, "Soul Collector", Rarity.SPECIAL, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); + this.expansionSetCode = "TSB"; + this.subtype.add("Vampire"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Whenever a creature dealt damage by Soul Collector this turn dies, return that card to the battlefield under your control. + this.addAbility(new DiesAndDealtDamageThisTurnTriggeredAbility(new ReturnToBattlefieldUnderYourControlTargetEffect(false))); + // Morph {B}{B}{B} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{B}{B}{B}"))); + } + + public SoulCollector(final SoulCollector card) { + super(card); + } + + @Override + public SoulCollector copy() { + return new SoulCollector(this); + } +} From 37b4948b54b7f551a49c1d795271430d9c56df02 Mon Sep 17 00:00:00 2001 From: markedagain Date: Fri, 10 Jul 2015 08:53:53 -0400 Subject: [PATCH 166/375] fixed filter on slipstream Eel --- Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java index cf5c043e624..04960e39dc2 100644 --- a/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java +++ b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java @@ -61,7 +61,7 @@ public class SlipstreamEel extends CardImpl { this.toughness = new MageInt(6); // Slipstream Eel can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent(filter)))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(filter))); // Cycling {1}{U} this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{U}"))); } From b5ba8b99e24a622bb0e7b3a8deb9d8aea813d18b Mon Sep 17 00:00:00 2001 From: markedagain Date: Fri, 24 Jul 2015 10:47:10 -0400 Subject: [PATCH 167/375] fixed some cards --- .../mage/sets/commander/SlipstreamEel.java | 104 ++++++------ .../mage/sets/lorwyn/KnuckleboneWitch.java | 2 +- .../mage/sets/onslaught/SlipstreamEel.java | 148 +++++++++--------- .../src/mage/sets/prophecy/GulfSquid.java | 138 ++++++++-------- 4 files changed, 193 insertions(+), 199 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java b/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java index 9f46a5c9af4..acd4a3c155d 100644 --- a/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java +++ b/Mage.Sets/src/mage/sets/commander/SlipstreamEel.java @@ -1,52 +1,52 @@ -/* - * 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.commander; - -import java.util.UUID; - -/** - * - * @author fireshoes - */ -public class SlipstreamEel extends mage.sets.onslaught.SlipstreamEel { - - public SlipstreamEel(UUID ownerId) { - super(ownerId); - this.cardNumber = 62; - this.expansionSetCode = "CMD"; - } - - public SlipstreamEel(final SlipstreamEel card) { - super(card); - } - - @Override - public SlipstreamEel copy() { - return new SlipstreamEel(this); - } -} +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class SlipstreamEel extends mage.sets.onslaught.SlipstreamEel { + + public SlipstreamEel(UUID ownerId) { + super(ownerId); + this.cardNumber = 62; + this.expansionSetCode = "CMD"; + } + + public SlipstreamEel(final SlipstreamEel card) { + super(card); + } + + @Override + public SlipstreamEel copy() { + return new SlipstreamEel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java b/Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java index 1752f327664..998d28eb901 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java +++ b/Mage.Sets/src/mage/sets/lorwyn/KnuckleboneWitch.java @@ -46,7 +46,7 @@ import mage.filter.predicate.permanent.ControllerPredicate; */ public class KnuckleboneWitch extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another Goblin you control"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin you control"); static { filter.add(new ControllerPredicate(TargetController.YOU)); diff --git a/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java index 04960e39dc2..a75ba50b483 100644 --- a/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java +++ b/Mage.Sets/src/mage/sets/onslaught/SlipstreamEel.java @@ -1,77 +1,71 @@ -/* - * 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.onslaught; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; -import mage.abilities.keyword.CyclingAbility; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; - -/** - * - * @author markedagain - */ -public class SlipstreamEel extends CardImpl { - - private static final FilterLandPermanent filter = new FilterLandPermanent("an Island"); - - static { - filter.add(new SubtypePredicate("Island")); - } - - public SlipstreamEel(UUID ownerId) { - super(ownerId, 114, "Slipstream Eel", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); - this.expansionSetCode = "ONS"; - this.subtype.add("Fish"); - this.subtype.add("Beast"); - this.power = new MageInt(6); - this.toughness = new MageInt(6); - - // Slipstream Eel can't attack unless defending player controls an Island. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(filter))); - // Cycling {1}{U} - this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{U}"))); - } - - public SlipstreamEel(final SlipstreamEel card) { - super(card); - } - - @Override - public SlipstreamEel copy() { - return new SlipstreamEel(this); - } -} +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class SlipstreamEel extends CardImpl { + + public SlipstreamEel(UUID ownerId) { + super(ownerId, 114, "Slipstream Eel", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Fish"); + this.subtype.add("Beast"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Slipstream Eel can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island","an Island")))); + + // Cycling {1}{U} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{U}"))); + } + + public SlipstreamEel(final SlipstreamEel card) { + super(card); + } + + @Override + public SlipstreamEel copy() { + return new SlipstreamEel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java b/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java index fc1b084ff38..5ea725b257a 100644 --- a/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java +++ b/Mage.Sets/src/mage/sets/prophecy/GulfSquid.java @@ -1,69 +1,69 @@ -/* - * 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.prophecy; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.filter.common.FilterLandPermanent; -import mage.target.TargetPlayer; - -/** - * - * @author fireshoes - */ -public class GulfSquid extends CardImpl { - - public GulfSquid(UUID ownerId) { - super(ownerId, 35, "Gulf Squid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); - this.expansionSetCode = "PCY"; - this.subtype.add("Squid"); - this.subtype.add("Beast"); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - - // When Gulf Squid enters the battlefield, tap all lands target player controls. - Ability ability = new EntersBattlefieldTriggeredAbility(new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands"))); - ability.addTarget(new TargetPlayer()); - this.addAbility(ability); - } - - public GulfSquid(final GulfSquid card) { - super(card); - } - - @Override - public GulfSquid copy() { - return new GulfSquid(this); - } -} +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterLandPermanent; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class GulfSquid extends CardImpl { + + public GulfSquid(UUID ownerId) { + super(ownerId, 35, "Gulf Squid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Squid"); + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Gulf Squid enters the battlefield, tap all lands target player controls. + Ability ability = new EntersBattlefieldTriggeredAbility(new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands"))); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public GulfSquid(final GulfSquid card) { + super(card); + } + + @Override + public GulfSquid copy() { + return new GulfSquid(this); + } +} From 252fc5fc604a1d6e32dbc5819fa10e15bb8aa03c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 08:42:51 +0200 Subject: [PATCH 168/375] * Fiery Conclusion - Fixed wrong rarity for Magic Origins. --- Mage.Sets/src/mage/sets/magicorigins/FieryConclusion.java | 2 ++ Mage.Sets/src/mage/sets/ravnica/FieryConclusion.java | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/FieryConclusion.java b/Mage.Sets/src/mage/sets/magicorigins/FieryConclusion.java index b0e9b90f317..cf262b2af5c 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/FieryConclusion.java +++ b/Mage.Sets/src/mage/sets/magicorigins/FieryConclusion.java @@ -28,6 +28,7 @@ package mage.sets.magicorigins; import java.util.UUID; +import mage.constants.Rarity; /** * @@ -39,6 +40,7 @@ public class FieryConclusion extends mage.sets.ravnica.FieryConclusion { super(ownerId); this.cardNumber = 144; this.expansionSetCode = "ORI"; + this.rarity = Rarity.UNCOMMON; } public FieryConclusion(final FieryConclusion card) { diff --git a/Mage.Sets/src/mage/sets/ravnica/FieryConclusion.java b/Mage.Sets/src/mage/sets/ravnica/FieryConclusion.java index 1414e2b710c..add1b7318bf 100644 --- a/Mage.Sets/src/mage/sets/ravnica/FieryConclusion.java +++ b/Mage.Sets/src/mage/sets/ravnica/FieryConclusion.java @@ -28,11 +28,11 @@ package mage.sets.ravnica; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; @@ -46,7 +46,6 @@ public class FieryConclusion extends CardImpl { super(ownerId, 122, "Fiery Conclusion", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}"); this.expansionSetCode = "RAV"; - // As an additional cost to cast Fiery Conclusion, sacrifice a creature. this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); // Fiery Conclusion deals 5 damage to target creature. From a380bfa196bc9c82fa163875b18a52084524c45d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 09:09:20 +0200 Subject: [PATCH 169/375] * Gideon, Battle-Forged - Fixed that giving indestructibility effect did not end as intended. --- .../test/cards/planeswalker/GideonTest.java | 79 +++++++++++++++++++ .../continuous/GainAbilityTargetEffect.java | 69 ++++++++-------- 2 files changed, 114 insertions(+), 34 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/GideonTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/GideonTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/GideonTest.java new file mode 100644 index 00000000000..51cbfff98f6 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/GideonTest.java @@ -0,0 +1,79 @@ +/* + * 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 org.mage.test.cards.planeswalker; + +import mage.abilities.keyword.IndestructibleAbility; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class GideonTest extends CardTestPlayerBase { + + // Gideon, Battle-Forged + // +2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controller's next turn if able. + // +1: Until your next turn, target creature gains indestructible. Untap that creature. + // 0: Until end of turn, Gideon, Battle-Forged becomes a 4/4 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. + @Test + public void testGideonBattleForged() { + // At end of combat, if Kytheon, Hero of Akros and at least two other creatures attacked this combat, exile Kytheon, + // then return him to the battlefield transformed under his owner's control. + // {2}{W}: Kytheon gains indestructible until end of turn. + addCard(Zone.BATTLEFIELD, playerB, "Kytheon, Hero of Akros"); + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); + addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox"); + + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); + addCard(Zone.HAND, playerA, "Lightning Bolt", 1); + + attack(2, playerB, "Kytheon, Hero of Akros"); + attack(2, playerB, "Silvercoat Lion"); + attack(2, playerB, "Pillarfield Ox"); + + activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "+1: Until your next turn, target creature gains indestructible. Untap that creature.", "Silvercoat Lion"); + + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt"); + + setStopAt(4, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerA, "Lightning Bolt", 1); + assertPermanentCount(playerB, "Gideon, Battle-Forged", 1); + assertCounterCount("Gideon, Battle-Forged", CounterType.LOYALTY, 4); + assertLife(playerA, 14); + + assertPermanentCount(playerB, "Silvercoat Lion", 1); + assertAbility(playerB, "Silvercoat Lion", IndestructibleAbility.getInstance(), false); + } + +} diff --git a/Mage/src/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java index 404c0476d7f..097da54a5dc 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/GainAbilityTargetEffect.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.effects.common.continuous; import java.util.Locale; @@ -85,10 +84,10 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl { } /** - * Used to set a duration to the next durationPhaseStep of the - * first controller of the effect. - * - * @param phaseStep + * Used to set a duration to the next durationPhaseStep of the first + * controller of the effect. + * + * @param phaseStep */ public void setDurationToPhase(PhaseStep phaseStep) { durationPhaseStep = phaseStep; @@ -105,8 +104,10 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl { @Override public boolean isInactive(Ability source, Game game) { - if (durationPhaseStep != null && durationPhaseStep.equals(game.getPhase().getStep().getType())) - { + if (super.isInactive(source, game)) { + return true; + } + if (durationPhaseStep != null && durationPhaseStep.equals(game.getPhase().getStep().getType())) { if (!sameStep && game.getActivePlayerId().equals(durationPlayerId) || game.getPlayer(durationPlayerId).hasReachedNextTurnAfterLeaving()) { return true; } @@ -157,7 +158,7 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl { } StringBuilder sb = new StringBuilder(); Target target = mode.getTargets().get(0); - if(target.getMaxNumberOfTargets() > 1){ + if (target.getMaxNumberOfTargets() > 1) { if (target.getNumberOfTargets() < target.getMaxNumberOfTargets()) { sb.append("Up to"); } From be33352a1d289b773d6df9c39b410d499a527567 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 09:16:39 +0200 Subject: [PATCH 170/375] * Sekki, Seasons' Guide - Fixed that the return to battlefield ability did not work. --- .../saviorsofkamigawa/SekkiSeasonsGuide.java | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java index 83cfa25aafb..649c2a88c63 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java @@ -81,9 +81,9 @@ public class SekkiSeasonsGuide extends CardImpl { // Sacrifice eight Spirits: Return Sekki from your graveyard to the battlefield. this.addAbility(new SimpleActivatedAbility( - Zone.BATTLEFIELD, + Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), - new SacrificeTargetCost(new TargetControlledPermanent(8,8,filter, true)))); + new SacrificeTargetCost(new TargetControlledPermanent(8, 8, filter, true)))); } public SekkiSeasonsGuide(final SekkiSeasonsGuide card) { @@ -98,45 +98,45 @@ public class SekkiSeasonsGuide extends CardImpl { class SekkiSeasonsGuideEffect extends PreventionEffectImpl { - public SekkiSeasonsGuideEffect() { - super(Duration.WhileOnBattlefield, Integer.MAX_VALUE, false, false); - staticText = "If damage would be dealt to {this}, prevent that damage, remove that many +1/+1 counters from {this}, and put that many 1/1 colorless Spirit creature tokens onto the battlefield"; - } + public SekkiSeasonsGuideEffect() { + super(Duration.WhileOnBattlefield, Integer.MAX_VALUE, false, false); + staticText = "If damage would be dealt to {this}, prevent that damage, remove that many +1/+1 counters from {this}, and put that many 1/1 colorless Spirit creature tokens onto the battlefield"; + } - public SekkiSeasonsGuideEffect(final SekkiSeasonsGuideEffect effect) { - super(effect); - } + public SekkiSeasonsGuideEffect(final SekkiSeasonsGuideEffect effect) { + super(effect); + } - @Override - public SekkiSeasonsGuideEffect copy() { - return new SekkiSeasonsGuideEffect(this); - } + @Override + public SekkiSeasonsGuideEffect copy() { + return new SekkiSeasonsGuideEffect(this); + } - @Override - public boolean apply(Game game, Ability source) { - return true; - } + @Override + public boolean apply(Game game, Ability source) { + return true; + } - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - int damage = event.getAmount(); - preventDamageAction(event, source, game); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - permanent.removeCounters(CounterType.P1P1.createInstance(damage), game); + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + int damage = event.getAmount(); + preventDamageAction(event, source, game); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + permanent.removeCounters(CounterType.P1P1.createInstance(damage), game); + } + new CreateTokenEffect(new SpiritToken(), damage).apply(game, source); + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (super.applies(event, source, game)) { + if (event.getTargetId().equals(source.getSourceId())) { + return true; } - new CreateTokenEffect(new SpiritToken(), damage).apply(game, source); - return true; } + return false; + } - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (super.applies(event, source, game)) { - if (event.getTargetId().equals(source.getSourceId())) { - return true; - } - } - return false; - } - - } \ No newline at end of file +} From 24dd46e15dcab1ca1b9e1e55feef660af681b9ad Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 09:40:09 +0200 Subject: [PATCH 171/375] * Hold the Line - Fixed wrong casting costs. --- .../src/mage/sets/championsofkamigawa/HoldTheLine.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HoldTheLine.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HoldTheLine.java index 95f5deee3ef..3177a4759f9 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/HoldTheLine.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HoldTheLine.java @@ -28,11 +28,11 @@ package mage.sets.championsofkamigawa; import java.util.UUID; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.abilities.effects.common.continuous.BoostAllEffect; -import mage.cards.CardImpl; import mage.filter.common.FilterBlockingCreature; /** @@ -44,10 +44,9 @@ public class HoldTheLine extends CardImpl { private static final FilterBlockingCreature filter = new FilterBlockingCreature("Blocking creatures"); public HoldTheLine(UUID ownerId) { - super(ownerId, 13, "Hold the Line", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{W}{W}"); + super(ownerId, 13, "Hold the Line", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{W}{W}"); this.expansionSetCode = "CHK"; - // Blocking creatures get +7/+7 until end of turn. this.getSpellAbility().addEffect(new BoostAllEffect(7, 7, Duration.EndOfTurn, filter, false)); } @@ -60,4 +59,4 @@ public class HoldTheLine extends CardImpl { public HoldTheLine copy() { return new HoldTheLine(this); } -} \ No newline at end of file +} From ece8248f11edbee2eeac8b5309287dd30ac83f96 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sat, 25 Jul 2015 11:34:04 +0300 Subject: [PATCH 172/375] Implement cards: Destructive Flow, Radiant Kavu, and Warped Devotion --- .../sets/eighthedition/WarpedDevotion.java | 107 ++++++++++++++++++ .../mage/sets/planeshift/DestructiveFlow.java | 71 ++++++++++++ .../src/mage/sets/planeshift/RadiantKavu.java | 76 +++++++++++++ .../mage/sets/planeshift/WarpedDevotion.java | 54 +++++++++ 4 files changed, 308 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/DestructiveFlow.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/WarpedDevotion.java diff --git a/Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java b/Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java new file mode 100644 index 00000000000..62f78c48d0f --- /dev/null +++ b/Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java @@ -0,0 +1,107 @@ +/* + * 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.eighthedition; + +import java.util.UUID; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LoneFox + */ +public class WarpedDevotion extends CardImpl { + + public WarpedDevotion(UUID ownerId) { + super(ownerId, 172, "Warped Devotion", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + this.expansionSetCode = "8ED"; + + // Whenever a permanent is returned to a player's hand, that player discards a card. + this.addAbility(new WarpedDevotionTriggeredAbility()); + } + + public WarpedDevotion(final WarpedDevotion card) { + super(card); + } + + @Override + public WarpedDevotion copy() { + return new WarpedDevotion(this); + } +} + +class WarpedDevotionTriggeredAbility extends TriggeredAbilityImpl { + + public WarpedDevotionTriggeredAbility() { + super(Zone.BATTLEFIELD, new DiscardTargetEffect(1), false); + } + + public WarpedDevotionTriggeredAbility(final WarpedDevotionTriggeredAbility ability) { + super(ability); + } + + public WarpedDevotionTriggeredAbility copy() { + return new WarpedDevotionTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + ZoneChangeEvent zce = (ZoneChangeEvent)event; + if(zce.getFromZone() == Zone.BATTLEFIELD && zce.getToZone() == Zone.HAND) { + Card card = game.getCard(event.getTargetId()); + if(card != null) { + for(Effect effect: getEffects()) { + effect.setTargetPointer(new FixedTarget(card.getOwnerId())); + } + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a permanent is returned to a player's hand, that player discards a card"; + } + +} diff --git a/Mage.Sets/src/mage/sets/planeshift/DestructiveFlow.java b/Mage.Sets/src/mage/sets/planeshift/DestructiveFlow.java new file mode 100644 index 00000000000..79dff24deeb --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/DestructiveFlow.java @@ -0,0 +1,71 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.common.SacrificeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SupertypePredicate; + +/** + * + * @author LoneFox + */ +public class DestructiveFlow extends CardImpl { + + private static final FilterLandPermanent filter = new FilterLandPermanent("nonbasic land"); + + static { + filter.add(Predicates.not(new SupertypePredicate("Basic"))); + } + + public DestructiveFlow(UUID ownerId) { + super(ownerId, 102, "Destructive Flow", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{B}{R}{G}"); + this.expansionSetCode = "PLS"; + + // At the beginning of each player's upkeep, that player sacrifices a nonbasic land. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeEffect(filter, 1, "that player"), + TargetController.ANY, false)); + + } + + public DestructiveFlow(final DestructiveFlow card) { + super(card); + } + + @Override + public DestructiveFlow copy() { + return new DestructiveFlow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java b/Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java new file mode 100644 index 00000000000..b460f739148 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java @@ -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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventAllDamageByAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author LoneFox + */ +public class RadiantKavu extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blue and black creatures"); + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLUE), new ColorPredicate(ObjectColor.BLACK))); + } + + public RadiantKavu(UUID ownerId) { + super(ownerId, 120, "Radiant Kavu", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{R}{G}{W}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Kavu"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {R}{G}{W}: Prevent all combat damage blue creatures and black creatures would deal this turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, (new PreventAllDamageByAllEffect(filter, + Duration.EndOfTurn, true)), new ManaCostsImpl("{R}{G}{W}"))); + } + + public RadiantKavu(final RadiantKavu card) { + super(card); + } + + @Override + public RadiantKavu copy() { + return new RadiantKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/WarpedDevotion.java b/Mage.Sets/src/mage/sets/planeshift/WarpedDevotion.java new file mode 100644 index 00000000000..776a40c4dce --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/WarpedDevotion.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.planeshift; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class WarpedDevotion extends mage.sets.eighthedition.WarpedDevotion { + + public WarpedDevotion(UUID ownerId) { + super(ownerId); + this.cardNumber = 57; + this.expansionSetCode = "PLS"; + this.rarity = Rarity.UNCOMMON; + } + + public WarpedDevotion(final WarpedDevotion card) { + super(card); + } + + @Override + public WarpedDevotion copy() { + return new WarpedDevotion(this); + } +} From e708061c5a87b2e70ed9400be4a44f976a94ee86 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 10:35:05 +0200 Subject: [PATCH 173/375] * The Abyss - Fixed target choosing of players not controlling the Abyss concerning hexproof / shroud. --- Mage.Sets/src/mage/sets/legends/TheAbyss.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage.Sets/src/mage/sets/legends/TheAbyss.java b/Mage.Sets/src/mage/sets/legends/TheAbyss.java index 2b8e802fe07..6124421c61b 100644 --- a/Mage.Sets/src/mage/sets/legends/TheAbyss.java +++ b/Mage.Sets/src/mage/sets/legends/TheAbyss.java @@ -97,6 +97,8 @@ class TheAbyssTriggeredAbility extends TriggeredAbilityImpl { filter.add(Predicates.not(new CardTypePredicate(CardType.ARTIFACT))); filter.add(new ControllerIdPredicate(player.getId())); Target target = new TargetCreaturePermanent(filter); + target.setAbilityController(getControllerId()); + target.setTargetController(player.getId()); this.getTargets().clear(); this.getTargets().add(target); return true; From 4a0d118b7f70ba29b35a0bd80cd6f3d58feb1769 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 11:09:16 +0200 Subject: [PATCH 174/375] * Fixed some creatures with singleton evasion abilities that sometimes faiedl to work correctly (e.g. Orchard Spirit). --- .../mage/sets/avacynrestored/HuntedGhoul.java | 76 ++-------------- .../championsofkamigawa/FieldOfReality.java | 76 ++++------------ .../mage/sets/innistrad/OrchardSpirit.java | 87 +++++------------- .../ProwlingNightstalker.java | 77 +++------------- .../sets/mirrodinbesieged/SignalPest.java | 90 +++++-------------- .../riseoftheeldrazi/ZulaportEnforcer.java | 90 ++++--------------- .../mage/sets/timespiral/AmrouSeekers.java | 81 ++++------------- 7 files changed, 110 insertions(+), 467 deletions(-) diff --git a/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java b/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java index d50023cd82c..e236033c8c0 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/HuntedGhoul.java @@ -27,18 +27,14 @@ */ package mage.sets.avacynrestored; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.common.combat.CantBlockCreaturesSourceEffect; +import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.effects.RestrictionEffect; -import mage.cards.CardImpl; -import mage.constants.Duration; -import mage.game.Game; -import mage.game.permanent.Permanent; - -import java.util.UUID; +import mage.filter.common.FilterCreaturePermanent; /** * @author noxx @@ -54,7 +50,7 @@ public class HuntedGhoul extends CardImpl { this.toughness = new MageInt(2); // Hunted Ghoul can't block Humans. - this.addAbility(HuntedGhoulAbility.getInstance()); + this.addAbility(new SimpleEvasionAbility(new CantBlockCreaturesSourceEffect(new FilterCreaturePermanent("Human", "Humans")))); } public HuntedGhoul(final HuntedGhoul card) { @@ -66,61 +62,3 @@ public class HuntedGhoul extends CardImpl { return new HuntedGhoul(this); } } - -class HuntedGhoulAbility extends EvasionAbility { - - private static HuntedGhoulAbility instance; - - public static HuntedGhoulAbility getInstance() { - if (instance == null) { - instance = new HuntedGhoulAbility(); - } - return instance; - } - - private HuntedGhoulAbility() { - this.addEffect(new HuntedGhoulEffect()); - } - - @Override - public String getRule() { - return "{this} can't block Humans."; - } - - @Override - public HuntedGhoulAbility copy() { - return getInstance(); - } -} - -class HuntedGhoulEffect extends RestrictionEffect { - - public HuntedGhoulEffect() { - super(Duration.WhileOnBattlefield); - } - - public HuntedGhoulEffect(final HuntedGhoulEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getAbilities().containsKey(HuntedGhoulAbility.getInstance().getId())) { - return true; - } - return false; - } - - @Override - public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (attacker != null && attacker.hasSubtype("Human")) { - return false; - } - return true; - } - - @Override - public HuntedGhoulEffect copy() { - return new HuntedGhoulEffect(this); - } -} diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/FieldOfReality.java b/Mage.Sets/src/mage/sets/championsofkamigawa/FieldOfReality.java index a7bfc05a864..4e1bc3cb95b 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/FieldOfReality.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/FieldOfReality.java @@ -25,30 +25,24 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.championsofkamigawa; import java.util.UUID; - +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; import mage.constants.AttachmentType; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.combat.CantBlockSourceEffect; -import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; -import mage.abilities.keyword.EnchantAbility; -import mage.cards.CardImpl; -import mage.constants.Outcome; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -62,13 +56,15 @@ public class FieldOfReality extends CardImpl { this.expansionSetCode = "CHK"; this.subtype.add("Aura"); - - // Enchanted creature can't be blocked by Spirits. + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); this.addAbility(new EnchantAbility(auraTarget.getTargetName())); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new FieldOfRealityEvasionAbility(), AttachmentType.AURA ))); + + // Enchanted creature can't be blocked by Spirits. + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesAttachedEffect( + Duration.WhileOnBattlefield, new FilterCreaturePermanent("Spirit", "Spirits"), AttachmentType.AURA))); // {1}{U}: Return Field of Reality to its owner's hand. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), new ManaCostsImpl("{1}{U}"))); } @@ -83,45 +79,3 @@ public class FieldOfReality extends CardImpl { } } - -class FieldOfRealityEvasionAbility extends EvasionAbility { - - public FieldOfRealityEvasionAbility() { - this.addEffect(new FieldOfRealityEvasionEffect()); - } - - public FieldOfRealityEvasionAbility(final FieldOfRealityEvasionAbility ability) { - super(ability); - } - - @Override - public String getRule() { - return "can't be blocked by Spirits"; - } - - @Override - public FieldOfRealityEvasionAbility copy() { - return new FieldOfRealityEvasionAbility(this); - } -} - -class FieldOfRealityEvasionEffect extends CantBlockSourceEffect { - - public FieldOfRealityEvasionEffect() { - super(Duration.WhileOnBattlefield); - } - - public FieldOfRealityEvasionEffect(final FieldOfRealityEvasionEffect effect) { - super(effect); - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - return !blocker.hasSubtype("Spirit") ; - } - - @Override - public FieldOfRealityEvasionEffect copy() { - return new FieldOfRealityEvasionEffect(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java b/Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java index e16f95e77af..d256f83ba64 100644 --- a/Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java +++ b/Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java @@ -28,18 +28,18 @@ package mage.sets.innistrad; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.effects.RestrictionEffect; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ReachAbility; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; /** * @@ -47,6 +47,17 @@ import mage.game.permanent.Permanent; */ public class OrchardSpirit extends CardImpl { + private final static FilterCreaturePermanent notFlyingorReachCreatures = new FilterCreaturePermanent("except by creatures with flying or reach"); + + static { + notFlyingorReachCreatures.add(Predicates.not( + Predicates.or( + new AbilityPredicate(FlyingAbility.class), + new AbilityPredicate(ReachAbility.class) + ) + )); + } + public OrchardSpirit(UUID ownerId) { super(ownerId, 198, "Orchard Spirit", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.expansionSetCode = "ISD"; @@ -56,7 +67,7 @@ public class OrchardSpirit extends CardImpl { this.toughness = new MageInt(2); // Orchard Spirit can't be blocked except by creatures with flying or reach. - this.addAbility(OrchardSpiritAbility.getInstance()); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(notFlyingorReachCreatures, Duration.WhileOnBattlefield))); } @@ -69,61 +80,3 @@ public class OrchardSpirit extends CardImpl { return new OrchardSpirit(this); } } - -class OrchardSpiritAbility extends EvasionAbility { - - private static OrchardSpiritAbility instance; - - public static OrchardSpiritAbility getInstance() { - if (instance == null) { - instance = new OrchardSpiritAbility(); - } - return instance; - } - - private OrchardSpiritAbility() { - this.addEffect(new OrchardSpiritEffect()); - } - - @Override - public String getRule() { - return "{this} can't be blocked except by creatures with flying or reach."; - } - - @Override - public OrchardSpiritAbility copy() { - return getInstance(); - } -} - -class OrchardSpiritEffect extends RestrictionEffect { - - public OrchardSpiritEffect() { - super(Duration.WhileOnBattlefield); - } - - public OrchardSpiritEffect(final OrchardSpiritEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getAbilities().containsKey(OrchardSpiritAbility.getInstance().getId())) { - return true; - } - return false; - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (blocker.getAbilities().contains(FlyingAbility.getInstance()) || blocker.getAbilities().contains(ReachAbility.getInstance())) { - return true; - } - return false; - } - - @Override - public OrchardSpiritEffect copy() { - return new OrchardSpiritEffect(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java b/Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java index f2351cdee4f..1c9cbe92997 100644 --- a/Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java +++ b/Mage.Sets/src/mage/sets/masterseditioniv/ProwlingNightstalker.java @@ -29,15 +29,16 @@ package mage.sets.masterseditioniv; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.effects.RestrictionEffect; +import mage.ObjectColor; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; /** * @@ -45,6 +46,12 @@ import mage.game.permanent.Permanent; */ public class ProwlingNightstalker extends CardImpl { + private final static FilterCreaturePermanent notBlackCreatures = new FilterCreaturePermanent("except by black creatures"); + + static { + notBlackCreatures.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK))); + } + public ProwlingNightstalker(UUID ownerId) { super(ownerId, 93, "Prowling Nightstalker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); this.expansionSetCode = "ME4"; @@ -53,7 +60,7 @@ public class ProwlingNightstalker extends CardImpl { this.toughness = new MageInt(2); // Prowling Nightstalker can't be blocked except by black creatures. - this.addAbility(ProwlingNightstalkerAbility.getInstance()); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(notBlackCreatures, Duration.WhileOnBattlefield))); } public ProwlingNightstalker(final ProwlingNightstalker card) { @@ -65,61 +72,3 @@ public class ProwlingNightstalker extends CardImpl { return new ProwlingNightstalker(this); } } - -class ProwlingNightstalkerAbility extends EvasionAbility { - - private static ProwlingNightstalkerAbility instance; - - public static ProwlingNightstalkerAbility getInstance() { - if (instance == null) { - instance = new ProwlingNightstalkerAbility(); - } - return instance; - } - - private ProwlingNightstalkerAbility() { - this.addEffect(new ProwlingNightstalkerEffect()); - } - - @Override - public String getRule() { - return "{this} can't be blocked except by black creatures."; - } - - @Override - public ProwlingNightstalkerAbility copy() { - return getInstance(); - } -} - -class ProwlingNightstalkerEffect extends RestrictionEffect { - - public ProwlingNightstalkerEffect() { - super(Duration.WhileOnBattlefield); - } - - public ProwlingNightstalkerEffect(final ProwlingNightstalkerEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getAbilities().containsKey(ProwlingNightstalkerAbility.getInstance().getId())) { - return true; - } - return false; - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (blocker.getColor(game).isBlack()) { - return true; - } - return false; - } - - @Override - public ProwlingNightstalkerEffect copy() { - return new ProwlingNightstalkerEffect(this); - } -} diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/SignalPest.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/SignalPest.java index 604e7f4d863..2ffc07acf9f 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/SignalPest.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/SignalPest.java @@ -27,13 +27,10 @@ */ package mage.sets.mirrodinbesieged; -import java.io.ObjectStreamException; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.MageSingleton; -import mage.abilities.effects.RestrictionEffect; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.keyword.BattleCryAbility; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ReachAbility; @@ -41,8 +38,9 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; /** * @@ -50,6 +48,17 @@ import mage.game.permanent.Permanent; */ public class SignalPest extends CardImpl { + private final static FilterCreaturePermanent notFlyingorReachCreatures = new FilterCreaturePermanent("except by creatures with flying or reach"); + + static { + notFlyingorReachCreatures.add(Predicates.not( + Predicates.or( + new AbilityPredicate(FlyingAbility.class), + new AbilityPredicate(ReachAbility.class) + ) + )); + } + public SignalPest(UUID ownerId) { super(ownerId, 131, "Signal Pest", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}"); this.expansionSetCode = "MBS"; @@ -58,8 +67,11 @@ public class SignalPest extends CardImpl { this.power = new MageInt(0); this.toughness = new MageInt(1); + // Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) this.addAbility(new BattleCryAbility()); - this.addAbility(SignalPestAbility.getInstance()); + + // Signal Pest can't be blocked except by creatures with flying or reach. + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(notFlyingorReachCreatures, Duration.WhileOnBattlefield))); } public SignalPest(final SignalPest card) { @@ -71,65 +83,3 @@ public class SignalPest extends CardImpl { return new SignalPest(this); } } - -class SignalPestAbility extends EvasionAbility implements MageSingleton { - - private static SignalPestAbility instance; - - private Object readResolve() throws ObjectStreamException { - return instance; - } - - public static SignalPestAbility getInstance() { - if (instance == null) { - instance = new SignalPestAbility(); - } - return instance; - } - - private SignalPestAbility() { - this.addEffect(new SignalPestEffect()); - } - - @Override - public String getRule() { - return "{this} can't be blocked except by creatures with flying or reach"; - } - - @Override - public SignalPestAbility copy() { - return getInstance(); - } -} - -class SignalPestEffect extends RestrictionEffect { - - public SignalPestEffect() { - super(Duration.WhileOnBattlefield); - } - - public SignalPestEffect(final SignalPestEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getAbilities().containsKey(SignalPestAbility.getInstance().getId())) { - return true; - } - return false; - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (blocker.getAbilities().contains(FlyingAbility.getInstance()) || blocker.getAbilities().contains(ReachAbility.getInstance())) { - return true; - } - return false; - } - - @Override - public SignalPestEffect copy() { - return new SignalPestEffect(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/ZulaportEnforcer.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/ZulaportEnforcer.java index a1b8a492f4b..9e4036e8187 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/ZulaportEnforcer.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/ZulaportEnforcer.java @@ -27,23 +27,24 @@ */ package mage.sets.riseoftheeldrazi; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; +import java.util.UUID; import mage.MageInt; +import mage.ObjectColor; import mage.abilities.Abilities; import mage.abilities.AbilitiesImpl; import mage.abilities.Ability; -import mage.abilities.EvasionAbility; +import mage.abilities.common.SimpleEvasionAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.abilities.keyword.LevelUpAbility; import mage.abilities.keyword.LevelerCardBuilder; import mage.cards.LevelerCard; -import mage.game.Game; -import mage.game.permanent.Permanent; - -import java.util.UUID; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; /** * @@ -51,6 +52,12 @@ import java.util.UUID; */ public class ZulaportEnforcer extends LevelerCard { + private final static FilterCreaturePermanent notBlackCreatures = new FilterCreaturePermanent("except by black creatures"); + + static { + notBlackCreatures.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK))); + } + public ZulaportEnforcer(UUID ownerId) { super(ownerId, 133, "Zulaport Enforcer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}"); this.expansionSetCode = "ROE"; @@ -64,14 +71,13 @@ public class ZulaportEnforcer extends LevelerCard { this.addAbility(new LevelUpAbility(new ManaCostsImpl("{4}"))); // LEVEL 1-2: 3/3 - // LEVEL 3+: 5/5 // Zulaport Enforcer can't be blocked except by black creatures. - Abilities levelAbilities = new AbilitiesImpl(); - levelAbilities.add(ZulaportEnforcerAbility.getInstance()); + Abilities levelAbilities = new AbilitiesImpl<>(); + levelAbilities.add(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(notBlackCreatures, Duration.WhileOnBattlefield))); this.addAbilities(LevelerCardBuilder.construct( - new LevelerCardBuilder.LevelAbility(1, 2, new AbilitiesImpl(), 3, 3), + new LevelerCardBuilder.LevelAbility(1, 2, new AbilitiesImpl<>(), 3, 3), new LevelerCardBuilder.LevelAbility(3, -1, levelAbilities, 5, 5) )); setMaxLevelCounters(3); @@ -86,61 +92,3 @@ public class ZulaportEnforcer extends LevelerCard { return new ZulaportEnforcer(this); } } - -class ZulaportEnforcerAbility extends EvasionAbility { - - private static ZulaportEnforcerAbility instance; - - public static ZulaportEnforcerAbility getInstance() { - if (instance == null) { - instance = new ZulaportEnforcerAbility(); - } - return instance; - } - - private ZulaportEnforcerAbility() { - this.addEffect(new ZulaportEnforcerEffect()); - } - - @Override - public String getRule() { - return "{this} can't be blocked except by black creatures."; - } - - @Override - public ZulaportEnforcerAbility copy() { - return getInstance(); - } -} - -class ZulaportEnforcerEffect extends RestrictionEffect { - - public ZulaportEnforcerEffect() { - super(Duration.WhileOnBattlefield); - } - - public ZulaportEnforcerEffect(final ZulaportEnforcerEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getAbilities().containsKey(ZulaportEnforcerAbility.getInstance().getId())) { - return true; - } - return false; - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (blocker.getColor(game).isBlack()) { - return true; - } - return false; - } - - @Override - public ZulaportEnforcerEffect copy() { - return new ZulaportEnforcerEffect(this); - } -} diff --git a/Mage.Sets/src/mage/sets/timespiral/AmrouSeekers.java b/Mage.Sets/src/mage/sets/timespiral/AmrouSeekers.java index 2b8cd9f5fae..f7e95746eea 100644 --- a/Mage.Sets/src/mage/sets/timespiral/AmrouSeekers.java +++ b/Mage.Sets/src/mage/sets/timespiral/AmrouSeekers.java @@ -28,24 +28,18 @@ package mage.sets.timespiral; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.ObjectColor; -import mage.abilities.Ability; -import mage.abilities.EvasionAbility; -import mage.abilities.MageSingleton; -import mage.abilities.effects.RestrictionEffect; -import mage.abilities.keyword.IntimidateAbility; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Rarity; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; /** * @@ -53,6 +47,17 @@ import mage.game.permanent.Permanent; */ public class AmrouSeekers extends CardImpl { + private final static FilterCreaturePermanent notArtificatOrWhite = new FilterCreaturePermanent("except by artifact creatures and/or white creatures"); + + static { + notArtificatOrWhite.add(Predicates.not( + Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new ColorPredicate(ObjectColor.WHITE) + ) + )); + } + public AmrouSeekers(UUID ownerId) { super(ownerId, 2, "Amrou Seekers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.expansionSetCode = "TSP"; @@ -63,7 +68,7 @@ public class AmrouSeekers extends CardImpl { this.toughness = new MageInt(2); // Amrou Seekers can't be blocked except by artifact creatures and/or white creatures. - this.addAbility(new AmrouSeekersEvasionAbility()); + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(notArtificatOrWhite, Duration.WhileOnBattlefield))); } @@ -76,57 +81,3 @@ public class AmrouSeekers extends CardImpl { return new AmrouSeekers(this); } } - -class AmrouSeekersEvasionAbility extends EvasionAbility implements MageSingleton { - - public AmrouSeekersEvasionAbility() { - super(); - this.addEffect(new AmrouSeekersRestrictionEffect()); - } - - public AmrouSeekersEvasionAbility(final AmrouSeekersEvasionAbility ability) { - super(ability); - } - - @Override - public String getRule() { - return "Amrou Seekers can't be blocked except by artifact creatures and/or white creatures."; - } - - @Override - public AmrouSeekersEvasionAbility copy() { - return new AmrouSeekersEvasionAbility(this); - } -} - - -class AmrouSeekersRestrictionEffect extends RestrictionEffect { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("artifact creatures and/or white creatures"); - static { - filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), new ColorPredicate(ObjectColor.WHITE))); - } - - public AmrouSeekersRestrictionEffect() { - super(Duration.WhileOnBattlefield); - } - - public AmrouSeekersRestrictionEffect(final AmrouSeekersRestrictionEffect effect) { - super(effect); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - return true; - } - - @Override - public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - return filter.match(blocker, source.getSourceId(), source.getControllerId(), game); - } - - @Override - public AmrouSeekersRestrictionEffect copy() { - return new AmrouSeekersRestrictionEffect(this); - } -} From 4755655dc9d59664f52a7f9ef4a938d8061034ff Mon Sep 17 00:00:00 2001 From: emerald000 Date: Sat, 25 Jul 2015 05:23:05 -0400 Subject: [PATCH 175/375] Added Enraging Licid. --- .../src/mage/sets/tempest/EnragingLicid.java | 72 ++++++ .../mage/abilities/common/LicidAbility.java | 232 ++++++++++++++++++ 2 files changed, 304 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/tempest/EnragingLicid.java create mode 100644 Mage/src/mage/abilities/common/LicidAbility.java diff --git a/Mage.Sets/src/mage/sets/tempest/EnragingLicid.java b/Mage.Sets/src/mage/sets/tempest/EnragingLicid.java new file mode 100644 index 00000000000..9ef2e6899fe --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/EnragingLicid.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.tempest; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.LicidAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author emerald000 + */ +public class EnragingLicid extends CardImpl { + + public EnragingLicid(UUID ownerId) { + super(ownerId, 171, "Enraging Licid", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "TMP"; + this.subtype.add("Licid"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {R}, {tap}: Enraging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. + this.addAbility(new LicidAbility(new ColoredManaCost(ColoredManaSymbol.R), new ColoredManaCost(ColoredManaSymbol.R))); + + // Enchanted creature has haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.AURA))); + } + + public EnragingLicid(final EnragingLicid card) { + super(card); + } + + @Override + public EnragingLicid copy() { + return new EnragingLicid(this); + } +} diff --git a/Mage/src/mage/abilities/common/LicidAbility.java b/Mage/src/mage/abilities/common/LicidAbility.java new file mode 100644 index 00000000000..a321266836d --- /dev/null +++ b/Mage/src/mage/abilities/common/LicidAbility.java @@ -0,0 +1,232 @@ +/* + * 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.abilities.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.ActivatedAbilityImpl; +import mage.abilities.SpecialAction; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCost; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CreateSpecialActionEffect; +import mage.abilities.effects.common.RemoveSpecialActionEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author emerald000 + */ +public class LicidAbility extends ActivatedAbilityImpl { + + public LicidAbility(ManaCost activationCost, ManaCost specialActionCost) { + super(Zone.BATTLEFIELD, new LicidEffect(specialActionCost), activationCost); + this.addCost(new TapSourceCost()); + this.addTarget(new TargetCreaturePermanent()); + } + + public LicidAbility(LicidAbility ability) { + super(ability); + } + + @Override + public LicidAbility copy() { + return new LicidAbility(this); + } +} + +class LicidEffect extends OneShotEffect { + + private final ManaCost specialActionCost; + + LicidEffect(ManaCost specialActionCost) { + super(Outcome.Neutral); + this.specialActionCost = specialActionCost; + this.staticText = "{this} loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay " + specialActionCost.getText() + " to end this effect"; + } + + LicidEffect(final LicidEffect effect) { + super(effect); + this.specialActionCost = effect.specialActionCost; + } + + @Override + public LicidEffect copy() { + return new LicidEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent licid = (Permanent) source.getSourceObjectIfItStillExists(game); + if (licid != null) { + UUID messageId = UUID.randomUUID(); + LicidContinuousEffect effect = new LicidContinuousEffect(messageId); + effect.setTargetPointer(new FixedTarget(licid.getId())); + game.addEffect(effect, source); + new AttachEffect(Outcome.Neutral).apply(game, source); + SpecialAction specialAction = new LicidSpecialAction(this.specialActionCost, messageId, licid.getIdName()); + new CreateSpecialActionEffect(specialAction).apply(game, source); + return true; + } + return false; + } +} + +class LicidContinuousEffect extends ContinuousEffectImpl { + + private final UUID messageId; + + LicidContinuousEffect(UUID messageId) { + super(Duration.Custom, Outcome.Neutral); + this.messageId = messageId; + } + + LicidContinuousEffect(LicidContinuousEffect ability) { + super(ability); + this.messageId = ability.messageId; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Permanent licid = (Permanent) source.getSourceObjectIfItStillExists(game); + if (licid != null) { + switch (layer) { + case TypeChangingEffects_4: + licid.getCardType().clear(); + licid.getCardType().add(CardType.ENCHANTMENT); + licid.getSubtype().clear(); + licid.getSubtype().add("Aura"); + break; + case AbilityAddingRemovingEffects_6: + for (Ability ability : licid.getAbilities(game)) { + for (Effect effect : ability.getEffects()) { + if (effect instanceof LicidEffect) { + licid.getAbilities(game).remove(ability); + break; + } + } + } + Ability ability = new EnchantAbility("creature"); + ability.setRuleAtTheTop(true); + licid.addAbility(ability, source.getSourceId(), game); + licid.getSpellAbility().getTargets().clear(); + Target target = new TargetCreaturePermanent(); + target.addTarget(this.getTargetPointer().getFirst(game, source), source, game); + licid.getSpellAbility().getTargets().add(target); + } + return true; + } + discard(); + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.TypeChangingEffects_4 || layer == Layer.AbilityAddingRemovingEffects_6; + } + + @Override + public boolean isInactive(Ability source, Game game) { + Object object = game.getState().getValue(this.messageId.toString()); + return object != null; + } + + @Override + public LicidContinuousEffect copy() { + return new LicidContinuousEffect(this); + } +} + +class LicidSpecialAction extends SpecialAction { + + LicidSpecialAction(ManaCost cost, UUID messageId, String licidName) { + super(); + this.addCost(cost); + this.addEffect(new LicidSpecialActionEffect(messageId, this.getId(), licidName)); + } + + LicidSpecialAction(final LicidSpecialAction ability) { + super(ability); + } + + @Override + public LicidSpecialAction copy() { + return new LicidSpecialAction(this); + } +} + +class LicidSpecialActionEffect extends OneShotEffect { + + private final UUID messageId; + private final UUID generatingSpecialActionId; + + LicidSpecialActionEffect(UUID messageId, UUID generatingSpecialActionId, String licidName) { + super(Outcome.Neutral); + this.messageId = messageId; + this.generatingSpecialActionId = generatingSpecialActionId; + this.staticText = "End " + licidName + " Effect"; + } + + LicidSpecialActionEffect(final LicidSpecialActionEffect effect) { + super(effect); + this.messageId = effect.messageId; + this.generatingSpecialActionId = effect.generatingSpecialActionId; + } + + @Override + public LicidSpecialActionEffect copy() { + return new LicidSpecialActionEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + new RemoveSpecialActionEffect(this.generatingSpecialActionId).apply(game, source); + game.getState().setValue(this.messageId.toString(), true); + return true; + } +} From 7eab95665762121ffa68792bd804ed352dab6419 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 11:33:58 +0200 Subject: [PATCH 176/375] * Garruk, Apex Predator - Fixed the triggered ability of the Emblem given to opponent. --- .../sets/magic2015/GarrukApexPredator.java | 12 ++-- .../AttackedByCreatureTriggeredAbility.java | 63 +++++++++---------- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java b/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java index abf19090026..955c9019f01 100644 --- a/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java +++ b/Mage.Sets/src/mage/sets/magic2015/GarrukApexPredator.java @@ -81,7 +81,6 @@ public class GarrukApexPredator extends CardImpl { this.expansionSetCode = "M15"; this.subtype.add("Garruk"); - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(5)), false)); // +1: Destroy another target planeswalker. @@ -100,7 +99,9 @@ public class GarrukApexPredator extends CardImpl { this.addAbility(ability); // -8: Target opponent gets an emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn." - ability = new LoyaltyAbility(new GetEmblemTargetPlayerEffect(new GarrukApexPredatorEmblem()), -8); + Effect effect = new GetEmblemTargetPlayerEffect(new GarrukApexPredatorEmblem()); + effect.setText("Target opponent gets an emblem with \"Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn.\""); + ability = new LoyaltyAbility(effect, -8); ability.addTarget(new TargetOpponent()); this.addAbility(ability); } @@ -162,13 +163,14 @@ class GarrukApexPredatorBeastToken extends Token { } /** - * Emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn." + * Emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample + * until end of turn." */ class GarrukApexPredatorEmblem extends Emblem { public GarrukApexPredatorEmblem() { setName("EMBLEM: Garruk, Apex Predator"); - Effect effect = new BoostTargetEffect(5,5,Duration.EndOfTurn); + Effect effect = new BoostTargetEffect(5, 5, Duration.EndOfTurn); effect.setText("it gets +5/+5"); Ability ability = new AttackedByCreatureTriggeredAbility(Zone.COMMAND, effect, false, SetTargetPointer.PERMANENT); effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, @@ -176,4 +178,4 @@ class GarrukApexPredatorEmblem extends Emblem { ability.addEffect(effect); this.getAbilities().add(ability); } -} \ No newline at end of file +} diff --git a/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java index 456d02029c8..b3182dc1c41 100644 --- a/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.common; import java.util.UUID; @@ -57,13 +56,13 @@ public class AttackedByCreatureTriggeredAbility extends TriggeredAbilityImpl { public AttackedByCreatureTriggeredAbility(Effect effect, boolean optional, SetTargetPointer setTargetPointer) { this(Zone.BATTLEFIELD, effect, optional, setTargetPointer); } - + public AttackedByCreatureTriggeredAbility(Zone zone, Effect effect, boolean optional, SetTargetPointer setTargetPointer) { super(zone, effect, optional); this.setTargetPointer = setTargetPointer; } - - public AttackedByCreatureTriggeredAbility(AttackedByCreatureTriggeredAbility ability) { + + public AttackedByCreatureTriggeredAbility(final AttackedByCreatureTriggeredAbility ability) { super(ability); this.setTargetPointer = ability.setTargetPointer; } @@ -80,9 +79,9 @@ public class AttackedByCreatureTriggeredAbility extends TriggeredAbilityImpl { if (getControllerId().equals(playerId) && attackingCreature != null) { if (!setTargetPointer.equals(SetTargetPointer.NONE)) { for (Effect effect : this.getEffects()) { - switch(setTargetPointer) { + switch (setTargetPointer) { case PERMANENT: - effect.setTargetPointer(new FixedTarget(event.getTargetId())); + effect.setTargetPointer(new FixedTarget(attackingCreature.getId())); break; case PLAYER: effect.setTargetPointer(new FixedTarget(attackingCreature.getControllerId())); From e4005c0a3528880e3fd7f305e3044735af2585e2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 12:40:59 +0200 Subject: [PATCH 177/375] * Simic Manipulator - Fixed that also 0 counters could be selected (fixes #1140). --- .../mage/sets/gatecrash/SimicManipulator.java | 91 ++++++++++--------- .../abilities/costs/VariableCostImpl.java | 62 +++++++------ 2 files changed, 78 insertions(+), 75 deletions(-) diff --git a/Mage.Sets/src/mage/sets/gatecrash/SimicManipulator.java b/Mage.Sets/src/mage/sets/gatecrash/SimicManipulator.java index 195737b5175..2c846394b3e 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/SimicManipulator.java +++ b/Mage.Sets/src/mage/sets/gatecrash/SimicManipulator.java @@ -1,40 +1,33 @@ /* -* 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. -*/ + * 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.gatecrash; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.SubLayer; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; @@ -45,6 +38,13 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.keyword.EvolveAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; @@ -52,16 +52,17 @@ import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; /** -* Gatecrash FAQ (01.2013) -* -* The power of the target creature is checked both as you target it and as the ability -* resolves. If the power of the target creature when the ability resolves is greater -* than the number of +1/+1 counters removed from Simic Manipulator, the ability will -* be countered and none of its effects will happen. You won't gain control of any -* creature, but the counters removed as a cost remain removed. -* -* @author LevelX2 -*/ + * Gatecrash FAQ (01.2013) + * + * The power of the target creature is checked both as you target it and as the + * ability resolves. If the power of the target creature when the ability + * resolves is greater than the number of +1/+1 counters removed from Simic + * Manipulator, the ability will be countered and none of its effects will + * happen. You won't gain control of any creature, but the counters removed as a + * cost remain removed. + * + * @author LevelX2 + */ public class SimicManipulator extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power less than or equal to the number of +1/+1 counters removed this way"); @@ -78,12 +79,12 @@ public class SimicManipulator extends CardImpl { // Evolve this.addAbility(new EvolveAbility()); - // {tap}, Remove one or more +1/+1 counters from Simic Manipulator: Gain control of target creature with power less than or equal to the number of +1/+1 counters removed this way. + // {T}, Remove one or more +1/+1 counters from Simic Manipulator: Gain control of target creature with power less than or equal to the number of +1/+1 counters removed this way. // TODO: Improve targeting, that only valid targets (power <= removed counters) can be choosen // Disadvantage now is, that a creature can be targeted that couldn't be targeted by rules. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SimicManipulatorGainControlTargetEffect(Duration.Custom), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent(filter)); - ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1.createInstance(),1)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1.createInstance(), 1, "Remove one or more +1/+1 counters from {this}")); this.addAbility(ability); } diff --git a/Mage/src/mage/abilities/costs/VariableCostImpl.java b/Mage/src/mage/abilities/costs/VariableCostImpl.java index cb8245e78c8..c020d7922ba 100644 --- a/Mage/src/mage/abilities/costs/VariableCostImpl.java +++ b/Mage/src/mage/abilities/costs/VariableCostImpl.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.costs; import java.util.UUID; @@ -39,7 +38,6 @@ import mage.target.Targets; * * @author LevelX2 */ - public abstract class VariableCostImpl implements Cost, VariableCost { protected UUID id; @@ -53,10 +51,12 @@ public abstract class VariableCostImpl implements Cost, VariableCost { public VariableCostImpl(String actionText) { this("X", actionText); } + /** * * @param xText string for the defined value - * @param actionText what happens with the value (e.g. "to tap", "to exile from your graveyard") + * @param actionText what happens with the value (e.g. "to tap", "to exile + * from your graveyard") */ public VariableCostImpl(String xText, String actionText) { id = UUID.randomUUID(); @@ -122,11 +122,13 @@ public abstract class VariableCostImpl implements Cost, VariableCost { @Override public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { return true; /* not used */ + } @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { return true; /* not used */ + } @Override @@ -154,7 +156,7 @@ public abstract class VariableCostImpl implements Cost, VariableCost { int xValue = 0; Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - xValue = controller.announceXCost(0, getMaxValue(source, game), + xValue = controller.announceXCost(getMinValue(source, game), getMaxValue(source, game), new StringBuilder("Announce the number of ").append(actionText).toString(), game, source, this); } From 193177d9999d56729a687ca3b1a2fc3f3b96d9e2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 12:41:48 +0200 Subject: [PATCH 178/375] Fixed a lot of storage lands to calculate available mana correctly. --- .../betrayersofkamigawa/PetalmaneBaku.java | 35 +++++++++------ .../sets/fallenempires/BottomlessVault.java | 14 ++++-- .../mage/sets/fallenempires/HollowTrees.java | 14 ++++-- .../mage/sets/fallenempires/IcatianStore.java | 14 ++++-- .../mage/sets/fifthedition/DwarvenHold.java | 14 ++++-- .../src/mage/sets/fifthedition/SandSilos.java | 14 ++++-- .../sets/mercadianmasques/FountainOfCho.java | 15 ++++--- .../mercadianmasques/MercadianBazaar.java | 13 ++++-- .../sets/mercadianmasques/RushwoodGrove.java | 17 ++++--- .../sets/mercadianmasques/SaprazzanCove.java | 15 ++++--- .../mercadianmasques/SubterraneanHangar.java | 13 ++++-- .../RemoveVariableCountersSourceCost.java | 45 +++++++++---------- 12 files changed, 141 insertions(+), 82 deletions(-) diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java index 4de0d0d8933..d7ee3a8fd78 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java @@ -25,24 +25,26 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.betrayersofkamigawa; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; -import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.CountersCount; +import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.ManaEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.BasicManaAbility; +import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; import mage.choices.ChoiceColor; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.counters.CounterType; import mage.filter.common.FilterSpiritOrArcaneCard; import mage.game.Game; @@ -62,14 +64,19 @@ public class PetalmaneBaku extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(2); - + // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku. this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); // {1}, Remove X ki counters from Petalmane Baku: Add X mana of any one color to your mana pool. - Ability ability = new PetalmaneBakuManaAbility(); - ability.addCost(new GenericManaCost(1)); - ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI.createInstance(1))); + Ability ability = new DynamicManaAbility( + new Mana(0, 0, 0, 0, 0, 0, 1), + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add X mana of any one color to your mana pool", + true, new CountersCount(CounterType.KI)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove X ki counters from {this}")); this.addAbility(ability); } @@ -81,8 +88,9 @@ public class PetalmaneBaku extends CardImpl { public PetalmaneBaku copy() { return new PetalmaneBaku(this); } - + private class PetalmaneBakuManaAbility extends BasicManaAbility { + PetalmaneBakuManaAbility() { super(new PetalmaneBakuManaEffect()); this.addChoice(new ChoiceColor()); @@ -96,7 +104,7 @@ public class PetalmaneBaku extends CardImpl { public PetalmaneBakuManaAbility copy() { return new PetalmaneBakuManaAbility(this); } -} + } private class PetalmaneBakuManaEffect extends ManaEffect { @@ -118,9 +126,9 @@ public class PetalmaneBaku extends CardImpl { int numberOfMana = 0; for (Cost cost : source.getCosts()) { if (cost instanceof RemoveVariableCountersSourceCost) { - numberOfMana = ((RemoveVariableCountersSourceCost)cost).getAmount(); + numberOfMana = ((RemoveVariableCountersSourceCost) cost).getAmount(); } - } + } if (choice.getColor().isBlack()) { player.getManaPool().addMana(new Mana(0, 0, 0, 0, numberOfMana, 0, 0), game, source); return true; @@ -152,5 +160,4 @@ public class PetalmaneBaku extends CardImpl { } } - -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/fallenempires/BottomlessVault.java b/Mage.Sets/src/mage/sets/fallenempires/BottomlessVault.java index 85705452450..277cc93571a 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/BottomlessVault.java +++ b/Mage.Sets/src/mage/sets/fallenempires/BottomlessVault.java @@ -35,7 +35,9 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SkipUntapOptionalAbility; import mage.abilities.condition.common.SourceTappedCondition; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -67,10 +69,14 @@ public class BottomlessVault extends CardImpl { Effect effect = new ConditionalOneShotEffect(addStorageCounter, SourceTappedCondition.getInstance(), "if {this} is tapped, put a storage counter on it"); this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, false)); // {tap}, Remove any number of storage counters from Bottomless Vault: Add {B} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.BlackMana, new RemovedCountersForCostValue(), - "Add {B} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.BlackMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {B} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/fallenempires/HollowTrees.java b/Mage.Sets/src/mage/sets/fallenempires/HollowTrees.java index f14cdd1f50b..9253c1fc4f3 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/HollowTrees.java +++ b/Mage.Sets/src/mage/sets/fallenempires/HollowTrees.java @@ -35,7 +35,9 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SkipUntapOptionalAbility; import mage.abilities.condition.common.SourceTappedCondition; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -67,10 +69,14 @@ public class HollowTrees extends CardImpl { Effect effect = new ConditionalOneShotEffect(addStorageCounter, SourceTappedCondition.getInstance(), "if {this} is tapped, put a storage counter on it"); this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, false)); // {tap}, Remove any number of storage counters from Hollow Trees: Add {G} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.BlackMana, new RemovedCountersForCostValue(), - "Add {B} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.GreenMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {G} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/fallenempires/IcatianStore.java b/Mage.Sets/src/mage/sets/fallenempires/IcatianStore.java index ad30635e7ef..0fbec1161d9 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/IcatianStore.java +++ b/Mage.Sets/src/mage/sets/fallenempires/IcatianStore.java @@ -35,7 +35,9 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SkipUntapOptionalAbility; import mage.abilities.condition.common.SourceTappedCondition; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -67,10 +69,14 @@ public class IcatianStore extends CardImpl { Effect effect = new ConditionalOneShotEffect(addStorageCounter, SourceTappedCondition.getInstance(), "if {this} is tapped, put a storage counter on it"); this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, false)); // {tap}, Remove any number of storage counters from Icatian Store: Add {W} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.WhiteMana, new RemovedCountersForCostValue(), - "Add {W} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.WhiteMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {W} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/fifthedition/DwarvenHold.java b/Mage.Sets/src/mage/sets/fifthedition/DwarvenHold.java index f7e8c8afd0f..ad4bc54a7ab 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/DwarvenHold.java +++ b/Mage.Sets/src/mage/sets/fifthedition/DwarvenHold.java @@ -35,7 +35,9 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SkipUntapOptionalAbility; import mage.abilities.condition.common.SourceTappedCondition; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -67,10 +69,14 @@ public class DwarvenHold extends CardImpl { Effect effect = new ConditionalOneShotEffect(addStorageCounter, SourceTappedCondition.getInstance(), "if {this} is tapped, put a storage counter on it"); this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, false)); // {tap}, Remove any number of storage counters from Dwarven Hold: Add {R} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.RedMana, new RemovedCountersForCostValue(), - "Add {R} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.RedMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {R} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/fifthedition/SandSilos.java b/Mage.Sets/src/mage/sets/fifthedition/SandSilos.java index 7e8a942094e..bbc58406a2f 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/SandSilos.java +++ b/Mage.Sets/src/mage/sets/fifthedition/SandSilos.java @@ -35,7 +35,9 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SkipUntapOptionalAbility; import mage.abilities.condition.common.SourceTappedCondition; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -67,10 +69,14 @@ public class SandSilos extends CardImpl { Effect effect = new ConditionalOneShotEffect(addStorageCounter, SourceTappedCondition.getInstance(), "if {this} is tapped, put a storage counter on it"); this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, false)); // {tap}, Remove any number of storage counters from Sand Silos: Add {U} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.BlueMana, new RemovedCountersForCostValue(), - "Add {U} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.BlueMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {U} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/FountainOfCho.java b/Mage.Sets/src/mage/sets/mercadianmasques/FountainOfCho.java index 5074f07c584..d60cf95b01f 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/FountainOfCho.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/FountainOfCho.java @@ -34,6 +34,7 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; @@ -57,11 +58,15 @@ public class FountainOfCho extends CardImpl { this.addAbility(new EntersBattlefieldTappedAbility()); // {tap}: Put a storage counter on Fountain of Cho. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.STORAGE.createInstance()), new TapSourceCost())); - // {tap}, Remove any number of storage counters from Fountain of Cho: Add {W} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.WhiteMana, new RemovedCountersForCostValue(), - "Add {W} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + // {T}, Remove any number of storage counters from Fountain of Cho: Add {W} to your mana pool for each storage counter removed this way. + Ability ability = new DynamicManaAbility( + Mana.WhiteMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {W} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/MercadianBazaar.java b/Mage.Sets/src/mage/sets/mercadianmasques/MercadianBazaar.java index b89398ad4a3..f361fba4a78 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/MercadianBazaar.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/MercadianBazaar.java @@ -34,6 +34,7 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; @@ -58,10 +59,14 @@ public class MercadianBazaar extends CardImpl { // {tap}: Put a storage counter on Mercadian Bazaar. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.STORAGE.createInstance()), new TapSourceCost())); // {tap}, Remove any number of storage counters from Mercadian Bazaar: Add {R} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.RedMana, new RemovedCountersForCostValue(), - "Add {R} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.RedMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {R} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/RushwoodGrove.java b/Mage.Sets/src/mage/sets/mercadianmasques/RushwoodGrove.java index df971fa382f..7aeef255e35 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/RushwoodGrove.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/RushwoodGrove.java @@ -34,6 +34,7 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; @@ -55,13 +56,17 @@ public class RushwoodGrove extends CardImpl { // Rushwood Grove enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - // {tap}: Put a storage counter on Rushwood Grove. + // {T}: Put a storage counter on Rushwood Grove. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.STORAGE.createInstance()), new TapSourceCost())); - // {tap}, Remove any number of storage counters from Rushwood Grove: Add {G} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.GreenMana, new RemovedCountersForCostValue(), - "Add {G} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + // {T}, Remove any number of storage counters from Rushwood Grove: Add {G} to your mana pool for each storage counter removed this way. + Ability ability = new DynamicManaAbility( + Mana.GreenMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {G} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanCove.java b/Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanCove.java index 7d841973f70..f6fa90c5fab 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanCove.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/SaprazzanCove.java @@ -34,13 +34,12 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.ColoredManaSymbol; import mage.constants.Rarity; import mage.constants.Zone; import mage.counters.CounterType; @@ -60,10 +59,14 @@ public class SaprazzanCove extends CardImpl { // {tap}: Put a storage counter on Saprazzan Cove. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.STORAGE.createInstance()), new TapSourceCost())); // {tap}, Remove any number of storage counters from Saprazzan Cove: Add {U} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.BlueMana, new RemovedCountersForCostValue(), - "Add {U} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.BlueMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {U} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/SubterraneanHangar.java b/Mage.Sets/src/mage/sets/mercadianmasques/SubterraneanHangar.java index 245b09cbd4a..21a9634814b 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/SubterraneanHangar.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/SubterraneanHangar.java @@ -34,6 +34,7 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; @@ -58,10 +59,14 @@ public class SubterraneanHangar extends CardImpl { // {tap}: Put a storage counter on Subterranean Hangar. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.STORAGE.createInstance()), new TapSourceCost())); // {tap}, Remove any number of storage counters from Subterranean Hangar: Add {B} to your mana pool for each storage counter removed this way. - Ability ability = new DynamicManaAbility(Mana.BlackMana, new RemovedCountersForCostValue(), - "Add {B} to your mana pool for each storage counter removed this way"); - ability.addCost(new RemoveVariableCountersSourceCost( - CounterType.STORAGE.createInstance(), "Remove any number of storage counters from {this}")); + Ability ability = new DynamicManaAbility( + Mana.BlackMana, + new RemovedCountersForCostValue(), + new TapSourceCost(), + "Add {B} to your mana pool for each storage counter removed this way", + true, new CountersCount(CounterType.STORAGE)); + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + "Remove any number of storage counters from {this}")); this.addAbility(ability); } diff --git a/Mage/src/mage/abilities/costs/common/RemoveVariableCountersSourceCost.java b/Mage/src/mage/abilities/costs/common/RemoveVariableCountersSourceCost.java index 49020791d4c..7678d644736 100644 --- a/Mage/src/mage/abilities/costs/common/RemoveVariableCountersSourceCost.java +++ b/Mage/src/mage/abilities/costs/common/RemoveVariableCountersSourceCost.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.abilities.costs.common; import mage.abilities.Ability; @@ -39,37 +38,38 @@ import mage.game.permanent.Permanent; * * @author LevelX2 */ -public class RemoveVariableCountersSourceCost extends VariableCostImpl { +public class RemoveVariableCountersSourceCost extends VariableCostImpl { protected int minimalCountersToPay = 0; private String counterName; - public RemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay) { - super(new StringBuilder(counter.getName()).append(" counters to remove").toString()); - this.minimalCountersToPay = minimalCountersToPay; - this.counterName = counter.getName(); - this.text = new StringBuilder("Remove ").append(xText).append(" ").append(counterName).append(" counters from {this}").toString(); - } - public RemoveVariableCountersSourceCost(Counter counter) { this(counter, 0); } - - public RemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay, String text) { - this(counter, minimalCountersToPay); - this.text = text; - } public RemoveVariableCountersSourceCost(Counter counter, String text) { - this(counter); - this.text = text; + this(counter, 0, text); + } + + public RemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay) { + this(counter, minimalCountersToPay, ""); + } + + public RemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay, String text) { + super(counter.getName() + " counters to remove"); + this.minimalCountersToPay = minimalCountersToPay; + this.counterName = counter.getName(); + if (text == null || text.isEmpty()) { + this.text = "Remove X " + counterName + " counters from {this}"; + } else { + this.text = text; + } } public RemoveVariableCountersSourceCost(final RemoveVariableCountersSourceCost cost) { super(cost); this.minimalCountersToPay = cost.minimalCountersToPay; this.counterName = cost.counterName; - this.text = cost.text; } @Override @@ -98,4 +98,3 @@ public class RemoveVariableCountersSourceCost extends VariableCostImpl { } } - From 6f13574639f447c3d8ffd179403df2c438fdcf22 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 12:54:57 +0200 Subject: [PATCH 179/375] Release 1.4.2v4. --- Mage.Common/src/mage/utils/MageVersion.java | 2 +- Mage/src/mage/cards/repository/CardRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java index 4800c7c1d4d..cc72ce6562a 100644 --- a/Mage.Common/src/mage/utils/MageVersion.java +++ b/Mage.Common/src/mage/utils/MageVersion.java @@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable { public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; public final static int MAGE_VERSION_PATCH = 2; - public final static String MAGE_VERSION_MINOR_PATCH = "v3"; + public final static String MAGE_VERSION_MINOR_PATCH = "v4"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 7c073ea5aab..019be833338 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -60,7 +60,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 41; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 29; + private static final long CARD_CONTENT_VERSION = 30; private final Random random = new Random(); private Dao cardDao; From 78201f551165499badea99b29dc1c545ee3b85e5 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 13:31:51 +0200 Subject: [PATCH 180/375] Release 1.4.2v4. --- Utils/release/getting_implemented_cards.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Utils/release/getting_implemented_cards.txt b/Utils/release/getting_implemented_cards.txt index c23eb917f1e..60049b9bff6 100644 --- a/Utils/release/getting_implemented_cards.txt +++ b/Utils/release/getting_implemented_cards.txt @@ -155,6 +155,9 @@ git log 8d5137e40ebe1c029e737ef475935ff7cc40bb64..HEAD --diff-filter=A --name-st since 1.4.2.v3 git log 60c7a2b34b5dd9a64bd415b65424a559294cf52b..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt +since 1.4.2.v4 +git log 193177d9999d56729a687ca3b1a2fc3f3b96d9e2..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt + 3. Copy added_cards.txt to trunk\Utils folder 4. Run script: > perl extract_in_wiki_format.perl From 3ea281ffbf5fd16acaeab34e54c68437719f297c Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sat, 25 Jul 2015 20:12:43 +0300 Subject: [PATCH 181/375] Add DamageTargetControllerEffect and use it for existing cards. Implement card: Illuminate --- .../src/mage/sets/apocalypse/Illuminate.java | 79 ++++++++++++++ .../sets/betrayersofkamigawa/FirstVolley.java | 50 ++------- .../mage/sets/magic2011/ChandrasOutrage.java | 61 +++-------- .../mage/sets/magicorigins/RavagingBlaze.java | 56 ++-------- .../common/DamageTargetControllerEffect.java | 103 ++++++++++++++++++ 5 files changed, 215 insertions(+), 134 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/Illuminate.java create mode 100644 Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/Illuminate.java b/Mage.Sets/src/mage/sets/apocalypse/Illuminate.java new file mode 100644 index 00000000000..d5e8769fbb2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/Illuminate.java @@ -0,0 +1,79 @@ +/* + * 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.abilities.condition.common.KickedCostCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class Illuminate extends CardImpl { + + public Illuminate(UUID ownerId) { + super(ownerId, 63, "Illuminate", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{X}{R}"); + this.expansionSetCode = "APC"; + + // Kicker {2}{R} and/or {3}{U} + KickerAbility kickerAbility = new KickerAbility("{2}{R}"); + kickerAbility.addKickerCost("{3}{U}"); + this.addAbility(kickerAbility); + // Illuminate deals X damage to target creature. If Illuminate was kicked with its {2}{R} kicker, it deals X damage to that creature's controller. If Illuminate was kicked with its {3}{U} kicker, you draw X cards. + this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue())); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new DamageTargetControllerEffect(new ManacostVariableValue()), + new KickedCostCondition("{2}{R}"), + "If {this} was kicked with its {2}{R} kicker, it deals X damage to that creature's controller.")); + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new DrawCardSourceControllerEffect(new ManacostVariableValue()), + new KickedCostCondition("{3}{U}"), + "If {this} was kicked with its {3}{U} kicker, you draw X cards.")); + + } + + public Illuminate(final Illuminate card) { + super(card); + } + + @Override + public Illuminate copy() { + return new Illuminate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FirstVolley.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FirstVolley.java index 8f20e822b03..58ad9dd54f7 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FirstVolley.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FirstVolley.java @@ -28,15 +28,12 @@ package mage.sets.betrayersofkamigawa; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.target.common.TargetCreaturePermanent; /** @@ -50,9 +47,11 @@ public class FirstVolley extends CardImpl { this.expansionSetCode = "BOK"; this.subtype.add("Arcane"); - // First Volley deals 1 damage to target creature and 1 damage to that creature's controller. - this.getSpellAbility().addEffect(new FirstVolleyEffect()); + this.getSpellAbility().addEffect(new DamageTargetEffect(1)); + Effect effect = new DamageTargetControllerEffect(1); + effect.setText("and 1 damage to that creature's controller"); + this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } @@ -66,34 +65,3 @@ public class FirstVolley extends CardImpl { return new FirstVolley(this); } } - -class FirstVolleyEffect extends OneShotEffect { - - public FirstVolleyEffect() { - super(Outcome.Damage); - this.staticText = "{this} deals 1 damage to target creature and 1 damage to that creature's controller"; - } - - public FirstVolleyEffect(final FirstVolleyEffect effect) { - super(effect); - } - - @Override - public FirstVolleyEffect copy() { - return new FirstVolleyEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); - if (permanent != null) { - Player controller = game.getPlayer(permanent.getControllerId()); - if (controller != null) { - permanent.damage(1, source.getSourceId(), game, false, true); - controller.damage(1, source.getSourceId(), game, false, true); - return true; - } - } - return false; - } -} diff --git a/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java b/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java index a5ee07e9ce7..98d75760c25 100644 --- a/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java +++ b/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -29,15 +29,12 @@ package mage.sets.magic2011; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.target.common.TargetCreaturePermanent; /** @@ -50,7 +47,11 @@ public class ChandrasOutrage extends CardImpl { super(ownerId, 128, "Chandra's Outrage", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}{R}"); this.expansionSetCode = "M11"; - this.getSpellAbility().addEffect(new ChandrasOutrageEffect()); + // Chandra's Outrage deals 4 damage to target creature and 2 damage to that creature's controller. + this.getSpellAbility().addEffect(new DamageTargetEffect(4)); + Effect effect = new DamageTargetControllerEffect(2); + effect.setText("and 2 damage to that creature's controller"); + this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } @@ -64,35 +65,3 @@ public class ChandrasOutrage extends CardImpl { } } - -class ChandrasOutrageEffect extends OneShotEffect { - - public ChandrasOutrageEffect() { - super(Outcome.Damage); - staticText = "{this} deals 4 damage to target creature and 2 damage to that creature's controller"; - } - - public ChandrasOutrageEffect(final ChandrasOutrageEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null) { - Player player = game.getPlayer(permanent.getControllerId()); - if (player != null) { - permanent.damage(4, source.getSourceId(), game, false, true); - player.damage(2, source.getSourceId(), game, false, true); - return true; - } - } - return false; - } - - @Override - public ChandrasOutrageEffect copy() { - return new ChandrasOutrageEffect(this); - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/magicorigins/RavagingBlaze.java b/Mage.Sets/src/mage/sets/magicorigins/RavagingBlaze.java index 15d9672c16f..a22d8aa8feb 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/RavagingBlaze.java +++ b/Mage.Sets/src/mage/sets/magicorigins/RavagingBlaze.java @@ -28,16 +28,14 @@ package mage.sets.magicorigins; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.condition.common.SpellMasteryCondition; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; /** @@ -50,10 +48,12 @@ public class RavagingBlaze extends CardImpl { super(ownerId, 159, "Ravaging Blaze", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{X}{R}{R}"); this.expansionSetCode = "ORI"; - // Ravaging Blaze deals X damage to target creature. - // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller. - this.getSpellAbility().addEffect(new RavagingBlazeEffect()); + // Ravaging Blaze deals X damage to target creature. + this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue())); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DamageTargetControllerEffect(new ManacostVariableValue()), + SpellMasteryCondition.getInstance(), "
Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller.")); } public RavagingBlaze(final RavagingBlaze card) { @@ -65,41 +65,3 @@ public class RavagingBlaze extends CardImpl { return new RavagingBlaze(this); } } - -class RavagingBlazeEffect extends OneShotEffect { - - public RavagingBlazeEffect() { - super(Outcome.Damage); - staticText = "{this} deals X damage to target creature.
" - + "Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, {this} also deals X damage to that creature's controller."; - } - - public RavagingBlazeEffect(final RavagingBlazeEffect effect) { - super(effect); - } - - @Override - public RavagingBlazeEffect copy() { - return new RavagingBlazeEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (permanent != null) { - int xValue = source.getManaCostsToPay().getX(); - if (xValue > 0) { - permanent.damage(xValue, source.getSourceId(), game, false, true); - if (SpellMasteryCondition.getInstance().apply(game, source)) { - Player targetController = game.getPlayer(permanent.getControllerId()); - if (targetController != null) { - targetController.damage(xValue, source.getSourceId(), game, false, true); - } - } - } - return true; - } - return false; - } - -} diff --git a/Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java b/Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java new file mode 100644 index 00000000000..d8d7216746f --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java @@ -0,0 +1,103 @@ +/* + * 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.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author LoneFox + */ +public class DamageTargetControllerEffect extends OneShotEffect { + + protected DynamicValue amount; + protected boolean preventable; + + public DamageTargetControllerEffect(int amount) { + this(new StaticValue(amount), true); + } + + public DamageTargetControllerEffect(int amount, boolean preventable) { + this(new StaticValue(amount), preventable); + } + + public DamageTargetControllerEffect(DynamicValue amount) { + this(amount, true); + } + + public DamageTargetControllerEffect(DynamicValue amount, boolean preventable) { + super(Outcome.Damage); + this.amount = amount; + this.preventable = preventable; + } + + public DamageTargetControllerEffect(final DamageTargetControllerEffect effect) { + super(effect); + amount = effect.amount.copy(); + preventable = effect.preventable; + } + + @Override + public DamageTargetControllerEffect copy() { + return new DamageTargetControllerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if(permanent != null) { + Player targetController = game.getPlayer(permanent.getControllerId()); + if(targetController != null) { + targetController.damage(amount.calculate(game, source, this), source.getSourceId(), game, false, preventable); + } + return true; + } + return false; + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + String text = "{this} deals " + amount.getMessage() + " damage to target " + + mode.getTargets().get(0).getTargetName() + "'s controller"; + if(!preventable) { + text += ". The damage can't be prevented"; + } + return text; + } +} From 16116ea0dad8d097e7aae1e2166b2c0046b533c7 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sat, 25 Jul 2015 21:10:54 +0300 Subject: [PATCH 182/375] Add DiscardOntoBattlefieldEffect and use it for existing cards. Implement card: Dodecapod --- .../src/mage/sets/apocalypse/Dodecapod.java | 97 +++++++++++++++++++ .../mage/sets/magic2011/ObstinateBaloth.java | 82 +++------------- .../sets/returntoravnica/LoxodonSmiter.java | 67 +------------ .../mage/sets/shadowmoor/WiltLeafLiege.java | 74 +------------- .../src/mage/sets/timeshifted/Dodecapod.java | 54 +++++++++++ .../common/DiscardOntoBattlefieldEffect.java | 96 ++++++++++++++++++ 6 files changed, 265 insertions(+), 205 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/Dodecapod.java create mode 100644 Mage.Sets/src/mage/sets/timeshifted/Dodecapod.java create mode 100644 Mage/src/mage/abilities/effects/common/DiscardOntoBattlefieldEffect.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/Dodecapod.java b/Mage.Sets/src/mage/sets/apocalypse/Dodecapod.java new file mode 100644 index 00000000000..28c78bf997a --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/Dodecapod.java @@ -0,0 +1,97 @@ +/* + * 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.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.DiscardOntoBattlefieldEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +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; + +/** + * + * @author LoneFox + */ +public class Dodecapod extends CardImpl { + + public Dodecapod(UUID ownerId) { + super(ownerId, 134, "Dodecapod", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + this.expansionSetCode = "APC"; + this.subtype.add("Golem"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // If a spell or ability an opponent controls causes you to discard Dodecapod, put it onto the battlefield with two +1/+1 counters on it instead of putting it into your graveyard. + this.addAbility(new SimpleStaticAbility(Zone.HAND, new DodecapodEffect())); + + } + + public Dodecapod(final Dodecapod card) { + super(card); + } + + @Override + public Dodecapod copy() { + return new Dodecapod(this); + } +} + + +class DodecapodEffect extends DiscardOntoBattlefieldEffect { + + public DodecapodEffect() { + super(); + staticText = "If a spell or ability an opponent controls causes you to discard {this}, put it onto the battlefield with two +1/+1 counters on it instead of putting it into your graveyard"; + } + + public DodecapodEffect(final DodecapodEffect effect) { + super(effect); + } + + @Override + public DodecapodEffect copy() { + return new DodecapodEffect(this); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + if(super.replaceEvent(event, source, game)) { + new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)).apply(game, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2011/ObstinateBaloth.java b/Mage.Sets/src/mage/sets/magic2011/ObstinateBaloth.java index f4675b3bc48..b4ec4152be9 100644 --- a/Mage.Sets/src/mage/sets/magic2011/ObstinateBaloth.java +++ b/Mage.Sets/src/mage/sets/magic2011/ObstinateBaloth.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -29,25 +29,15 @@ package mage.sets.magic2011; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.DiscardOntoBattlefieldEffect; import mage.abilities.effects.common.GainLifeEffect; -import mage.cards.Card; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.events.ZoneChangeEvent; -import mage.game.stack.StackObject; -import mage.players.Player; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; /** * @@ -65,9 +55,9 @@ public class ObstinateBaloth extends CardImpl { // When Obstinate Baloth enters the battlefield, you gain 4 life. this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4), false)); - + // If a spell or ability an opponent controls causes you to discard Obstinate Baloth, put it onto the battlefield instead of putting it into your graveyard. - this.addAbility(new SimpleStaticAbility(Zone.HAND, new ObstinateBalothEffect())); + this.addAbility(new SimpleStaticAbility(Zone.HAND, new DiscardOntoBattlefieldEffect())); } public ObstinateBaloth(final ObstinateBaloth card) { @@ -81,53 +71,3 @@ public class ObstinateBaloth extends CardImpl { } -class ObstinateBalothEffect extends ReplacementEffectImpl { - - public ObstinateBalothEffect() { - super(Duration.EndOfGame, Outcome.PutCardInPlay); - staticText = "If a spell or ability an opponent controls causes you to discard {this}, put it onto the battlefield instead of putting it into your graveyard"; - } - - public ObstinateBalothEffect(final ObstinateBalothEffect effect) { - super(effect); - } - - @Override - public ObstinateBalothEffect copy() { - return new ObstinateBalothEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == EventType.ZONE_CHANGE; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (event.getTargetId().equals(source.getSourceId())) { - ZoneChangeEvent zcEvent = (ZoneChangeEvent) event; - if (zcEvent.getFromZone() == Zone.HAND && zcEvent.getToZone() == Zone.GRAVEYARD) { - StackObject spell = game.getStack().getStackObject(event.getSourceId()); - if (spell != null && game.getOpponents(source.getControllerId()).contains(spell.getControllerId())) { - return true; - } - } - } - return false; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Card card = game.getCard(source.getSourceId()); - if (card != null) { - Player owner = game.getPlayer(card.getOwnerId()); - if (owner != null) { - if (owner.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId())) { - return true; - } - } - } - return false; - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/returntoravnica/LoxodonSmiter.java b/Mage.Sets/src/mage/sets/returntoravnica/LoxodonSmiter.java index 3ec4636e9c7..e127fad6560 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/LoxodonSmiter.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/LoxodonSmiter.java @@ -32,19 +32,12 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.CantBeCounteredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ReplacementEffectImpl; -import mage.cards.Card; +import mage.abilities.effects.common.DiscardOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.stack.StackObject; -import mage.players.Player; /** * @@ -67,7 +60,7 @@ public class LoxodonSmiter extends CardImpl { this.addAbility(new CantBeCounteredAbility()); // If a spell or ability an opponent controls causes you to discard Loxodon Smiter, put it onto the battlefield instead of putting it into your graveyard. - this.addAbility(new SimpleStaticAbility(Zone.HAND, new LoxodonSmiterEffect())); + this.addAbility(new SimpleStaticAbility(Zone.HAND, new DiscardOntoBattlefieldEffect())); } public LoxodonSmiter(final LoxodonSmiter card) { @@ -79,59 +72,3 @@ public class LoxodonSmiter extends CardImpl { return new LoxodonSmiter(this); } } - -class LoxodonSmiterEffect extends ReplacementEffectImpl { - - public LoxodonSmiterEffect() { - super(Duration.EndOfGame, Outcome.PutCardInPlay); - staticText = "If a spell or ability an opponent controls causes you to discard {this}, put it onto the battlefield instead of putting it into your graveyard"; - } - - public LoxodonSmiterEffect(final LoxodonSmiterEffect effect) { - super(effect); - } - - @Override - public LoxodonSmiterEffect copy() { - return new LoxodonSmiterEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (event.getTargetId().equals(source.getSourceId())) { - ZoneChangeEvent zcEvent = (ZoneChangeEvent) event; - if (zcEvent.getFromZone() == Zone.HAND && zcEvent.getToZone() == Zone.GRAVEYARD) { - StackObject spell = game.getStack().getStackObject(event.getSourceId()); - if (spell != null && game.getOpponents(source.getControllerId()).contains(spell.getControllerId())) { - return true; - } - } - } - return false; - } - - @Override - public boolean apply(Game game, Ability source) { - Card card = game.getCard(source.getSourceId()); - if (card != null) { - Player player = game.getPlayer(card.getOwnerId()); - if (player != null) { - if (card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId())) { - return true; - } - } - } - return false; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - return apply(game, source); - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/shadowmoor/WiltLeafLiege.java b/Mage.Sets/src/mage/sets/shadowmoor/WiltLeafLiege.java index 373f7aaa411..a8c72991aab 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/WiltLeafLiege.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/WiltLeafLiege.java @@ -30,27 +30,18 @@ package mage.sets.shadowmoor; import java.util.UUID; import mage.MageInt; import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.DiscardOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.stack.StackObject; -import mage.players.Player; /** * @@ -66,7 +57,7 @@ public class WiltLeafLiege extends CardImpl { filterWhite.add(new ColorPredicate(ObjectColor.WHITE)); filterWhite.add(new ControllerPredicate(TargetController.YOU)); } - + public WiltLeafLiege(UUID ownerId) { super(ownerId, 245, "Wilt-Leaf Liege", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G/W}{G/W}{G/W}"); this.expansionSetCode = "SHM"; @@ -77,11 +68,11 @@ public class WiltLeafLiege extends CardImpl { this.toughness = new MageInt(4); // Other green creatures you control get +1/+1. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(new StaticValue(1), new StaticValue(1), Duration.WhileOnBattlefield, filterGreen, true))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filterGreen, true))); // Other white creatures you control get +1/+1. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(new StaticValue(1), new StaticValue(1), Duration.WhileOnBattlefield, filterWhite, true))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filterWhite, true))); // If a spell or ability an opponent controls causes you to discard Wilt-Leaf Liege, put it onto the battlefield instead of putting it into your graveyard. - this.addAbility(new SimpleStaticAbility(Zone.HAND, new WiltLeafLiegeEffect())); + this.addAbility(new SimpleStaticAbility(Zone.HAND, new DiscardOntoBattlefieldEffect())); } public WiltLeafLiege(final WiltLeafLiege card) { @@ -93,58 +84,3 @@ public class WiltLeafLiege extends CardImpl { return new WiltLeafLiege(this); } } - -class WiltLeafLiegeEffect extends ReplacementEffectImpl { - - public WiltLeafLiegeEffect() { - super(Duration.EndOfGame, Outcome.PutCardInPlay); - staticText = "If a spell or ability an opponent controls causes you to discard {this}, put it onto the battlefield instead of putting it into your graveyard"; - } - - public WiltLeafLiegeEffect(final WiltLeafLiegeEffect effect) { - super(effect); - } - - @Override - public WiltLeafLiegeEffect copy() { - return new WiltLeafLiegeEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType().equals(GameEvent.EventType.ZONE_CHANGE); - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (event.getTargetId().equals(source.getSourceId())) { - ZoneChangeEvent zcEvent = (ZoneChangeEvent) event; - if (zcEvent.getFromZone() == Zone.HAND && zcEvent.getToZone() == Zone.GRAVEYARD) { - StackObject spell = game.getStack().getStackObject(event.getSourceId()); - if (spell != null && game.getOpponents(source.getControllerId()).contains(spell.getControllerId())) { - return true; - } - } - } - return false; - } - - @Override - public boolean apply(Game game, Ability source) { - Card card = game.getCard(source.getSourceId()); - if (card != null) { - Player player = game.getPlayer(card.getOwnerId()); - if (player != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId()); - return true; - } - } - return false; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - return apply(game, source); - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/timeshifted/Dodecapod.java b/Mage.Sets/src/mage/sets/timeshifted/Dodecapod.java new file mode 100644 index 00000000000..73f7ddd1063 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/Dodecapod.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.timeshifted; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class Dodecapod extends mage.sets.apocalypse.Dodecapod { + + public Dodecapod(UUID ownerId) { + super(ownerId); + this.cardNumber = 108; + this.expansionSetCode = "TSB"; + this.rarity = Rarity.SPECIAL; + } + + public Dodecapod(final Dodecapod card) { + super(card); + } + + @Override + public Dodecapod copy() { + return new Dodecapod(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/DiscardOntoBattlefieldEffect.java b/Mage/src/mage/abilities/effects/common/DiscardOntoBattlefieldEffect.java new file mode 100644 index 00000000000..137b33c5145 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/DiscardOntoBattlefieldEffect.java @@ -0,0 +1,96 @@ +/* + * 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.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.Card; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.stack.StackObject; +import mage.players.Player; + +/** + * + * @author LoneFox + */ +public class DiscardOntoBattlefieldEffect extends ReplacementEffectImpl { + + public DiscardOntoBattlefieldEffect() { + super(Duration.EndOfGame, Outcome.PutCardInPlay); + staticText = "If a spell or ability an opponent controls causes you to discard {this}, put it onto the battlefield instead of putting it into your graveyard"; + } + + public DiscardOntoBattlefieldEffect(final DiscardOntoBattlefieldEffect effect) { + super(effect); + } + + @Override + public DiscardOntoBattlefieldEffect copy() { + return new DiscardOntoBattlefieldEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.ZONE_CHANGE; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getTargetId().equals(source.getSourceId())) { + ZoneChangeEvent zcEvent = (ZoneChangeEvent) event; + if (zcEvent.getFromZone() == Zone.HAND && zcEvent.getToZone() == Zone.GRAVEYARD) { + StackObject spell = game.getStack().getStackObject(event.getSourceId()); + if (spell != null && game.getOpponents(source.getControllerId()).contains(spell.getControllerId())) { + return true; + } + } + } + return false; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Card card = game.getCard(source.getSourceId()); + if (card != null) { + Player owner = game.getPlayer(card.getOwnerId()); + if (owner != null) { + if (owner.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId())) { + return true; + } + } + } + return false; + } + +} From d5963642b1d4dc9b41f7ff7294e9037fe3fcea1b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 25 Jul 2015 20:25:19 +0200 Subject: [PATCH 183/375] Added getCounters(Game game) for PermanentImpl. --- Mage/src/mage/game/permanent/PermanentImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 3d7941c00b5..1085eeecc8a 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -325,6 +325,11 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { return counters; } + @Override + public Counters getCounters(Game game) { + return counters; + } + @Override public void addCounters(String name, int amount, Game game) { addCounters(name, amount, game, null); From 72b3c1e2b34d5d517f96c7877f8a9caba430568a Mon Sep 17 00:00:00 2001 From: klayhamn Date: Sat, 25 Jul 2015 23:01:07 +0300 Subject: [PATCH 184/375] Adding the card "Wall of Shards" from the Coldsnap set --- .../src/mage/sets/coldsnap/WallOfShards.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/coldsnap/WallOfShards.java diff --git a/Mage.Sets/src/mage/sets/coldsnap/WallOfShards.java b/Mage.Sets/src/mage/sets/coldsnap/WallOfShards.java new file mode 100644 index 00000000000..6ab64f95d8b --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/WallOfShards.java @@ -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.coldsnap; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.costs.common.GainLifeOpponentCost; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.CumulativeUpkeepAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author klayhamn + */ +public class WallOfShards extends CardImpl { + + public WallOfShards(UUID ownerId) { + super(ownerId, 23, "Wall of Shards", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "CSP"; + this.supertype.add("Snow"); + this.subtype.add("Wall"); + this.power = new MageInt(1); + this.toughness = new MageInt(8); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Cumulative upkeep-An opponent gains 1 life. + this.addAbility(new CumulativeUpkeepAbility(new GainLifeOpponentCost(1) )); + } + + public WallOfShards(final WallOfShards card) { + super(card); + } + + @Override + public WallOfShards copy() { + return new WallOfShards(this); + } +} From c1dc053e9f958a5fad661f011c2691ee8000d7d6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 26 Jul 2015 00:01:30 +0200 Subject: [PATCH 185/375] * Artificer's Epiphany - Fixed tooltip text (fixes #1148). --- Mage.Sets/src/mage/sets/magicorigins/ArtificersEpiphany.java | 4 ++-- .../effects/common/discard/DiscardControllerEffect.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/ArtificersEpiphany.java b/Mage.Sets/src/mage/sets/magicorigins/ArtificersEpiphany.java index dc5b68d353f..cab1d89f252 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/ArtificersEpiphany.java +++ b/Mage.Sets/src/mage/sets/magicorigins/ArtificersEpiphany.java @@ -44,8 +44,8 @@ import mage.filter.predicate.mageobject.CardTypePredicate; * @author fireshoes */ public class ArtificersEpiphany extends CardImpl { - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("artifacts"); + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control no artifacts"); static { filter.add(new CardTypePredicate(CardType.ARTIFACT)); diff --git a/Mage/src/mage/abilities/effects/common/discard/DiscardControllerEffect.java b/Mage/src/mage/abilities/effects/common/discard/DiscardControllerEffect.java index da0da5f3cba..fa9d314a213 100644 --- a/Mage/src/mage/abilities/effects/common/discard/DiscardControllerEffect.java +++ b/Mage/src/mage/abilities/effects/common/discard/DiscardControllerEffect.java @@ -27,12 +27,12 @@ */ package mage.abilities.effects.common.discard; -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.cards.Card; +import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.util.CardUtil; @@ -98,7 +98,7 @@ public class DiscardControllerEffect extends OneShotEffect { } private void setText() { - StringBuilder sb = new StringBuilder("Discard "); + StringBuilder sb = new StringBuilder("discard "); if (amount.toString().equals("1")) { sb.append("a"); } else { From 9dd6e616cdb40254bb6b7470be6e5d4c7d737303 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 26 Jul 2015 00:38:56 +0200 Subject: [PATCH 186/375] * Fixed that commander mana replacement effect did wrong mana replacements if additional mana was produced from abilities of opponents (fixes #1146). --- .../duel/CommanderManaReplacmentTest.java | 82 +++++++++++++ Mage/src/mage/game/events/GameEvent.java | 15 ++- Mage/src/mage/players/ManaPool.java | 108 +++++++++--------- 3 files changed, 149 insertions(+), 56 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/commander/duel/CommanderManaReplacmentTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/commander/duel/CommanderManaReplacmentTest.java b/Mage.Tests/src/test/java/org/mage/test/commander/duel/CommanderManaReplacmentTest.java new file mode 100644 index 00000000000..84ee71449bd --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/commander/duel/CommanderManaReplacmentTest.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.commander.duel; + +import java.io.FileNotFoundException; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.GameException; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestCommanderDuelBase; + +/** + * + * @author LevelX2 + */ +public class CommanderManaReplacmentTest extends CardTestCommanderDuelBase { + + @Override + protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException { + setDecknamePlayerA("CommanderDuel_UW.dck"); // Commander = Daxos of Meletis + return super.createNewGameAndPlayers(); + } + + /** + * This issue appears to arise in both Commander Two Player Duel and + * Commander Free For All. Whenever a player (call her player 1) controls a + * permanent with a mana doubling continuous effect (e.g. Mana Flare) and + * another player (call her player 2) taps an affected permanent for mana + * that is outside of player 1's color identity, player 2 gets an additional + * colorless mana rather than the correct color of mana. I suspect the + * reason for this is that Xmage is treating Mana Flare as producing mana of + * the appropriate color and adding it to another player's mana pool, which + * is both incorrect in the game rules and would cause this problem. + * + * For example, I am playing a mono red deck and control a Mana Flare. You + * are playing a mono green deck and you tap a Forest for mana. You should + * add GG to your mana pool, but instead, Xmage shows you adding 1G to your + * mana pool. + */ + @Test + public void castCommanderWithFlash() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 1); + addCard(Zone.HAND, playerA, "Vedalken Mastermind", 1); // {U}{U} + + addCard(Zone.BATTLEFIELD, playerB, "Mana Flare"); + + activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {U}"); // should add {U}{U} + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Vedalken Mastermind"); + setStopAt(1, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Vedalken Mastermind", 1); + + } + +} diff --git a/Mage/src/mage/game/events/GameEvent.java b/Mage/src/mage/game/events/GameEvent.java index 433ad158c39..fcabb52c61a 100644 --- a/Mage/src/mage/game/events/GameEvent.java +++ b/Mage/src/mage/game/events/GameEvent.java @@ -119,7 +119,20 @@ public class GameEvent implements Serializable { */ SPELL_CAST, ACTIVATE_ABILITY, ACTIVATED_ABILITY, - ADD_MANA, MANA_ADDED, + /* ADD_MANA + targetId id of the ability that added the mana + sourceId sourceId of the ability that added the mana + playerId player the mana is added to the mana pool for + mana the mana added + */ + ADD_MANA, + /* MANA_ADDED + targetId id of the ability that added the mana + sourceId sourceId of the ability that added the mana + playerId player the mana is added to the mana pool for + mana the mana added + */ + MANA_ADDED, /* MANA_PAYED targetId id if the ability the mana was paid for (not the sourceId) sourceId sourceId of the mana source diff --git a/Mage/src/mage/players/ManaPool.java b/Mage/src/mage/players/ManaPool.java index 200faae6b79..f4745ac20ca 100644 --- a/Mage/src/mage/players/ManaPool.java +++ b/Mage/src/mage/players/ManaPool.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.players; import java.io.Serializable; @@ -63,7 +62,7 @@ public class ManaPool implements Serializable { private boolean autoPayment; // auto payment from mana pool: true - mode is active private boolean autoPaymentRestricted; // auto payment from mana pool: true - if auto Payment is on, it will only pay if one kind of mana is in the pool private ManaType unlockedManaType; // type of mana that was selected to pay manually - + private final Set doNotEmptyManaTypes = new HashSet<>(); public ManaPool(UUID playerId) { @@ -75,7 +74,7 @@ public class ManaPool implements Serializable { public ManaPool(final ManaPool pool) { this.playerId = pool.playerId; - for (ManaPoolItem item: pool.manaItems) { + for (ManaPoolItem item : pool.manaItems) { manaItems.add(item.copy()); } this.autoPayment = pool.autoPayment; @@ -105,24 +104,24 @@ public class ManaPool implements Serializable { } /** - * + * * @param manaType the mana type that should be paid * @param ability * @param filter * @param game - * @return + * @return */ public boolean pay(ManaType manaType, Ability ability, Filter filter, Game game) { if (!autoPayment && !manaType.equals(unlockedManaType)) { // if manual payment and the needed mana type was not unlocked, nothing will be paid return false; } - if (autoPayment && autoPaymentRestricted && !wasManaAddedBeyondStock() && !manaType.equals(unlockedManaType)) { + if (autoPayment && autoPaymentRestricted && !wasManaAddedBeyondStock() && !manaType.equals(unlockedManaType)) { // if automatic restricted payment and there is laready mana in the pool // and the needed mana type was not unlocked, nothing will be paid return false; } - + if (getConditional(manaType, ability, filter, game) > 0) { removeConditional(manaType, ability, game); lockManaType(); // pay only one mana if mana payment is set to manually @@ -134,7 +133,7 @@ public class ManaPool implements Serializable { if (!filter.match(sourceObject, game)) { continue; } - } + } if (!manaType.equals(unlockedManaType) && autoPayment && autoPaymentRestricted && mana.count() == mana.getStock()) { // no mana added beyond the stock so don't auto pay this continue; @@ -202,7 +201,7 @@ public class ManaPool implements Serializable { public void clearEmptyManaPoolRules() { doNotEmptyManaTypes.clear(); } - + public void addDoNotEmptyManaType(ManaType manaType) { doNotEmptyManaTypes.add(manaType); } @@ -217,7 +216,7 @@ public class ManaPool implements Serializable { if (!doNotEmptyManaTypes.contains(manaType)) { if (item.get(manaType) > 0) { if (!item.getDuration().equals(Duration.EndOfTurn) || game.getPhase().getType().equals(TurnPhase.END)) { - if (game.replaceEvent(new GameEvent(GameEvent.EventType.EMPTY_MANA_POOL, playerId, null, playerId))) { + if (game.replaceEvent(new GameEvent(GameEvent.EventType.EMPTY_MANA_POOL, playerId, null, playerId))) { int amount = item.get(manaType); item.clear(manaType); item.add(ManaType.COLORLESS, amount); @@ -230,7 +229,7 @@ public class ManaPool implements Serializable { if (conditionalItem != null) { if (conditionalItem.get(manaType) > 0) { if (!item.getDuration().equals(Duration.EndOfTurn) || game.getPhase().getType().equals(TurnPhase.END)) { - if (game.replaceEvent(new GameEvent(GameEvent.EventType.EMPTY_MANA_POOL, playerId, null, playerId))) { + if (game.replaceEvent(new GameEvent(GameEvent.EventType.EMPTY_MANA_POOL, playerId, null, playerId))) { int amount = conditionalItem.get(manaType); conditionalItem.clear(manaType); conditionalItem.add(ManaType.COLORLESS, amount); @@ -246,8 +245,8 @@ public class ManaPool implements Serializable { if (item.count() == 0) { it.remove(); } - } - return total; + } + return total; } private int payX(Ability ability, Game game) { @@ -261,8 +260,7 @@ public class ManaPool implements Serializable { total += item.count(); it.remove(); } - } - else { + } else { total += item.count(); it.remove(); } @@ -272,10 +270,11 @@ public class ManaPool implements Serializable { /** * remove all mana from pool that applies and that matches filter + * * @param ability * @param game * @param filter - * @return + * @return */ public int payX(Ability ability, Game game, FilterMana filter) { if (filter == null) { @@ -297,8 +296,7 @@ public class ManaPool implements Serializable { } } } - } - else { + } else { if (filter.isBlack()) { total += item.getBlack(); item.removeBlack(); @@ -333,7 +331,7 @@ public class ManaPool implements Serializable { public Mana getMana() { Mana m = new Mana(); - for (ManaPoolItem item: manaItems) { + for (ManaPoolItem item : manaItems) { m.add(item.getMana()); } return m; @@ -375,12 +373,12 @@ public class ManaPool implements Serializable { public void addMana(Mana manaToAdd, Game game, Ability source) { addMana(manaToAdd, game, source, false); } - + public void addMana(Mana manaToAdd, Game game, Ability source, boolean emptyOnTurnsEnd) { Mana mana = manaToAdd.copy(); - if (!game.replaceEvent(new ManaEvent(EventType.ADD_MANA, source.getId(), source.getSourceId(), source.getControllerId(), mana))) { + if (!game.replaceEvent(new ManaEvent(EventType.ADD_MANA, source.getId(), source.getSourceId(), playerId, mana))) { if (mana instanceof ConditionalMana) { - ManaPoolItem item = new ManaPoolItem((ConditionalMana)mana, source.getSourceId(), source.getOriginalId()); + ManaPoolItem item = new ManaPoolItem((ConditionalMana) mana, source.getSourceId(), source.getOriginalId()); if (emptyOnTurnsEnd) { item.setDuration(Duration.EndOfTurn); } @@ -389,18 +387,18 @@ public class ManaPool implements Serializable { ManaPoolItem item = new ManaPoolItem(mana.getRed(), mana.getGreen(), mana.getBlue(), mana.getWhite(), mana.getBlack(), mana.getColorless(), source.getSourceId(), source.getOriginalId(), mana.getFlag()); if (emptyOnTurnsEnd) { item.setDuration(Duration.EndOfTurn); - } + } this.manaItems.add(item); } - GameEvent event = GameEvent.getEvent(GameEvent.EventType.MANA_ADDED, source.getId(), source.getSourceId(), source.getControllerId()); - event.setData(mana.toString()); - game.fireEvent(event); + ManaEvent manaEvent = new ManaEvent(EventType.MANA_ADDED, source.getId(), source.getSourceId(), playerId, mana); + manaEvent.setData(mana.toString()); + game.fireEvent(manaEvent); } } public List getConditionalMana() { List conditionalMana = new ArrayList<>(); - for (ManaPoolItem item: manaItems) { + for (ManaPoolItem item : manaItems) { if (item.isConditional()) { conditionalMana.add(item.getConditionalMana()); } @@ -410,7 +408,7 @@ public class ManaPool implements Serializable { public int count() { int x = 0; - for (ManaPoolItem item: manaItems) { + for (ManaPoolItem item : manaItems) { x += item.count(); } return x; @@ -465,7 +463,7 @@ public class ManaPool implements Serializable { mana.setStock(mana.count()); } } - + private boolean wasManaAddedBeyondStock() { for (ManaPoolItem mana : manaItems) { if (mana.getStock() < mana.count()) { From 25db567c8988c8fddc8223216ad8776075145578 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 26 Jul 2015 08:59:43 +0200 Subject: [PATCH 187/375] * Sekki, Seasons' Guide - Fixed that it wrongly returned to hand instead to battlefield. --- .../src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java index 649c2a88c63..0d45c155313 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SekkiSeasonsGuide.java @@ -36,7 +36,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.PreventionEffectImpl; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -82,7 +82,7 @@ public class SekkiSeasonsGuide extends CardImpl { // Sacrifice eight Spirits: Return Sekki from your graveyard to the battlefield. this.addAbility(new SimpleActivatedAbility( Zone.GRAVEYARD, - new ReturnSourceFromGraveyardToHandEffect(), + new ReturnSourceFromGraveyardToBattlefieldEffect(), new SacrificeTargetCost(new TargetControlledPermanent(8, 8, filter, true)))); } From 768fd17d931db5483adb2d1deea11deb162a0782 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 26 Jul 2015 09:19:46 +0200 Subject: [PATCH 188/375] * Some spelling changes. --- .../java/mage/client/game/PlayAreaPanel.java | 2 +- .../client/game/PlayAreaPanelOptions.java | 63 ++++++++++--------- Mage/src/mage/game/GameImpl.java | 2 +- Mage/src/mage/game/GameOptions.java | 12 ++-- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java index 101df9709ad..a3d2f246c4d 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java @@ -333,7 +333,7 @@ public class PlayAreaPanel extends javax.swing.JPanel { } }; - JMenu rollbackMainItem = new JMenu("Roll back"); + JMenu rollbackMainItem = new JMenu("Rollback"); rollbackMainItem.setMnemonic(KeyEvent.VK_R); rollbackMainItem.setToolTipText("The game will be rolled back to the start of the requested turn if all players agree."); popupMenu.add(rollbackMainItem); diff --git a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanelOptions.java b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanelOptions.java index 377b7591c4b..fb6cfe194aa 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanelOptions.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanelOptions.java @@ -1,30 +1,30 @@ /* -* 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. -*/ + * 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.client.game; /** @@ -39,20 +39,21 @@ public class PlayAreaPanelOptions { this.playerItself = playerItself; this.rollbackTurnsAllowed = rollbackTurnsAllowed; } - + /** - * true if the client is a player / false if the client is a watcher + * true if the client is a player / false if the client is a watcher */ public boolean isPlayer = false; /** - * true if the player is the client player itself, false if the player is another player playing with the clinet player + * true if the player is the client player itself, false if the player is + * another player playing with the clinet player */ public boolean playerItself = false; /** - * true if the player can roll back turns if all players agree + * true if the player can rollback turns if all players agree */ public boolean rollbackTurnsAllowed = false; - + } diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index b14cd2908a0..858b5b8fff0 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -174,7 +174,7 @@ public abstract class GameImpl implements Game, Serializable { protected GameState state; private transient Stack savedStates = new Stack<>(); protected transient GameStates gameStates = new GameStates(); - // game states to allow player roll back + // game states to allow player rollback protected transient Map gameStatesRollBack = new HashMap<>(); protected boolean executingRollback; diff --git a/Mage/src/mage/game/GameOptions.java b/Mage/src/mage/game/GameOptions.java index 7767880a589..fc3c8a7424f 100644 --- a/Mage/src/mage/game/GameOptions.java +++ b/Mage/src/mage/game/GameOptions.java @@ -4,8 +4,8 @@ import java.io.Serializable; import mage.constants.PhaseStep; /** - * Game options for Mage game. - * Mainly used in tests to configure {@link GameImpl} with specific params. + * Game options for Mage game. Mainly used in tests to configure + * {@link GameImpl} with specific params. * * @author ayratn */ @@ -23,8 +23,8 @@ public class GameOptions implements Serializable { public boolean testMode = false; /** - * Defines the turn number game should stop on. - * By default, is null meaning that game shouldn't stop on any specific turn. + * Defines the turn number game should stop on. By default, is null meaning + * that game shouldn't stop on any specific turn. */ public Integer stopOnTurn = null; @@ -37,9 +37,9 @@ public class GameOptions implements Serializable { * If true, library won't be shuffled at the beginning of the game */ public boolean skipInitShuffling = false; - + /** - * If true, players can roll back turn if all players agree + * If true, players can rollback turn if all players agree */ public boolean rollbackTurnsAllowed = true; } From 5694f8aa8c88485be8102fecc5a2bb2054f76388 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 26 Jul 2015 09:19:57 +0200 Subject: [PATCH 189/375] * Added a test. --- .../AI/basic/PreventRepeatedActionsTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java index 56b924d8e9b..7237a3fc9b8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java @@ -66,4 +66,21 @@ public class PreventRepeatedActionsTest extends CardTestPlayerBaseAI { Assert.assertEquals("AI should only used Equipment once", 2, tappedLands); } + /** + * If the AI on a local server gets control of a Basalt Monolith it will + * infinite loop taping for three mana and then using the mana to untap lol. + * Seeing the computer durdle troll is quite the hillarious thing + */ + @Test + public void testBasaltMonolith() { + // Basalt Monolith doesn't untap during your untap step. + // {T}: Add {3} to your mana pool. + // {3}: Untap Basalt Monolith. + addCard(Zone.BATTLEFIELD, playerA, "Basalt Monolith", 1); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertTapped("Basalt Monolith", false); + } } From b029de3ec9dbd2af034aa5aaf8a8393f27e47644 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 26 Jul 2015 10:17:04 +0200 Subject: [PATCH 190/375] * Added id and colored font to shown related object names of stack abilities. --- Mage.Common/src/mage/view/CardsView.java | 5 +-- .../src/mage/view/StackAbilityView.java | 3 +- Mage/src/mage/util/GameLog.java | 31 +++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Mage.Common/src/mage/view/CardsView.java b/Mage.Common/src/mage/view/CardsView.java index a4400c5faad..0107ee0ee03 100644 --- a/Mage.Common/src/mage/view/CardsView.java +++ b/Mage.Common/src/mage/view/CardsView.java @@ -49,6 +49,7 @@ import mage.game.GameState; import mage.game.command.Emblem; import mage.game.permanent.Permanent; import mage.target.targetpointer.TargetPointer; +import mage.util.GameLog; /** * @@ -145,11 +146,11 @@ public class CardsView extends LinkedHashMap { for (UUID uuid : abilityTargets) { MageObject mageObject = game.getObject(uuid); if (mageObject != null) { - names.add(mageObject.getName()); + names.add(GameLog.getColoredObjectIdNameForTooltip(mageObject)); } } if (!names.isEmpty()) { - abilityView.getRules().add("Related to: " + names.toString() + ""); + abilityView.getRules().add("Related objects: " + names.toString() + ""); } } } diff --git a/Mage.Common/src/mage/view/StackAbilityView.java b/Mage.Common/src/mage/view/StackAbilityView.java index a55b78c9c8f..6fb4d3c4863 100644 --- a/Mage.Common/src/mage/view/StackAbilityView.java +++ b/Mage.Common/src/mage/view/StackAbilityView.java @@ -41,6 +41,7 @@ import mage.game.Game; import mage.game.stack.StackAbility; import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.TargetPointer; +import mage.util.GameLog; /** * @@ -118,7 +119,7 @@ public class StackAbilityView extends CardView { if ((mageObject instanceof Card) && ((Card) mageObject).isFaceDown(game)) { continue; } - names.add(mageObject.getName()); + names.add(GameLog.getColoredObjectIdNameForTooltip(mageObject)); } } diff --git a/Mage/src/mage/util/GameLog.java b/Mage/src/mage/util/GameLog.java index 544b0a2d359..b6a59464e67 100644 --- a/Mage/src/mage/util/GameLog.java +++ b/Mage/src/mage/util/GameLog.java @@ -39,6 +39,7 @@ public class GameLog { static final String LOG_COLOR_PLAYER = "#20B2AA"; // LightSeaGreen static final String LOG_COLOR_PLAYER_REQUEST = "#D2691E"; // Chocolate static final String LOG_COLOR_PLAYER_CONFIRM = "#D2691E"; // Chocolate + // colors for more dark background static final String LOG_COLOR_GREEN = "#90EE90"; // LightGreen static final String LOG_COLOR_RED = "#FF6347"; // Tomato static final String LOG_COLOR_BLUE = "#87CEFA"; // LightSkyBlue @@ -46,6 +47,14 @@ public class GameLog { static final String LOG_COLOR_WHITE = "#F0E68C"; // Khaki static final String LOG_COLOR_MULTI = "#DAA520"; // GoldenRod static final String LOG_COLOR_COLORLESS = "#B0C4DE"; // LightSteelBlue + // colors for tooltip (light background) + static final String LOG_TT_COLOR_RED = "Red"; // Tomato + static final String LOG_TT_COLOR_GREEN = "Green"; // LightGreen + static final String LOG_TT_COLOR_BLUE = "Blue"; + static final String LOG_TT_COLOR_BLACK = "Black"; + static final String LOG_TT_COLOR_WHITE = "#CCDB00"; + static final String LOG_TT_COLOR_MULTI = "#FFAC40"; + static final String LOG_TT_COLOR_COLORLESS = "#94A4BA"; static final String LOG_COLOR_NEUTRAL = "#F0F8FF"; // AliceBlue public static String replaceNameByColoredName(MageObject mageObject, String text) { @@ -60,6 +69,10 @@ public class GameLog { return "" + mageObject.getName() + " [" + mageObject.getId().toString().substring(0, 3) + "]"; } + public static String getColoredObjectIdNameForTooltip(MageObject mageObject) { + return "" + mageObject.getName() + " [" + mageObject.getId().toString().substring(0, 3) + "]"; + } + public static String getNeutralColoredText(String text) { return "" + text + ""; } @@ -97,4 +110,22 @@ public class GameLog { return LOG_COLOR_BLACK; } } + + private static String getTooltipColorName(ObjectColor objectColor) { + if (objectColor.isMulticolored()) { + return LOG_TT_COLOR_MULTI; + } else if (objectColor.isColorless()) { + return LOG_TT_COLOR_COLORLESS; + } else if (objectColor.isRed()) { + return LOG_TT_COLOR_RED; + } else if (objectColor.isGreen()) { + return LOG_TT_COLOR_GREEN; + } else if (objectColor.isBlue()) { + return LOG_TT_COLOR_BLUE; + } else if (objectColor.isWhite()) { + return LOG_TT_COLOR_WHITE; + } else { + return LOG_TT_COLOR_BLACK; + } + } } From 77e53d6bbd01f3558f9f8ed563b56acd832f726c Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 26 Jul 2015 11:49:31 +0300 Subject: [PATCH 191/375] Add PlayWithHandRevealedEffect and use it for existing cards. Implement cards: Revelation, Seer's Vision, and Wandering Eye --- .../src/mage/sets/iceage/ZursWeirding.java | 55 ++------- .../src/mage/sets/invasion/SeersVision.java | 70 +++++++++++ .../src/mage/sets/legends/Revelation.java | 62 ++++++++++ .../src/mage/sets/nemesis/WanderingEye.java | 68 +++++++++++ .../src/mage/sets/urzassaga/Telepathy.java | 54 ++------- .../PlayWithHandRevealedEffect.java | 114 ++++++++++++++++++ 6 files changed, 336 insertions(+), 87 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/invasion/SeersVision.java create mode 100644 Mage.Sets/src/mage/sets/legends/Revelation.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/WanderingEye.java create mode 100644 Mage/src/mage/abilities/effects/common/continuous/PlayWithHandRevealedEffect.java diff --git a/Mage.Sets/src/mage/sets/iceage/ZursWeirding.java b/Mage.Sets/src/mage/sets/iceage/ZursWeirding.java index ebee9cfe3df..7d722651097 100644 --- a/Mage.Sets/src/mage/sets/iceage/ZursWeirding.java +++ b/Mage.Sets/src/mage/sets/iceage/ZursWeirding.java @@ -31,17 +31,16 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.continuous.PlayWithHandRevealedEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Layer; import mage.constants.Outcome; import mage.constants.Rarity; -import mage.constants.SubLayer; +import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; @@ -59,8 +58,8 @@ public class ZursWeirding extends CardImpl { this.expansionSetCode = "ICE"; // Players play with their hands revealed. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayerRevealHandCardsEffect())); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithHandRevealedEffect(TargetController.ANY))); + // If a player would draw a card, he or she reveals it instead. Then any other player may pay 2 life. If a player does, put that card into its owner's graveyard. Otherwise, that player draws a card. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ZursWeirdingReplacementEffect())); } @@ -81,7 +80,7 @@ class ZursWeirdingReplacementEffect extends ReplacementEffectImpl { super(Duration.WhileOnBattlefield, Outcome.Neutral); this.staticText = "If a player would draw a card, he or she reveals it instead. Then any other player may pay 2 life. If a player does, put that card into its owner's graveyard. Otherwise, that player draws a card."; } - + public ZursWeirdingReplacementEffect(final ZursWeirdingReplacementEffect effect) { super(effect); } @@ -90,7 +89,7 @@ class ZursWeirdingReplacementEffect extends ReplacementEffectImpl { public ZursWeirdingReplacementEffect copy() { return new ZursWeirdingReplacementEffect(this); } - + @Override public boolean apply(Game game, Ability source) { return true; @@ -105,7 +104,7 @@ class ZursWeirdingReplacementEffect extends ReplacementEffectImpl { if (card != null) { // reveals it instead player.revealCards(sourceObject.getIdName() + " next draw of " + player.getName() + " (" + game.getTurnNum()+"|"+game.getPhase().getType() +")", new CardsImpl(card), game); - + // Then any other player may pay 2 life. If a player does, put that card into its owner's graveyard PlayerList playerList = game.getPlayerList().copy(); playerList.setCurrent(player.getId()); @@ -116,14 +115,14 @@ class ZursWeirdingReplacementEffect extends ReplacementEffectImpl { currentPlayer.getLife() >= 2 && currentPlayer.chooseUse(Outcome.Benefit, message, source, game)) { currentPlayer.loseLife(2, game); - player.moveCards(card, Zone.LIBRARY, Zone.GRAVEYARD, source, game); + player.moveCards(card, Zone.LIBRARY, Zone.GRAVEYARD, source, game); // game.getState().getRevealed().reset(); return true; } - + currentPlayer = playerList.getNext(game); } - + // game.getState().getRevealed().reset(); } } @@ -132,43 +131,11 @@ class ZursWeirdingReplacementEffect extends ReplacementEffectImpl { @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.DRAW_CARD; - } + } @Override public boolean applies(GameEvent event, Ability source, Game game) { return true; } - -} -class PlayerRevealHandCardsEffect extends ContinuousEffectImpl { - - public PlayerRevealHandCardsEffect() { - super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Detriment); - staticText = "Players play with their hands revealed"; - } - - public PlayerRevealHandCardsEffect(final PlayerRevealHandCardsEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - for (UUID playerID : controller.getInRange()) { - Player player = game.getPlayer(playerID); - if (player != null) { - player.revealCards(player.getName() + "'s hand cards", player.getHand(), game, false); - } - } - return true; - } - return false; - } - - @Override - public PlayerRevealHandCardsEffect copy() { - return new PlayerRevealHandCardsEffect(this); - } } diff --git a/Mage.Sets/src/mage/sets/invasion/SeersVision.java b/Mage.Sets/src/mage/sets/invasion/SeersVision.java new file mode 100644 index 00000000000..e2cb73ad3bb --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/SeersVision.java @@ -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.invasion; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.continuous.PlayWithHandRevealedEffect; +import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.target.TargetPlayer; + +/** + * + * @author LoneFox + */ +public class SeersVision extends CardImpl { + + public SeersVision(UUID ownerId) { + super(ownerId, 270, "Seer's Vision", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{B}"); + this.expansionSetCode = "INV"; + + // Your opponents play with their hands revealed. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithHandRevealedEffect(TargetController.OPPONENT))); + // Sacrifice Seer's Vision: Look at target player's hand and choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new DiscardCardYouChooseTargetEffect(), new SacrificeSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public SeersVision(final SeersVision card) { + super(card); + } + + @Override + public SeersVision copy() { + return new SeersVision(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/Revelation.java b/Mage.Sets/src/mage/sets/legends/Revelation.java new file mode 100644 index 00000000000..bf24c939253 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/Revelation.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.legends; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.PlayWithHandRevealedEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class Revelation extends CardImpl { + + public Revelation(UUID ownerId) { + super(ownerId, 116, "Revelation", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{G}"); + this.expansionSetCode = "LEG"; + this.supertype.add("World"); + + // Players play with their hands revealed. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithHandRevealedEffect(TargetController.ANY))); + } + + public Revelation(final Revelation card) { + super(card); + } + + @Override + public Revelation copy() { + return new Revelation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/WanderingEye.java b/Mage.Sets/src/mage/sets/nemesis/WanderingEye.java new file mode 100644 index 00000000000..04c4fa1c665 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/WanderingEye.java @@ -0,0 +1,68 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.PlayWithHandRevealedEffect; +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; + +/** + * + * @author LoneFox + */ +public class WanderingEye extends CardImpl { + + public WanderingEye(UUID ownerId) { + super(ownerId, 50, "Wandering Eye", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Illusion"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Players play with their hands revealed. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithHandRevealedEffect(TargetController.ANY))); + } + + public WanderingEye(final WanderingEye card) { + super(card); + } + + @Override + public WanderingEye copy() { + return new WanderingEye(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/Telepathy.java b/Mage.Sets/src/mage/sets/urzassaga/Telepathy.java index 037fe814b77..e71a4cbb551 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Telepathy.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Telepathy.java @@ -27,16 +27,18 @@ */ package mage.sets.urzassaga; -import mage.constants.*; -import mage.abilities.Ability; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.cards.CardImpl; -import mage.game.Game; -import mage.players.Player; - import java.util.UUID; import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.PlayWithHandRevealedEffect; +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; /** * @@ -49,7 +51,7 @@ public class Telepathy extends CardImpl { this.expansionSetCode = "USG"; // Your opponents play with their hands revealed. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OpponentsPlayWithTheTopCardRevealedEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithHandRevealedEffect(TargetController.OPPONENT))); } public Telepathy(final Telepathy card) { @@ -61,37 +63,3 @@ public class Telepathy extends CardImpl { return new Telepathy(this); } } - -class OpponentsPlayWithTheTopCardRevealedEffect extends ContinuousEffectImpl { - - public OpponentsPlayWithTheTopCardRevealedEffect() { - super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Detriment); - staticText = "Your opponents play with their hands revealed"; - } - - public OpponentsPlayWithTheTopCardRevealedEffect(final OpponentsPlayWithTheTopCardRevealedEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null) { - for (UUID opponentId : game.getOpponents(controller.getId())) { - Player opponent = game.getPlayer(opponentId); - if (opponent != null) { - controller.revealCards(sourceObject.getIdName() + " " + opponent.getName(), opponent.getHand(), game, false); - } - } - return true; - } - return false; - } - - @Override - public OpponentsPlayWithTheTopCardRevealedEffect copy() { - return new OpponentsPlayWithTheTopCardRevealedEffect(this); - } - -} diff --git a/Mage/src/mage/abilities/effects/common/continuous/PlayWithHandRevealedEffect.java b/Mage/src/mage/abilities/effects/common/continuous/PlayWithHandRevealedEffect.java new file mode 100644 index 00000000000..ebbb47260b8 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/continuous/PlayWithHandRevealedEffect.java @@ -0,0 +1,114 @@ +/* + * 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.abilities.effects.common.continuous; + +import java.util.ArrayList; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.TargetController; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LoneFox + */ +public class PlayWithHandRevealedEffect extends ContinuousEffectImpl { + + private TargetController who; + + public PlayWithHandRevealedEffect(TargetController who) { + super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Detriment); + this.who = who; + } + + public PlayWithHandRevealedEffect(final PlayWithHandRevealedEffect effect) { + super(effect); + who = effect.who; + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Iterable affectedPlayers; + switch(who) { + case ANY: + affectedPlayers = controller.getInRange(); + break; + case OPPONENT: + affectedPlayers = game.getOpponents(source.getControllerId()); + break; + case YOU: + ArrayList tmp = new ArrayList(); + tmp.add(source.getControllerId()); + affectedPlayers = tmp; + break; + default: + return false; + } + + for(UUID playerID: affectedPlayers) { + Player player = game.getPlayer(playerID); + if (player != null) { + player.revealCards(player.getName() + "'s hand cards", player.getHand(), game, false); + } + } + return true; + } + return false; + } + + @Override + public PlayWithHandRevealedEffect copy() { + return new PlayWithHandRevealedEffect(this); + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + switch(who) { + case ANY: + return "Players play with their hands revealed"; + case OPPONENT: + return "Your opponents play with their hands revealed"; + case YOU: + return "Play with your hand revealed"; + default: + return "Unknown TargetController for PlayWithHandRevealedEffect"; + } + } +} From 085914f4e4570a6322c78e3ece94ebaebd7bee21 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 26 Jul 2015 12:04:15 +0300 Subject: [PATCH 192/375] Fix missing sacrifice cost of the last ability of Wintermoon Mesa --- Mage.Sets/src/mage/sets/prophecy/WintermoonMesa.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage.Sets/src/mage/sets/prophecy/WintermoonMesa.java b/Mage.Sets/src/mage/sets/prophecy/WintermoonMesa.java index 959aa4e37c9..41e285b6b91 100644 --- a/Mage.Sets/src/mage/sets/prophecy/WintermoonMesa.java +++ b/Mage.Sets/src/mage/sets/prophecy/WintermoonMesa.java @@ -31,6 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.TapTargetEffect; @@ -58,6 +59,7 @@ public class WintermoonMesa extends CardImpl { // {2}, {tap}, Sacrifice Wintermoon Mesa: Tap two target lands. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new ManaCostsImpl<>("{2}")); ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetLandPermanent(2)); this.addAbility(ability); } From 145bd39175266bd0573260dcf7bb3a23faab34fb Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 26 Jul 2015 12:25:31 +0300 Subject: [PATCH 193/375] Implement cards: Juntu Stakes, Urborg Phantom, and Vodalian Mystic --- .../mage/sets/apocalypse/VodalianMystic.java | 82 +++++++++++++++++++ .../src/mage/sets/invasion/JuntuStakes.java | 71 ++++++++++++++++ .../src/mage/sets/invasion/UrborgPhantom.java | 79 ++++++++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/VodalianMystic.java create mode 100644 Mage.Sets/src/mage/sets/invasion/JuntuStakes.java create mode 100644 Mage.Sets/src/mage/sets/invasion/UrborgPhantom.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/VodalianMystic.java b/Mage.Sets/src/mage/sets/apocalypse/VodalianMystic.java new file mode 100644 index 00000000000..a46c45b9817 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/VodalianMystic.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BecomesColorTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetSpell; + +/** + * + * @author LoneFox + */ +public class VodalianMystic extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.SORCERY))); + } + + public VodalianMystic(UUID ownerId) { + super(ownerId, 33, "Vodalian Mystic", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "APC"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {T}: Target instant or sorcery spell becomes the color of your choice. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorTargetEffect(Duration.WhileOnStack), new TapSourceCost()); + ability.addTarget(new TargetSpell(filter)); + this.addAbility(ability); + } + + public VodalianMystic(final VodalianMystic card) { + super(card); + } + + @Override + public VodalianMystic copy() { + return new VodalianMystic(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/JuntuStakes.java b/Mage.Sets/src/mage/sets/invasion/JuntuStakes.java new file mode 100644 index 00000000000..785f9e98b67 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/JuntuStakes.java @@ -0,0 +1,71 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; + +/** + * + * @author LoneFox + */ +public class JuntuStakes extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures with power 1 or less"); + + static { + filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, 2)); + } + + public JuntuStakes(UUID ownerId) { + super(ownerId, 304, "Juntu Stakes", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "INV"; + + // Creatures with power 1 or less don't untap during their controllers' untap steps. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, filter))); + } + + public JuntuStakes(final JuntuStakes card) { + super(card); + } + + @Override + public JuntuStakes copy() { + return new JuntuStakes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/UrborgPhantom.java b/Mage.Sets/src/mage/sets/invasion/UrborgPhantom.java new file mode 100644 index 00000000000..f308c862049 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/UrborgPhantom.java @@ -0,0 +1,79 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.CantBlockAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.PreventCombatDamageBySourceEffect; +import mage.abilities.effects.common.PreventCombatDamageToSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class UrborgPhantom extends CardImpl { + + public UrborgPhantom(UUID ownerId) { + super(ownerId, 132, "Urborg Phantom", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "INV"; + this.subtype.add("Spirit"); + this.subtype.add("Minion"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Urborg Phantom can't block. + this.addAbility(new CantBlockAbility()); + // {U}: Prevent all combat damage that would be dealt to and dealt by Urborg Phantom this turn. + Effect effect = new PreventCombatDamageToSourceEffect(Duration.EndOfTurn); + effect.setText("Prevent all combat damage that would be dealt to"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{U}")); + effect = new PreventCombatDamageBySourceEffect(Duration.EndOfTurn); + effect.setText("and dealt by {this} this turn"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public UrborgPhantom(final UrborgPhantom card) { + super(card); + } + + @Override + public UrborgPhantom copy() { + return new UrborgPhantom(this); + } +} From 84d23538196a362154a50dc96218b5e5b3365955 Mon Sep 17 00:00:00 2001 From: Simown Date: Sun, 26 Jul 2015 12:45:14 +0100 Subject: [PATCH 194/375] Fix for Random booster draft iterates endless while booster generation (#1136) --- Mage.Sets/src/mage/sets/DragonsMaze.java | 3 ++- Mage.Sets/src/mage/sets/FateReforged.java | 5 ++--- Mage/src/mage/cards/ExpansionSet.java | 14 ++++---------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Mage.Sets/src/mage/sets/DragonsMaze.java b/Mage.Sets/src/mage/sets/DragonsMaze.java index 45c316b308e..1fe91979797 100644 --- a/Mage.Sets/src/mage/sets/DragonsMaze.java +++ b/Mage.Sets/src/mage/sets/DragonsMaze.java @@ -84,7 +84,8 @@ public class DragonsMaze extends ExpansionSet { savedCardsInfos = CardRepository.instance.findCards(criteria); savedCards.put(rarity, savedCardsInfos); } - return savedCardsInfos; + // Return a copy of the saved cards information, as not to modify the original. + return new ArrayList<>(savedCardsInfos); } else { return super.getCardsByRarity(rarity); } diff --git a/Mage.Sets/src/mage/sets/FateReforged.java b/Mage.Sets/src/mage/sets/FateReforged.java index f1126deeb10..76d31b292a2 100644 --- a/Mage.Sets/src/mage/sets/FateReforged.java +++ b/Mage.Sets/src/mage/sets/FateReforged.java @@ -81,9 +81,8 @@ public class FateReforged extends ExpansionSet { savedCardsInfos = CardRepository.instance.findCards(criteria); savedCards.put(rarity, savedCardsInfos); } - List cards = new ArrayList<>(); - cards.addAll(savedCardsInfos); - return cards; + // Return a copy of the saved cards information, as not to modify the original. + return new ArrayList<>(savedCardsInfos); } else { return super.getCardsByRarity(rarity); } diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index 5c307480558..23c5649fbe3 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -117,16 +117,11 @@ public abstract class ExpansionSet implements Serializable { // if the packs are too big, it removes the first cards. // since it adds lands then commons before uncommons // and rares this should be the least disruptive. - List theBooster = this.createBooster(); List commons = getCardsByRarity(Rarity.COMMON); - int iterations = 0; - while (15 > theBooster.size() && !commons.isEmpty()) { + + while (15 > theBooster.size()) { addToBooster(theBooster, commons); - iterations++; - if (iterations > 14) { - break; - } } while (theBooster.size() > 15) { @@ -301,9 +296,8 @@ public abstract class ExpansionSet implements Serializable { savedCardsInfos = CardRepository.instance.findCards(criteria); savedCards.put(rarity, savedCardsInfos); } - List cards = new ArrayList<>(); - cards.addAll(savedCardsInfos); - return cards; + // Return a copy of the saved cards information, as not to modify the original. + return new ArrayList<>(savedCardsInfos); } public List getSpecialCommon() { From 4d798e81b8ca7eddb2f23bea759ae109494d3a61 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Sun, 26 Jul 2015 19:30:15 +0300 Subject: [PATCH 195/375] add thrumming stone and surging dementia --- .../cards/abilities/keywords/RippleTest.java | 112 +++++++++++++++++ .../effects/keyword/RippleEffect.java | 118 ++++++++++++++++++ 2 files changed, 230 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java create mode 100644 Mage/src/mage/abilities/effects/keyword/RippleEffect.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java new file mode 100644 index 00000000000..3048249b38c --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java @@ -0,0 +1,112 @@ +package org.mage.test.cards.abilities.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author klayhamn + */ +public class RippleTest extends CardTestPlayerBase { + + /** + * 702.59.Ripple + * 702.59a Ripple is a triggered ability that functions only while the card with ripple is on the stack. “Ripple N” means + * “When you cast this spell, you may reveal the top N cards of your library, or, if there are fewer than N cards in your + * library, you may reveal all the cards in your library. If you reveal cards from your library this way, you may cast any + * of those cards with the same name as this spell without paying their mana costs, then put all revealed cards not cast + * this way on the bottom of your library in any order.” + * 702.59b If a spell has multiple instances of ripple, each triggers separately. + */ + + @Test + public void testRippleWhenSameCardNotFound() { + + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.HAND, playerA, "Surging Dementia",2 ); + addCard(Zone.LIBRARY, playerA, "Swamp", 4); + + + addCard(Zone.HAND, playerB, "Island", 3); + addCard(Zone.LIBRARY, playerB, "Island", 3); + + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Surging Dementia", playerB); + setChoice(playerA, "Yes"); + + setStopAt(2, PhaseStep.END_TURN); + + execute(); + + assertHandCount(playerB, 3); // should have 2 less + assertHandCount(playerA, 1); // after cast, one remains + + assertGraveyardCount(playerA, "Surging Dementia", 1); + assertGraveyardCount(playerB, "Island", 1); + } + + @Test + public void testRippleWhenSameCardFoundOnce() { + + removeAllCardsFromLibrary(playerA); + + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.HAND, playerA, "Surging Dementia",2 ); + addCard(Zone.LIBRARY, playerA, "Surging Dementia",1); + addCard(Zone.LIBRARY, playerA, "Swamp", 3); + + + addCard(Zone.HAND, playerB, "Island", 3); + addCard(Zone.LIBRARY, playerB, "Island", 3); + + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Surging Dementia", playerB); + setChoice(playerA, "Yes"); + addTarget(playerA, playerB); + + setStopAt(2, PhaseStep.END_TURN); + + execute(); + + assertHandCount(playerB, 2); // should have 2 less + assertHandCount(playerA, 1); // after cast, none remain + assertGraveyardCount(playerA, "Surging Dementia", 2); + assertGraveyardCount(playerB, "Island", 2); + + } + + @Test + public void testRippleWhenSameCardFoundMoreThanOnce() { + + + removeAllCardsFromLibrary(playerA); + skipInitShuffling(); + + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.HAND, playerA, "Surging Dementia",2 ); + + addCard(Zone.LIBRARY, playerA, "Surging Dementia",1); + addCard(Zone.LIBRARY, playerA, "Swamp", 2); + addCard(Zone.LIBRARY, playerA, "Surging Dementia",1); + addCard(Zone.LIBRARY, playerA, "Swamp", 2); + + + addCard(Zone.HAND, playerB, "Island", 3); + addCard(Zone.LIBRARY, playerB, "Island", 3); + + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Surging Dementia", playerB); + setChoice(playerA, "Yes"); + addTarget(playerA, playerB); + + setStopAt(2, PhaseStep.END_TURN); + + execute(); + + assertHandCount(playerB, 1); // should have 2 less + assertHandCount(playerA, 1); // after cast, none remain + assertGraveyardCount(playerA, "Surging Dementia", 3); + assertGraveyardCount(playerB, "Island", 3); + } +} diff --git a/Mage/src/mage/abilities/effects/keyword/RippleEffect.java b/Mage/src/mage/abilities/effects/keyword/RippleEffect.java new file mode 100644 index 00000000000..4ad87f442d2 --- /dev/null +++ b/Mage/src/mage/abilities/effects/keyword/RippleEffect.java @@ -0,0 +1,118 @@ +package mage.abilities.effects.keyword; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.TargetCard; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author klayhamn + */ +public class RippleEffect extends OneShotEffect { + + protected int rippleNumber; + protected boolean isTargetSelf; // is the source of the ripple also the target of the ripple? + + public RippleEffect(int rippleNumber) { + this(rippleNumber, true); // by default, the source is also the target + } + + public RippleEffect(int rippleNumber, boolean isTargetSelf) { + super(Outcome.PlayForFree); + this.rippleNumber = rippleNumber; + this.isTargetSelf = isTargetSelf; + this.setText(); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (player != null) { + if (!player.chooseUse(Outcome.Neutral, "Reveal "+ rippleNumber + " cards from the top of your library?", source, game )){ + return false; //fizzle + } + + Cards cards = new CardsImpl(); + int count = Math.min(rippleNumber, player.getLibrary().size()); + if (count == 0) { + return true; + } + player.revealCards(sourceObject.getIdName(), cards, game); + for (int i = 0; i < count; i++) { + Card card = player.getLibrary().removeFromTop(game); + cards.add(card); + } + + // Select cards with the same name as the spell on which the ripple effect applies + // FIXME: I'm not sure the "isTargetSelf" flag is the most elegant solution + String cardNameToRipple; + if (isTargetSelf) { // if the ripple applies to the same card that triggered it + cardNameToRipple = sourceObject.getName(); + } else { // if the ripple is caused by something else (e.g. Thrumming Stone) + if (targetPointer == null) { + return true; // this might be possible if the "rememberSource" param wasn't used (which would constitute a bug) + } + UUID triggeringSpellID = targetPointer.getFirst(game, source); + Spell spellOnStack = game.getStack().getSpell(triggeringSpellID); + if (spellOnStack == null) { + return true; // spell was countered or exiled, effect should fizzle + } + cardNameToRipple = spellOnStack.getName(); + } + + FilterCard sameNameFilter = new FilterCard("card(s) with the name: \"" + cardNameToRipple + "\" to cast without paying their mana cost"); + sameNameFilter.add(new NamePredicate(cardNameToRipple)); + TargetCard target1 = new TargetCard(Zone.LIBRARY, sameNameFilter); + target1.setRequired(false); + + // Choose cards to play for free + while (player.isInGame() && cards.count(sameNameFilter, game) > 0 && player.choose(Outcome.PlayForFree, cards, target1, game)) { + Card card = cards.get(target1.getFirstTarget(), game); + if (card != null) { + player.cast(card.getSpellAbility(), game, true); + cards.remove(card); + } + target1.clearChosen(); + } + // move cards that weren't cast to the bottom of the library + player.putCardsOnBottomOfLibrary(cards, game, source, true); + // do we need to fire an event here? there is nothing that listens to ripple so far... + return true; + } + + return false; + } + + public RippleEffect(final RippleEffect effect) { + super(effect); + this.rippleNumber = effect.rippleNumber; + this.isTargetSelf = effect.isTargetSelf; + } + + @Override + public RippleEffect copy() { + return new RippleEffect(this); + } + + private void setText() { + StringBuilder sb = new StringBuilder("Ripple ").append(rippleNumber); + sb.append(". (You may reveal the top "); + sb.append(CardUtil.numberToText(rippleNumber)); + sb.append(" cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.)"); + staticText = sb.toString(); + } +} From 9621959922139462d928271f236e7866c4fca520 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Sun, 26 Jul 2015 19:33:24 +0300 Subject: [PATCH 196/375] add thrumming stone and surging dementia --- .../mage/sets/coldsnap/SurgingDementia.java | 67 +++++++++++++++++++ .../mage/sets/coldsnap/ThrummingStone.java | 64 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java diff --git a/Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java b/Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java new file mode 100644 index 00000000000..72a52c42be7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.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.coldsnap; + +import java.util.UUID; + +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.abilities.effects.common.discard.DiscardControllerEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.abilities.effects.keyword.RippleEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetPlayer; + +/** + * + * @author klayhamn + */ +public class SurgingDementia extends CardImpl { + + public SurgingDementia(UUID ownerId) { + super(ownerId, 72, "Surging Dementia", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{B}"); + this.expansionSetCode = "CSP"; + + // Ripple 4 + this.getSpellAbility().addEffect(new RippleEffect(4)); + // Target player discards a card. + this.getSpellAbility().getEffects().add(new DiscardTargetEffect(1)); + this.getSpellAbility().getTargets().add(new TargetPlayer()); + } + + public SurgingDementia(final SurgingDementia card) { + super(card); + } + + @Override + public SurgingDementia copy() { + return new SurgingDementia(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java b/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java new file mode 100644 index 00000000000..26781804359 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java @@ -0,0 +1,64 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.keyword.RippleEffect; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.filter.FilterSpell; + +/** + * + * @author klayhamn + */ +public class ThrummingStone extends CardImpl { + + //applies to all spells + private static final FilterSpell anySpellFilter = new FilterSpell(); + + public ThrummingStone(UUID ownerId) { + super(ownerId, 142, "Thrumming Stone", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{5}"); + this.expansionSetCode = "CSP"; + this.supertype.add("Legendary"); + + addAbility(new SpellCastControllerTriggeredAbility(new RippleEffect(4, false), anySpellFilter, false, true)); + } + + public ThrummingStone(final ThrummingStone card) { + super(card); + } + + @Override + public ThrummingStone copy() { + return new ThrummingStone(this); + } + +} + From 50b1085ebb12f39fb5ceb7f5941d49c583fc7cca Mon Sep 17 00:00:00 2001 From: klayhamn Date: Mon, 27 Jul 2015 02:01:57 +0300 Subject: [PATCH 197/375] fix RippleEffect so that it still triggers even when original spell is exiled or countered --- .../effects/keyword/RippleEffect.java | 53 ++++++++----------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/Mage/src/mage/abilities/effects/keyword/RippleEffect.java b/Mage/src/mage/abilities/effects/keyword/RippleEffect.java index 4ad87f442d2..db5dd8a7181 100644 --- a/Mage/src/mage/abilities/effects/keyword/RippleEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/RippleEffect.java @@ -16,8 +16,6 @@ import mage.players.Player; import mage.target.TargetCard; import mage.util.CardUtil; -import java.util.UUID; - /** * @author klayhamn */ @@ -37,39 +35,42 @@ public class RippleEffect extends OneShotEffect { this.setText(); } + public RippleEffect(final RippleEffect effect) { + super(effect); + this.rippleNumber = effect.rippleNumber; + this.isTargetSelf = effect.isTargetSelf; + } + + @Override + public RippleEffect copy() { + return new RippleEffect(this); + } + + @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (player != null) { - if (!player.chooseUse(Outcome.Neutral, "Reveal "+ rippleNumber + " cards from the top of your library?", source, game )){ - return false; //fizzle + if (!player.chooseUse(Outcome.Neutral, "Reveal " + rippleNumber + " cards from the top of your library?", source, game)){ + return true; //fizzle } - Cards cards = new CardsImpl(); - int count = Math.min(rippleNumber, player.getLibrary().size()); - if (count == 0) { - return true; - } - player.revealCards(sourceObject.getIdName(), cards, game); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - cards.add(card); - } + cards.addAll(player.getLibrary().getTopCards(game, rippleNumber)); // pull top cards + player.revealCards(sourceObject.getIdName(), cards, game); // reveal the cards - // Select cards with the same name as the spell on which the ripple effect applies + // Find out which card should be rippled // FIXME: I'm not sure the "isTargetSelf" flag is the most elegant solution String cardNameToRipple; if (isTargetSelf) { // if the ripple applies to the same card that triggered it cardNameToRipple = sourceObject.getName(); } else { // if the ripple is caused by something else (e.g. Thrumming Stone) - if (targetPointer == null) { - return true; // this might be possible if the "rememberSource" param wasn't used (which would constitute a bug) + Spell spellOnStack = game.getStack().getSpell(targetPointer.getFirst(game, source)); + if (spellOnStack == null) { // if the ripple target got countered or exiled + spellOnStack = (Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK); } - UUID triggeringSpellID = targetPointer.getFirst(game, source); - Spell spellOnStack = game.getStack().getSpell(triggeringSpellID); if (spellOnStack == null) { - return true; // spell was countered or exiled, effect should fizzle + return true; // should not happen? } cardNameToRipple = spellOnStack.getName(); } @@ -90,24 +91,12 @@ public class RippleEffect extends OneShotEffect { } // move cards that weren't cast to the bottom of the library player.putCardsOnBottomOfLibrary(cards, game, source, true); - // do we need to fire an event here? there is nothing that listens to ripple so far... return true; } return false; } - public RippleEffect(final RippleEffect effect) { - super(effect); - this.rippleNumber = effect.rippleNumber; - this.isTargetSelf = effect.isTargetSelf; - } - - @Override - public RippleEffect copy() { - return new RippleEffect(this); - } - private void setText() { StringBuilder sb = new StringBuilder("Ripple ").append(rippleNumber); sb.append(". (You may reveal the top "); From 37dbdeb07f6e2aba0ac6b9d85add6c0bb30dfa64 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Mon, 27 Jul 2015 02:11:08 +0300 Subject: [PATCH 198/375] correct some incorrect documentation comments in ripple test --- .../cards/abilities/keywords/RippleTest.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java index 3048249b38c..4217495e540 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RippleTest.java @@ -39,11 +39,11 @@ public class RippleTest extends CardTestPlayerBase { execute(); - assertHandCount(playerB, 3); // should have 2 less + assertHandCount(playerB, 3); // should have 1 less assertHandCount(playerA, 1); // after cast, one remains - assertGraveyardCount(playerA, "Surging Dementia", 1); - assertGraveyardCount(playerB, "Island", 1); + assertGraveyardCount(playerA, "Surging Dementia", 1); // 1 cast + assertGraveyardCount(playerB, "Island", 1); // 1 discarded } @Test @@ -70,9 +70,9 @@ public class RippleTest extends CardTestPlayerBase { execute(); assertHandCount(playerB, 2); // should have 2 less - assertHandCount(playerA, 1); // after cast, none remain - assertGraveyardCount(playerA, "Surging Dementia", 2); - assertGraveyardCount(playerB, "Island", 2); + assertHandCount(playerA, 1); // after cast, one remains in hand + assertGraveyardCount(playerA, "Surging Dementia", 2); // 2 were cast + assertGraveyardCount(playerB, "Island", 2); // 2 were discarded } @@ -104,9 +104,9 @@ public class RippleTest extends CardTestPlayerBase { execute(); - assertHandCount(playerB, 1); // should have 2 less - assertHandCount(playerA, 1); // after cast, none remain - assertGraveyardCount(playerA, "Surging Dementia", 3); - assertGraveyardCount(playerB, "Island", 3); + assertHandCount(playerB, 1); // should have 3 less + assertHandCount(playerA, 1); // after cast, one remains in hand + assertGraveyardCount(playerA, "Surging Dementia", 3); // 3 were cast + assertGraveyardCount(playerB, "Island", 3); // 3 were discarded } } From 2d5402b8e87ef827a327f61d13d7e13e3e5c020e Mon Sep 17 00:00:00 2001 From: benjamin Date: Sun, 26 Jul 2015 20:00:44 -0400 Subject: [PATCH 199/375] Added a Historical Standard deck validator, conforming to most of the rules found at http://thattournament.website/historic-tournament.php --- .../src/mage/deck/AllStandards.java | 253 ++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AllStandards.java diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AllStandards.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AllStandards.java new file mode 100644 index 00000000000..009c89c6da2 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AllStandards.java @@ -0,0 +1,253 @@ +package mage.deck; + +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.cards.decks.Constructed; +import mage.cards.decks.Deck; +import mage.constants.SetType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Map; + +/** + * This class represents a deck conforming to the rules contained in the + * subreddit /r/AllStandards. + * + * This class was originally made to work with the historical standard ruleset. + * Data taken from http://thattournament.website/historic-tournament.php + * (site changed, originally thtp://mtgt.nfshost.com/historic-tournament.php) + * + * If there are any questions or corrections, feel free to contact me. + * + * @author Marthinwurer (at gmail.com) + */ +public class AllStandards extends Constructed { + + /* + * This array stores the set codes of each standard up to + * Kamigawa/Ravnica standard, where rotation stabilized. + */ + protected static final String[][] standards = { + + // the first 10 standards are commented out to adhere to the all + // standards ruleset, instaed of the historical standard ruleset. + +// // 1st standard: The Dark, Fallen Empires, and 4th. +// { "DRK", "FEM", "4ED" }, +// +// // 2nd standard: 4th, Fallen Empires, Ice Age, Chronicles, Homelands, +// // Alliances, and Mirage. +// {"FEM", "4ED", "ICE", "HML", "ALL", "MIR"}, +// +// // 3rd standard: 4th, Chronicles, Alliances, Mirage, Visions. +// {"4ED", "ALL", "MIR", "VIS"}, +// +// // 4th Standard: Ice Age, Homelands, Alliances, Mirage, Visions, 5th, +// // and Weatherlight. +// {"ICE", "HML", "ALL", "MIR", "VIS", "5ED", "WTH"}, +// +// // 5th Standard: Mirage, Visions, 5th, Weatherlight, Tempest, +// // Stronghold, and Exodus. +// {"MIR", "VIS", "5ED", "WTH", "TMP", "STH", "EXO"}, +// +// // 6th Standard: 5th, Tempest, Stronghold, Exodus, Urza's Saga, Urza's +// // Legacy, Urza's Destiny. +// {"5ED", "TMP", "STH", "EXO", "USG", "ULG"}, +// +// // 7th Standard: Tempest, Stronghold, Exodus, Urza's Saga, Urza's +// // Legacy, 6th, Urza's Destiny. +// {"TMP", "STH", "EXO", "USG", "ULG", "6ED", "UDS"}, +// +// // 8th Standard: Urza's Saga, Urza's Legacy, 6th, Urza's Destiny, +// // Mercadian Masques, Nemesis, Prophecy. +// {"USG", "ULG", "6ED", "UDS", "MMQ", "NMS", "PCY"}, +// +// // 9th Standard +// {"6ED", "MMQ", "NMS", "PCY", "INV", "PLS"}, +// +// // 10th Standard +// {"7ED", "MMQ", "NMS", "PCY", "INV", "PLS", "APC"}, + + // 11th Standard + {"7ED", "INV", "APC", "PLS", "ODY", "TOR", "JUD"}, + + // 12th Standard + {"7ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, + + // 13th Standard + {"8ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, + + // 14th Standard + {"8ED", "ONS", "LGN", "LGN", "MRD", "DST", "5DN"}, + + // 15th Standard + {"8ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, + + // 16th Standard + {"9ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, + + // 17th Standard + {"9ED", "CHK", "BOK", "SOK", "RAV", "GPT", "DIS", "CSP"}, + + // 18th Standard + {"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, + + // 19th Standard + {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"}, + + // 20th Standard + {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, + + // 21st Standard + {"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"} + }; + + /** + * Constructor. Don't need to mess with any of the sets yet; that will be + * done in the overridden validate function. + */ + public AllStandards() { + super("Constructed - All Standards"); + + // banned cards for historical standard ruleset commented out. + +// // banned cards +// banned.add("Balance"); +// // Not banned in the format, but it is either this or Misty, and most +// // people choose Misty. +// banned.add("Batterskull"); +// banned.add("Memory Jar"); +// banned.add("Mind Over Matter"); +// banned.add("Mind Twist"); +// banned.add("Skullclamp"); +// banned.add("Tolarian Academy"); +// banned.add("Yawgmoth's Bargain"); + + banned.add("Ancient Den"); + banned.add("Arcbound Ravager"); + banned.add("Disciple of the Vault"); + banned.add("Great Furnace"); + banned.add("Jace, the Mind Sculptor"); + banned.add("Seat of the Synod"); + banned.add("Skullclamp"); + banned.add("Tree of Tales"); + banned.add("Vault of Whispers"); + } + + /** + * Overridden validate function. Changes the standard sets, then uses the + * regular validation function to test validity. + * @param deck - the deck to validate. + * @return + */ + @Override + public boolean validate(Deck deck) { + + Map leastInvalid = null; + + boolean valid = false; + + // up to Lorwyn/Alara, standards will have to be hard-coded. + // iterate through the array of standards. + for (String[] sets : standards) { + + // clear the invalid list + invalid.clear(); + + // add the sets to the setCodes. + setCodes = new ArrayList<>(Arrays.asList(sets)); + + // validate it. If it validates, clear the invalid cards and break. + if (super.validate(deck)) { + valid = true; + break; + } + + // if the map holding the invalid cards is empty, set it to a + // copy of the current invalid list. + if (leastInvalid == null) { + leastInvalid = new HashMap<>(this.getInvalid()); + continue; + } + + // see how many invalid cards there are. if there are less invalid + // cards than the stored invalid list, assign the current invalid + // to leastInvalid. + if (leastInvalid.size() > this.getInvalid().size()) { + leastInvalid = new HashMap<>(this.getInvalid()); + } + } + + // After testing the first few standards, do the regular ones. + // set the initial starting and ending date, as well as the current. + GregorianCalendar start = new GregorianCalendar(2006, + Calendar.SEPTEMBER, 1); + GregorianCalendar end = new GregorianCalendar(2008, + Calendar.SEPTEMBER, 1); + GregorianCalendar current = new GregorianCalendar(); + + // use the method for determining regular standard legality, but change + // the date for each standard. + while (end.before(current) && !valid) { + + // clear the invalid list and set codes. + setCodes.clear(); + invalid.clear(); + + // increment the start and end dates. + start.set(Calendar.YEAR, start.get(Calendar.YEAR) + 1); + end.set(Calendar.YEAR, start.get(Calendar.YEAR) + 2); + + // Get the sets in that time period. + // (code taken from standard.java) + for (ExpansionSet set : Sets.getInstance().values()) { + if (set.getReleaseDate().after(start.getTime()) + && set.getReleaseDate().before(end.getTime()) + && (set.getSetType() == SetType.CORE || set.getSetType() == SetType.EXPANSION)) { + setCodes.add(set.getCode()); + } + } + + // if either of the mirrodin blocks are in the time period, ban + // misty and darksteel citadel + if( setCodes.contains("MRD") || setCodes.contains("SOM")){ + banned.add("Darksteel Citadel"); + banned.add("Stoneforge Mystic"); + }else{ + banned.remove("Darksteel Citadel"); + banned.remove("Stoneforge Mystic"); + } + + // validate it. If it validates, clear the invalid cards and break. + if (super.validate(deck)) { + invalid.clear(); + valid = true; + break; + } + + // see how many invalid cards there are. if there are less invalid + // cards than the stored invalid list, assign the current invalid + // to leastInvalid. + if (leastInvalid == null){ + leastInvalid = new HashMap<>(this.getInvalid()); + + }else if (leastInvalid.size() > this.getInvalid().size()) { + leastInvalid = new HashMap<>(this.getInvalid()); + } + } + + // if no standard environment is valid, set the invalid to the + // invalid that had the least errors. + if( !valid ){ + this.invalid = new HashMap<>(leastInvalid); + } + + // return the validity. + return valid; + } + +} From bd5d13a32362dc7631b05216bd6f82d6a4f7da2d Mon Sep 17 00:00:00 2001 From: benjamin Date: Sun, 26 Jul 2015 22:59:18 -0400 Subject: [PATCH 200/375] Updated Historical Standard validators changed name of AllStandards.java to more accurately reflect the format; it uses the new date range and banlist from /r/AllStandards. Historical Standard uses the banlist from http://thattournament.website/historic-tournament.php --- .../src/mage/deck/HistoricalStandard.java | 227 ++++++++++++++++++ .../{AllStandards.java => SuperStandard.java} | 70 ++---- 2 files changed, 241 insertions(+), 56 deletions(-) create mode 100644 Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java rename Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/{AllStandards.java => SuperStandard.java} (73%) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java new file mode 100644 index 00000000000..1c8ba55341f --- /dev/null +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java @@ -0,0 +1,227 @@ +package mage.deck; + +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.cards.decks.Constructed; +import mage.cards.decks.Deck; +import mage.constants.SetType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Map; + +/** + * This class represents a deck from any past standard. + * + * This class was originally made to work with the historical standard ruleset. + * Data taken from http://thattournament.website/historic-tournament.php + * (site changed, originally thtp://mtgt.nfshost.com/historic-tournament.php) + * + * If there are any questions or corrections, feel free to contact me. + * + * @author Marthinwurer (at gmail.com) + */ +public class HistoricalStandard extends Constructed { + + /* + * This array stores the set codes of each standard up to + * Kamigawa/Ravnica standard, where rotation stabilized. + */ + protected static final String[][] standards = { + + // 1st standard: The Dark, Fallen Empires, and 4th. + { "DRK", "FEM", "4ED" }, + + // 2nd standard: 4th, Fallen Empires, Ice Age, Chronicles, Homelands, + // Alliances, and Mirage. + {"FEM", "4ED", "ICE", "HML", "ALL", "MIR"}, + + // 3rd standard: 4th, Chronicles, Alliances, Mirage, Visions. + {"4ED", "ALL", "MIR", "VIS"}, + + // 4th Standard: Ice Age, Homelands, Alliances, Mirage, Visions, 5th, + // and Weatherlight. + {"ICE", "HML", "ALL", "MIR", "VIS", "5ED", "WTH"}, + + // 5th Standard: Mirage, Visions, 5th, Weatherlight, Tempest, + // Stronghold, and Exodus. + {"MIR", "VIS", "5ED", "WTH", "TMP", "STH", "EXO"}, + + // 6th Standard: 5th, Tempest, Stronghold, Exodus, Urza's Saga, Urza's + // Legacy, Urza's Destiny. + {"5ED", "TMP", "STH", "EXO", "USG", "ULG"}, + + // 7th Standard: Tempest, Stronghold, Exodus, Urza's Saga, Urza's + // Legacy, 6th, Urza's Destiny. + {"TMP", "STH", "EXO", "USG", "ULG", "6ED", "UDS"}, + + // 8th Standard: Urza's Saga, Urza's Legacy, 6th, Urza's Destiny, + // Mercadian Masques, Nemesis, Prophecy. + {"USG", "ULG", "6ED", "UDS", "MMQ", "NMS", "PCY"}, + + // 9th Standard + {"6ED", "MMQ", "NMS", "PCY", "INV", "PLS"}, + + // 10th Standard + {"7ED", "MMQ", "NMS", "PCY", "INV", "PLS", "APC"}, + + // 11th Standard + {"7ED", "INV", "APC", "PLS", "ODY", "TOR", "JUD"}, + + // 12th Standard + {"7ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, + + // 13th Standard + {"8ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, + + // 14th Standard + {"8ED", "ONS", "LGN", "LGN", "MRD", "DST", "5DN"}, + + // 15th Standard + {"8ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, + + // 16th Standard + {"9ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, + + // 17th Standard + {"9ED", "CHK", "BOK", "SOK", "RAV", "GPT", "DIS", "CSP"}, + + // 18th Standard + {"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, + + // 19th Standard + {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"}, + + // 20th Standard + {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, + + // 21st Standard + {"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"} + }; + + /** + * Constructor. Don't need to mess with any of the sets yet; that will be + * done in the overridden validate function. + */ + public HistoricalStandard() { + super("Constructed - Historical Standard"); + + // banned cards + banned.add("Balance"); + // Not banned in the format, but it is either this or Misty, and most + // people choose Misty. + banned.add("Batterskull"); + banned.add("Memory Jar"); + banned.add("Mind Over Matter"); + banned.add("Mind Twist"); + banned.add("Skullclamp"); + banned.add("Tolarian Academy"); + banned.add("Yawgmoth's Bargain"); + } + + /** + * Overridden validate function. Changes the standard sets, then uses the + * regular validation function to test validity. + * @param deck - the deck to validate. + * @return + */ + @Override + public boolean validate(Deck deck) { + + Map leastInvalid = null; + + boolean valid = false; + + // up to Lorwyn/Alara, standards will have to be hard-coded. + // iterate through the array of standards. + for (String[] sets : standards) { + + // clear the invalid list + invalid.clear(); + + // add the sets to the setCodes. + setCodes = new ArrayList<>(Arrays.asList(sets)); + + // validate it. If it validates, clear the invalid cards and break. + if (super.validate(deck)) { + valid = true; + break; + } + + // if the map holding the invalid cards is empty, set it to a + // copy of the current invalid list. + if (leastInvalid == null) { + leastInvalid = new HashMap<>(this.getInvalid()); + continue; + } + + // see how many invalid cards there are. if there are less invalid + // cards than the stored invalid list, assign the current invalid + // to leastInvalid. + if (leastInvalid.size() > this.getInvalid().size()) { + leastInvalid = new HashMap<>(this.getInvalid()); + } + } + + // After testing the first few standards, do the regular ones. + // set the initial starting and ending date, as well as the current. + GregorianCalendar start = new GregorianCalendar(2006, + Calendar.SEPTEMBER, 1); + GregorianCalendar end = new GregorianCalendar(2008, + Calendar.SEPTEMBER, 1); + GregorianCalendar current = new GregorianCalendar(); + + // use the method for determining regular standard legality, but change + // the date for each standard. + while (end.before(current) && !valid) { + + // clear the invalid list and set codes. + setCodes.clear(); + invalid.clear(); + + // increment the start and end dates. + start.set(Calendar.YEAR, start.get(Calendar.YEAR) + 1); + end.set(Calendar.YEAR, start.get(Calendar.YEAR) + 2); + + // Get the sets in that time period. + // (code taken from standard.java) + for (ExpansionSet set : Sets.getInstance().values()) { + if (set.getReleaseDate().after(start.getTime()) + && set.getReleaseDate().before(end.getTime()) + && (set.getSetType() == SetType.CORE || set.getSetType() == SetType.EXPANSION)) { + setCodes.add(set.getCode()); + } + } + + // validate it. If it validates, clear the invalid cards and break. + if (super.validate(deck)) { + invalid.clear(); + valid = true; + break; + } + + // see how many invalid cards there are. if there are less invalid + // cards than the stored invalid list, assign the current invalid + // to leastInvalid. + if (leastInvalid == null){ + leastInvalid = new HashMap<>(this.getInvalid()); + + }else if (leastInvalid.size() > this.getInvalid().size()) { + leastInvalid = new HashMap<>(this.getInvalid()); + } + } + + // if no standard environment is valid, set the invalid to the + // invalid that had the least errors. + if( !valid ){ + this.invalid = new HashMap<>(leastInvalid); + } + + // return the validity. + return valid; + } + +} diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AllStandards.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java similarity index 73% rename from Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AllStandards.java rename to Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java index 009c89c6da2..be6caf7dc1a 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AllStandards.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java @@ -15,7 +15,7 @@ import java.util.Map; /** * This class represents a deck conforming to the rules contained in the - * subreddit /r/AllStandards. + subreddit /r/SuperStandard. * * This class was originally made to work with the historical standard ruleset. * Data taken from http://thattournament.website/historic-tournament.php @@ -25,53 +25,15 @@ import java.util.Map; * * @author Marthinwurer (at gmail.com) */ -public class AllStandards extends Constructed { +public class SuperStandard extends Constructed { /* * This array stores the set codes of each standard up to * Kamigawa/Ravnica standard, where rotation stabilized. + * Data taken from http://thattournament.website/historic-tournament.php */ protected static final String[][] standards = { - // the first 10 standards are commented out to adhere to the all - // standards ruleset, instaed of the historical standard ruleset. - -// // 1st standard: The Dark, Fallen Empires, and 4th. -// { "DRK", "FEM", "4ED" }, -// -// // 2nd standard: 4th, Fallen Empires, Ice Age, Chronicles, Homelands, -// // Alliances, and Mirage. -// {"FEM", "4ED", "ICE", "HML", "ALL", "MIR"}, -// -// // 3rd standard: 4th, Chronicles, Alliances, Mirage, Visions. -// {"4ED", "ALL", "MIR", "VIS"}, -// -// // 4th Standard: Ice Age, Homelands, Alliances, Mirage, Visions, 5th, -// // and Weatherlight. -// {"ICE", "HML", "ALL", "MIR", "VIS", "5ED", "WTH"}, -// -// // 5th Standard: Mirage, Visions, 5th, Weatherlight, Tempest, -// // Stronghold, and Exodus. -// {"MIR", "VIS", "5ED", "WTH", "TMP", "STH", "EXO"}, -// -// // 6th Standard: 5th, Tempest, Stronghold, Exodus, Urza's Saga, Urza's -// // Legacy, Urza's Destiny. -// {"5ED", "TMP", "STH", "EXO", "USG", "ULG"}, -// -// // 7th Standard: Tempest, Stronghold, Exodus, Urza's Saga, Urza's -// // Legacy, 6th, Urza's Destiny. -// {"TMP", "STH", "EXO", "USG", "ULG", "6ED", "UDS"}, -// -// // 8th Standard: Urza's Saga, Urza's Legacy, 6th, Urza's Destiny, -// // Mercadian Masques, Nemesis, Prophecy. -// {"USG", "ULG", "6ED", "UDS", "MMQ", "NMS", "PCY"}, -// -// // 9th Standard -// {"6ED", "MMQ", "NMS", "PCY", "INV", "PLS"}, -// -// // 10th Standard -// {"7ED", "MMQ", "NMS", "PCY", "INV", "PLS", "APC"}, - // 11th Standard {"7ED", "INV", "APC", "PLS", "ODY", "TOR", "JUD"}, @@ -110,23 +72,9 @@ public class AllStandards extends Constructed { * Constructor. Don't need to mess with any of the sets yet; that will be * done in the overridden validate function. */ - public AllStandards() { + public SuperStandard() { super("Constructed - All Standards"); - - // banned cards for historical standard ruleset commented out. -// // banned cards -// banned.add("Balance"); -// // Not banned in the format, but it is either this or Misty, and most -// // people choose Misty. -// banned.add("Batterskull"); -// banned.add("Memory Jar"); -// banned.add("Mind Over Matter"); -// banned.add("Mind Twist"); -// banned.add("Skullclamp"); -// banned.add("Tolarian Academy"); -// banned.add("Yawgmoth's Bargain"); - banned.add("Ancient Den"); banned.add("Arcbound Ravager"); banned.add("Disciple of the Vault"); @@ -160,6 +108,16 @@ public class AllStandards extends Constructed { // add the sets to the setCodes. setCodes = new ArrayList<>(Arrays.asList(sets)); + + // if either of the mirrodin blocks are in the time period, ban + // misty and darksteel citadel + if( setCodes.contains("MRD") || setCodes.contains("SOM")){ + banned.add("Darksteel Citadel"); + banned.add("Stoneforge Mystic"); + }else{ + banned.remove("Darksteel Citadel"); + banned.remove("Stoneforge Mystic"); + } // validate it. If it validates, clear the invalid cards and break. if (super.validate(deck)) { From 3e2963d21dafabb0b8588ed0d43e3ed0e2b24f9c Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 27 Jul 2015 07:56:45 +0300 Subject: [PATCH 201/375] Fix a brainfart in Radiant Kavu's text --- Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java b/Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java index b460f739148..e29f6f24da0 100644 --- a/Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java +++ b/Mage.Sets/src/mage/sets/planeshift/RadiantKavu.java @@ -48,7 +48,7 @@ import mage.filter.predicate.mageobject.ColorPredicate; */ public class RadiantKavu extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blue and black creatures"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blue creatures and black creatures"); static { filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLUE), new ColorPredicate(ObjectColor.BLACK))); } From fc24fc6800d472891006c90548881203d100881c Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 27 Jul 2015 07:57:52 +0300 Subject: [PATCH 202/375] Fix Warped Devotion to work whan a token is bounced --- .../src/mage/sets/eighthedition/WarpedDevotion.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java b/Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java index 62f78c48d0f..777f332ff05 100644 --- a/Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java +++ b/Mage.Sets/src/mage/sets/eighthedition/WarpedDevotion.java @@ -88,20 +88,17 @@ class WarpedDevotionTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zce = (ZoneChangeEvent)event; if(zce.getFromZone() == Zone.BATTLEFIELD && zce.getToZone() == Zone.HAND) { - Card card = game.getCard(event.getTargetId()); - if(card != null) { - for(Effect effect: getEffects()) { - effect.setTargetPointer(new FixedTarget(card.getOwnerId())); - } - return true; + for(Effect effect: getEffects()) { + effect.setTargetPointer(new FixedTarget(zce.getTarget().getOwnerId())); } + return true; } return false; } @Override public String getRule() { - return "Whenever a permanent is returned to a player's hand, that player discards a card"; + return "Whenever a permanent is returned to a player's hand, that player discards a card."; } } From b36f3a4a2be87865512b5bd86d7543c1a92a0199 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 07:58:51 +0200 Subject: [PATCH 203/375] * Mark of Mutiny - Fixed tooltip text. --- .../src/mage/sets/zendikar/MarkOfMutiny.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/Mage.Sets/src/mage/sets/zendikar/MarkOfMutiny.java b/Mage.Sets/src/mage/sets/zendikar/MarkOfMutiny.java index 1f329686b98..d7b27e2f34f 100644 --- a/Mage.Sets/src/mage/sets/zendikar/MarkOfMutiny.java +++ b/Mage.Sets/src/mage/sets/zendikar/MarkOfMutiny.java @@ -25,19 +25,19 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.zendikar; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; import mage.counters.CounterType; import mage.target.common.TargetCreaturePermanent; @@ -47,18 +47,28 @@ import mage.target.common.TargetCreaturePermanent; */ public class MarkOfMutiny extends CardImpl { - public MarkOfMutiny (UUID ownerId) { + public MarkOfMutiny(UUID ownerId) { super(ownerId, 137, "Mark of Mutiny", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{R}"); this.expansionSetCode = "ZEN"; + // Gain control of target creature until end of turn. + // Put a +1/+1 counter on it and untap it. + // That creature gains haste until end of turn. (It can attack and this turn.) this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); - this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new UntapTargetEffect()); + Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); + effect.setText("Put a +1/+1 counter on it"); + this.getSpellAbility().addEffect(effect); + effect = new UntapTargetEffect(); + effect.setText("and untap it"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setText("That creature gains haste until end of turn. (It can {T} attack and this turn.)"); + this.getSpellAbility().addEffect(effect); + } - public MarkOfMutiny (final MarkOfMutiny card) { + public MarkOfMutiny(final MarkOfMutiny card) { super(card); } From 0c9b2ebe71f1a188cf7a48d1bc2985f8dac74e19 Mon Sep 17 00:00:00 2001 From: Justin Godesky Date: Mon, 27 Jul 2015 06:42:45 -0400 Subject: [PATCH 204/375] Updated list of formats Updated list of formats, accounting for All Standards and Historic Standards --- readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index a7ee59046a3..42e70b4c04c 100644 --- a/readme.md +++ b/readme.md @@ -12,6 +12,7 @@ You can visit the XMage forum [here](http://www.slightlymagic.net/forum/viewforu * You can play either a two player duel or a multiplayer free-for-all game with up to 10 players. * Commander format (also up to 10 players). * Tiny Leaders duels. +* All Standards and Historic Standard formats. * There are two tournament types supported, which can be played with up to 16 players: * Elimination or swiss type handling * Booster (also Cube) draft tournaments (4-16) @@ -32,4 +33,4 @@ If you are interested in developing XMage, here are some useful resources: * [Developer Testing Tools](http://github.com/magefree/mage/wiki/Developer-Testing-Tools) * [Double Faced Cards](http://github.com/magefree/mage/wiki/Double-Faced-Cards) * [Card Requests](http://www.slightlymagic.net/forum/viewtopic.php?f=70&t=4554) -* [Tournament Relevant Card Requests](http://www.slightlymagic.net/forum/viewtopic.php?f=70&t=14062) \ No newline at end of file +* [Tournament Relevant Card Requests](http://www.slightlymagic.net/forum/viewtopic.php?f=70&t=14062) From a3eb1f3a638de3e4f7cbed93b943b5e67bf966f2 Mon Sep 17 00:00:00 2001 From: Justin Godesky Date: Mon, 27 Jul 2015 06:53:32 -0400 Subject: [PATCH 205/375] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 42e70b4c04c..d7ce960f8df 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@ You can visit the XMage forum [here](http://www.slightlymagic.net/forum/viewforu * You can play either a two player duel or a multiplayer free-for-all game with up to 10 players. * Commander format (also up to 10 players). * Tiny Leaders duels. -* All Standards and Historic Standard formats. +* Super Standard and Historic Standard formats. * There are two tournament types supported, which can be played with up to 16 players: * Elimination or swiss type handling * Booster (also Cube) draft tournaments (4-16) From 808efbc762b23ba8b0e07c860fbaa4b64762e772 Mon Sep 17 00:00:00 2001 From: Justin Godesky Date: Mon, 27 Jul 2015 07:06:34 -0400 Subject: [PATCH 206/375] Readme: simplifying feature list + minor edits --- readme.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/readme.md b/readme.md index d7ce960f8df..590ae692157 100644 --- a/readme.md +++ b/readme.md @@ -7,20 +7,18 @@ There are public servers where you can play XMage against other players. You can You can visit the XMage forum [here](http://www.slightlymagic.net/forum/viewforum.php?f=70). ## Features -* Deck editor to build your desired decks. -* There is a simple computer AI opponent available. -* You can play either a two player duel or a multiplayer free-for-all game with up to 10 players. -* Commander format (also up to 10 players). -* Tiny Leaders duels. -* Super Standard and Historic Standard formats. -* There are two tournament types supported, which can be played with up to 16 players: -* Elimination or swiss type handling -* Booster (also Cube) draft tournaments (4-16) -* Sealed (also from Cube) tournaments (2-16) +* Deck editor (load and save decks) +* Simple computer AI opponent +* Two player duel or a multiplayer free-for-all game with up to 10 players +* Supports special formats like Commander (up to 10 players), Cube, Tiny Leaders, Super Standard, Historic Standard +* There are two tournament types supported (elimination or swiss type handling), which can be played with up to 16 players: + * Booster (also Cube) draft tournaments (4-16) + * Sealed (also from Cube) tournaments (2-16) + ## Installation Download and install the [latest XMage release](http://XMage.de). -You will need to have the [Java Runtime Environment](http://java.com/en/) Version 7 or later. +You will need to have Version 7 or later of the [Java Runtime Environment](http://java.com/en/). Look [here](http://www.slightlymagic.net/forum/viewtopic.php?f=70&t=13632) for more detailed instructions. [Here](http://github.com/magefree/mage/wiki/Release-changes) you can find a log of the latest changes. From dbff7bedb972893ec88abde52ab7fd264219f0a3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 17:21:52 +0200 Subject: [PATCH 207/375] * Some changes to skip turn handling (turn count and messages). --- .../org/mage/test/turnmod/SkipTurnTest.java | 63 +++++++++++++++++++ .../common/turn/SkipNextTurnSourceEffect.java | 17 ++++- Mage/src/mage/game/GameImpl.java | 31 ++------- Mage/src/mage/game/turn/Turn.java | 40 ++++++++++-- 4 files changed, 117 insertions(+), 34 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/turnmod/SkipTurnTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/turnmod/SkipTurnTest.java b/Mage.Tests/src/test/java/org/mage/test/turnmod/SkipTurnTest.java new file mode 100644 index 00000000000..71c88bf394d --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/turnmod/SkipTurnTest.java @@ -0,0 +1,63 @@ +/* + * 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 org.mage.test.turnmod; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class SkipTurnTest extends CardTestPlayerBase { + + @Test + public void testEaterOfDays() { + // At the beginning of your upkeep or whenever you cast a green spell, put a charge counter on Shrine of Boundless Growth. + // {T}, Sacrifice Shrine of Boundless Growth: Add {1} to your mana pool for each charge counter on Shrine of Boundless Growth. + addCard(Zone.HAND, playerA, "Shrine of Boundless Growth", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 7); + // Flying + // Trample + // When Eater of Days enters the battlefield, you skip your next two turns. + addCard(Zone.HAND, playerA, "Eater of Days", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Eater of Days"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shrine of Boundless Growth"); + + setStopAt(5, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Eater of Days", 1); + assertPermanentCount(playerA, "Shrine of Boundless Growth", 1); + assertCounterCount("Shrine of Boundless Growth", CounterType.CHARGE, 1); + } +} diff --git a/Mage/src/mage/abilities/effects/common/turn/SkipNextTurnSourceEffect.java b/Mage/src/mage/abilities/effects/common/turn/SkipNextTurnSourceEffect.java index ff1431ad21f..511a0f1c388 100644 --- a/Mage/src/mage/abilities/effects/common/turn/SkipNextTurnSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/turn/SkipNextTurnSourceEffect.java @@ -10,20 +10,29 @@ import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; import mage.game.turn.TurnMod; +import mage.util.CardUtil; /** * * @author Mael */ public class SkipNextTurnSourceEffect extends OneShotEffect { - + + int numberOfTurns; + public SkipNextTurnSourceEffect() { + this(1); + } + + public SkipNextTurnSourceEffect(int numberOfTurns) { super(Outcome.Neutral); - staticText = "You skip your next turn"; + this.numberOfTurns = numberOfTurns; + staticText = "you skip your next " + (numberOfTurns == 1 ? "turn" : CardUtil.numberToText(numberOfTurns) + " turns"); } public SkipNextTurnSourceEffect(final SkipNextTurnSourceEffect effect) { super(effect); + this.numberOfTurns = effect.numberOfTurns; } @Override @@ -33,7 +42,9 @@ public class SkipNextTurnSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - game.getState().getTurnMods().add(new TurnMod(source.getControllerId(), true)); + for (int i = 0; i < numberOfTurns; i++) { + game.getState().getTurnMods().add(new TurnMod(source.getControllerId(), true)); + } return true; } } diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 858b5b8fff0..f3a878d2206 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -700,7 +700,6 @@ public abstract class GameImpl implements Game, Serializable { if (!playTurn(playerByOrder)) { break; } - state.setTurnNum(state.getTurnNum() + 1); } playExtraTurns(); playerByOrder = playerList.getNext(this); @@ -741,7 +740,6 @@ public abstract class GameImpl implements Game, Serializable { informPlayers(extraPlayer.getLogName() + " takes an extra turn"); } playTurn(extraPlayer); - state.setTurnNum(state.getTurnNum() + 1); } } extraTurn = getNextExtraTurn(); @@ -768,6 +766,7 @@ public abstract class GameImpl implements Game, Serializable { } private boolean playTurn(Player player) { + boolean skipTurn = false; do { if (executingRollback) { executingRollback = false; @@ -781,41 +780,23 @@ public abstract class GameImpl implements Game, Serializable { state.setActivePlayerId(player.getId()); saveRollBackGameState(); } - this.logStartOfTurn(player); if (checkStopOnTurnOption()) { return false; } - state.getTurn().play(this, player); + skipTurn = state.getTurn().play(this, player); } while (executingRollback); if (isPaused() || gameOver(null)) { return false; } - endOfTurn(); + if (!skipTurn) { + endOfTurn(); + state.setTurnNum(state.getTurnNum() + 1); + } return true; } - private void logStartOfTurn(Player player) { - StringBuilder sb = new StringBuilder("Turn ").append(state.getTurnNum()).append(" "); - sb.append(player.getLogName()); - sb.append(" ("); - int delimiter = this.getPlayers().size() - 1; - for (Player gamePlayer : this.getPlayers().values()) { - sb.append(gamePlayer.getLife()); - int poison = gamePlayer.getCounters().getCount(CounterType.POISON); - if (poison > 0) { - sb.append("[P:").append(poison).append("]"); - } - if (delimiter > 0) { - sb.append(" - "); - delimiter--; - } - } - sb.append(")"); - fireStatusEvent(sb.toString(), true); - } - private boolean checkStopOnTurnOption() { if (gameOptions.stopOnTurn != null && gameOptions.stopAtStep == PhaseStep.UNTAP) { if (gameOptions.stopOnTurn.equals(state.getTurnNum())) { diff --git a/Mage/src/mage/game/turn/Turn.java b/Mage/src/mage/game/turn/Turn.java index ec5d2f81ca1..30a367814ca 100644 --- a/Mage/src/mage/game/turn/Turn.java +++ b/Mage/src/mage/game/turn/Turn.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.UUID; import mage.constants.PhaseStep; import mage.constants.TurnPhase; +import mage.counters.CounterType; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -116,16 +117,24 @@ public class Turn implements Serializable { return null; } - public void play(Game game, Player activePlayer) { + /** + * + * @param game + * @param activePlayer + * @return true if turn is skipped + */ + public boolean play(Game game, Player activePlayer) { activePlayer.becomesActivePlayer(); this.setDeclareAttackersStepStarted(false); if (game.isPaused() || game.gameOver(null)) { - return; + return false; } if (game.getState().getTurnMods().skipTurn(activePlayer.getId())) { - return; + game.informPlayers(activePlayer.getLogName() + " skips his or her turn."); + return true; } + logStartOfTurn(game, activePlayer); checkTurnIsControlledByOtherPlayer(game, activePlayer.getId()); @@ -134,7 +143,7 @@ public class Turn implements Serializable { game.getPlayer(activePlayer.getId()).beginTurn(game); for (Phase phase : phases) { if (game.isPaused() || game.gameOver(null)) { - return; + return false; } if (!isEndTurnRequested() || phase.getType().equals(TurnPhase.END)) { currentPhase = phase; @@ -142,7 +151,7 @@ public class Turn implements Serializable { if (!game.getState().getTurnMods().skipPhase(activePlayer.getId(), currentPhase.getType())) { if (phase.play(game, activePlayer.getId())) { if (game.executingRollback()) { - return; + return false; } //20091005 - 500.4/703.4n game.emptyManaPools(); @@ -155,7 +164,7 @@ public class Turn implements Serializable { } } } - + return false; } public void resumePlay(Game game, boolean wasPaused) { @@ -327,4 +336,23 @@ public class Turn implements Serializable { return sb.toString(); } + private void logStartOfTurn(Game game, Player player) { + StringBuilder sb = new StringBuilder("Turn ").append(game.getState().getTurnNum()).append(" "); + sb.append(player.getLogName()); + sb.append(" ("); + int delimiter = game.getPlayers().size() - 1; + for (Player gamePlayer : game.getPlayers().values()) { + sb.append(gamePlayer.getLife()); + int poison = gamePlayer.getCounters().getCount(CounterType.POISON); + if (poison > 0) { + sb.append("[P:").append(poison).append("]"); + } + if (delimiter > 0) { + sb.append(" - "); + delimiter--; + } + } + sb.append(")"); + game.fireStatusEvent(sb.toString(), true); + } } From 29997ebf57cf116007f6530eb8adb2ff9f2e52eb Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 17:23:09 +0200 Subject: [PATCH 208/375] * Added Eater of Days, Tariel, Reckoner of Souls, Island Sanctuary, Selvala, Explorer Returned and Awakening. --- .../sets/commander/TarielReckonerOfSouls.java | 119 +++++++++++++++++ .../conspiracy/SelvalaExplorerReturned.java | 52 ++++++++ .../src/mage/sets/darksteel/EaterOfDays.java | 69 ++++++++++ .../sets/fifthedition/IslandSanctuary.java | 52 ++++++++ .../sets/fourthedition/IslandSanctuary.java | 52 ++++++++ .../sets/limitedalpha/IslandSanctuary.java | 123 ++++++++++++++++++ .../sets/limitedbeta/IslandSanctuary.java | 52 ++++++++ .../masterseditioniv/IslandSanctuary.java | 52 ++++++++ .../sets/revisededition/IslandSanctuary.java | 52 ++++++++ .../src/mage/sets/stronghold/Awakening.java | 72 ++++++++++ .../unlimitededition/IslandSanctuary.java | 52 ++++++++ .../SelvalaExplorerReturned.java | 112 ++++++++++++++++ .../sets/zendikar/MagosiTheWaterveil.java | 62 ++------- .../dynamicvalue/common/ParleyCount.java | 98 ++++++++++++++ .../effects/common/UntapAllEffect.java | 69 ++++++++++ Mage/src/mage/constants/AbilityWord.java | 9 +- 16 files changed, 1044 insertions(+), 53 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/SelvalaExplorerReturned.java create mode 100644 Mage.Sets/src/mage/sets/darksteel/EaterOfDays.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/IslandSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/fourthedition/IslandSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/limitedalpha/IslandSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/limitedbeta/IslandSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/IslandSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/revisededition/IslandSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/stronghold/Awakening.java create mode 100644 Mage.Sets/src/mage/sets/unlimitededition/IslandSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/vintagemasters/SelvalaExplorerReturned.java create mode 100644 Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java create mode 100644 Mage/src/mage/abilities/effects/common/UntapAllEffect.java diff --git a/Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java b/Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java new file mode 100644 index 00000000000..7cfe1e0b577 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java @@ -0,0 +1,119 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.VigilanceAbility; +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.common.FilterCreatureCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class TarielReckonerOfSouls extends CardImpl { + + public TarielReckonerOfSouls(UUID ownerId) { + super(ownerId, 229, "Tariel, Reckoner of Souls", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{4}{W}{B}{R}"); + this.expansionSetCode = "CMD"; + this.supertype.add("Legendary"); + this.subtype.add("Angel"); + this.power = new MageInt(4); + this.toughness = new MageInt(7); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + // {T}: Choose a creature card at random from target opponent's graveyard. Put that card onto the battlefield under your control. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TarielReckonerOfSoulsEffect(), new TapSourceCost()); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + + } + + public TarielReckonerOfSouls(final TarielReckonerOfSouls card) { + super(card); + } + + @Override + public TarielReckonerOfSouls copy() { + return new TarielReckonerOfSouls(this); + } +} + +class TarielReckonerOfSoulsEffect extends OneShotEffect { + + public TarielReckonerOfSoulsEffect() { + super(Outcome.PutCardInPlay); + this.staticText = "Choose a creature card at random from target opponent's graveyard. Put that card onto the battlefield under your control"; + } + + public TarielReckonerOfSoulsEffect(final TarielReckonerOfSoulsEffect effect) { + super(effect); + } + + @Override + public TarielReckonerOfSoulsEffect copy() { + return new TarielReckonerOfSoulsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player targetOpponent = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (controller != null && targetOpponent != null) { + Cards creatureCards = new CardsImpl(); + for (Card card : targetOpponent.getGraveyard().getCards(new FilterCreatureCard(), game)) { + creatureCards.add(card); + } + if (!creatureCards.isEmpty()) { + Card card = creatureCards.getRandom(game); + controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId()); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/SelvalaExplorerReturned.java b/Mage.Sets/src/mage/sets/conspiracy/SelvalaExplorerReturned.java new file mode 100644 index 00000000000..a455dc71609 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/SelvalaExplorerReturned.java @@ -0,0 +1,52 @@ +/* + * 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.conspiracy; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class SelvalaExplorerReturned extends mage.sets.vintagemasters.SelvalaExplorerReturned { + + public SelvalaExplorerReturned(UUID ownerId) { + super(ownerId); + this.cardNumber = 51; + this.expansionSetCode = "CNS"; + } + + public SelvalaExplorerReturned(final SelvalaExplorerReturned card) { + super(card); + } + + @Override + public SelvalaExplorerReturned copy() { + return new SelvalaExplorerReturned(this); + } +} diff --git a/Mage.Sets/src/mage/sets/darksteel/EaterOfDays.java b/Mage.Sets/src/mage/sets/darksteel/EaterOfDays.java new file mode 100644 index 00000000000..9463deac87e --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/EaterOfDays.java @@ -0,0 +1,69 @@ +/* + * 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.darksteel; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.turn.SkipNextTurnSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class EaterOfDays extends CardImpl { + + public EaterOfDays(UUID ownerId) { + super(ownerId, 120, "Eater of Days", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + this.expansionSetCode = "DST"; + this.subtype.add("Leviathan"); + this.power = new MageInt(9); + this.toughness = new MageInt(8); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Trample + this.addAbility(TrampleAbility.getInstance()); + // When Eater of Days enters the battlefield, you skip your next two turns. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SkipNextTurnSourceEffect(2))); + } + + public EaterOfDays(final EaterOfDays card) { + super(card); + } + + @Override + public EaterOfDays copy() { + return new EaterOfDays(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/IslandSanctuary.java b/Mage.Sets/src/mage/sets/fifthedition/IslandSanctuary.java new file mode 100644 index 00000000000..096725df9c9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/IslandSanctuary.java @@ -0,0 +1,52 @@ +/* + * 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.fifthedition; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class IslandSanctuary extends mage.sets.limitedalpha.IslandSanctuary { + + public IslandSanctuary(UUID ownerId) { + super(ownerId); + this.cardNumber = 315; + this.expansionSetCode = "5ED"; + } + + public IslandSanctuary(final IslandSanctuary card) { + super(card); + } + + @Override + public IslandSanctuary copy() { + return new IslandSanctuary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fourthedition/IslandSanctuary.java b/Mage.Sets/src/mage/sets/fourthedition/IslandSanctuary.java new file mode 100644 index 00000000000..430788c2d02 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/IslandSanctuary.java @@ -0,0 +1,52 @@ +/* + * 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.fourthedition; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class IslandSanctuary extends mage.sets.limitedalpha.IslandSanctuary { + + public IslandSanctuary(UUID ownerId) { + super(ownerId); + this.cardNumber = 281; + this.expansionSetCode = "4ED"; + } + + public IslandSanctuary(final IslandSanctuary card) { + super(card); + } + + @Override + public IslandSanctuary copy() { + return new IslandSanctuary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/limitedalpha/IslandSanctuary.java b/Mage.Sets/src/mage/sets/limitedalpha/IslandSanctuary.java new file mode 100644 index 00000000000..e6c8441f235 --- /dev/null +++ b/Mage.Sets/src/mage/sets/limitedalpha/IslandSanctuary.java @@ -0,0 +1,123 @@ +/* + * 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.limitedalpha; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.combat.CantAttackYouAllEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.IslandwalkAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class IslandSanctuary extends CardImpl { + + public IslandSanctuary(UUID ownerId) { + super(ownerId, 209, "Island Sanctuary", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "LEA"; + + // If you would draw a card during your draw step, instead you may skip that draw. If you do, until your next turn, you can't be attacked except by creatures with flying and/or islandwalk. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new IslandSanctuaryEffect())); + } + + public IslandSanctuary(final IslandSanctuary card) { + super(card); + } + + @Override + public IslandSanctuary copy() { + return new IslandSanctuary(this); + } +} + +class IslandSanctuaryEffect extends ReplacementEffectImpl { + + private final static FilterCreaturePermanent notFlyingorIslandwalkCreatures = new FilterCreaturePermanent("except by creatures with flying and/or islandwalk"); + + static { + notFlyingorIslandwalkCreatures.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + notFlyingorIslandwalkCreatures.add(Predicates.not(new AbilityPredicate(IslandwalkAbility.class))); + } + + IslandSanctuaryEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "If you would draw a card during your draw step, instead you may skip that draw. If you do, until your next turn, you can't be attacked except by creatures with flying and/or islandwalk"; + } + + IslandSanctuaryEffect(final IslandSanctuaryEffect effect) { + super(effect); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(event.getPlayerId()); + if (controller != null && controller.chooseUse(outcome, "Skip draw card? (If you do, until your next turn, you can't be attacked except by creatures with flying and/or islandwalk)", source, game)) { + game.informPlayers(controller.getLogName() + " skips his or her draw card action. Until his or her next turn, he or she can't be attacked except by creatures with flying and/or islandwalk"); + game.addEffect(new CantAttackYouAllEffect(Duration.UntilYourNextTurn, notFlyingorIslandwalkCreatures), source); + return true; + } + return false; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DRAW_CARD; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return source.getControllerId().equals(event.getPlayerId()) && game.getTurn().getStepType().equals(PhaseStep.DRAW); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public IslandSanctuaryEffect copy() { + return new IslandSanctuaryEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/limitedbeta/IslandSanctuary.java b/Mage.Sets/src/mage/sets/limitedbeta/IslandSanctuary.java new file mode 100644 index 00000000000..3e66149dbb5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/limitedbeta/IslandSanctuary.java @@ -0,0 +1,52 @@ +/* + * 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.limitedbeta; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class IslandSanctuary extends mage.sets.limitedalpha.IslandSanctuary { + + public IslandSanctuary(UUID ownerId) { + super(ownerId); + this.cardNumber = 211; + this.expansionSetCode = "LEB"; + } + + public IslandSanctuary(final IslandSanctuary card) { + super(card); + } + + @Override + public IslandSanctuary copy() { + return new IslandSanctuary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/IslandSanctuary.java b/Mage.Sets/src/mage/sets/masterseditioniv/IslandSanctuary.java new file mode 100644 index 00000000000..8dc77ce2315 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/IslandSanctuary.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditioniv; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class IslandSanctuary extends mage.sets.limitedalpha.IslandSanctuary { + + public IslandSanctuary(UUID ownerId) { + super(ownerId); + this.cardNumber = 15; + this.expansionSetCode = "ME4"; + } + + public IslandSanctuary(final IslandSanctuary card) { + super(card); + } + + @Override + public IslandSanctuary copy() { + return new IslandSanctuary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/revisededition/IslandSanctuary.java b/Mage.Sets/src/mage/sets/revisededition/IslandSanctuary.java new file mode 100644 index 00000000000..a7e0b44651a --- /dev/null +++ b/Mage.Sets/src/mage/sets/revisededition/IslandSanctuary.java @@ -0,0 +1,52 @@ +/* + * 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.revisededition; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class IslandSanctuary extends mage.sets.limitedalpha.IslandSanctuary { + + public IslandSanctuary(UUID ownerId) { + super(ownerId); + this.cardNumber = 209; + this.expansionSetCode = "3ED"; + } + + public IslandSanctuary(final IslandSanctuary card) { + super(card); + } + + @Override + public IslandSanctuary copy() { + return new IslandSanctuary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/stronghold/Awakening.java b/Mage.Sets/src/mage/sets/stronghold/Awakening.java new file mode 100644 index 00000000000..51e8196e645 --- /dev/null +++ b/Mage.Sets/src/mage/sets/stronghold/Awakening.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.stronghold; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.common.UntapAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author LevelX2 + */ +public class Awakening extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("creatures and lands"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND) + )); + } + + public Awakening(UUID ownerId) { + super(ownerId, 51, "Awakening", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}"); + this.expansionSetCode = "STH"; + + // At the beginning of each upkeep, untap all creatures and lands. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new UntapAllEffect(filter), TargetController.ANY, false)); + } + + public Awakening(final Awakening card) { + super(card); + } + + @Override + public Awakening copy() { + return new Awakening(this); + } +} diff --git a/Mage.Sets/src/mage/sets/unlimitededition/IslandSanctuary.java b/Mage.Sets/src/mage/sets/unlimitededition/IslandSanctuary.java new file mode 100644 index 00000000000..f7c31dedb27 --- /dev/null +++ b/Mage.Sets/src/mage/sets/unlimitededition/IslandSanctuary.java @@ -0,0 +1,52 @@ +/* + * 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.unlimitededition; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class IslandSanctuary extends mage.sets.limitedalpha.IslandSanctuary { + + public IslandSanctuary(UUID ownerId) { + super(ownerId); + this.cardNumber = 210; + this.expansionSetCode = "2ED"; + } + + public IslandSanctuary(final IslandSanctuary card) { + super(card); + } + + @Override + public IslandSanctuary copy() { + return new IslandSanctuary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/vintagemasters/SelvalaExplorerReturned.java b/Mage.Sets/src/mage/sets/vintagemasters/SelvalaExplorerReturned.java new file mode 100644 index 00000000000..3a88cb54f45 --- /dev/null +++ b/Mage.Sets/src/mage/sets/vintagemasters/SelvalaExplorerReturned.java @@ -0,0 +1,112 @@ +/* + * 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.vintagemasters; + +import java.util.UUID; +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.ParleyCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardAllEffect; +import mage.cards.CardImpl; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class SelvalaExplorerReturned extends CardImpl { + + public SelvalaExplorerReturned(UUID ownerId) { + super(ownerId, 260, "Selvala, Explorer Returned", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}{W}"); + this.expansionSetCode = "VMA"; + this.supertype.add("Legendary"); + this.subtype.add("Elf"); + this.subtype.add("Scout"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Parley - {T}: Each player reveals the top card of his or her library. For each nonland card revealed this way, add {G} to your mana pool and you gain 1 life. Then each player draws a card. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SelvalaExplorerReturnedEffect(), new TapSourceCost()); + ability.setAbilityWord(AbilityWord.PARLEY); + Effect effect = new DrawCardAllEffect(1); + effect.setText("Then each player draws a card"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public SelvalaExplorerReturned(final SelvalaExplorerReturned card) { + super(card); + } + + @Override + public SelvalaExplorerReturned copy() { + return new SelvalaExplorerReturned(this); + } +} + +class SelvalaExplorerReturnedEffect extends OneShotEffect { + + public SelvalaExplorerReturnedEffect() { + super(Outcome.Benefit); + this.staticText = "Each player reveals the top card of his or her library. For each nonland card revealed this way, add {G} to your mana pool and you gain 1 life"; + } + + public SelvalaExplorerReturnedEffect(final SelvalaExplorerReturnedEffect effect) { + super(effect); + } + + @Override + public SelvalaExplorerReturnedEffect copy() { + return new SelvalaExplorerReturnedEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int parley = ParleyCount.getInstance().calculate(game, source, this); + if (parley > 0) { + controller.getManaPool().addMana(new Mana(0, parley, 0, 0, 0, 0, 0), game, source); + controller.gainLife(parley, game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/MagosiTheWaterveil.java b/Mage.Sets/src/mage/sets/zendikar/MagosiTheWaterveil.java index 578345c2938..6850c94e1c8 100644 --- a/Mage.Sets/src/mage/sets/zendikar/MagosiTheWaterveil.java +++ b/Mage.Sets/src/mage/sets/zendikar/MagosiTheWaterveil.java @@ -28,9 +28,6 @@ package mage.sets.zendikar; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -38,17 +35,15 @@ import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.ReturnToHandSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; +import mage.abilities.effects.common.turn.SkipNextTurnSourceEffect; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; -import mage.constants.Outcome; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.turn.TurnMod; -import mage.players.Player; /** * @@ -62,21 +57,22 @@ public class MagosiTheWaterveil extends CardImpl { // Magosi, the Waterveil enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - - // {tap}: Add {U} to your mana pool. + + // {T}: Add {U} to your mana pool. this.addAbility(new BlueManaAbility()); - - // {U}, {tap}: Put an eon counter on Magosi, the Waterveil. Skip your next turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MagosiTheWaterveilEffect(), new ManaCostsImpl("{U}")); + + // {U}, {T}: Put an eon counter on Magosi, the Waterveil. Skip your next turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.EON.createInstance()), new ManaCostsImpl("{U}")); + ability.addEffect(new SkipNextTurnSourceEffect()); ability.addCost(new TapSourceCost()); this.addAbility(ability); - - // {tap}, Remove an eon counter from Magosi, the Waterveil and return it to its owner's hand: Take an extra turn after this one. + + // {T}, Remove an eon counter from Magosi, the Waterveil and return it to its owner's hand: Take an extra turn after this one. Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddExtraTurnControllerEffect(), new TapSourceCost()); ability2.addCost(new RemoveCountersSourceCost(CounterType.EON.createInstance())); ability2.addCost(new ReturnToHandSourceCost()); this.addAbility(ability2); - + } public MagosiTheWaterveil(final MagosiTheWaterveil card) { @@ -88,35 +84,3 @@ public class MagosiTheWaterveil extends CardImpl { return new MagosiTheWaterveil(this); } } - -class MagosiTheWaterveilEffect extends OneShotEffect { - - public MagosiTheWaterveilEffect() { - super(Outcome.Neutral); - staticText = "Put an eon counter on Magosi, the Waterveil. Skip your next turn"; - } - - public MagosiTheWaterveilEffect(final MagosiTheWaterveilEffect effect) { - super(effect); - } - - @Override - public MagosiTheWaterveilEffect copy() { - return new MagosiTheWaterveilEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent magosi = game.getPermanent(source.getSourceId()); - Player player = game.getPlayer(source.getControllerId()); - - if (magosi != null) { - magosi.addCounters(CounterType.EON.createInstance(), game); - } - if (player != null) { - game.getState().getTurnMods().add(new TurnMod(player.getId(), true)); - } - return true; - } - -} \ No newline at end of file diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java new file mode 100644 index 00000000000..008969e24fd --- /dev/null +++ b/Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java @@ -0,0 +1,98 @@ +/* + * 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.abilities.dynamicvalue.common; + +import java.io.ObjectStreamException; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.MageSingleton; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.cards.Card; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.game.Game; +import mage.players.Player; + +/** + * Don't use this for continuous effects because it applies a reveal effect! + * + * @author LevelX2 + */ +public class ParleyCount implements DynamicValue, MageSingleton { + + private static final ParleyCount fINSTANCE = new ParleyCount(); + + private Object readResolve() throws ObjectStreamException { + return fINSTANCE; + } + + public static ParleyCount getInstance() { + return fINSTANCE; + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + // Each player reveals the top card of his or her library. For each nonland card revealed this way + int parleyValue = 0; + MageObject sourceObject = game.getObject(sourceAbility.getSourceId()); + if (sourceObject != null) { + for (UUID playerId : game.getState().getPlayerList(sourceAbility.getControllerId())) { + Player player = game.getPlayer(playerId); + if (player != null) { + Card card = player.getLibrary().getFromTop(game); + if (card != null) { + if (!card.getCardType().contains(CardType.LAND)) { + parleyValue++; + } + player.revealCards(sourceObject.getIdName() + " (" + player.getName() + ")", new CardsImpl(card), game); + } + } + + } + } + return parleyValue; + } + + @Override + public DynamicValue copy() { + return fINSTANCE; + } + + @Override + public String toString() { + return "1"; + } + + @Override + public String getMessage() { + return "Parley"; + } + +} diff --git a/Mage/src/mage/abilities/effects/common/UntapAllEffect.java b/Mage/src/mage/abilities/effects/common/UntapAllEffect.java new file mode 100644 index 00000000000..b2b05b496d7 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/UntapAllEffect.java @@ -0,0 +1,69 @@ +/* + * 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.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class UntapAllEffect extends OneShotEffect { + + private final FilterPermanent filter; + + public UntapAllEffect(FilterPermanent filter) { + super(Outcome.Untap); + staticText = "untap all " + filter.getMessage(); + this.filter = filter; + } + + public UntapAllEffect(final UntapAllEffect effect) { + super(effect); + this.filter = effect.filter; + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { + permanent.untap(game); + } + return true; + } + + @Override + public UntapAllEffect copy() { + return new UntapAllEffect(this); + } + +} diff --git a/Mage/src/mage/constants/AbilityWord.java b/Mage/src/mage/constants/AbilityWord.java index c050ab0e945..1ef899c62fd 100644 --- a/Mage/src/mage/constants/AbilityWord.java +++ b/Mage/src/mage/constants/AbilityWord.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.constants; /** @@ -33,15 +32,17 @@ package mage.constants; * @author LevelX2 */ public enum AbilityWord { + BLOODRUSH("Bloodrush"), CONSTELLATION("Constellation"), - FEROCIOUS("Ferocious"), + FEROCIOUS("Ferocious"), + FORMIDABLE("Formidable"), + GRANDEUR("Grandeur"), HELLBENT("Hellbent"), HEROIC("Heroic"), - FORMIDABLE("Formidable"), LANDFALL("Landfall"), METALCRAFT("Metalcraft"), - GRANDEUR("Grandeur"), + PARLEY("Parley"), RAID("Raid"); private final String text; From 88c5a0993f4430843304e1231310c1b6db18ebff Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 27 Jul 2015 20:28:35 +0300 Subject: [PATCH 209/375] Implement cards: Divine Light, Putrid Warrior, Squee's Revenge, and Tundra Kavu --- .../src/mage/sets/apocalypse/DivineLight.java | 68 +++++++++ .../mage/sets/apocalypse/PutridWarrior.java | 144 ++++++++++++++++++ .../mage/sets/apocalypse/SqueesRevenge.java | 95 ++++++++++++ .../src/mage/sets/apocalypse/TundraKavu.java | 112 ++++++++++++++ 4 files changed, 419 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/DivineLight.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/PutridWarrior.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/SqueesRevenge.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/TundraKavu.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/DivineLight.java b/Mage.Sets/src/mage/sets/apocalypse/DivineLight.java new file mode 100644 index 00000000000..6cf52f3af6d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/DivineLight.java @@ -0,0 +1,68 @@ +/* + * 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.abilities.effects.common.PreventAllDamageToAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LoneFox + */ +public class DivineLight extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public DivineLight(UUID ownerId) { + super(ownerId, 8, "Divine Light", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{W}"); + this.expansionSetCode = "APC"; + + // Prevent all damage that would be dealt this turn to creatures you control. + this.getSpellAbility().addEffect(new PreventAllDamageToAllEffect(Duration.EndOfTurn, filter)); + } + + public DivineLight(final DivineLight card) { + super(card); + } + + @Override + public DivineLight copy() { + return new DivineLight(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/PutridWarrior.java b/Mage.Sets/src/mage/sets/apocalypse/PutridWarrior.java new file mode 100644 index 00000000000..5c166fb112d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/PutridWarrior.java @@ -0,0 +1,144 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.LoseLifeAllPlayersEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent.EventType; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LoneFox + + */ +public class PutridWarrior extends CardImpl { + + public PutridWarrior(UUID ownerId) { + super(ownerId, 117, "Putrid Warrior", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}{B}"); + this.expansionSetCode = "APC"; + this.subtype.add("Zombie"); + this.subtype.add("Soldier"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Putrid Warrior deals damage, choose one - Each player loses 1 life; or each player gains 1 life. + Ability ability = new PutridWarriorDealsDamageTriggeredAbility(new LoseLifeAllPlayersEffect(1)); + Mode mode = new Mode(); + mode.getEffects().add(new PutridWarriorGainLifeEffect()); + ability.addMode(mode); + this.addAbility(ability); + } + + public PutridWarrior(final PutridWarrior card) { + super(card); + } + + @Override + public PutridWarrior copy() { + return new PutridWarrior(this); + } +} + + +class PutridWarriorDealsDamageTriggeredAbility extends TriggeredAbilityImpl { + + public PutridWarriorDealsDamageTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect, false); + } + + public PutridWarriorDealsDamageTriggeredAbility(final PutridWarriorDealsDamageTriggeredAbility ability) { + super(ability); + } + + @Override + public PutridWarriorDealsDamageTriggeredAbility copy() { + return new PutridWarriorDealsDamageTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGED_PLAYER || event.getType() == EventType.DAMAGED_CREATURE + || event.getType() == EventType.DAMAGED_PLANESWALKER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getSourceId().equals(this.sourceId); + } + + @Override + public String getRule() { + return "Whenever {this} deals damage, " + super.getRule(); + } +} + + +class PutridWarriorGainLifeEffect extends OneShotEffect { + + public PutridWarriorGainLifeEffect() { + super(Outcome.GainLife); + staticText = "Each player gains 1 life."; + } + + public PutridWarriorGainLifeEffect(final PutridWarriorGainLifeEffect effect) { + super(effect); + } + + @Override + public PutridWarriorGainLifeEffect copy() { + return new PutridWarriorGainLifeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for(UUID playerId: game.getPlayer(source.getControllerId()).getInRange()) { + Player player = game.getPlayer(playerId); + if(player != null) { + player.gainLife(1, game); + } + } + return true; + } + +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/SqueesRevenge.java b/Mage.Sets/src/mage/sets/apocalypse/SqueesRevenge.java new file mode 100644 index 00000000000..b513bdc569d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/SqueesRevenge.java @@ -0,0 +1,95 @@ +/* + * 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.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LoneFox + */ +public class SqueesRevenge extends CardImpl { + + public SqueesRevenge(UUID ownerId) { + super(ownerId, 123, "Squee's Revenge", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{U}{R}"); + this.expansionSetCode = "APC"; + + // Choose a number. Flip a coin that many times or until you lose a flip, whichever comes first. If you win all the flips, draw two cards for each flip. + this.getSpellAbility().addEffect(new SqueesRevengeEffect()); + } + + public SqueesRevenge(final SqueesRevenge card) { + super(card); + } + + @Override + public SqueesRevenge copy() { + return new SqueesRevenge(this); + } +} + +class SqueesRevengeEffect extends OneShotEffect { + + public SqueesRevengeEffect() { + super(Outcome.DrawCard); + staticText = "Choose a number. Flip a coin that many times or until you lose a flip, whichever comes first. If you win all the flips, draw two cards for each flip."; + } + + public SqueesRevengeEffect(final SqueesRevengeEffect effect) { + super(effect); + } + + public SqueesRevengeEffect copy() { + return new SqueesRevengeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if(player != null) { + int number = player.announceXMana(0, Integer.MAX_VALUE, "Choose how many times to flip a coin", game, source); + game.informPlayers(player.getLogName() + " chooses " + number + "."); + for(int i = 0; i < number; i++) { + if(!player.flipCoin(game)) { + return true; + } + } + player.drawCards(2 * number, game); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/TundraKavu.java b/Mage.Sets/src/mage/sets/apocalypse/TundraKavu.java new file mode 100644 index 00000000000..e1f72960bf5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/TundraKavu.java @@ -0,0 +1,112 @@ +/* + * 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.LinkedHashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LoneFox + */ +public class TundraKavu extends CardImpl { + + public TundraKavu(UUID ownerId) { + super(ownerId, 71, "Tundra Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "APC"; + this.subtype.add("Kavu"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {T}: Target land becomes a Plains or an Island until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TundraKavuEffect(), new TapSourceCost()); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public TundraKavu(final TundraKavu card) { + super(card); + } + + @Override + public TundraKavu copy() { + return new TundraKavu(this); + } +} + + +class TundraKavuEffect extends BecomesBasicLandTargetEffect { + + public TundraKavuEffect() { + super(Duration.EndOfTurn, false, true, ""); + staticText = "Target land becomes a Plains or an Island until end of turn."; + } + + public TundraKavuEffect(final TundraKavuEffect effect) { + super(effect); + } + + public TundraKavuEffect copy() { + return new TundraKavuEffect(this); + } + + @Override + public void init(Ability source, Game game) { + landTypes.clear(); + Player controller = game.getPlayer(source.getControllerId()); + if(controller != null) { + Set choiceSet = new LinkedHashSet<>(); + choiceSet.add("Island"); + choiceSet.add("Plains"); + ChoiceImpl choice = new ChoiceImpl(true); + choice.setChoices(choiceSet); + choice.setMessage("Choose a basic land type"); + controller.choose(outcome, choice, game); + landTypes.add(choice.getChoice()); + } else { + this.discard(); + } + + super.init(source, game); + } +} From 023da6fdd431be7cc9626b0e85c3678d98c2740a Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 27 Jul 2015 20:54:05 +0300 Subject: [PATCH 210/375] Add missing image variants. Correct the tooltip text of Phyrexian War Beast. --- .../{Astrolabe.java => Astrolabe1.java} | 10 ++-- .../src/mage/sets/alliances/Astrolabe2.java | 52 ++++++++++++++++++ ...FeastOrFamine.java => FeastOrFamine1.java} | 10 ++-- .../mage/sets/alliances/FeastOrFamine2.java | 52 ++++++++++++++++++ ...GorillaShaman.java => GorillaShaman1.java} | 12 ++--- .../mage/sets/alliances/GorillaShaman2.java | 53 +++++++++++++++++++ ...nWarBeast.java => PhyrexianWarBeast1.java} | 19 ++++--- .../sets/alliances/PhyrexianWarBeast2.java | 52 ++++++++++++++++++ .../mastersedition/PhyrexianWarBeast.java | 2 +- .../sets/masterseditionii/GorillaShaman.java | 2 +- 10 files changed, 239 insertions(+), 25 deletions(-) rename Mage.Sets/src/mage/sets/alliances/{Astrolabe.java => Astrolabe1.java} (89%) create mode 100644 Mage.Sets/src/mage/sets/alliances/Astrolabe2.java rename Mage.Sets/src/mage/sets/alliances/{FeastOrFamine.java => FeastOrFamine1.java} (88%) create mode 100644 Mage.Sets/src/mage/sets/alliances/FeastOrFamine2.java rename Mage.Sets/src/mage/sets/alliances/{GorillaShaman.java => GorillaShaman1.java} (94%) create mode 100644 Mage.Sets/src/mage/sets/alliances/GorillaShaman2.java rename Mage.Sets/src/mage/sets/alliances/{PhyrexianWarBeast.java => PhyrexianWarBeast1.java} (84%) create mode 100644 Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast2.java diff --git a/Mage.Sets/src/mage/sets/alliances/Astrolabe.java b/Mage.Sets/src/mage/sets/alliances/Astrolabe1.java similarity index 89% rename from Mage.Sets/src/mage/sets/alliances/Astrolabe.java rename to Mage.Sets/src/mage/sets/alliances/Astrolabe1.java index 33660230615..ec59b50b40d 100644 --- a/Mage.Sets/src/mage/sets/alliances/Astrolabe.java +++ b/Mage.Sets/src/mage/sets/alliances/Astrolabe1.java @@ -33,20 +33,20 @@ import java.util.UUID; * * @author fireshoes */ -public class Astrolabe extends mage.sets.masterseditioniii.Astrolabe { +public class Astrolabe1 extends mage.sets.masterseditioniii.Astrolabe { - public Astrolabe(UUID ownerId) { + public Astrolabe1(UUID ownerId) { super(ownerId); this.cardNumber = 159; this.expansionSetCode = "ALL"; } - public Astrolabe(final Astrolabe card) { + public Astrolabe1(final Astrolabe1 card) { super(card); } @Override - public Astrolabe copy() { - return new Astrolabe(this); + public Astrolabe1 copy() { + return new Astrolabe1(this); } } diff --git a/Mage.Sets/src/mage/sets/alliances/Astrolabe2.java b/Mage.Sets/src/mage/sets/alliances/Astrolabe2.java new file mode 100644 index 00000000000..1ef02040269 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/Astrolabe2.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Astrolabe2 extends mage.sets.masterseditioniii.Astrolabe { + + public Astrolabe2(UUID ownerId) { + super(ownerId); + this.cardNumber = 160; + this.expansionSetCode = "ALL"; + } + + public Astrolabe2(final Astrolabe2 card) { + super(card); + } + + @Override + public Astrolabe2 copy() { + return new Astrolabe2(this); + } +} diff --git a/Mage.Sets/src/mage/sets/alliances/FeastOrFamine.java b/Mage.Sets/src/mage/sets/alliances/FeastOrFamine1.java similarity index 88% rename from Mage.Sets/src/mage/sets/alliances/FeastOrFamine.java rename to Mage.Sets/src/mage/sets/alliances/FeastOrFamine1.java index 338c1d5b0b4..dcdb28a3477 100644 --- a/Mage.Sets/src/mage/sets/alliances/FeastOrFamine.java +++ b/Mage.Sets/src/mage/sets/alliances/FeastOrFamine1.java @@ -33,20 +33,20 @@ import java.util.UUID; * * @author fireshoes */ -public class FeastOrFamine extends mage.sets.izzetvsgolgari.FeastOrFamine { +public class FeastOrFamine1 extends mage.sets.izzetvsgolgari.FeastOrFamine { - public FeastOrFamine(UUID ownerId) { + public FeastOrFamine1(UUID ownerId) { super(ownerId); this.cardNumber = 8; this.expansionSetCode = "ALL"; } - public FeastOrFamine(final FeastOrFamine card) { + public FeastOrFamine1(final FeastOrFamine1 card) { super(card); } @Override - public FeastOrFamine copy() { - return new FeastOrFamine(this); + public FeastOrFamine1 copy() { + return new FeastOrFamine1(this); } } diff --git a/Mage.Sets/src/mage/sets/alliances/FeastOrFamine2.java b/Mage.Sets/src/mage/sets/alliances/FeastOrFamine2.java new file mode 100644 index 00000000000..36b61ba137c --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/FeastOrFamine2.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class FeastOrFamine2 extends mage.sets.izzetvsgolgari.FeastOrFamine { + + public FeastOrFamine2(UUID ownerId) { + super(ownerId); + this.cardNumber = 9; + this.expansionSetCode = "ALL"; + } + + public FeastOrFamine2(final FeastOrFamine2 card) { + super(card); + } + + @Override + public FeastOrFamine2 copy() { + return new FeastOrFamine2(this); + } +} diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaShaman.java b/Mage.Sets/src/mage/sets/alliances/GorillaShaman1.java similarity index 94% rename from Mage.Sets/src/mage/sets/alliances/GorillaShaman.java rename to Mage.Sets/src/mage/sets/alliances/GorillaShaman1.java index bc8eed1bc83..edb27282bc7 100644 --- a/Mage.Sets/src/mage/sets/alliances/GorillaShaman.java +++ b/Mage.Sets/src/mage/sets/alliances/GorillaShaman1.java @@ -50,9 +50,9 @@ import mage.target.TargetPermanent; * * @author fireshoes */ -public class GorillaShaman extends CardImpl { +public class GorillaShaman1 extends CardImpl { - public GorillaShaman(UUID ownerId) { + public GorillaShaman1(UUID ownerId) { super(ownerId, 106, "Gorilla Shaman", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); this.expansionSetCode = "ALL"; this.subtype.add("Ape"); @@ -65,7 +65,7 @@ public class GorillaShaman extends CardImpl { ability.addTarget(new TargetPermanent(new FilterArtifactPermanent("noncreature artifact with converted mana cost X"))); this.addAbility(ability); } - + @Override public void adjustTargets(Ability ability, Game game) { if (ability instanceof SimpleActivatedAbility) { @@ -79,12 +79,12 @@ public class GorillaShaman extends CardImpl { } } - public GorillaShaman(final GorillaShaman card) { + public GorillaShaman1(final GorillaShaman1 card) { super(card); } @Override - public GorillaShaman copy() { - return new GorillaShaman(this); + public GorillaShaman1 copy() { + return new GorillaShaman1(this); } } diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaShaman2.java b/Mage.Sets/src/mage/sets/alliances/GorillaShaman2.java new file mode 100644 index 00000000000..d6f1c2181d4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/GorillaShaman2.java @@ -0,0 +1,53 @@ +/* + * 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.alliances; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class GorillaShaman2 extends GorillaShaman1 { + + public GorillaShaman2(UUID ownerId) { + super(ownerId); + this.cardNumber = 107; + this.rarity = Rarity.UNCOMMON; + } + + public GorillaShaman2(final GorillaShaman2 card) { + super(card); + } + + @Override + public GorillaShaman2 copy() { + return new GorillaShaman2(this); + } +} diff --git a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast.java b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java similarity index 84% rename from Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast.java rename to Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java index 552835b9017..5dad7465e1b 100644 --- a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast.java +++ b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java @@ -31,6 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageControllerEffect; import mage.abilities.effects.common.SacrificeTargetEffect; import mage.cards.CardImpl; @@ -43,9 +44,9 @@ import mage.target.common.TargetControlledPermanent; * * @author fireshoes */ -public class PhyrexianWarBeast extends CardImpl { +public class PhyrexianWarBeast1 extends CardImpl { - public PhyrexianWarBeast(UUID ownerId) { + public PhyrexianWarBeast1(UUID ownerId) { super(ownerId, 169, "Phyrexian War Beast", Rarity.COMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); this.expansionSetCode = "ALL"; this.subtype.add("Beast"); @@ -53,18 +54,22 @@ public class PhyrexianWarBeast extends CardImpl { this.toughness = new MageInt(4); // When Phyrexian War Beast leaves the battlefield, sacrifice a land and Phyrexian War Beast deals 1 damage to you. - Ability ability = new LeavesBattlefieldTriggeredAbility(new SacrificeTargetEffect(), false); - ability.addEffect(new DamageControllerEffect(1)); + Effect effect = new SacrificeTargetEffect(); + effect.setText("sacrifice a land"); + Ability ability = new LeavesBattlefieldTriggeredAbility(effect, false); + effect = new DamageControllerEffect(1); + effect.setText("and {this} deals 1 damage to you"); + ability.addEffect(effect); ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); this.addAbility(ability); } - public PhyrexianWarBeast(final PhyrexianWarBeast card) { + public PhyrexianWarBeast1(final PhyrexianWarBeast1 card) { super(card); } @Override - public PhyrexianWarBeast copy() { - return new PhyrexianWarBeast(this); + public PhyrexianWarBeast1 copy() { + return new PhyrexianWarBeast1(this); } } diff --git a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast2.java b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast2.java new file mode 100644 index 00000000000..baa04a1b989 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast2.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class PhyrexianWarBeast2 extends PhyrexianWarBeast1 { + + public PhyrexianWarBeast2(UUID ownerId) { + super(ownerId); + this.cardNumber = 170; + } + + public PhyrexianWarBeast2(final PhyrexianWarBeast2 card) { + super(card); + } + + @Override + public PhyrexianWarBeast2 copy() { + return new PhyrexianWarBeast2(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.java b/Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.java index 67d8bff8d78..cfc764e03a9 100644 --- a/Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.java +++ b/Mage.Sets/src/mage/sets/mastersedition/PhyrexianWarBeast.java @@ -34,7 +34,7 @@ import mage.constants.Rarity; * * @author fireshoes */ -public class PhyrexianWarBeast extends mage.sets.alliances.PhyrexianWarBeast { +public class PhyrexianWarBeast extends mage.sets.alliances.PhyrexianWarBeast1 { public PhyrexianWarBeast(UUID ownerId) { super(ownerId); diff --git a/Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.java b/Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.java index 38a2dad555f..e9d1bdf4bbc 100644 --- a/Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.java +++ b/Mage.Sets/src/mage/sets/masterseditionii/GorillaShaman.java @@ -34,7 +34,7 @@ import mage.constants.Rarity; * * @author fireshoes */ -public class GorillaShaman extends mage.sets.alliances.GorillaShaman { +public class GorillaShaman extends mage.sets.alliances.GorillaShaman1 { public GorillaShaman(UUID ownerId) { super(ownerId); From 0d7e6b8a28efecbd940ea02aaae677e07b3aeffe Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 27 Jul 2015 21:39:46 +0300 Subject: [PATCH 211/375] Implement the Leech cycle from Invasion --- .../mage/sets/invasion/AlabasterLeech.java | 75 +++++++++++++++++ .../mage/sets/invasion/AndraditeLeech.java | 81 +++++++++++++++++++ .../src/mage/sets/invasion/JadeLeech.java | 75 +++++++++++++++++ .../src/mage/sets/invasion/RubyLeech.java | 78 ++++++++++++++++++ .../src/mage/sets/invasion/SapphireLeech.java | 78 ++++++++++++++++++ 5 files changed, 387 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/invasion/AlabasterLeech.java create mode 100644 Mage.Sets/src/mage/sets/invasion/AndraditeLeech.java create mode 100644 Mage.Sets/src/mage/sets/invasion/JadeLeech.java create mode 100644 Mage.Sets/src/mage/sets/invasion/RubyLeech.java create mode 100644 Mage.Sets/src/mage/sets/invasion/SapphireLeech.java diff --git a/Mage.Sets/src/mage/sets/invasion/AlabasterLeech.java b/Mage.Sets/src/mage/sets/invasion/AlabasterLeech.java new file mode 100644 index 00000000000..68d3990309a --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/AlabasterLeech.java @@ -0,0 +1,75 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.cost.SpellsCostIncreasementControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author LoneFox + */ +public class AlabasterLeech extends CardImpl { + + private static final FilterCard filter = new FilterCard("White spells"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public AlabasterLeech(UUID ownerId) { + super(ownerId, 1, "Alabaster Leech", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "INV"; + this.subtype.add("Leech"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // White spells you cast cost {W} more to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new SpellsCostIncreasementControllerEffect(filter, new ManaCostsImpl("{W}")))); + } + + public AlabasterLeech(final AlabasterLeech card) { + super(card); + } + + @Override + public AlabasterLeech copy() { + return new AlabasterLeech(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/AndraditeLeech.java b/Mage.Sets/src/mage/sets/invasion/AndraditeLeech.java new file mode 100644 index 00000000000..a506047da25 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/AndraditeLeech.java @@ -0,0 +1,81 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.cost.SpellsCostIncreasementControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author LoneFox + */ +public class AndraditeLeech extends CardImpl { + + private static final FilterCard filter = new FilterCard("Black spells"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLACK)); + } + + public AndraditeLeech(UUID ownerId) { + super(ownerId, 93, "Andradite Leech", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "INV"; + this.subtype.add("Leech"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Black spells you cast cost {B} more to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new SpellsCostIncreasementControllerEffect(filter, new ManaCostsImpl("{B}")))); + // {B}: Andradite Leech gets +1/+1 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{B}"))); + } + + public AndraditeLeech(final AndraditeLeech card) { + super(card); + } + + @Override + public AndraditeLeech copy() { + return new AndraditeLeech(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/JadeLeech.java b/Mage.Sets/src/mage/sets/invasion/JadeLeech.java new file mode 100644 index 00000000000..31d429ffa21 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/JadeLeech.java @@ -0,0 +1,75 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.cost.SpellsCostIncreasementControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author LoneFox + */ +public class JadeLeech extends CardImpl { + + private static final FilterCard filter = new FilterCard("Green spells"); + + static { + filter.add(new ColorPredicate(ObjectColor.GREEN)); + } + + public JadeLeech(UUID ownerId) { + super(ownerId, 190, "Jade Leech", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + this.expansionSetCode = "INV"; + this.subtype.add("Leech"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Green spells you cast cost {G} more to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new SpellsCostIncreasementControllerEffect(filter, new ManaCostsImpl("{G}")))); + } + + public JadeLeech(final JadeLeech card) { + super(card); + } + + @Override + public JadeLeech copy() { + return new JadeLeech(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/RubyLeech.java b/Mage.Sets/src/mage/sets/invasion/RubyLeech.java new file mode 100644 index 00000000000..1f09b7471a3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/RubyLeech.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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.cost.SpellsCostIncreasementControllerEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author LoneFox + */ +public class RubyLeech extends CardImpl { + + private static final FilterCard filter = new FilterCard("Red spells"); + + static { + filter.add(new ColorPredicate(ObjectColor.RED)); + } + + public RubyLeech(UUID ownerId) { + super(ownerId, 161, "Ruby Leech", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Leech"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + // Red spells you cast cost {R} more to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new SpellsCostIncreasementControllerEffect(filter, new ManaCostsImpl("{R}")))); + } + + public RubyLeech(final RubyLeech card) { + super(card); + } + + @Override + public RubyLeech copy() { + return new RubyLeech(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/SapphireLeech.java b/Mage.Sets/src/mage/sets/invasion/SapphireLeech.java new file mode 100644 index 00000000000..b1e8a9fb239 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/SapphireLeech.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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.cost.SpellsCostIncreasementControllerEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author LoneFox + */ +public class SapphireLeech extends CardImpl { + + private static final FilterCard filter = new FilterCard("Blue spells"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLUE)); + } + + public SapphireLeech(UUID ownerId) { + super(ownerId, 71, "Sapphire Leech", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "INV"; + this.subtype.add("Leech"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Blue spells you cast cost {U} more to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new SpellsCostIncreasementControllerEffect(filter, new ManaCostsImpl("{U}")))); + } + + public SapphireLeech(final SapphireLeech card) { + super(card); + } + + @Override + public SapphireLeech copy() { + return new SapphireLeech(this); + } +} From edd7861fd3473743156c87c8a53c2574a4f99aea Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 21:20:08 +0200 Subject: [PATCH 212/375] * Kalitas, Bloodchief of Ghet - Added missing Legendary supertype. --- .../sets/zendikar/KalitasBloodchiefOfGhet.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/zendikar/KalitasBloodchiefOfGhet.java b/Mage.Sets/src/mage/sets/zendikar/KalitasBloodchiefOfGhet.java index 3e521b30c4d..2e34253f3ee 100644 --- a/Mage.Sets/src/mage/sets/zendikar/KalitasBloodchiefOfGhet.java +++ b/Mage.Sets/src/mage/sets/zendikar/KalitasBloodchiefOfGhet.java @@ -28,10 +28,6 @@ package mage.sets.zendikar; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -40,6 +36,10 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; @@ -53,16 +53,16 @@ public class KalitasBloodchiefOfGhet extends CardImpl { public KalitasBloodchiefOfGhet(UUID ownerId) { super(ownerId, 99, "Kalitas, Bloodchief of Ghet", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{5}{B}{B}"); + this.supertype.add("Legendary"); this.expansionSetCode = "ZEN"; this.subtype.add("Vampire"); this.subtype.add("Warrior"); - this.power = new MageInt(5); - this.toughness = new MageInt(5); - // {B}{B}{B}, {T}: Destroy target creature. If that creature dies this way, put a black Vampire creature token onto the battlefield. Its power is equal to that creature's power and its toughness is equal to that creature's toughness. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new KalitasDestroyEffect(), new ManaCostsImpl("{B}{B}{B}")); ability.addCost(new TapSourceCost()); + this.power = new MageInt(5); + this.toughness = new MageInt(5); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -114,4 +114,4 @@ class VampireToken extends Token { toughness = new MageInt(tokenToughness); } -} \ No newline at end of file +} From a08e86be97bf89b2f50ab4dfa54afb2f79ebdf2c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 22:11:51 +0200 Subject: [PATCH 213/375] * Recurring Nightmare - Fixed that permanents instead of creatures could be sacrificed to activate the ability. --- Mage.Sets/src/mage/sets/exodus/RecurringNightmare.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/exodus/RecurringNightmare.java b/Mage.Sets/src/mage/sets/exodus/RecurringNightmare.java index 7b1e7534779..200cbf81999 100644 --- a/Mage.Sets/src/mage/sets/exodus/RecurringNightmare.java +++ b/Mage.Sets/src/mage/sets/exodus/RecurringNightmare.java @@ -37,7 +37,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreatureCard; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetControlledPermanent; @@ -47,15 +47,14 @@ import mage.target.common.TargetControlledPermanent; * @author jeffwadsworth */ public class RecurringNightmare extends CardImpl { - + private static final FilterCreatureCard filter = new FilterCreatureCard("creature card in your graveyard"); - private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("creature"); + private static final FilterControlledCreaturePermanent filter2 = new FilterControlledCreaturePermanent("creature"); public RecurringNightmare(UUID ownerId) { super(ownerId, 72, "Recurring Nightmare", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); this.expansionSetCode = "EXO"; - // Sacrifice a creature, Return Recurring Nightmare to its owner's hand: Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToBattlefieldTargetEffect(), new SacrificeTargetCost(new TargetControlledPermanent(filter2))); ability.addTarget(new TargetCardInYourGraveyard(filter)); From 878909809a5cdf859a3b0a7cadf491e5e45f5ba0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 22:18:43 +0200 Subject: [PATCH 214/375] * Deathforge Shaman - Fixed bug that rollbacks game if multikicker is used. --- Mage.Sets/src/mage/sets/worldwake/DeathforgeShaman.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/worldwake/DeathforgeShaman.java b/Mage.Sets/src/mage/sets/worldwake/DeathforgeShaman.java index e2fd72a1fac..74cf754a08d 100644 --- a/Mage.Sets/src/mage/sets/worldwake/DeathforgeShaman.java +++ b/Mage.Sets/src/mage/sets/worldwake/DeathforgeShaman.java @@ -27,6 +27,7 @@ */ package mage.sets.worldwake; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -42,8 +43,6 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; -import java.util.UUID; - /** * * @author jeffwadsworth @@ -61,7 +60,7 @@ public class DeathforgeShaman extends CardImpl { // Multikicker {R} this.addAbility(new MultikickerAbility("{R}")); - + // When Deathforge Shaman enters the battlefield, it deals damage to target player equal to twice the number of times it was kicked. Ability ability = new EntersBattlefieldTriggeredAbility(new DeathforgeShamanEffect()); ability.addTarget(new TargetPlayer()); @@ -101,7 +100,7 @@ class DeathforgeShamanEffect extends OneShotEffect { Player player = game.getPlayer(source.getFirstTarget()); if (player != null) { - player.damage(damage, id, game, false, true); + player.damage(damage, source.getSourceId(), game, false, true); return true; } return false; From c49e18049c74119b8809093a63809e837a671da3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 23:13:15 +0200 Subject: [PATCH 215/375] * Orbs of Warding - Fixed possible null pointer exception. --- Mage.Sets/src/mage/sets/magicorigins/OrbsOfWarding.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/OrbsOfWarding.java b/Mage.Sets/src/mage/sets/magicorigins/OrbsOfWarding.java index a244007d356..fc6732b14ce 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/OrbsOfWarding.java +++ b/Mage.Sets/src/mage/sets/magicorigins/OrbsOfWarding.java @@ -89,7 +89,7 @@ class OrbsOfWardingEffect extends PreventionEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { if (event.getTargetId().equals(source.getControllerId())) { Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); - if (permanent.getCardType().contains(CardType.CREATURE)) { + if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) { return super.applies(event, source, game); } } From b23d987fe7d1d3ef61dd8d0c2c4d4dec843da7ab Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 27 Jul 2015 23:48:17 +0200 Subject: [PATCH 216/375] * Dead Reckoning - Fixed that source of damage was not set correctly. --- Mage.Sets/src/mage/sets/worldwake/DeadReckoning.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/worldwake/DeadReckoning.java b/Mage.Sets/src/mage/sets/worldwake/DeadReckoning.java index fcae572f925..9f4235be957 100644 --- a/Mage.Sets/src/mage/sets/worldwake/DeadReckoning.java +++ b/Mage.Sets/src/mage/sets/worldwake/DeadReckoning.java @@ -28,14 +28,13 @@ package mage.sets.worldwake; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.game.Game; @@ -54,7 +53,6 @@ public class DeadReckoning extends CardImpl { super(ownerId, 56, "Dead Reckoning", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{B}{B}"); this.expansionSetCode = "WWK"; - // You may put target creature card from your graveyard on top of your library. If you do, Dead Reckoning deals damage equal to that card's power to target creature. this.getSpellAbility().addEffect(new DeadReckoningEffect()); @@ -103,7 +101,7 @@ class DeadReckoningEffect extends OneShotEffect { int power = creatureInGraveyard.getPower().getValue(); Permanent creature = game.getPermanent(target2.getFirstTarget()); if (creature != null) { - creature.damage(power, id, game, true, true); + creature.damage(power, source.getSourceId(), game, true, true); return true; } } From 1ef74f32938533a38f58c024ce03600e6aa11cc2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 28 Jul 2015 00:04:57 +0200 Subject: [PATCH 217/375] Fixed some possible null pointer exceptions. --- .../src/mage/player/human/HumanPlayer.java | 2 +- .../effects/AuraReplacementEffect.java | 32 ++-- Mage/src/mage/cards/CardImpl.java | 20 ++- Mage/src/mage/game/combat/Combat.java | 31 ++-- Mage/src/mage/game/permanent/Permanent.java | 142 +++++++++++++----- Mage/src/mage/game/permanent/token/Token.java | 16 +- 6 files changed, 164 insertions(+), 79 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 5989d537f46..5997c368ae7 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -251,7 +251,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean choose(Outcome outcome, Choice choice, Game game) { - if (outcome.equals(Outcome.PutManaInPool)) { + if (Outcome.PutManaInPool.equals(outcome)) { if (currentlyUnpaidMana != null && ManaUtil.tryToAutoSelectAManaColor(choice, currentlyUnpaidMana)) { return true; diff --git a/Mage/src/mage/abilities/effects/AuraReplacementEffect.java b/Mage/src/mage/abilities/effects/AuraReplacementEffect.java index e5cdec0b930..eb62e657c20 100644 --- a/Mage/src/mage/abilities/effects/AuraReplacementEffect.java +++ b/Mage/src/mage/abilities/effects/AuraReplacementEffect.java @@ -51,13 +51,15 @@ import mage.target.common.TargetCardInGraveyard; /** * Cards with the Aura subtype don't change the zone they are in, if there is no * valid target on the battlefield. Also, when entering the battlefield and it - * was not cast (so from Zone != Hand), this effect gets the target to whitch to attach it - * and adds the Aura the the battlefield and attachs it to the target. + * was not cast (so from Zone != Hand), this effect gets the target to whitch to + * attach it and adds the Aura the the battlefield and attachs it to the target. * The "attachTo:" value in game state has to be set therefore. - * - * If no "attachTo:" value is defined, the controlling player has to chose the aura target. * - * This effect is automatically added to ContinuousEffects at the start of a game + * If no "attachTo:" value is defined, the controlling player has to chose the + * aura target. + * + * This effect is automatically added to ContinuousEffects at the start of a + * game * * @author North */ @@ -93,7 +95,7 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { return false; } // Aura enters the battlefield attached - Object object = game.getState().getValue("attachTo:"+card.getId()); + Object object = game.getState().getValue("attachTo:" + card.getId()); if (object != null && object instanceof PermanentCard) { return false; } @@ -113,7 +115,7 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { targetId = stackAbility.getEffects().get(0).getTargetPointer().getFirst(game, stackAbility); } } - + if (targetId == null) { Target target = card.getSpellAbility().getTargets().get(0); enchantCardInGraveyard = target instanceof TargetCardInGraveyard; @@ -122,9 +124,10 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { } Player player = game.getPlayer(card.getOwnerId()); Outcome auraOutcome = Outcome.BoostCreature; - Ability: for (Ability ability:card.getAbilities()) { + Ability: + for (Ability ability : card.getAbilities()) { if (ability instanceof SpellAbility) { - for (Effect effect: ability.getEffects()) { + for (Effect effect : ability.getEffects()) { if (effect instanceof AttachEffect) { auraOutcome = effect.getOutcome(); break Ability; @@ -167,13 +170,16 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { game.getBattlefield().addPermanent(permanent); card.setZone(Zone.BATTLEFIELD, game); game.applyEffects(); - permanent.entersBattlefield(event.getSourceId(), game, fromZone, true); + boolean entered = permanent.entersBattlefield(event.getSourceId(), game, fromZone, true); game.applyEffects(); + if (!entered) { + return false; + } game.fireEvent(new ZoneChangeEvent(permanent, controllerId, fromZone, Zone.BATTLEFIELD)); if (targetCard != null) { permanent.attachTo(targetCard.getId(), game); - } + } if (targetPermanent != null) { targetPermanent.addAttachment(permanent.getId(), game); } @@ -183,7 +189,7 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { } return true; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.ZONE_CHANGE; @@ -192,7 +198,7 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { if (((ZoneChangeEvent) event).getToZone().equals(Zone.BATTLEFIELD) - && !(((ZoneChangeEvent) event).getFromZone().equals(Zone.HAND)) ) { + && !(((ZoneChangeEvent) event).getFromZone().equals(Zone.HAND))) { Card card = game.getCard(event.getTargetId()); if (card != null && card.getCardType().contains(CardType.ENCHANTMENT) && card.hasSubtype("Aura")) { return true; diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index db25e8f955b..c353c8e8d31 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -421,13 +421,17 @@ public abstract class CardImpl extends MageObjectImpl implements Card { game.setZone(objectId, Zone.BATTLEFIELD); game.setScopeRelevant(true); game.applyEffects(); - permanent.entersBattlefield(sourceId, game, event.getFromZone(), true); + boolean entered = permanent.entersBattlefield(sourceId, game, event.getFromZone(), true); game.setScopeRelevant(false); game.applyEffects(); - if (flag) { - permanent.setTapped(true); + if (entered) { + if (flag) { + permanent.setTapped(true); + } + event.setTarget(permanent); + } else { + return false; } - event.setTarget(permanent); break; default: Card sourceCard = game.getCard(sourceId); @@ -603,11 +607,13 @@ public abstract class CardImpl extends MageObjectImpl implements Card { game.setScopeRelevant(true); permanent.setTapped(tapped); permanent.setFaceDown(facedown, game); - permanent.entersBattlefield(sourceId, game, event.getFromZone(), true); + boolean entered = permanent.entersBattlefield(sourceId, game, event.getFromZone(), true); game.setScopeRelevant(false); game.applyEffects(); - game.addSimultaneousEvent(new ZoneChangeEvent(permanent, event.getPlayerId(), fromZone, Zone.BATTLEFIELD)); - return true; + if (entered) { + game.addSimultaneousEvent(new ZoneChangeEvent(permanent, event.getPlayerId(), fromZone, Zone.BATTLEFIELD)); + return true; + } } if (facedown) { this.setFaceDown(false, game); diff --git a/Mage/src/mage/game/combat/Combat.java b/Mage/src/mage/game/combat/Combat.java index 4cc23e31414..1ed22dcf96c 100644 --- a/Mage/src/mage/game/combat/Combat.java +++ b/Mage/src/mage/game/combat/Combat.java @@ -810,19 +810,21 @@ public class Combat implements Serializable, Copyable { // check now, if it already blocks a creature that mustBeBlockedByAtLeastOne if (possibleBlocker.getBlocking() > 0) { CombatGroup combatGroupOfPossibleBlocker = findGroupOfBlocker(possibleBlockerId); - for (UUID blockedAttackerId : combatGroupOfPossibleBlocker.getAttackers()) { - if (mustBeBlockedByAtLeastOne.containsKey(blockedAttackerId)) { - // blocks a creature that has to be blocked by at least one - if (combatGroupOfPossibleBlocker.getBlockers().size() == 1) { - // the creature blocks alone already a creature that has to be blocked by at least one, - // so this is ok - return null; + if (combatGroupOfPossibleBlocker != null) { + for (UUID blockedAttackerId : combatGroupOfPossibleBlocker.getAttackers()) { + if (mustBeBlockedByAtLeastOne.containsKey(blockedAttackerId)) { + // blocks a creature that has to be blocked by at least one + if (combatGroupOfPossibleBlocker.getBlockers().size() == 1) { + // the creature blocks alone already a creature that has to be blocked by at least one, + // so this is ok + return null; + } + // TODO: Check if the attacker is already blocked by another creature + // and despite there is need that this attacker blocks this attacker also + // I don't know why + Permanent blockedAttacker = game.getPermanent(blockedAttackerId); + return possibleBlocker.getIdName() + " blocks with other creatures " + blockedAttacker.getIdName() + ", which has to be blocked by only one creature. "; } - // TODO: Check if the attacker is already blocked by another creature - // and despite there is need that this attacker blocks this attacker also - // I don't know why - Permanent blockedAttacker = game.getPermanent(blockedAttackerId); - return possibleBlocker.getIdName() + " blocks with other creatures " + blockedAttacker.getIdName() + ", which has to be blocked by only one creature. "; } } } @@ -947,9 +949,12 @@ public class Combat implements Serializable, Copyable { if (!canDefenderBeAttacked(attackerId, defenderId, game)) { return false; } + Permanent attacker = game.getPermanent(attackerId); + if (attacker == null) { + return false; + } CombatGroup newGroup = new CombatGroup(defenderId, defender != null, defender != null ? defender.getControllerId() : defenderId); newGroup.attackers.add(attackerId); - Permanent attacker = game.getPermanent(attackerId); attacker.setAttacking(true); groups.add(newGroup); return true; diff --git a/Mage/src/mage/game/permanent/Permanent.java b/Mage/src/mage/game/permanent/Permanent.java index 33221ea2fb7..9a53acdc2d1 100644 --- a/Mage/src/mage/game/permanent/Permanent.java +++ b/Mage/src/mage/game/permanent/Permanent.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.game.permanent; import java.util.ArrayList; @@ -45,60 +44,89 @@ import mage.game.Game; public interface Permanent extends Card, Controllable { void setControllerId(UUID controllerId); + boolean isTapped(); + boolean untap(Game game); + boolean tap(Game game); + /** * use tap(game) - *

setTapped doesn't trigger TAPPED event and should be used - * only if you want permanent to enter battlefield tapped

+ *

+ * setTapped doesn't trigger TAPPED event and should be used only if you + * want permanent to enter battlefield tapped

* * @param tapped * @deprecated */ @Deprecated void setTapped(boolean tapped); + boolean canTap(); boolean isFlipped(); + boolean unflip(Game game); + boolean flip(Game game); boolean transform(Game game); + boolean isTransformed(); + void setTransformed(boolean value); boolean isPhasedIn(); + boolean phaseIn(Game game); + boolean phaseOut(Game game); boolean isMonstrous(); + void setMonstrous(boolean value); boolean isRenowned(); + void setRenowned(boolean value); void setCardNumber(int cid); + void setExpansionSetCode(String expansionSetCode); + void setRarity(Rarity rarity); + void setFlipCard(boolean flipCard); + void setFlipCardName(String flipCardName); + void setSecondCardFace(Card card); Counters getCounters(); List getAttachments(); + UUID getAttachedTo(); + void attachTo(UUID permanentId, Game game); + boolean addAttachment(UUID permanentId, Game game); + boolean removeAttachment(UUID permanentId, Game game); boolean canBeTargetedBy(MageObject source, UUID controllerId, Game game); + boolean hasProtectionFrom(MageObject source, Game game); + boolean cantBeEnchantedBy(MageObject source, Game game); + boolean wasControlledFromStartOfControllerTurn(); + boolean hasSummoningSickness(); + int getDamage(); + int damage(int damage, UUID sourceId, Game game, boolean combat, boolean preventable); int damage(int damage, UUID sourceId, Game game, boolean combat, boolean preventable, ArrayList appliedEffects); @@ -114,58 +142,83 @@ public interface Permanent extends Card, Controllable { * @return */ int markDamage(int damage, UUID sourceId, Game game, boolean preventable, boolean combat); + int applyDamage(Game game); void removeAllDamage(Game game); void reset(Game game); + boolean destroy(UUID sourceId, Game game, boolean noRegen); + boolean sacrifice(UUID sourceId, Game game); + boolean regenerate(UUID sourceId, Game game); + boolean fight(Permanent fightTarget, Ability source, Game game); - void entersBattlefield(UUID sourceId, Game game, Zone fromZone, boolean fireEvent); + boolean entersBattlefield(UUID sourceId, Game game, Zone fromZone, boolean fireEvent); + String getValue(); @Deprecated void addAbility(Ability ability); + @Deprecated void addAbility(Ability ability, Game game); + void addAbility(Ability ability, UUID sourceId, Game game); + void addAbility(Ability ability, UUID sourceId, Game game, boolean createNewId); void removeAllAbilities(UUID sourceId, Game game); void addLoyaltyUsed(); + boolean canLoyaltyBeUsed(Game game); - public void resetControl(); + boolean changeControllerId(UUID controllerId, Game game); + boolean checkControlChanged(Game game); void beginningOfTurn(Game game); + void endOfTurn(Game game); + int getTurnsOnBattlefield(); void addPower(int power); + void addToughness(int toughness); boolean isAttacking(); + int getBlocking(); + void setAttacking(boolean attacking); + void setBlocking(int blocking); + int getMaxBlocks(); + void setMaxBlocks(int maxBlocks); + int getMinBlockedBy(); + void setMinBlockedBy(int minBlockedBy); + int getMaxBlockedBy(); + boolean isRemovedFromCombat(); + void setRemovedFromCombat(boolean removedFromCombat); /** * Sets the maximum number of blockers the creature can be blocked by. - * Default = 0 which means there is no restriction in the number of blockers. + * Default = 0 which means there is no restriction in the number of + * blockers. * * @param maxBlockedBy maximum number of blockers */ @@ -180,11 +233,14 @@ public interface Permanent extends Card, Controllable { * @return */ boolean canAttack(UUID defenderId, Game game); + boolean canBlock(UUID attackerId, Game game); + boolean canBlockAny(Game game); /** - * Checks by restriction effects if the permanent can use activated abilities + * Checks by restriction effects if the permanent can use activated + * abilities * * @param game * @return true - permanent can use activated abilities @@ -192,11 +248,15 @@ public interface Permanent extends Card, Controllable { boolean canUseActivatedAbilities(Game game); boolean removeFromCombat(Game game); + boolean removeFromCombat(Game game, boolean withInfo); + boolean isDeathtouched(); /** - * Returns a list of object refrences that dealt damage this turn to this permanent + * Returns a list of object refrences that dealt damage this turn to this + * permanent + * * @return */ HashSet getDealtDamageByThisTurn(); @@ -222,13 +282,14 @@ public interface Permanent extends Card, Controllable { * Get card that was imprinted on this one. * * Can be null if no card was imprinted. + * * @return Imprinted card UUID. */ List getImprinted(); /** - * Allows to connect any card to permanent. - * Very similar to Imprint except that it is for internal use only. + * Allows to connect any card to permanent. Very similar to Imprint except + * that it is for internal use only. * * @param key * @param connectedCard @@ -236,8 +297,9 @@ public interface Permanent extends Card, Controllable { void addConnectedCard(String key, UUID connectedCard); /** - * Returns connected cards. - * Very similar to Imprint except that it is for internal use only. + * Returns connected cards. Very similar to Imprint except that it is for + * internal use only. + * * @param key * @return */ @@ -245,6 +307,7 @@ public interface Permanent extends Card, Controllable { /** * Clear all connected cards. + * * @param key */ void clearConnectedCards(String key); @@ -269,9 +332,11 @@ public interface Permanent extends Card, Controllable { void clearPairedCard(); void setMorphed(boolean value); + boolean isMorphed(); void setManifested(boolean value); + boolean isManifested(); @Override @@ -280,5 +345,6 @@ public interface Permanent extends Card, Controllable { // Simple int counter to set a timewise create order , the lower the number the earlier the object was created // if objects enter the battlefield at the same time they can get (and should) get the same number. int getCreateOrder(); + void setCreateOrder(int createOrder); } diff --git a/Mage/src/mage/game/permanent/token/Token.java b/Mage/src/mage/game/permanent/token/Token.java index def3ce49c65..59d4727dbed 100644 --- a/Mage/src/mage/game/permanent/token/Token.java +++ b/Mage/src/mage/game/permanent/token/Token.java @@ -159,15 +159,17 @@ public class Token extends MageObjectImpl { this.lastAddedTokenId = newToken.getId(); game.setScopeRelevant(true); game.applyEffects(); - newToken.entersBattlefield(sourceId, game, Zone.OUTSIDE, true); + boolean entered = newToken.entersBattlefield(sourceId, game, Zone.OUTSIDE, true); game.setScopeRelevant(false); game.applyEffects(); - game.fireEvent(new ZoneChangeEvent(newToken, event.getPlayerId(), Zone.OUTSIDE, Zone.BATTLEFIELD)); - if (attacking && game.getCombat() != null) { - game.getCombat().addAttackingCreature(newToken.getId(), game); - } - if (!game.isSimulation()) { - game.informPlayers(controller.getLogName() + " puts a " + newToken.getLogName() + " token onto the battlefield"); + if (entered) { + game.fireEvent(new ZoneChangeEvent(newToken, event.getPlayerId(), Zone.OUTSIDE, Zone.BATTLEFIELD)); + if (attacking && game.getCombat() != null) { + game.getCombat().addAttackingCreature(newToken.getId(), game); + } + if (!game.isSimulation()) { + game.informPlayers(controller.getLogName() + " puts a " + newToken.getLogName() + " token onto the battlefield"); + } } } From 65ff88d244103d24fd2367d19aaf7ddfedb01ac9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 28 Jul 2015 00:07:51 +0200 Subject: [PATCH 218/375] Fixed some possible null pointer exceptions. --- Mage/src/mage/game/permanent/PermanentImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 1085eeecc8a..93b2f355be7 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -899,10 +899,10 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { } @Override - public void entersBattlefield(UUID sourceId, Game game, Zone fromZone, boolean fireEvent) { + public boolean entersBattlefield(UUID sourceId, Game game, Zone fromZone, boolean fireEvent) { controlledFromStartOfControllerTurn = false; if (this.isFaceDown(game)) { - // remove some attributes here, bceause first apply effects comes later otherwise abilities (e.g. color related) will unintended trigger + // remove some attributes here, because first apply effects comes later otherwise abilities (e.g. color related) will unintended trigger MorphAbility.setPermanentToFaceDownCreature(this); } EntersTheBattlefieldEvent event = new EntersTheBattlefieldEvent(this, sourceId, getControllerId(), fromZone); @@ -914,7 +914,9 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { game.addSimultaneousEvent(event); } } + return true; } + return false; } @Override From cc9bda92afd5ce077076efc8f7b35fd854a2683c Mon Sep 17 00:00:00 2001 From: benjamin Date: Mon, 27 Jul 2015 21:40:22 -0400 Subject: [PATCH 219/375] Updated Historical Standard validators Made both actually test for having Stoneforge Mystic XOR Batterskull. Updated Super Standard Banlist. --- .../src/mage/deck/HistoricalStandard.java | 16 ++++++++++++---- .../src/mage/deck/SuperStandard.java | 17 +++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java index 1c8ba55341f..ceb699b1247 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java @@ -18,7 +18,7 @@ import java.util.Map; * * This class was originally made to work with the historical standard ruleset. * Data taken from http://thattournament.website/historic-tournament.php - * (site changed, originally thtp://mtgt.nfshost.com/historic-tournament.php) + * (site changed, originally http://mtgt.nfshost.com/historic-tournament.php) * * If there are any questions or corrections, feel free to contact me. * @@ -111,9 +111,6 @@ public class HistoricalStandard extends Constructed { // banned cards banned.add("Balance"); - // Not banned in the format, but it is either this or Misty, and most - // people choose Misty. - banned.add("Batterskull"); banned.add("Memory Jar"); banned.add("Mind Over Matter"); banned.add("Mind Twist"); @@ -134,6 +131,17 @@ public class HistoricalStandard extends Constructed { Map leastInvalid = null; boolean valid = false; + + // first, check whether misty and batterskull are in the same deck. + Map counts = new HashMap<>(); + countCards(counts, deck.getCards()); + countCards(counts, deck.getSideboard()); + if( counts.containsKey("Stoneforge Mystic") + && counts.containsKey("Batterskull")){ + + // if both, then skip all following tests by returning + return false; + } // up to Lorwyn/Alara, standards will have to be hard-coded. // iterate through the array of standards. diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java index be6caf7dc1a..9b6a91dba0f 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java @@ -76,10 +76,8 @@ public class SuperStandard extends Constructed { super("Constructed - All Standards"); banned.add("Ancient Den"); - banned.add("Arcbound Ravager"); banned.add("Disciple of the Vault"); banned.add("Great Furnace"); - banned.add("Jace, the Mind Sculptor"); banned.add("Seat of the Synod"); banned.add("Skullclamp"); banned.add("Tree of Tales"); @@ -98,6 +96,17 @@ public class SuperStandard extends Constructed { Map leastInvalid = null; boolean valid = false; + + // first, check whether misty and batterskull are in the same deck. + Map counts = new HashMap<>(); + countCards(counts, deck.getCards()); + countCards(counts, deck.getSideboard()); + if( counts.containsKey("Stoneforge Mystic") + && counts.containsKey("Batterskull")){ + + // if both, then skip all following tests by returning + return false; + } // up to Lorwyn/Alara, standards will have to be hard-coded. // iterate through the array of standards. @@ -113,10 +122,8 @@ public class SuperStandard extends Constructed { // misty and darksteel citadel if( setCodes.contains("MRD") || setCodes.contains("SOM")){ banned.add("Darksteel Citadel"); - banned.add("Stoneforge Mystic"); }else{ banned.remove("Darksteel Citadel"); - banned.remove("Stoneforge Mystic"); } // validate it. If it validates, clear the invalid cards and break. @@ -174,10 +181,8 @@ public class SuperStandard extends Constructed { // misty and darksteel citadel if( setCodes.contains("MRD") || setCodes.contains("SOM")){ banned.add("Darksteel Citadel"); - banned.add("Stoneforge Mystic"); }else{ banned.remove("Darksteel Citadel"); - banned.remove("Stoneforge Mystic"); } // validate it. If it validates, clear the invalid cards and break. From 409edab4eca424f2034fa504b058d2115d657155 Mon Sep 17 00:00:00 2001 From: benjamin Date: Mon, 27 Jul 2015 21:41:07 -0400 Subject: [PATCH 220/375] Added Historical and Super Standard Validators to default configs --- Mage.Server/config/config.xml | 2 ++ Mage.Server/release/config/config.xml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index 453ddaffeb0..e28563936ef 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -87,7 +87,9 @@ + + diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml index c18cbdeb3af..93ccc1a86a3 100644 --- a/Mage.Server/release/config/config.xml +++ b/Mage.Server/release/config/config.xml @@ -66,7 +66,9 @@ + + From 17ba61e1aab359cacebc7af6460a42aab33a83e3 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Tue, 28 Jul 2015 09:45:24 +0300 Subject: [PATCH 221/375] remove independent RippleEffect and replace with RippleAbility --- .../RippleAbility.java} | 91 +++++++++++-------- 1 file changed, 55 insertions(+), 36 deletions(-) rename Mage/src/mage/abilities/{effects/keyword/RippleEffect.java => keyword/RippleAbility.java} (55%) diff --git a/Mage/src/mage/abilities/effects/keyword/RippleEffect.java b/Mage/src/mage/abilities/keyword/RippleAbility.java similarity index 55% rename from Mage/src/mage/abilities/effects/keyword/RippleEffect.java rename to Mage/src/mage/abilities/keyword/RippleAbility.java index db5dd8a7181..3b2735906be 100644 --- a/Mage/src/mage/abilities/effects/keyword/RippleEffect.java +++ b/Mage/src/mage/abilities/keyword/RippleAbility.java @@ -1,7 +1,8 @@ -package mage.abilities.effects.keyword; +package mage.abilities.keyword; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.Cards; @@ -11,6 +12,7 @@ import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; import mage.game.Game; +import mage.game.events.GameEvent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetCard; @@ -19,26 +21,62 @@ import mage.util.CardUtil; /** * @author klayhamn */ -public class RippleEffect extends OneShotEffect { +public class RippleAbility extends TriggeredAbilityImpl { - protected int rippleNumber; - protected boolean isTargetSelf; // is the source of the ripple also the target of the ripple? + protected final int rippleNumber; - public RippleEffect(int rippleNumber) { - this(rippleNumber, true); // by default, the source is also the target + public RippleAbility(int rippleNumber) { + super(Zone.STACK, new RippleEffect(rippleNumber), false); + this.rippleNumber = rippleNumber; } - public RippleEffect(int rippleNumber, boolean isTargetSelf) { + public RippleAbility(RippleAbility ability) { + super(ability); + this.rippleNumber = ability.rippleNumber; + + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null && spell.getSourceId().equals(this.getSourceId())) { + return true; + } + return false; + + } + + @Override + public RippleAbility copy() { + return new RippleAbility(this); + } + + + @Override + public String getRule() { + return "Ripple ((When you cast this spell, you may reveal the top " + CardUtil.numberToText(rippleNumber) + " cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.))"; + } + + +} + +class RippleEffect extends OneShotEffect { + + protected int rippleNumber; + + public RippleEffect(int rippleNumber) { super(Outcome.PlayForFree); this.rippleNumber = rippleNumber; - this.isTargetSelf = isTargetSelf; - this.setText(); } public RippleEffect(final RippleEffect effect) { super(effect); this.rippleNumber = effect.rippleNumber; - this.isTargetSelf = effect.isTargetSelf; } @Override @@ -55,32 +93,19 @@ public class RippleEffect extends OneShotEffect { if (!player.chooseUse(Outcome.Neutral, "Reveal " + rippleNumber + " cards from the top of your library?", source, game)){ return true; //fizzle } + // reveal to/**/p cards from library Cards cards = new CardsImpl(); - cards.addAll(player.getLibrary().getTopCards(game, rippleNumber)); // pull top cards - player.revealCards(sourceObject.getIdName(), cards, game); // reveal the cards - - // Find out which card should be rippled - // FIXME: I'm not sure the "isTargetSelf" flag is the most elegant solution - String cardNameToRipple; - if (isTargetSelf) { // if the ripple applies to the same card that triggered it - cardNameToRipple = sourceObject.getName(); - } else { // if the ripple is caused by something else (e.g. Thrumming Stone) - Spell spellOnStack = game.getStack().getSpell(targetPointer.getFirst(game, source)); - if (spellOnStack == null) { // if the ripple target got countered or exiled - spellOnStack = (Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK); - } - if (spellOnStack == null) { - return true; // should not happen? - } - cardNameToRipple = spellOnStack.getName(); - } + cards.addAll(player.getLibrary().getTopCards(game, rippleNumber)); + player.revealCards(sourceObject.getIdName(), cards, game); + // determine which card should be rippled + String cardNameToRipple = sourceObject.getName(); FilterCard sameNameFilter = new FilterCard("card(s) with the name: \"" + cardNameToRipple + "\" to cast without paying their mana cost"); sameNameFilter.add(new NamePredicate(cardNameToRipple)); TargetCard target1 = new TargetCard(Zone.LIBRARY, sameNameFilter); target1.setRequired(false); - // Choose cards to play for free + // choose cards to play for free while (player.isInGame() && cards.count(sameNameFilter, game) > 0 && player.choose(Outcome.PlayForFree, cards, target1, game)) { Card card = cards.get(target1.getFirstTarget(), game); if (card != null) { @@ -97,11 +122,5 @@ public class RippleEffect extends OneShotEffect { return false; } - private void setText() { - StringBuilder sb = new StringBuilder("Ripple ").append(rippleNumber); - sb.append(". (You may reveal the top "); - sb.append(CardUtil.numberToText(rippleNumber)); - sb.append(" cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.)"); - staticText = sb.toString(); - } } + From 827dab6d956fa7bba67344d014d1e18c07fb9e94 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Tue, 28 Jul 2015 09:47:02 +0300 Subject: [PATCH 222/375] change Surging Dementia to use the rippleAbility instead of the rippleEffect --- Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java b/Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java index 72a52c42be7..a7798996a3f 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java +++ b/Mage.Sets/src/mage/sets/coldsnap/SurgingDementia.java @@ -29,11 +29,8 @@ package mage.sets.coldsnap; import java.util.UUID; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; -import mage.abilities.effects.common.discard.DiscardControllerEffect; import mage.abilities.effects.common.discard.DiscardTargetEffect; -import mage.abilities.effects.keyword.RippleEffect; +import mage.abilities.keyword.RippleAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; @@ -50,7 +47,8 @@ public class SurgingDementia extends CardImpl { this.expansionSetCode = "CSP"; // Ripple 4 - this.getSpellAbility().addEffect(new RippleEffect(4)); + this.addAbility(new RippleAbility(4)); + // Target player discards a card. this.getSpellAbility().getEffects().add(new DiscardTargetEffect(1)); this.getSpellAbility().getTargets().add(new TargetPlayer()); From 4044817641c2ec15b0e9acc3afcb1817a65e721b Mon Sep 17 00:00:00 2001 From: klayhamn Date: Tue, 28 Jul 2015 09:50:24 +0300 Subject: [PATCH 223/375] * add ThrummingStone test * Add rule text for Thrumming Stone * change ThrummingStones effect to be a static continuous effect that gives a triggered ability to spells, rather than being a triggered ability triggered by the stone itself --- .../mage/sets/coldsnap/ThrummingStone.java | 64 +++++++++++++++++-- .../abilities/other/ThrummingStoneTest.java | 61 ++++++++++++++++++ 2 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java diff --git a/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java b/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java index 26781804359..c7f1a281d01 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java +++ b/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java @@ -28,11 +28,19 @@ package mage.sets.coldsnap; import java.util.UUID; -import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.keyword.RippleEffect; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.RippleAbility; import mage.cards.CardImpl; import mage.constants.*; import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; +import mage.players.Player; /** * @@ -41,14 +49,15 @@ import mage.filter.FilterSpell; public class ThrummingStone extends CardImpl { //applies to all spells - private static final FilterSpell anySpellFilter = new FilterSpell(); + private static final FilterSpell anySpellFilter = new FilterSpell("Spells you cast"); public ThrummingStone(UUID ownerId) { super(ownerId, 142, "Thrumming Stone", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{5}"); this.expansionSetCode = "CSP"; this.supertype.add("Legendary"); - addAbility(new SpellCastControllerTriggeredAbility(new RippleEffect(4, false), anySpellFilter, false, true)); + // spells you cast have Ripple 4 + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ThrummingStoneGainAbilitySpellsEffect(new RippleAbility(4), anySpellFilter))); } public ThrummingStone(final ThrummingStone card) { @@ -62,3 +71,50 @@ public class ThrummingStone extends CardImpl { } +class ThrummingStoneGainAbilitySpellsEffect extends ContinuousEffectImpl { + + private final Ability ability; + private final FilterSpell filter; + + + public ThrummingStoneGainAbilitySpellsEffect(Ability ability, FilterSpell filter) { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + this.ability = ability; + this.filter = filter; + staticText = filter.getMessage() + " have " + ability.getRule(); + } + + public ThrummingStoneGainAbilitySpellsEffect(final ThrummingStoneGainAbilitySpellsEffect effect) { + super(effect); + this.ability = effect.ability; + this.filter = effect.filter; + } + + @Override + public ThrummingStoneGainAbilitySpellsEffect copy() { + return new ThrummingStoneGainAbilitySpellsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (player != null && permanent != null) { + for (StackObject stackObject : game.getStack()) { + // only spells cast, so no copies of spells + if ((stackObject instanceof Spell) && !stackObject.isCopy() && stackObject.getControllerId().equals(source.getControllerId())) { + Spell spell = (Spell) stackObject; + if (filter.match(spell, game)) { + if (!spell.getAbilities().contains(ability)) { + game.getState().addOtherAbility(spell.getCard(), ability); + } + } + } + } + return true; + } + return false; + } +} + + diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java new file mode 100644 index 00000000000..0776f50e703 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java @@ -0,0 +1,61 @@ +package org.mage.test.cards.abilities.other; + +import jdk.nashorn.internal.ir.annotations.Ignore; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author klayhamn + */ +public class ThrummingStoneTest extends CardTestPlayerBase { + + @Test + public void testApplyForNoneRippleCardsWhenSingleRipple() throws Exception { + + removeAllCardsFromLibrary(playerA); + + addCard(Zone.BATTLEFIELD, playerA, "Thrumming Stone"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.HAND, playerA, "Shadowborn Apostle"); + + addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle", 1); + addCard(Zone.LIBRARY, playerA, "Swamp", 3); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shadowborn Apostle"); + setChoice(playerA, "Yes"); + + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Shadowborn Apostle", 2); + + } + + @Test + @Ignore // FIXME: This still fails + public void testApplyForNoneRippleCardsWhenMultiRipple() throws Exception { + + removeAllCardsFromLibrary(playerA); + + addCard(Zone.BATTLEFIELD, playerA, "Thrumming Stone"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.HAND, playerA, "Shadowborn Apostle"); + + addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle"); + addCard(Zone.LIBRARY, playerA, "Swamp", 3); + addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle"); + + skipInitShuffling(); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shadowborn Apostle"); + setChoice(playerA, "Yes"); + + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Shadowborn Apostle", 3); + + } +} From 0e51c1fcf49df90fdc8d7f0d59d149fafad6ab03 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 28 Jul 2015 12:21:25 +0300 Subject: [PATCH 224/375] Add EnvoyEffect (named so because MTG Salvation wiki calls these creatures envoys and I can't think of a better name). Use it for existing cards. Implement cards: Brass Herald, Grave Defiler, and Tidal Courier --- .../src/mage/sets/apocalypse/BrassHerald.java | 83 ++++++++++++++++ .../sets/apocalypse/EnlistmentOfficer.java | 67 +++---------- .../sets/apocalypse/GoblinRingleader.java | 66 +++---------- .../mage/sets/apocalypse/GraveDefiler.java | 76 ++++++++++++++ .../src/mage/sets/apocalypse/KavuHowler.java | 69 +++---------- .../mage/sets/apocalypse/SylvanMessenger.java | 68 +++---------- .../mage/sets/apocalypse/TidalCourier.java | 80 +++++++++++++++ .../mage/sets/eighthedition/BrassHerald.java | 54 ++++++++++ .../abilities/effects/common/EnvoyEffect.java | 99 +++++++++++++++++++ .../mageobject/ChosenSubtypePredicate.java | 57 +++++++++++ 10 files changed, 504 insertions(+), 215 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/BrassHerald.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/GraveDefiler.java create mode 100644 Mage.Sets/src/mage/sets/apocalypse/TidalCourier.java create mode 100644 Mage.Sets/src/mage/sets/eighthedition/BrassHerald.java create mode 100644 Mage/src/mage/abilities/effects/common/EnvoyEffect.java create mode 100644 Mage/src/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/BrassHerald.java b/Mage.Sets/src/mage/sets/apocalypse/BrassHerald.java new file mode 100644 index 00000000000..a4050e666de --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/BrassHerald.java @@ -0,0 +1,83 @@ +/* + * 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.MageInt; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.abilities.effects.common.EnvoyEffect; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; + +/** + * + * @author LoneFox + */ +public class BrassHerald extends CardImpl { + + public BrassHerald(UUID ownerId) { + super(ownerId, 133, "Brass Herald", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}"); + this.expansionSetCode = "APC"; + this.subtype.add("Golem"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // As Brass Herald enters the battlefield, choose a creature type. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature))); + // When Brass Herald enters the battlefield, reveal the top four cards of your library. Put all creature cards of the chosen type revealed this way into your hand and the rest on the bottom of your library in any order. + FilterCard filter = new FilterCard("creature cards of the chosen type"); + filter.add(new ChosenSubtypePredicate(this.getId())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new EnvoyEffect(filter, 4))); + + // Creatures of the chosen type get +1/+1. + FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creatures of the chosen type"); + filter2.add(new ChosenSubtypePredicate(this.getId())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, + filter2, false))); + } + + public BrassHerald(final BrassHerald card) { + super(card); + } + + @Override + public BrassHerald copy() { + return new BrassHerald(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/EnlistmentOfficer.java b/Mage.Sets/src/mage/sets/apocalypse/EnlistmentOfficer.java index 1f51b2b2680..2b46d650488 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/EnlistmentOfficer.java +++ b/Mage.Sets/src/mage/sets/apocalypse/EnlistmentOfficer.java @@ -29,29 +29,32 @@ package mage.sets.apocalypse; import java.util.UUID; import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FirstStrikeAbility; -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.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.EnvoyEffect; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.players.Player; + /** * * @author fireshoes */ public class EnlistmentOfficer extends CardImpl { + private static final FilterCard filter = new FilterCard("Soldier cards"); + + static { + filter.add(new SubtypePredicate("Soldier")); + } + public EnlistmentOfficer(UUID ownerId) { super(ownerId, 9, "Enlistment Officer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.expansionSetCode = "APC"; @@ -64,7 +67,7 @@ public class EnlistmentOfficer extends CardImpl { // First strike this.addAbility(FirstStrikeAbility.getInstance()); // When Enlistment Officer enters the battlefield, reveal the top four cards of your library. Put all Soldier cards revealed this way into your hand and the rest on the bottom of your library in any order. - this.addAbility(new EntersBattlefieldTriggeredAbility(new EnlistmentOfficerEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new EnvoyEffect(filter, 4))); } public EnlistmentOfficer(final EnlistmentOfficer card) { @@ -76,45 +79,3 @@ public class EnlistmentOfficer extends CardImpl { return new EnlistmentOfficer(this); } } - -class EnlistmentOfficerEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("Soldier"); - static { - filter.add(new SubtypePredicate("Soldier")); - } - - public EnlistmentOfficerEffect() { - super(Outcome.DrawCard); - this.staticText = "reveal the top four cards of your library. Put all Soldier cards revealed this way into your hand and the rest on the bottom of your library in any order"; - } - - public EnlistmentOfficerEffect(final EnlistmentOfficerEffect effect) { - super(effect); - } - - @Override - public EnlistmentOfficerEffect copy() { - return new EnlistmentOfficerEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || sourceObject == null) { - return false; - } - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 4)); - controller.revealCards(sourceObject.getName(), cards, game); - for (Card card: cards.getCards(game)) { - if (filter.match(card, game)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - cards.remove(card); - } - } - controller.putCardsOnBottomOfLibrary(cards, game, source, true); - return true; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/apocalypse/GoblinRingleader.java b/Mage.Sets/src/mage/sets/apocalypse/GoblinRingleader.java index 2594b49c05b..31446160675 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/GoblinRingleader.java +++ b/Mage.Sets/src/mage/sets/apocalypse/GoblinRingleader.java @@ -29,23 +29,19 @@ package mage.sets.apocalypse; import java.util.UUID; import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.HasteAbility; -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.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.EnvoyEffect; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.players.Player; /** * @@ -53,6 +49,12 @@ import mage.players.Player; */ public class GoblinRingleader extends CardImpl { + private static final FilterCard filter = new FilterCard("Goblin cards"); + + static { + filter.add(new SubtypePredicate("Goblin")); + } + public GoblinRingleader(UUID ownerId) { super(ownerId, 62, "Goblin Ringleader", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.expansionSetCode = "APC"; @@ -64,7 +66,7 @@ public class GoblinRingleader extends CardImpl { // Haste this.addAbility(HasteAbility.getInstance()); // When Goblin Ringleader enters the battlefield, reveal the top four cards of your library. Put all Goblin cards revealed this way into your hand and the rest on the bottom of your library in any order. - this.addAbility(new EntersBattlefieldTriggeredAbility(new GoblinRingleaderEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new EnvoyEffect(filter, 4))); } public GoblinRingleader(final GoblinRingleader card) { @@ -76,45 +78,3 @@ public class GoblinRingleader extends CardImpl { return new GoblinRingleader(this); } } - -class GoblinRingleaderEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("Goblin"); - static { - filter.add(new SubtypePredicate("Goblin")); - } - - public GoblinRingleaderEffect() { - super(Outcome.DrawCard); - this.staticText = "reveal the top four cards of your library. Put all Goblin cards revealed this way into your hand and the rest on the bottom of your library in any order"; - } - - public GoblinRingleaderEffect(final GoblinRingleaderEffect effect) { - super(effect); - } - - @Override - public GoblinRingleaderEffect copy() { - return new GoblinRingleaderEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || sourceObject == null) { - return false; - } - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 4)); - controller.revealCards(sourceObject.getName(), cards, game); - for (Card card: cards.getCards(game)) { - if (filter.match(card, game)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - cards.remove(card); - } - } - controller.putCardsOnBottomOfLibrary(cards, game, source, true); - return true; - } -} diff --git a/Mage.Sets/src/mage/sets/apocalypse/GraveDefiler.java b/Mage.Sets/src/mage/sets/apocalypse/GraveDefiler.java new file mode 100644 index 00000000000..32f78b77b22 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/GraveDefiler.java @@ -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.apocalypse; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.EnvoyEffect; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author LoneFox + */ +public class GraveDefiler extends CardImpl { + + private static final FilterCard filter = new FilterCard("Zombie cards"); + + static { + filter.add(new SubtypePredicate("Zombie")); + } + + public GraveDefiler(UUID ownerId) { + super(ownerId, 40, "Grave Defiler", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "APC"; + this.subtype.add("Zombie"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // When Grave Defiler enters the battlefield, reveal the top four cards of your library. Put all Zombie cards revealed this way into your hand and the rest on the bottom of your library in any order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new EnvoyEffect(filter, 4))); + // {1}{B}: Regenerate Grave Defiler. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{1}{B}"))); } + + public GraveDefiler(final GraveDefiler card) { + super(card); + } + + @Override + public GraveDefiler copy() { + return new GraveDefiler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/KavuHowler.java b/Mage.Sets/src/mage/sets/apocalypse/KavuHowler.java index 7e339821ac5..5a724d26974 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/KavuHowler.java +++ b/Mage.Sets/src/mage/sets/apocalypse/KavuHowler.java @@ -29,29 +29,31 @@ package mage.sets.apocalypse; import java.util.UUID; import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.keyword.FirstStrikeAbility; -import mage.cards.Card; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.cards.CardImpl; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.Outcome; +import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.EnvoyEffect; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.players.Player; + /** * * @author fireshoes */ public class KavuHowler extends CardImpl { + private static final FilterCard filter = new FilterCard("Kavu cards"); + + static { + filter.add(new SubtypePredicate("Kavu")); + } + public KavuHowler(UUID ownerId) { super(ownerId, 79, "Kavu Howler", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.expansionSetCode = "APC"; @@ -61,8 +63,7 @@ public class KavuHowler extends CardImpl { this.toughness = new MageInt(5); // When Kavu Howler enters the battlefield, reveal the top four cards of your library. Put all Kavu cards revealed this way into your hand and the rest on the bottom of your library in any order. - this.addAbility(new EntersBattlefieldTriggeredAbility(new KavuHowlerEffect())); - + this.addAbility(new EntersBattlefieldTriggeredAbility(new EnvoyEffect(filter, 4))); } public KavuHowler(final KavuHowler card) { @@ -74,45 +75,3 @@ public class KavuHowler extends CardImpl { return new KavuHowler(this); } } - -class KavuHowlerEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("Kavu"); - static { - filter.add(new SubtypePredicate("Kavu")); - } - - public KavuHowlerEffect() { - super(Outcome.DrawCard); - this.staticText = "reveal the top four cards of your library. Put all Kavu cards revealed this way into your hand and the rest on the bottom of your library in any order"; - } - - public KavuHowlerEffect(final KavuHowlerEffect effect) { - super(effect); - } - - @Override - public KavuHowlerEffect copy() { - return new KavuHowlerEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || sourceObject == null) { - return false; - } - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 4)); - controller.revealCards(sourceObject.getName(), cards, game); - for (Card card: cards.getCards(game)) { - if (filter.match(card, game)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - cards.remove(card); - } - } - controller.putCardsOnBottomOfLibrary(cards, game, source, true); - return true; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/apocalypse/SylvanMessenger.java b/Mage.Sets/src/mage/sets/apocalypse/SylvanMessenger.java index 6c865543d5a..ebd4641c225 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/SylvanMessenger.java +++ b/Mage.Sets/src/mage/sets/apocalypse/SylvanMessenger.java @@ -29,29 +29,32 @@ package mage.sets.apocalypse; import java.util.UUID; import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.TrampleAbility; -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.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.EnvoyEffect; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.players.Player; + /** * * @author LevelX2 */ public class SylvanMessenger extends CardImpl { + private static final FilterCard filter = new FilterCard("Elf cards"); + + static { + filter.add(new SubtypePredicate("Elf")); + } + public SylvanMessenger(UUID ownerId) { super(ownerId, 87, "Sylvan Messenger", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.expansionSetCode = "APC"; @@ -63,8 +66,7 @@ public class SylvanMessenger extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); // When Sylvan Messenger enters the battlefield, reveal the top four cards of your library. Put all Elf cards revealed this way into your hand and the rest on the bottom of your library in any order. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SylvanMessengerEffect())); - + this.addAbility(new EntersBattlefieldTriggeredAbility(new EnvoyEffect(filter, 4))); } public SylvanMessenger(final SylvanMessenger card) { @@ -76,45 +78,3 @@ public class SylvanMessenger extends CardImpl { return new SylvanMessenger(this); } } - -class SylvanMessengerEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("Elf"); - static { - filter.add(new SubtypePredicate("Elf")); - } - - public SylvanMessengerEffect() { - super(Outcome.DrawCard); - this.staticText = "reveal the top four cards of your library. Put all Elf cards revealed this way into your hand and the rest on the bottom of your library in any order"; - } - - public SylvanMessengerEffect(final SylvanMessengerEffect effect) { - super(effect); - } - - @Override - public SylvanMessengerEffect copy() { - return new SylvanMessengerEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || sourceObject == null) { - return false; - } - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 4)); - controller.revealCards(sourceObject.getName(), cards, game); - for (Card card: cards.getCards(game)) { - if (filter.match(card, game)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - cards.remove(card); - } - } - controller.putCardsOnBottomOfLibrary(cards, game, source, true); - return true; - } -} diff --git a/Mage.Sets/src/mage/sets/apocalypse/TidalCourier.java b/Mage.Sets/src/mage/sets/apocalypse/TidalCourier.java new file mode 100644 index 00000000000..a88c420529d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/TidalCourier.java @@ -0,0 +1,80 @@ +/* + * 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.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.EnvoyEffect; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author LoneFox + */ +public class TidalCourier extends CardImpl { + + private static final FilterCard filter = new FilterCard("Merfolk cards"); + + static { + filter.add(new SubtypePredicate("Merfolk")); + } + + public TidalCourier(UUID ownerId) { + super(ownerId, 31, "Tidal Courier", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "APC"; + this.subtype.add("Merfolk"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // When Tidal Courier enters the battlefield, reveal the top four cards of your library. Put all Merfolk cards revealed this way into your hand and the rest on the bottom of your library in any order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new EnvoyEffect(filter, 4))); + // {3}{U}: Tidal Courier gains flying until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(FlyingAbility.getInstance(), + Duration.EndOfTurn), new ManaCostsImpl("{3}{U}"))); + } + + public TidalCourier(final TidalCourier card) { + super(card); + } + + @Override + public TidalCourier copy() { + return new TidalCourier(this); + } +} diff --git a/Mage.Sets/src/mage/sets/eighthedition/BrassHerald.java b/Mage.Sets/src/mage/sets/eighthedition/BrassHerald.java new file mode 100644 index 00000000000..43bb4056503 --- /dev/null +++ b/Mage.Sets/src/mage/sets/eighthedition/BrassHerald.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.eighthedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class BrassHerald extends mage.sets.apocalypse.BrassHerald { + + public BrassHerald(UUID ownerId) { + super(ownerId); + this.cardNumber = 293; + this.expansionSetCode = "8ED"; + this.rarity = Rarity.RARE; + } + + public BrassHerald(final BrassHerald card) { + super(card); + } + + @Override + public BrassHerald copy() { + return new BrassHerald(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/EnvoyEffect.java b/Mage/src/mage/abilities/effects/common/EnvoyEffect.java new file mode 100644 index 00000000000..e0f4c22e8b2 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/EnvoyEffect.java @@ -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.abilities.effects.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author LoneFox + */ +public class EnvoyEffect extends OneShotEffect { + + private final FilterCard filter; + private final int numCards; + + public EnvoyEffect(FilterCard filter, int numCards) { + super(Outcome.DrawCard); + this.filter = filter; + this.numCards = numCards; + } + + public EnvoyEffect(final EnvoyEffect effect) { + super(effect); + this.filter = effect.filter.copy(); + this.numCards = effect.numCards; + } + + @Override + public EnvoyEffect copy() { + return new EnvoyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if(controller == null || sourceObject == null) { + return false; + } + Cards cards = new CardsImpl(); + cards.addAll(controller.getLibrary().getTopCards(game, numCards)); + controller.revealCards(sourceObject.getName(), cards, game); + for(Card card: cards.getCards(game)) { + if(filter.match(card, game)) { + controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + cards.remove(card); + } + } + controller.putCardsOnBottomOfLibrary(cards, game, source, true); + return true; + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + + return "Reveal the top " + CardUtil.numberToText(numCards) + " cards of your library. Put all " + + filter.getMessage() + " revealed this way into your hand and the rest on the bottom of your library in any order."; + } +} diff --git a/Mage/src/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java b/Mage/src/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java new file mode 100644 index 00000000000..ca732ec3f98 --- /dev/null +++ b/Mage/src/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java @@ -0,0 +1,57 @@ +/* + * 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.filter.predicate.mageobject; + +import java.util.UUID; +import mage.MageObject; +import mage.filter.predicate.Predicate; +import mage.game.Game; + +/** + * + * @author LoneFox + */ +public class ChosenSubtypePredicate implements Predicate { + + private final UUID cardID; + + public ChosenSubtypePredicate(UUID cardID) { + this.cardID = cardID; + } + + @Override + public boolean apply(MageObject input, Game game) { + String subtype = (String) game.getState().getValue(cardID + "_type"); + return input.hasSubtype(subtype); + } + + @Override + public String toString() { + return "Chosen subtype"; + } +} From 1427227445d633a684839ca97443b188006da964 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Tue, 28 Jul 2015 12:57:49 +0300 Subject: [PATCH 225/375] Use ChosenSubtypePredicate for some existing cards --- .../sets/magic2012/AdaptiveAutomaton.java | 103 ++++-------------- .../mage/sets/onslaught/SharedTriumph.java | 36 +----- .../sets/urzaslegacy/EngineeredPlague.java | 43 ++------ 3 files changed, 33 insertions(+), 149 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java b/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java index dcce392fd61..d6af2a5a2ab 100644 --- a/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java +++ b/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java @@ -27,24 +27,31 @@ */ package mage.sets.magic2012; -import mage.constants.*; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import java.util.UUID; - /** * @author nantuko */ @@ -59,11 +66,15 @@ public class AdaptiveAutomaton extends CardImpl { this.toughness = new MageInt(2); // As Adaptive Automaton enters the battlefield, choose a creature type. - this.addAbility(new AsEntersBattlefieldAbility(new AdaptiveAutomatonEffect())); + this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature))); // Adaptive Automaton is the chosen type in addition to its other types. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AdaptiveAutomatonAddSubtypeEffect())); // Other creatures you control of the chosen type get +1/+1. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AdaptiveAutomatonBoostControlledEffect())); + FilterCreaturePermanent filter = new FilterCreaturePermanent("Other creatures you control of the chosen type"); + filter.add(new ChosenSubtypePredicate(this.getId())); + filter.add(new AnotherPredicate()); + filter.add(new ControllerPredicate(TargetController.YOU)); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false))); } public AdaptiveAutomaton(final AdaptiveAutomaton card) { @@ -76,43 +87,6 @@ public class AdaptiveAutomaton extends CardImpl { } } -class AdaptiveAutomatonEffect extends OneShotEffect { - - public AdaptiveAutomatonEffect() { - super(Outcome.BoostCreature); - staticText = "choose a creature type"; - } - - public AdaptiveAutomatonEffect(final AdaptiveAutomatonEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (player != null && permanent != null) { - Choice typeChoice = new ChoiceImpl(true); - typeChoice.setMessage("Choose creature type"); - typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); - while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { - return false; - } - } - game.informPlayers(permanent.getName() + ": " + player.getLogName() + " has chosen " + typeChoice.getChoice()); - game.getState().setValue(permanent.getId() + "_type", typeChoice.getChoice()); - permanent.addInfo("chosen type", "Chosen type: " + typeChoice.getChoice().toString() + "", game); - } - return false; - } - - @Override - public AdaptiveAutomatonEffect copy() { - return new AdaptiveAutomatonEffect(this); - } - -} class AdaptiveAutomatonAddSubtypeEffect extends ContinuousEffectImpl { public AdaptiveAutomatonAddSubtypeEffect() { @@ -141,40 +115,3 @@ class AdaptiveAutomatonAddSubtypeEffect extends ContinuousEffectImpl { return new AdaptiveAutomatonAddSubtypeEffect(this); } } - -class AdaptiveAutomatonBoostControlledEffect extends ContinuousEffectImpl { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - - public AdaptiveAutomatonBoostControlledEffect() { - super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); - staticText = "Other creatures you control of the chosen type get +1/+1"; - } - - public AdaptiveAutomatonBoostControlledEffect(final AdaptiveAutomatonBoostControlledEffect effect) { - super(effect); - } - - @Override - public AdaptiveAutomatonBoostControlledEffect copy() { - return new AdaptiveAutomatonBoostControlledEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); - if (subtype != null) { - for (Permanent perm: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { - if (!perm.getId().equals(source.getSourceId()) && perm.hasSubtype(subtype)) { - perm.addPower(1); - perm.addToughness(1); - } - } - } - } - return true; - } - -} diff --git a/Mage.Sets/src/mage/sets/onslaught/SharedTriumph.java b/Mage.Sets/src/mage/sets/onslaught/SharedTriumph.java index bbaf9de2c45..1846892cc4e 100644 --- a/Mage.Sets/src/mage/sets/onslaught/SharedTriumph.java +++ b/Mage.Sets/src/mage/sets/onslaught/SharedTriumph.java @@ -39,8 +39,7 @@ import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; /** * @@ -55,9 +54,10 @@ public class SharedTriumph extends CardImpl { // As Shared Triumph enters the battlefield, choose a creature type. this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature))); - // Creatures of the chosen type get +1/+1. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, new FilterSharedTriumph(), false))); + FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures of the chosen type"); + filter.add(new ChosenSubtypePredicate(this.getId())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false))); } public SharedTriumph(final SharedTriumph card) { @@ -69,31 +69,3 @@ public class SharedTriumph extends CardImpl { return new SharedTriumph(this); } } - -class FilterSharedTriumph extends FilterCreaturePermanent { - - public FilterSharedTriumph() { - super("Creatures of the chosen type"); - } - - public FilterSharedTriumph(final FilterSharedTriumph filter) { - super(filter); - } - - @Override - public FilterSharedTriumph copy() { - return new FilterSharedTriumph(this); - } - - @Override - public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { - if(super.match(permanent, sourceId, playerId, game)){ - String subtype = (String) game.getState().getValue(sourceId + "_type"); - if(subtype != null && !subtype.equals("") && permanent.hasSubtype(subtype)){ - return true; - } - } - return false; - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzaslegacy/EngineeredPlague.java b/Mage.Sets/src/mage/sets/urzaslegacy/EngineeredPlague.java index cb30ebba8db..185a236c3c3 100644 --- a/Mage.Sets/src/mage/sets/urzaslegacy/EngineeredPlague.java +++ b/Mage.Sets/src/mage/sets/urzaslegacy/EngineeredPlague.java @@ -28,16 +28,18 @@ package mage.sets.urzaslegacy; import java.util.UUID; - -import mage.constants.*; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.ChooseCreatureTypeEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; /** * @@ -53,7 +55,9 @@ public class EngineeredPlague extends CardImpl { // As Engineered Plague enters the battlefield, choose a creature type. this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.UnboostCreature))); // All creatures of the chosen type get -1/-1. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(-1, -1, Duration.WhileOnBattlefield, new FilterEngineeredPlague(), false))); + FilterCreaturePermanent filter = new FilterCreaturePermanent("All creatures of the chosen type"); + filter.add(new ChosenSubtypePredicate(this.getId())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(-1, -1, Duration.WhileOnBattlefield, filter, false))); } public EngineeredPlague(final EngineeredPlague card) { @@ -64,33 +68,4 @@ public class EngineeredPlague extends CardImpl { public EngineeredPlague copy() { return new EngineeredPlague(this); } - - class FilterEngineeredPlague extends FilterCreaturePermanent { - - public FilterEngineeredPlague() { - super("All creatures of the chosen type"); - } - - public FilterEngineeredPlague(final FilterEngineeredPlague filter) { - super(filter); - } - - @Override - public FilterEngineeredPlague copy() { - return new FilterEngineeredPlague(this); - } - - @Override - public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { - if(super.match(permanent, sourceId, playerId, game)){ - String subtype = (String) game.getState().getValue(sourceId + "_type"); - if(subtype != null && !subtype.equals("") && permanent.hasSubtype(subtype)){ - return true; - } - } - return false; - } - - } - } From 1f24b569c73758ff18e997fc2b676fc1e6a328d9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 28 Jul 2015 15:04:37 +0200 Subject: [PATCH 226/375] * Fixed a bug of adding abilities to non permanentes if the an effect added an ability to multiple objects. --- Mage/src/mage/game/GameState.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Mage/src/mage/game/GameState.java b/Mage/src/mage/game/GameState.java index b7b9c1850b7..21824f7a41c 100644 --- a/Mage/src/mage/game/GameState.java +++ b/Mage/src/mage/game/GameState.java @@ -41,6 +41,7 @@ import mage.abilities.Ability; import mage.abilities.ActivatedAbility; import mage.abilities.DelayedTriggeredAbilities; import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.MageSingleton; import mage.abilities.Mode; import mage.abilities.SpecialActions; import mage.abilities.StaticAbility; @@ -856,13 +857,19 @@ public class GameState implements Serializable, Copyable { * @param ability */ public void addOtherAbility(Card attachedTo, Ability ability) { - ability.setSourceId(attachedTo.getId()); - ability.setControllerId(attachedTo.getOwnerId()); + Ability newAbility; + if (ability instanceof MageSingleton) { + newAbility = ability; + } else { + newAbility = ability.copy(); + } + newAbility.setSourceId(attachedTo.getId()); + newAbility.setControllerId(attachedTo.getOwnerId()); if (!cardState.containsKey(attachedTo.getId())) { cardState.put(attachedTo.getId(), new CardState()); } - cardState.get(attachedTo.getId()).addAbility(ability); - addAbility(ability, attachedTo.getId(), attachedTo); + cardState.get(attachedTo.getId()).addAbility(newAbility); + addAbility(newAbility, attachedTo.getId(), attachedTo); } /** From cac6a03e7ff78a37a3537d1e19113605950d46bf Mon Sep 17 00:00:00 2001 From: klayhamn Date: Tue, 28 Jul 2015 17:38:50 +0300 Subject: [PATCH 227/375] * fix potential bug where the copy constructor of the continuous effect of ThrummingStone did not copy its object parameters * unignore the thrumming stone test --- .../mage/sets/coldsnap/ThrummingStone.java | 113 +++++++++--------- .../abilities/other/ThrummingStoneTest.java | 62 +++++----- 2 files changed, 89 insertions(+), 86 deletions(-) diff --git a/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java b/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java index c7f1a281d01..a7a7b45af73 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java +++ b/Mage.Sets/src/mage/sets/coldsnap/ThrummingStone.java @@ -27,14 +27,18 @@ */ package mage.sets.coldsnap; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.keyword.RippleAbility; import mage.cards.CardImpl; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; import mage.filter.FilterSpell; import mage.game.Game; import mage.game.permanent.Permanent; @@ -42,79 +46,80 @@ import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.players.Player; +import java.util.UUID; + /** - * * @author klayhamn */ public class ThrummingStone extends CardImpl { - //applies to all spells - private static final FilterSpell anySpellFilter = new FilterSpell("Spells you cast"); + //applies to all spells + private static final FilterSpell anySpellFilter = new FilterSpell("Spells you cast"); - public ThrummingStone(UUID ownerId) { - super(ownerId, 142, "Thrumming Stone", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{5}"); - this.expansionSetCode = "CSP"; - this.supertype.add("Legendary"); + public ThrummingStone(UUID ownerId) { + super(ownerId, 142, "Thrumming Stone", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{5}"); + this.expansionSetCode = "CSP"; + this.supertype.add("Legendary"); - // spells you cast have Ripple 4 - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ThrummingStoneGainAbilitySpellsEffect(new RippleAbility(4), anySpellFilter))); - } + // spells you cast have Ripple 4 + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ThrummingStoneGainAbilitySpellsEffect(new RippleAbility(4), anySpellFilter))); + } - public ThrummingStone(final ThrummingStone card) { - super(card); - } + public ThrummingStone(final ThrummingStone card) { + super(card); + } - @Override - public ThrummingStone copy() { - return new ThrummingStone(this); - } + @Override + public ThrummingStone copy() { + return new ThrummingStone(this); + } } class ThrummingStoneGainAbilitySpellsEffect extends ContinuousEffectImpl { - private final Ability ability; - private final FilterSpell filter; + private final Ability ability; + private final FilterSpell filter; - public ThrummingStoneGainAbilitySpellsEffect(Ability ability, FilterSpell filter) { - super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.ability = ability; - this.filter = filter; - staticText = filter.getMessage() + " have " + ability.getRule(); - } + public ThrummingStoneGainAbilitySpellsEffect(Ability ability, FilterSpell filter) { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + this.ability = ability; + this.filter = filter; + staticText = filter.getMessage() + " have " + ability.getRule(); + } - public ThrummingStoneGainAbilitySpellsEffect(final ThrummingStoneGainAbilitySpellsEffect effect) { - super(effect); - this.ability = effect.ability; - this.filter = effect.filter; - } + public ThrummingStoneGainAbilitySpellsEffect(final ThrummingStoneGainAbilitySpellsEffect effect) { + super(effect); + this.ability = effect.ability.copy(); + this.filter = effect.filter.copy(); + } - @Override - public ThrummingStoneGainAbilitySpellsEffect copy() { - return new ThrummingStoneGainAbilitySpellsEffect(this); - } + @Override + public ThrummingStoneGainAbilitySpellsEffect copy() { + return new ThrummingStoneGainAbilitySpellsEffect(this); + } - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (player != null && permanent != null) { - for (StackObject stackObject : game.getStack()) { - // only spells cast, so no copies of spells - if ((stackObject instanceof Spell) && !stackObject.isCopy() && stackObject.getControllerId().equals(source.getControllerId())) { - Spell spell = (Spell) stackObject; - if (filter.match(spell, game)) { - if (!spell.getAbilities().contains(ability)) { - game.getState().addOtherAbility(spell.getCard(), ability); - } - } - } + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (player != null && permanent != null) { + for (StackObject stackObject : game.getStack()) { + // only spells cast, so no copies of spells + if ((stackObject instanceof Spell) && !stackObject.isCopy() && stackObject.getControllerId().equals(source.getControllerId())) { + Spell spell = (Spell) stackObject; + if (filter.match(spell, game)) { + if (!spell.getAbilities().contains(ability)) { + game.getState().addOtherAbility(spell.getCard(), ability); } - return true; + } } - return false; + } + return true; } + return false; + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java index 0776f50e703..1b84ec26f63 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/other/ThrummingStoneTest.java @@ -1,6 +1,5 @@ package org.mage.test.cards.abilities.other; -import jdk.nashorn.internal.ir.annotations.Ignore; import mage.constants.PhaseStep; import mage.constants.Zone; import org.junit.Test; @@ -11,51 +10,50 @@ import org.mage.test.serverside.base.CardTestPlayerBase; */ public class ThrummingStoneTest extends CardTestPlayerBase { - @Test - public void testApplyForNoneRippleCardsWhenSingleRipple() throws Exception { + @Test + public void testApplyForNoneRippleCardsWhenSingleRipple() throws Exception { - removeAllCardsFromLibrary(playerA); + removeAllCardsFromLibrary(playerA); - addCard(Zone.BATTLEFIELD, playerA, "Thrumming Stone"); - addCard(Zone.BATTLEFIELD, playerA, "Swamp"); - addCard(Zone.HAND, playerA, "Shadowborn Apostle"); + addCard(Zone.BATTLEFIELD, playerA, "Thrumming Stone"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.HAND, playerA, "Shadowborn Apostle"); - addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle", 1); - addCard(Zone.LIBRARY, playerA, "Swamp", 3); + addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle", 1); + addCard(Zone.LIBRARY, playerA, "Swamp", 3); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shadowborn Apostle"); - setChoice(playerA, "Yes"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shadowborn Apostle"); + setChoice(playerA, "Yes"); - setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); - execute(); + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + execute(); - assertPermanentCount(playerA, "Shadowborn Apostle", 2); + assertPermanentCount(playerA, "Shadowborn Apostle", 2); - } + } - @Test - @Ignore // FIXME: This still fails - public void testApplyForNoneRippleCardsWhenMultiRipple() throws Exception { + @Test + public void testApplyForNoneRippleCardsWhenMultiRipple() throws Exception { - removeAllCardsFromLibrary(playerA); + removeAllCardsFromLibrary(playerA); - addCard(Zone.BATTLEFIELD, playerA, "Thrumming Stone"); - addCard(Zone.BATTLEFIELD, playerA, "Swamp"); - addCard(Zone.HAND, playerA, "Shadowborn Apostle"); + addCard(Zone.BATTLEFIELD, playerA, "Thrumming Stone"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.HAND, playerA, "Shadowborn Apostle"); - addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle"); - addCard(Zone.LIBRARY, playerA, "Swamp", 3); - addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle"); + addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle"); + addCard(Zone.LIBRARY, playerA, "Swamp", 3); + addCard(Zone.LIBRARY, playerA, "Shadowborn Apostle"); - skipInitShuffling(); + skipInitShuffling(); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shadowborn Apostle"); - setChoice(playerA, "Yes"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shadowborn Apostle"); + setChoice(playerA, "Yes"); - setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); - execute(); + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + execute(); - assertPermanentCount(playerA, "Shadowborn Apostle", 3); + assertPermanentCount(playerA, "Shadowborn Apostle", 3); - } + } } From e5d29907ed432f05b3bc39e2fff8a16923cc454f Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 28 Jul 2015 12:40:34 -0500 Subject: [PATCH 228/375] Implemented Righteous Aura, Haazda Shield Mate, Invulnerability, and Cho-Arrim Alchemist --- .../sets/dissension/HaazdaShieldMate.java | 73 ++++++++++ .../mercadianmasques/ChoArrimAlchemist.java | 134 ++++++++++++++++++ .../sets/mercadianmasques/RighteousAura.java | 54 +++++++ .../mage/sets/tempest/Invulnerability.java | 64 +++++++++ .../src/mage/sets/visions/RighteousAura.java | 66 +++++++++ 5 files changed, 391 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/dissension/HaazdaShieldMate.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimAlchemist.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/RighteousAura.java create mode 100644 Mage.Sets/src/mage/sets/tempest/Invulnerability.java create mode 100644 Mage.Sets/src/mage/sets/visions/RighteousAura.java diff --git a/Mage.Sets/src/mage/sets/dissension/HaazdaShieldMate.java b/Mage.Sets/src/mage/sets/dissension/HaazdaShieldMate.java new file mode 100644 index 00000000000..54c0f540246 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dissension/HaazdaShieldMate.java @@ -0,0 +1,73 @@ +/* + * 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.dissension; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventNextDamageFromChosenSourceToYouEffect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author anonymous + */ +public class HaazdaShieldMate extends CardImpl { + + public HaazdaShieldMate(UUID ownerId) { + super(ownerId, 12, "Haazda Shield Mate", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "DIS"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // At the beginning of your upkeep, sacrifice Haazda Shield Mate unless you pay {W}{W}. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{W}{W}")), TargetController.YOU, false)); + + // {W}: The next time a source of your choice would deal damage to you this turn, prevent that damage. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventNextDamageFromChosenSourceToYouEffect(Duration.EndOfTurn), new ManaCostsImpl("{W}"))); + } + + public HaazdaShieldMate(final HaazdaShieldMate card) { + super(card); + } + + @Override + public HaazdaShieldMate copy() { + return new HaazdaShieldMate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimAlchemist.java b/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimAlchemist.java new file mode 100644 index 00000000000..27d31e4d615 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/ChoArrimAlchemist.java @@ -0,0 +1,134 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.PreventionEffectData; +import mage.abilities.effects.PreventionEffectImpl; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.TargetSource; + +/** + * + * @author anonymous + */ +public class ChoArrimAlchemist extends CardImpl { + + public ChoArrimAlchemist(UUID ownerId) { + super(ownerId, 8, "Cho-Arrim Alchemist", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}{W}{W}, {tap}, Discard a card: The next time a source of your choice would deal damage to you this turn, prevent that damage. You gain life equal to the damage prevented this way. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ChoArrimAlchemistEffect(), new ManaCostsImpl("{1}{W}{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + public ChoArrimAlchemist(final ChoArrimAlchemist card) { + super(card); + } + + @Override + public ChoArrimAlchemist copy() { + return new ChoArrimAlchemist(this); + } +} + +class ChoArrimAlchemistEffect extends PreventionEffectImpl { + + private final TargetSource target; + + public ChoArrimAlchemistEffect() { + super(Duration.EndOfTurn, Integer.MAX_VALUE, false, false); + this.staticText = "The next time a source of your choice would deal damage to you this turn, prevent that damage. You gain life equal to the damage prevented this way."; + this.target = new TargetSource(); + } + + public ChoArrimAlchemistEffect(final ChoArrimAlchemistEffect effect) { + super(effect); + this.target = effect.target.copy(); + } + + @Override + public ChoArrimAlchemistEffect copy() { + return new ChoArrimAlchemistEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public void init(Ability source, Game game) { + this.target.choose(Outcome.PreventDamage, source.getControllerId(), source.getSourceId(), game); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + PreventionEffectData preventionData = preventDamageAction(event, source, game); + this.used = true; + this.discard(); // only one use + if (preventionData.getPreventedDamage() > 0) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + player.gainLife(preventionData.getPreventedDamage(), game); + } + } + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!this.used && super.applies(event, source, game)) { + if (event.getTargetId().equals(source.getControllerId()) && event.getSourceId().equals(target.getFirstTarget())) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/RighteousAura.java b/Mage.Sets/src/mage/sets/mercadianmasques/RighteousAura.java new file mode 100644 index 00000000000..dafd9416aa8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/RighteousAura.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.mercadianmasques; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author anonymous + */ +public class RighteousAura extends mage.sets.visions.RighteousAura { + + public RighteousAura(UUID ownerId) { + super(ownerId); + this.cardNumber = 45; + this.expansionSetCode = "MMQ"; + this.rarity = Rarity.UNCOMMON; + } + + public RighteousAura(final RighteousAura card) { + super(card); + } + + @Override + public RighteousAura copy() { + return new RighteousAura(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/Invulnerability.java b/Mage.Sets/src/mage/sets/tempest/Invulnerability.java new file mode 100644 index 00000000000..7c278d62dea --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/Invulnerability.java @@ -0,0 +1,64 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.effects.common.PreventNextDamageFromChosenSourceToYouEffect; +import mage.abilities.keyword.BuybackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author anonymous + */ +public class Invulnerability extends CardImpl { + + public Invulnerability(UUID ownerId) { + super(ownerId, 237, "Invulnerability", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "TMP"; + + // Buyback {3} + this.addAbility(new BuybackAbility("{3}")); + + // The next time a source of your choice would deal damage to you this turn, prevent that damage. + this.getSpellAbility().addEffect(new PreventNextDamageFromChosenSourceToYouEffect(Duration.EndOfTurn)); + } + + public Invulnerability(final Invulnerability card) { + super(card); + } + + @Override + public Invulnerability copy() { + return new Invulnerability(this); + } +} + diff --git a/Mage.Sets/src/mage/sets/visions/RighteousAura.java b/Mage.Sets/src/mage/sets/visions/RighteousAura.java new file mode 100644 index 00000000000..fd13176fe8b --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/RighteousAura.java @@ -0,0 +1,66 @@ +/* + * 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.visions; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventNextDamageFromChosenSourceToYouEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author anonymous + */ +public class RighteousAura extends CardImpl { + + public RighteousAura(UUID ownerId) { + super(ownerId, 120, "Righteous Aura", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "VIS"; + + // {W}, Pay 2 life: The next time a source of your choice would deal damage to you this turn, prevent that damage. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventNextDamageFromChosenSourceToYouEffect(Duration.EndOfTurn), new ManaCostsImpl("{W}")); + ability.addCost(new PayLifeCost(2)); + this.addAbility(ability); + } + + public RighteousAura(final RighteousAura card) { + super(card); + } + + @Override + public RighteousAura copy() { + return new RighteousAura(this); + } +} From 7432e4c082e8925eb6150fcae03483ebe3f5175c Mon Sep 17 00:00:00 2001 From: klayhamn Date: Tue, 28 Jul 2015 23:10:40 +0300 Subject: [PATCH 229/375] * Add the Foriysian Totem * Add the SourceIsCreatureCondition --- .../mage/sets/timespiral/ForiysianTotem.java | 92 +++++++++++++++++++ .../common/SourceIsCreatureCondition.java | 25 +++++ 2 files changed, 117 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java create mode 100644 Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java diff --git a/Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java b/Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java new file mode 100644 index 00000000000..b8a107eac5b --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java @@ -0,0 +1,92 @@ +/* + * 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.timespiral; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.SourceIsCreatureCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.mana.RedManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.permanent.token.Token; + +import java.util.UUID; + +/** + * + * @author klayhamn + */ +public class ForiysianTotem extends CardImpl { + + private final static String ruleText = "As long as Foriysian Totem is a creature, it can block an additional creature."; + + public ForiysianTotem(UUID ownerId) { + super(ownerId, 254, "Foriysian Totem", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "TSP"; + + // {tap}: Add {R} to your mana pool. + this.addAbility(new RedManaAbility()); + + // {4}{R}: Foriysian Totem becomes a 4/4 red Giant artifact creature with trample until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ForiysianTotemToken(), "", Duration.EndOfTurn), new ManaCostsImpl<>("{4}{R}"))); + + // As long as Foriysian Totem is a creature, it can block an additional creature. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new CanBlockAdditionalCreatureEffect(1), SourceIsCreatureCondition.getInstance() , ruleText))); + } + + public ForiysianTotem(final ForiysianTotem card) { + super(card); + } + + @Override + public ForiysianTotem copy() { + return new ForiysianTotem(this); + } + +} + +class ForiysianTotemToken extends Token { + + public ForiysianTotemToken() { + super("", "4/4 red Giant artifact creature"); + cardType.add(CardType.CREATURE); + cardType.add(CardType.ARTIFACT); + subtype.add("Giant"); + color.setRed(true); + power = new MageInt(4); + toughness = new MageInt(4); + } +} \ No newline at end of file diff --git a/Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java b/Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java new file mode 100644 index 00000000000..0a877da1621 --- /dev/null +++ b/Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java @@ -0,0 +1,25 @@ +package mage.abilities.condition.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.constants.CardType; +import mage.game.Game; + +/** + * @author klayhamn + */ +public class SourceIsCreatureCondition implements Condition { + + private static final SourceIsCreatureCondition fInstance = new SourceIsCreatureCondition(); + + public static Condition getInstance() { + return fInstance; + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject object = game.getObject(source.getSourceId()); + return object != null && object.getCardType().contains(CardType.CREATURE); + } +} From f677a779aeb40fb834b20cfd51f9cc157cfc53d9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 28 Jul 2015 22:24:08 +0200 Subject: [PATCH 230/375] * Stranglehold - Fixed the not working abilities. --- .../src/mage/sets/commander/Stranglehold.java | 10 +-- .../mage/test/cards/rules/CantSearchTest.java | 66 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/rules/CantSearchTest.java diff --git a/Mage.Sets/src/mage/sets/commander/Stranglehold.java b/Mage.Sets/src/mage/sets/commander/Stranglehold.java index e129b6c3108..ae748538b58 100644 --- a/Mage.Sets/src/mage/sets/commander/Stranglehold.java +++ b/Mage.Sets/src/mage/sets/commander/Stranglehold.java @@ -30,6 +30,7 @@ package mage.sets.commander; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ReplacementEffectImpl; import mage.cards.CardImpl; @@ -37,6 +38,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -53,10 +55,10 @@ public class Stranglehold extends CardImpl { this.expansionSetCode = "CMD"; // Your opponents can't search libraries. - this.getSpellAbility().addEffect(new OpponentsCantSearchLibarariesEffect()); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OpponentsCantSearchLibarariesEffect())); + // If an opponent would begin an extra turn, that player skips that turn instead. - this.getSpellAbility().addEffect(new StrangleholdSkipExtraTurnsEffect()); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new StrangleholdSkipExtraTurnsEffect())); } public Stranglehold(final Stranglehold card) { @@ -103,7 +105,7 @@ class OpponentsCantSearchLibarariesEffect extends ContinuousRuleModifyingEffectI public boolean checksEventType(GameEvent event, Game game) { return EventType.SEARCH_LIBRARY.equals(event.getType()); } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantSearchTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantSearchTest.java new file mode 100644 index 00000000000..f823f473314 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantSearchTest.java @@ -0,0 +1,66 @@ +/* + * 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 org.mage.test.cards.rules; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class CantSearchTest extends CardTestPlayerBase { + + /** + * Stranglehold doesn´t stop your opponents from searching libraries, at the + * moment it doesn´t work at all. Opponents were able to search their and my + * library in multiple gammes. + */ + @Test + public void testStranglehold() { + // Your opponents can't search libraries. + // If an opponent would begin an extra turn, that player skips that turn instead. + addCard(Zone.BATTLEFIELD, playerB, "Stranglehold"); + + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + // Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. + addCard(Zone.HAND, playerA, "Rampant Growth", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rampant Growth"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Rampant Growth", 1); + assertPermanentCount(playerA, 2); // only the two forests + + } + +} From eaf75f17118720665db5cf6efa2b82f69aa3c915 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Wed, 29 Jul 2015 00:58:58 +0300 Subject: [PATCH 231/375] * Add AEther Membrane --- .../mage/sets/planarchaos/AEtherMembrane.java | 52 ++++++++ .../sets/venservskoth/AEtherMembrane.java | 111 ++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/planarchaos/AEtherMembrane.java create mode 100644 Mage.Sets/src/mage/sets/venservskoth/AEtherMembrane.java diff --git a/Mage.Sets/src/mage/sets/planarchaos/AEtherMembrane.java b/Mage.Sets/src/mage/sets/planarchaos/AEtherMembrane.java new file mode 100644 index 00000000000..971b3c29428 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/AEtherMembrane.java @@ -0,0 +1,52 @@ +/* + * 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.planarchaos; + +import java.util.UUID; + +/** + * + * @author klayhamn + */ +public class AEtherMembrane extends mage.sets.venservskoth.AEtherMembrane { + + public AEtherMembrane(UUID ownerId) { + super(ownerId); + this.cardNumber = 93; + this.expansionSetCode = "PLC"; + } + + public AEtherMembrane(final AEtherMembrane card) { + super(card); + } + + @Override + public AEtherMembrane copy() { + return new AEtherMembrane(this); + } +} diff --git a/Mage.Sets/src/mage/sets/venservskoth/AEtherMembrane.java b/Mage.Sets/src/mage/sets/venservskoth/AEtherMembrane.java new file mode 100644 index 00000000000..f799049694a --- /dev/null +++ b/Mage.Sets/src/mage/sets/venservskoth/AEtherMembrane.java @@ -0,0 +1,111 @@ +/* + * 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.venservskoth; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BlocksCreatureTriggeredAbility; +import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * + * @author klayhamn + */ +public class AEtherMembrane extends CardImpl { + + public AEtherMembrane(UUID ownerId) { + super(ownerId, 48, "AEther Membrane", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); + this.expansionSetCode = "DDI"; + this.subtype.add("Wall"); + this.power = new MageInt(0); + this.toughness = new MageInt(5); + + // Defender; reach + this.addAbility(ReachAbility.getInstance()); + this.addAbility(DefenderAbility.getInstance()); + + // Whenever AEther Membrane blocks a creature, return that creature to its owner's hand at end of combat. + this.addAbility(new BlocksCreatureTriggeredAbility(new AEtherMembraneEffect(), false, true)); + } + + public AEtherMembrane(final AEtherMembrane card) { + super(card); + } + + @Override + public AEtherMembrane copy() { + return new AEtherMembrane(this); + } +} + +// @klayhamn: This is identical to the effect of KaijinOfTheVanishingTouch but there's only 2 cards with this effect +// and it's not generic enough to be extracted, imho +class AEtherMembraneEffect extends OneShotEffect { + + AEtherMembraneEffect() { + super(Outcome.ReturnToHand); + staticText = "return that creature to its owner's hand at end of combat"; + } + + AEtherMembraneEffect(final AEtherMembraneEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent targetCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source)); + if (targetCreature != null) { + AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new ReturnToHandTargetEffect()); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); + game.addDelayedTriggeredAbility(delayedAbility); + return true; + } + return false; + } + + @Override + public AEtherMembraneEffect copy() { + return new AEtherMembraneEffect(this); + } +} \ No newline at end of file From 16192bc2a4f2989293cdd05a4f280bc54fce31bd Mon Sep 17 00:00:00 2001 From: klayhamn Date: Wed, 29 Jul 2015 01:55:15 +0300 Subject: [PATCH 232/375] Fix issue #1072 - Meddling Mage incorrectly preventing copies of spells from being put on the stack --- .../src/mage/sets/alarareborn/MeddlingMage.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java b/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java index cce3267605f..2ab7ca6092b 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java +++ b/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java @@ -27,7 +27,6 @@ */ package mage.sets.alarareborn; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -36,15 +35,13 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.NameACardEffect; import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import java.util.UUID; + /** * * @author Plopman @@ -117,7 +114,8 @@ class MeddlingMageReplacementEffect extends ContinuousRuleModifyingEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { MageObject object = game.getObject(event.getSourceId()); - return object != null && object.getName().equals(game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY)); + // fixes issue #1072 + return object != null && !object.isCopy() && object.getName().equals(game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY)); } } \ No newline at end of file From afebe26247894747167e8056a76dfe4b645af5cb Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 29 Jul 2015 10:23:09 +0300 Subject: [PATCH 233/375] Implement cards: Overload, Scorching Lava, and Winnow --- .../src/mage/sets/invasion/Overload.java | 88 +++++++++++++++ .../src/mage/sets/invasion/ScorchingLava.java | 79 ++++++++++++++ Mage.Sets/src/mage/sets/invasion/Winnow.java | 100 ++++++++++++++++++ 3 files changed, 267 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/invasion/Overload.java create mode 100644 Mage.Sets/src/mage/sets/invasion/ScorchingLava.java create mode 100644 Mage.Sets/src/mage/sets/invasion/Winnow.java diff --git a/Mage.Sets/src/mage/sets/invasion/Overload.java b/Mage.Sets/src/mage/sets/invasion/Overload.java new file mode 100644 index 00000000000..a68c354a336 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/Overload.java @@ -0,0 +1,88 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.target.common.TargetArtifactPermanent; + +/** + * + * @author LoneFox + */ +public class Overload extends CardImpl { + + private static final FilterArtifactPermanent filter2 = new FilterArtifactPermanent("artifact if its converted mana cost is 2 or less"); + private static final FilterArtifactPermanent filter5 = new FilterArtifactPermanent("artifact if its converted mana cost is 5 or less"); + + static { + filter2.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 3)); + filter5.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 5)); + } + + public Overload(UUID ownerId) { + super(ownerId, 157, "Overload", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{R}"); + this.expansionSetCode = "INV"; + + // Kicker {2} + this.addAbility(new KickerAbility("{2}")); + // Destroy target artifact if its converted mana cost is 2 or less. If Overload was kicked, destroy that artifact if its converted mana cost is 5 or less instead. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetArtifactPermanent(filter5)); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if(ability instanceof SpellAbility) { + if(!KickedCondition.getInstance().apply(game, ability)) { + ability.getTargets().clear(); + ability.getTargets().add(new TargetArtifactPermanent(filter2)); + } + } + } + + public Overload(final Overload card) { + super(card); + } + + @Override + public Overload copy() { + return new Overload(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/ScorchingLava.java b/Mage.Sets/src/mage/sets/invasion/ScorchingLava.java new file mode 100644 index 00000000000..89e042afc84 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/ScorchingLava.java @@ -0,0 +1,79 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.condition.LockedInCondition; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; +import mage.abilities.decorator.ConditionalReplacementEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies; +import mage.abilities.effects.common.ruleModifying.CantRegenerateTargetEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; +import mage.watchers.common.DamagedByWatcher; + +/** + * + * @author LoneFox + */ +public class ScorchingLava extends CardImpl { + + public ScorchingLava(UUID ownerId) { + super(ownerId, 164, "Scorching Lava", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}"); + this.expansionSetCode = "INV"; + + // Kicker {R} + this.addAbility(new KickerAbility("{R}")); + // Scorching Lava deals 2 damage to target creature or player. If Scorching Lava was kicked, that creature can't be regenerated this turn and if it would die this turn, exile it instead. + this.getSpellAbility().addEffect(new DamageTargetEffect(2)); + this.getSpellAbility().addEffect(new ConditionalContinuousRuleModifyingEffect( + new CantRegenerateTargetEffect(Duration.EndOfTurn, "That creature"), new LockedInCondition(KickedCondition.getInstance()))); + Effect effect = new ConditionalReplacementEffect(new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn), + new LockedInCondition(KickedCondition.getInstance())); + effect.setText("and if it would die this turn, exile it instead"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + this.getSpellAbility().addWatcher(new DamagedByWatcher()); + } + + public ScorchingLava(final ScorchingLava card) { + super(card); + } + + @Override + public ScorchingLava copy() { + return new ScorchingLava(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/Winnow.java b/Mage.Sets/src/mage/sets/invasion/Winnow.java new file mode 100644 index 00000000000..c309612be7c --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/Winnow.java @@ -0,0 +1,100 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetNonlandPermanent; + +/** + * + * @author LoneFox + */ +public class Winnow extends CardImpl { + + public Winnow(UUID ownerId) { + super(ownerId, 45, "Winnow", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "INV"; + + // Destroy target nonland permanent if another permanent with the same name is on the battlefield. + this.getSpellAbility().addEffect(new WinnowEffect()); + this.getSpellAbility().addTarget(new TargetNonlandPermanent()); + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public Winnow(final Winnow card) { + super(card); + } + + @Override + public Winnow copy() { + return new Winnow(this); + } +} + +class WinnowEffect extends DestroyTargetEffect { + + public WinnowEffect() { + super(); + staticText = "Destroy target nonland permanent if another permanent with the same name is on the battlefield."; + } + + public WinnowEffect(final WinnowEffect effect) { + super(effect); + } + + @Override + public WinnowEffect copy() { + return new WinnowEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent target = game.getPermanent(source.getFirstTarget()); + if(target != null) { + FilterPermanent filter = new FilterPermanent(); + filter.add(new NamePredicate(target.getName())); + if(new PermanentsOnBattlefieldCount(filter).calculate(game, source, this) > 1) { + super.apply(game, source); + } + return true; + } + return false; + } +} From 16a63cea0647c911db002de0569dee6ed0bf6bbb Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 29 Jul 2015 10:24:00 +0300 Subject: [PATCH 234/375] Fix the kicked effect of Explosive Growth --- Mage.Sets/src/mage/sets/invasion/ExplosiveGrowth.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/invasion/ExplosiveGrowth.java b/Mage.Sets/src/mage/sets/invasion/ExplosiveGrowth.java index 8862c23620a..6b71c14bc36 100644 --- a/Mage.Sets/src/mage/sets/invasion/ExplosiveGrowth.java +++ b/Mage.Sets/src/mage/sets/invasion/ExplosiveGrowth.java @@ -28,6 +28,7 @@ package mage.sets.invasion; import java.util.UUID; +import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.KickedCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -50,11 +51,11 @@ public class ExplosiveGrowth extends CardImpl { // Kicker {5} this.addAbility(new KickerAbility("{5}")); - + // Target creature gets +2/+2 until end of turn. If Explosive Growth was kicked, that creature gets +5/+5 until end of turn instead. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new ConditionalContinuousEffect(new BoostTargetEffect(5, 5, Duration.EndOfTurn), - new BoostTargetEffect(2, 2, Duration.EndOfTurn), KickedCondition.getInstance(), + new BoostTargetEffect(2, 2, Duration.EndOfTurn), new LockedInCondition(KickedCondition.getInstance()), "Target creature gets +2/+2 until end of turn. If Explosive Growth was kicked, that creature gets +5/+5 until end of turn instead.")); } @@ -66,4 +67,4 @@ public class ExplosiveGrowth extends CardImpl { public ExplosiveGrowth copy() { return new ExplosiveGrowth(this); } -} \ No newline at end of file +} From 8c583afd651c31d0a9afe4be4479ea78e059219a Mon Sep 17 00:00:00 2001 From: fireshoes Date: Wed, 29 Jul 2015 13:22:44 -0500 Subject: [PATCH 235/375] Updated mtg-cards-data.txt with BFZ spoiler Oblivion Sower. Implemented ~13 cards. --- .../mage/sets/darksteel/VulshokWarBoar.java | 70 +++++++++ .../sets/eighthedition/PrimevalForce.java | 146 +++++++++--------- .../src/mage/sets/exodus/TheftOfDreams.java | 97 ++++++++++++ .../src/mage/sets/legends/MoldDemon.java | 75 +++++++++ .../sets/masterseditioniv/TheftOfDreams.java | 54 +++++++ .../src/mage/sets/mirrodin/NimDevourer.java | 125 +++++++++++++++ .../mage/sets/onslaught/CabalExecutioner.java | 116 ++++++++++++++ .../src/mage/sets/portal/PlantElemental.java | 74 +++++++++ .../src/mage/sets/portal/TheftOfDreams.java | 54 +++++++ .../sets/portalsecondage/TheftOfDreams.java | 54 +++++++ .../sets/portalthreekingdoms/Deception.java | 60 +++++++ .../src/mage/sets/ravnica/Blockbuster.java | 69 +++++++++ .../mage/sets/ravnica/StoneshakerShaman.java | 74 +++++++++ .../mage/sets/tempest/ServantOfVolrath.java | 67 ++++++++ .../src/mage/sets/tempest/WorthyCause.java | 71 +++++++++ .../mage/sets/weatherlight/RogueElephant.java | 73 +++++++++ .../sets/weatherlight/TendrilsOfDespair.java | 65 ++++++++ Utils/mtg-cards-data.txt | 1 + 18 files changed, 1272 insertions(+), 73 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/darksteel/VulshokWarBoar.java create mode 100644 Mage.Sets/src/mage/sets/exodus/TheftOfDreams.java create mode 100644 Mage.Sets/src/mage/sets/legends/MoldDemon.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/TheftOfDreams.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/CabalExecutioner.java create mode 100644 Mage.Sets/src/mage/sets/portal/PlantElemental.java create mode 100644 Mage.Sets/src/mage/sets/portal/TheftOfDreams.java create mode 100644 Mage.Sets/src/mage/sets/portalsecondage/TheftOfDreams.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/Deception.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/Blockbuster.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/StoneshakerShaman.java create mode 100644 Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.java create mode 100644 Mage.Sets/src/mage/sets/tempest/WorthyCause.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/RogueElephant.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/TendrilsOfDespair.java diff --git a/Mage.Sets/src/mage/sets/darksteel/VulshokWarBoar.java b/Mage.Sets/src/mage/sets/darksteel/VulshokWarBoar.java new file mode 100644 index 00000000000..60fe264ccea --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/VulshokWarBoar.java @@ -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.darksteel; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class VulshokWarBoar extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledArtifactPermanent("an artifact"); + + public VulshokWarBoar(UUID ownerId) { + super(ownerId, 72, "Vulshok War Boar", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + this.expansionSetCode = "DST"; + this.subtype.add("Boar"); + this.subtype.add("Beast"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // When Vulshok War Boar enters the battlefield, sacrifice it unless you sacrifice an artifact. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(filter))))); + } + + public VulshokWarBoar(final VulshokWarBoar card) { + super(card); + } + + @Override + public VulshokWarBoar copy() { + return new VulshokWarBoar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/eighthedition/PrimevalForce.java b/Mage.Sets/src/mage/sets/eighthedition/PrimevalForce.java index 34329114d1f..d5e41013983 100644 --- a/Mage.Sets/src/mage/sets/eighthedition/PrimevalForce.java +++ b/Mage.Sets/src/mage/sets/eighthedition/PrimevalForce.java @@ -1,73 +1,73 @@ -/* - * 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.eighthedition; - -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.MageInt; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; -import mage.cards.CardImpl; -import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.target.common.TargetControlledPermanent; - -/** - * - * @author Plopman - */ -public class PrimevalForce extends CardImpl { - - private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("Forest"); - static{ - filter.add(new SubtypePredicate("Forest")); - } - - public PrimevalForce(UUID ownerId) { - super(ownerId, 273, "Primeval Force", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}{G}"); - this.expansionSetCode = "8ED"; - this.subtype.add("Elemental"); - - this.power = new MageInt(8); - this.toughness = new MageInt(8); - - // When Primeval Force enters the battlefield, sacrifice it unless you sacrifice three Forests. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(3, 3, filter, true))))); - } - - public PrimevalForce(final PrimevalForce card) { - super(card); - } - - @Override - public PrimevalForce copy() { - return new PrimevalForce(this); - } -} +/* + * 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.eighthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author Plopman + */ +public class PrimevalForce extends CardImpl { + + private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("three Forests"); + static{ + filter.add(new SubtypePredicate("Forest")); + } + + public PrimevalForce(UUID ownerId) { + super(ownerId, 273, "Primeval Force", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}{G}"); + this.expansionSetCode = "8ED"; + this.subtype.add("Elemental"); + + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // When Primeval Force enters the battlefield, sacrifice it unless you sacrifice three Forests. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(3, 3, filter, true))))); + } + + public PrimevalForce(final PrimevalForce card) { + super(card); + } + + @Override + public PrimevalForce copy() { + return new PrimevalForce(this); + } +} diff --git a/Mage.Sets/src/mage/sets/exodus/TheftOfDreams.java b/Mage.Sets/src/mage/sets/exodus/TheftOfDreams.java new file mode 100644 index 00000000000..e1b3c1a9fde --- /dev/null +++ b/Mage.Sets/src/mage/sets/exodus/TheftOfDreams.java @@ -0,0 +1,97 @@ +/* + * 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.exodus; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class TheftOfDreams extends CardImpl { + + public TheftOfDreams(UUID ownerId) { + super(ownerId, 49, "Theft of Dreams", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{U}"); + this.expansionSetCode = "EXO"; + + // Draw a card for each tapped creature target opponent controls. + this.getSpellAbility().addEffect(new TheftOfDreamsEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public TheftOfDreams(final TheftOfDreams card) { + super(card); + } + + @Override + public TheftOfDreams copy() { + return new TheftOfDreams(this); + } +} + +class TheftOfDreamsEffect extends OneShotEffect { + + public TheftOfDreamsEffect() { + super(Outcome.DrawCard); + this.staticText = "Draw a card for each tapped creature target opponent controls"; + } + + public TheftOfDreamsEffect(final TheftOfDreamsEffect effect) { + super(effect); + } + + @Override + public TheftOfDreamsEffect copy() { + return new TheftOfDreamsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (opponent != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new TappedPredicate()); + filter.add(new ControllerIdPredicate(opponent.getId())); + return new DrawCardSourceControllerEffect(game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game)).apply(game, source); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/legends/MoldDemon.java b/Mage.Sets/src/mage/sets/legends/MoldDemon.java new file mode 100644 index 00000000000..4ba53333fad --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/MoldDemon.java @@ -0,0 +1,75 @@ +/* + * 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.legends; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class MoldDemon extends CardImpl { + + private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("two Swamps"); + + static{ + filter.add(new SubtypePredicate("Swamp")); + } + + public MoldDemon(UUID ownerId) { + super(ownerId, 26, "Mold Demon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}"); + this.expansionSetCode = "LEG"; + this.subtype.add("Fungus"); + this.subtype.add("Demon"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // When Mold Demon enters the battlefield, sacrifice it unless you sacrifice two Swamps. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, true))))); + } + + public MoldDemon(final MoldDemon card) { + super(card); + } + + @Override + public MoldDemon copy() { + return new MoldDemon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/TheftOfDreams.java b/Mage.Sets/src/mage/sets/masterseditioniv/TheftOfDreams.java new file mode 100644 index 00000000000..fa21c71af72 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/TheftOfDreams.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.masterseditioniv; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class TheftOfDreams extends mage.sets.exodus.TheftOfDreams { + + public TheftOfDreams(UUID ownerId) { + super(ownerId); + this.cardNumber = 67; + this.expansionSetCode = "ME4"; + this.rarity = Rarity.UNCOMMON; + } + + public TheftOfDreams(final TheftOfDreams card) { + super(card); + } + + @Override + public TheftOfDreams copy() { + return new TheftOfDreams(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java b/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java new file mode 100644 index 00000000000..5096665ecc1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java @@ -0,0 +1,125 @@ +/* + * 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.mirrodin; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class NimDevourer extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("artifact you control"); + + static { + filter.add(new CardTypePredicate(CardType.ARTIFACT)); + } + + public NimDevourer(UUID ownerId) { + super(ownerId, 70, "Nim Devourer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); + this.expansionSetCode = "MRD"; + this.subtype.add("Zombie"); + this.power = new MageInt(4); + this.toughness = new MageInt(1); + + // Nim Devourer gets +1/+0 for each artifact you control. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(new PermanentsOnBattlefieldCount(filter), new StaticValue(0), Duration.WhileOnBattlefield))); + + // {B}{B}: Return Nim Devourer from your graveyard to the battlefield, then sacrifice a creature. Activate this ability only during your upkeep. + Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl("{B}{B}")); + ability.addEffect(new NimDevourerEffect()); + this.addAbility(ability); + } + + public NimDevourer(final NimDevourer card) { + super(card); + } + + @Override + public NimDevourer copy() { + return new NimDevourer(this); + } +} + +class NimDevourerEffect extends OneShotEffect { + + public NimDevourerEffect() { + super(Outcome.Sacrifice); + this.staticText = "then sacrifice a creature"; + } + + public NimDevourerEffect(final NimDevourerEffect effect) { + super(effect); + } + + @Override + public NimDevourerEffect copy() { + return new NimDevourerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + Target target = new TargetControlledPermanent(new FilterControlledCreaturePermanent()); + + if (target.canChoose(player.getId(), game) && player.choose(Outcome.Sacrifice, target, source.getSourceId(), game)) { + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + return permanent.sacrifice(source.getSourceId(), game); + } + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/onslaught/CabalExecutioner.java b/Mage.Sets/src/mage/sets/onslaught/CabalExecutioner.java new file mode 100644 index 00000000000..f29be5c3967 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/CabalExecutioner.java @@ -0,0 +1,116 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.SacrificeEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.DamagedPlayerEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class CabalExecutioner extends CardImpl { + + public CabalExecutioner(UUID ownerId) { + super(ownerId, 130, "Cabal Executioner", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Cabal Executioner deals combat damage to a player, that player sacrifices a creature. + this.addAbility(new CabalExecutionerAbility()); + + // Morph {3}{B}{B} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{3}{B}{B}"))); + } + + public CabalExecutioner(final CabalExecutioner card) { + super(card); + } + + @Override + public CabalExecutioner copy() { + return new CabalExecutioner(this); + } +} + +class CabalExecutionerAbility extends TriggeredAbilityImpl { + + public CabalExecutionerAbility() { + super(Zone.BATTLEFIELD, new SacrificeEffect(new FilterCreaturePermanent(), 1, "")); + } + + public CabalExecutionerAbility(final CabalExecutionerAbility ability) { + super(ability); + } + + @Override + public CabalExecutionerAbility copy() { + return new CabalExecutionerAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return EventType.DAMAGED_PLAYER.equals(event.getType()); + } + + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; + if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); + } + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever {this} deals combat damage to a player, that player sacrifices a creature."; + } +} diff --git a/Mage.Sets/src/mage/sets/portal/PlantElemental.java b/Mage.Sets/src/mage/sets/portal/PlantElemental.java new file mode 100644 index 00000000000..012a1d5cf9a --- /dev/null +++ b/Mage.Sets/src/mage/sets/portal/PlantElemental.java @@ -0,0 +1,74 @@ +/* + * 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.portal; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class PlantElemental extends CardImpl { + + private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("a Forest"); + + static{ + filter.add(new SubtypePredicate("Forest")); + } + + public PlantElemental(UUID ownerId) { + super(ownerId, 107, "Plant Elemental", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "POR"; + this.subtype.add("Plant"); + this.subtype.add("Elemental"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // When Plant Elemental enters the battlefield, sacrifice it unless you sacrifice a Forest. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(filter))))); + } + + public PlantElemental(final PlantElemental card) { + super(card); + } + + @Override + public PlantElemental copy() { + return new PlantElemental(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portal/TheftOfDreams.java b/Mage.Sets/src/mage/sets/portal/TheftOfDreams.java new file mode 100644 index 00000000000..6342c53c2e6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portal/TheftOfDreams.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.portal; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class TheftOfDreams extends mage.sets.exodus.TheftOfDreams { + + public TheftOfDreams(UUID ownerId) { + super(ownerId); + this.cardNumber = 73; + this.expansionSetCode = "POR"; + this.rarity = Rarity.UNCOMMON; + } + + public TheftOfDreams(final TheftOfDreams card) { + super(card); + } + + @Override + public TheftOfDreams copy() { + return new TheftOfDreams(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalsecondage/TheftOfDreams.java b/Mage.Sets/src/mage/sets/portalsecondage/TheftOfDreams.java new file mode 100644 index 00000000000..4035e36a471 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalsecondage/TheftOfDreams.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.portalsecondage; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class TheftOfDreams extends mage.sets.exodus.TheftOfDreams { + + public TheftOfDreams(UUID ownerId) { + super(ownerId); + this.cardNumber = 55; + this.expansionSetCode = "PO2"; + this.rarity = Rarity.UNCOMMON; + } + + public TheftOfDreams(final TheftOfDreams card) { + super(card); + } + + @Override + public TheftOfDreams copy() { + return new TheftOfDreams(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/Deception.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/Deception.java new file mode 100644 index 00000000000..59fdf2a4bb4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/Deception.java @@ -0,0 +1,60 @@ +/* + * 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.portalthreekingdoms; + +import java.util.UUID; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class Deception extends CardImpl { + + public Deception(UUID ownerId) { + super(ownerId, 73, "Deception", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{B}"); + this.expansionSetCode = "PTK"; + + // Target opponent discards two cards. + this.getSpellAbility().addTarget(new TargetOpponent()); + this.getSpellAbility().addEffect(new DiscardTargetEffect(2)); + } + + public Deception(final Deception card) { + super(card); + } + + @Override + public Deception copy() { + return new Deception(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/Blockbuster.java b/Mage.Sets/src/mage/sets/ravnica/Blockbuster.java new file mode 100644 index 00000000000..0a3520ac9b0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/Blockbuster.java @@ -0,0 +1,69 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.TappedPredicate; + +/** + * + * @author fireshoes + */ +public class Blockbuster extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature"); + + static { + filter.add(new TappedPredicate()); + } + + public Blockbuster(UUID ownerId) { + super(ownerId, 115, "Blockbuster", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}{R}"); + this.expansionSetCode = "RAV"; + + // {1}{R}, Sacrifice Blockbuster: Blockbuster deals 3 damage to each tapped creature and each player. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageEverythingEffect(3, filter), new ManaCostsImpl("{1}{R}"))); + } + + public Blockbuster(final Blockbuster card) { + super(card); + } + + @Override + public Blockbuster copy() { + return new Blockbuster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/StoneshakerShaman.java b/Mage.Sets/src/mage/sets/ravnica/StoneshakerShaman.java new file mode 100644 index 00000000000..77579329ae6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/StoneshakerShaman.java @@ -0,0 +1,74 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.effects.common.SacrificeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; + +/** + * + * @author fireshoes + */ +public class StoneshakerShaman extends CardImpl { + + private static final FilterLandPermanent filter = new FilterLandPermanent("untapped land"); + + static { + filter.add(Predicates.not(new TappedPredicate())); + } + + public StoneshakerShaman(UUID ownerId) { + super(ownerId, 145, "Stoneshaker Shaman", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Human"); + this.subtype.add("Shaman"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // At the beginning of each player's end step, that player sacrifices an untapped land. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new SacrificeEffect(filter, 1, "that player "), TargetController.ANY, false)); + } + + public StoneshakerShaman(final StoneshakerShaman card) { + super(card); + } + + @Override + public StoneshakerShaman copy() { + return new StoneshakerShaman(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.java b/Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.java new file mode 100644 index 00000000000..ac860ea4ce9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.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.tempest; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class ServantOfVolrath extends CardImpl { + + public ServantOfVolrath(UUID ownerId) { + super(ownerId, 50, "Servant of Volrath", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "TMP"; + this.subtype.add("Minion"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When Servant of Volrath leaves the battlefield, sacrifice a creature. + Ability ability = new LeavesBattlefieldTriggeredAbility(new SacrificeTargetEffect(), false); + ability.addTarget(new TargetControlledCreaturePermanent()); + this.addAbility(ability); + } + + public ServantOfVolrath(final ServantOfVolrath card) { + super(card); + } + + @Override + public ServantOfVolrath copy() { + return new ServantOfVolrath(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/WorthyCause.java b/Mage.Sets/src/mage/sets/tempest/WorthyCause.java new file mode 100644 index 00000000000..64bcac4466d --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/WorthyCause.java @@ -0,0 +1,71 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.BuybackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class WorthyCause extends CardImpl { + + public WorthyCause(UUID ownerId) { + super(ownerId, 265, "Worthy Cause", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{W}"); + this.expansionSetCode = "TMP"; + + // Buyback {2} + this.addAbility(new BuybackAbility("{2}")); + + // As an additional cost to cast Worthy Cause, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + + // You gain life equal to the sacrificed creature's toughness. + Effect effect = new GainLifeEffect(new SacrificeCostCreaturesToughness()); + effect.setText("You gain life equal to the sacrificed creature's toughness"); + this.getSpellAbility().addEffect(effect); + } + + public WorthyCause(final WorthyCause card) { + super(card); + } + + @Override + public WorthyCause copy() { + return new WorthyCause(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/RogueElephant.java b/Mage.Sets/src/mage/sets/weatherlight/RogueElephant.java new file mode 100644 index 00000000000..be79f2afd4e --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/RogueElephant.java @@ -0,0 +1,73 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class RogueElephant extends CardImpl { + + private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("a Forest"); + + static{ + filter.add(new SubtypePredicate("Forest")); + } + + public RogueElephant(UUID ownerId) { + super(ownerId, 81, "Rogue Elephant", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Elephant"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When Rogue Elephant enters the battlefield, sacrifice it unless you sacrifice a Forest. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(filter))))); + } + + public RogueElephant(final RogueElephant card) { + super(card); + } + + @Override + public RogueElephant copy() { + return new RogueElephant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/TendrilsOfDespair.java b/Mage.Sets/src/mage/sets/weatherlight/TendrilsOfDespair.java new file mode 100644 index 00000000000..0e04d0c179b --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/TendrilsOfDespair.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.weatherlight; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class TendrilsOfDespair extends CardImpl { + + public TendrilsOfDespair(UUID ownerId) { + super(ownerId, 25, "Tendrils of Despair", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{B}"); + this.expansionSetCode = "WTH"; + + // As an additional cost to cast Tendrils of Despair, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + + // Target opponent discards two cards. + this.getSpellAbility().addTarget(new TargetOpponent()); + this.getSpellAbility().addEffect(new DiscardTargetEffect(2)); + } + + public TendrilsOfDespair(final TendrilsOfDespair card) { + super(card); + } + + @Override + public TendrilsOfDespair copy() { + return new TendrilsOfDespair(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 9104f393604..e6fcd5d3cb4 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -27237,4 +27237,5 @@ Akroma, Angel of Fury|From the Vault: Angels|1|M|{5}{R}{R}{R}|Legendary Creature Akroma, Angel of Wrath|From the Vault: Angels|2|M|{5}{W}{W}{W}|Legendary Creature - Angel|6|6|Flying, first strike, vigilance, trample, haste, protection from black and from red| Avacyn, Angel of Hope|From the Vault: Angels|5|M|{5}{W}{W}{W}|Legendary Creature - Angel|8|8|Flying, vigilance$Avacyn, Angel of Hope and other permanents you control are indestructible.| Iona, Shield of Emeria|From the Vault: Angels|9|M|{6}{W}{W}{W}|Legendary Creature - Angel|7|7|Flying$As Iona, Shield of Emeria enters the battlefield, choose a color.$Your opponents can't cast spells of the chosen color.| +Oblivion Sower|Battle for Zendikar|999|M|{6}|Creature - Eldrazi|5|8|When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.| Evolving Wilds|Battle for Zendikar|236|C||Land|||{T}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library.| \ No newline at end of file From 2a3facd289c20d197acf42acee8416d48453ed87 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Wed, 29 Jul 2015 22:13:07 +0300 Subject: [PATCH 236/375] Fix that celestial mantle incorrectly untapped all of its owners lands --- Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java b/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java index a4fc1945330..b1a4a82922f 100644 --- a/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java +++ b/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java @@ -28,21 +28,15 @@ package mage.sets.zendikar; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.UntapAllLandsControllerEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; @@ -52,6 +46,8 @@ import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author Loki @@ -88,7 +84,6 @@ class CelestialMantleAbility extends TriggeredAbilityImpl { public CelestialMantleAbility() { super(Zone.BATTLEFIELD, new CelestialMantleEffect()); - this.addEffect(new UntapAllLandsControllerEffect()); } public CelestialMantleAbility(final CelestialMantleAbility ability) { From 3283e57ae656960dfb71efa332cef7ec38262b9e Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Wed, 29 Jul 2015 21:11:11 -0700 Subject: [PATCH 237/375] implemented Zedruu the Greathearted --- .../sets/commander/ZedruuTheGreathearted.java | 127 ++++++++++++++++++ ...anentsYouOwnThatOpponentsControlCount.java | 56 ++++++++ 2 files changed, 183 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java create mode 100644 Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java diff --git a/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java b/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java new file mode 100644 index 00000000000..881dc212f2d --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java @@ -0,0 +1,127 @@ +/* + * 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.commander; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; +import mage.abilities.dynamicvalue.common.PermanentsYouOwnThatOpponentsControlCount; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author anonymous + */ +public class ZedruuTheGreathearted extends CardImpl { + + public ZedruuTheGreathearted(UUID ownerId) { + super(ownerId, 240, "Zedruu the Greathearted", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{1}{R}{W}{U}"); + this.expansionSetCode = "CMD"; + this.supertype.add("Legendary"); + this.subtype.add("Minotaur"); + this.subtype.add("Monk"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // At the beginning of your upkeep, you gain X life and draw X cards, where X is the number of permanents you own that your opponents control. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(new PermanentsYouOwnThatOpponentsControlCount()), TargetController.YOU, false)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(new PermanentsYouOwnThatOpponentsControlCount()), TargetController.YOU, false)); + + // {R}{W}{U}: Target opponent gains control of target permanent you control. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ZedruuTheGreatheartedEffect(), new ManaCostsImpl("{R}{W}{U}")); + ability.addTarget(new TargetOpponent()); + ability.addTarget(new TargetControlledPermanent()); + this.addAbility(ability); + } + + public ZedruuTheGreathearted(final ZedruuTheGreathearted card) { + super(card); + } + + @Override + public ZedruuTheGreathearted copy() { + return new ZedruuTheGreathearted(this); + } + + class ZedruuTheGreatheartedEffect extends ContinuousEffectImpl { + + MageObjectReference targetPermanentReference; + + public ZedruuTheGreatheartedEffect() { + super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + this.staticText = "Target opponent gains control of target permanent you control"; + } + + public ZedruuTheGreatheartedEffect(final ZedruuTheGreatheartedEffect effect) { + super(effect); + this.targetPermanentReference = effect.targetPermanentReference; + } + + @Override + public ZedruuTheGreatheartedEffect copy() { + return new ZedruuTheGreatheartedEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + targetPermanentReference = new MageObjectReference(source.getTargets().get(1).getFirstTarget(), game); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + Permanent permanent = targetPermanentReference.getPermanent(game); + if (player != null && permanent != null) { + return permanent.changeControllerId(player.getId(), game); + } else { + discard(); + } + return false; + } + } +} diff --git a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java new file mode 100644 index 00000000000..9e80bf4e7af --- /dev/null +++ b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java @@ -0,0 +1,56 @@ +package mage.abilities.dynamicvalue.common; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class PermanentsYouOwnThatOpponentsControlCount implements DynamicValue { + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + if (sourceAbility != null) { + Player controller = game.getPlayer(sourceAbility.getControllerId()); + + if (controller != null) { + UUID controllerId = controller.getId(); + Set opponentIds = game.getOpponents(controllerId); + int count = 0; + + for (UUID opponentId : opponentIds){ + List opponentPermanents = game.getBattlefield().getAllActivePermanents(opponentId); + + for (Permanent opponentPermanent : opponentPermanents){ + if (opponentPermanent.getOwnerId().equals(controllerId)){ + count++; + } + } + } + + return count; + } + } + return 0; + } + + @Override + public DynamicValue copy() { + return new PermanentsYouOwnThatOpponentsControlCount(); + } + + @Override + public String getMessage() { + return "number of permanents you own that your opponents control"; + } + + @Override + public String toString() { + return "1"; + } +} + From b54b795bc1dc116c736b8b1be4af8bea0875c382 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Wed, 29 Jul 2015 22:42:52 -0700 Subject: [PATCH 238/375] made Zedruu's upkeep ability into a single ability with two effects --- .../src/mage/sets/commander/ZedruuTheGreathearted.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java b/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java index 881dc212f2d..22c05643085 100644 --- a/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java +++ b/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java @@ -68,11 +68,12 @@ public class ZedruuTheGreathearted extends CardImpl { this.toughness = new MageInt(4); // At the beginning of your upkeep, you gain X life and draw X cards, where X is the number of permanents you own that your opponents control. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(new PermanentsYouOwnThatOpponentsControlCount()), TargetController.YOU, false)); - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(new PermanentsYouOwnThatOpponentsControlCount()), TargetController.YOU, false)); + Ability ability = new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(new PermanentsYouOwnThatOpponentsControlCount()), TargetController.YOU, false); + ability.addEffect(new DrawCardSourceControllerEffect(new PermanentsYouOwnThatOpponentsControlCount())); + this.addAbility(ability); // {R}{W}{U}: Target opponent gains control of target permanent you control. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ZedruuTheGreatheartedEffect(), new ManaCostsImpl("{R}{W}{U}")); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ZedruuTheGreatheartedEffect(), new ManaCostsImpl("{R}{W}{U}")); ability.addTarget(new TargetOpponent()); ability.addTarget(new TargetControlledPermanent()); this.addAbility(ability); From 67bd4956d986a69ebdb40a97cff32cf4a5217f2e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 30 Jul 2015 11:29:36 +0200 Subject: [PATCH 239/375] * Changed return class of copy method. --- .../dynamicvalue/IntPlusDynamicValue.java | 5 +-- .../dynamicvalue/MultipliedValue.java | 5 +-- .../common/AttackingCreatureCount.java | 5 +-- .../common/AuraAttachedCount.java | 7 ++-- .../common/CardsInAllGraveyardsCount.java | 3 +- .../CardsInControllerGraveyardCount.java | 2 +- .../common/CardsInControllerHandCount.java | 3 +- .../common/CardsInTargetPlayerHandCount.java | 4 +- .../common/ControllerGotLifeCount.java | 13 +++---- .../common/ControllerLifeCount.java | 3 +- .../dynamicvalue/common/CountersCount.java | 2 +- .../dynamicvalue/common/DevotionCount.java | 16 ++++---- .../common/DevouredCreaturesCount.java | 4 +- .../common/DiscardCostCardConvertedMana.java | 7 ++-- .../dynamicvalue/common/DomainValue.java | 2 +- .../common/EquipmentAttachedCount.java | 7 ++-- .../ExileFromHandCostCardConvertedMana.java | 12 +++--- .../common/ManaSpentToCastCount.java | 6 +-- .../common/ManaTypeInManaPoolCount.java | 2 +- .../common/OpponentsLostLifeCount.java | 9 ++--- .../dynamicvalue/common/ParleyCount.java | 2 +- .../common/PermanentsOnBattlefieldCount.java | 29 ++++++++++++++- ...PermanentsTargetOpponentControlsCount.java | 37 ++++++++++++++++--- .../common/RemovedCountersForCostValue.java | 7 ++-- .../common/RevealTargetFromHandCostCount.java | 7 ++-- .../common/SacrificeCostCreaturesPower.java | 7 ++-- .../SacrificeCostCreaturesToughness.java | 7 ++-- .../common/SignInversionDynamicValue.java | 3 +- .../common/SourcePermanentPowerCount.java | 2 +- .../dynamicvalue/common/StaticValue.java | 7 ++-- .../dynamicvalue/common/SunburstCount.java | 27 ++++++-------- .../common/TargetConvertedManaCost.java | 2 +- .../common/TargetPermanentPowerCount.java | 2 +- .../dynamicvalue/common/UrzaTerrainValue.java | 12 +++--- 34 files changed, 148 insertions(+), 120 deletions(-) diff --git a/Mage/src/mage/abilities/dynamicvalue/IntPlusDynamicValue.java b/Mage/src/mage/abilities/dynamicvalue/IntPlusDynamicValue.java index bb787f1db5d..17b2373adee 100644 --- a/Mage/src/mage/abilities/dynamicvalue/IntPlusDynamicValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/IntPlusDynamicValue.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue; import mage.abilities.Ability; @@ -36,8 +35,8 @@ import mage.game.Game; * * @author LevelX2 */ - public class IntPlusDynamicValue implements DynamicValue { + private final DynamicValue value; private final int baseValue; @@ -57,7 +56,7 @@ public class IntPlusDynamicValue implements DynamicValue { } @Override - public DynamicValue copy() { + public IntPlusDynamicValue copy() { return new IntPlusDynamicValue(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/MultipliedValue.java b/Mage/src/mage/abilities/dynamicvalue/MultipliedValue.java index 142e4957461..66c92a0809a 100644 --- a/Mage/src/mage/abilities/dynamicvalue/MultipliedValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/MultipliedValue.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue; import mage.abilities.Ability; @@ -36,8 +35,8 @@ import mage.game.Game; * * @author LevelX2 */ - public class MultipliedValue implements DynamicValue { + private final DynamicValue value; private final int multplier; @@ -57,7 +56,7 @@ public class MultipliedValue implements DynamicValue { } @Override - public DynamicValue copy() { + public MultipliedValue copy() { return new MultipliedValue(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java b/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java index cb14e541b48..085246aa33b 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue.common; import mage.abilities.Ability; @@ -38,8 +37,6 @@ import mage.game.combat.CombatGroup; * * @author LevelX2 */ - - public class AttackingCreatureCount implements DynamicValue { private String message; @@ -67,7 +64,7 @@ public class AttackingCreatureCount implements DynamicValue { } @Override - public DynamicValue copy() { + public AttackingCreatureCount copy() { return new AttackingCreatureCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/AuraAttachedCount.java b/Mage/src/mage/abilities/dynamicvalue/common/AuraAttachedCount.java index 373025c4383..be484456be7 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/AuraAttachedCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/AuraAttachedCount.java @@ -27,15 +27,14 @@ */ package mage.abilities.dynamicvalue.common; +import java.util.List; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.game.Game; import mage.game.permanent.Permanent; -import java.util.List; -import java.util.UUID; - /** * * @author North @@ -74,7 +73,7 @@ public class AuraAttachedCount implements DynamicValue { } @Override - public DynamicValue copy() { + public AuraAttachedCount copy() { return new AuraAttachedCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CardsInAllGraveyardsCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CardsInAllGraveyardsCount.java index debf69c55dc..caec5c530a7 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/CardsInAllGraveyardsCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/CardsInAllGraveyardsCount.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue.common; import java.util.UUID; @@ -72,7 +71,7 @@ public class CardsInAllGraveyardsCount implements DynamicValue { } @Override - public DynamicValue copy() { + public CardsInAllGraveyardsCount copy() { return new CardsInAllGraveyardsCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerGraveyardCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerGraveyardCount.java index 114bbba06d8..c69bea308f6 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerGraveyardCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerGraveyardCount.java @@ -44,7 +44,7 @@ public class CardsInControllerGraveyardCount implements DynamicValue { } @Override - public DynamicValue copy() { + public CardsInControllerGraveyardCount copy() { return new CardsInControllerGraveyardCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerHandCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerHandCount.java index f94de01572e..71e9836cb8a 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerHandCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/CardsInControllerHandCount.java @@ -7,6 +7,7 @@ import mage.game.Game; import mage.players.Player; public class CardsInControllerHandCount implements DynamicValue { + @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { if (sourceAbility != null) { @@ -19,7 +20,7 @@ public class CardsInControllerHandCount implements DynamicValue { } @Override - public DynamicValue copy() { + public CardsInControllerHandCount copy() { return new CardsInControllerHandCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CardsInTargetPlayerHandCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CardsInTargetPlayerHandCount.java index 27bab074560..393f45db14e 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/CardsInTargetPlayerHandCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/CardsInTargetPlayerHandCount.java @@ -22,7 +22,7 @@ public class CardsInTargetPlayerHandCount implements DynamicValue { } @Override - public DynamicValue copy() { + public CardsInTargetPlayerHandCount copy() { return new CardsInTargetPlayerHandCount(); } @@ -30,5 +30,5 @@ public class CardsInTargetPlayerHandCount implements DynamicValue { public String getMessage() { return "cards in target player's hand"; } - + } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ControllerGotLifeCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ControllerGotLifeCount.java index a1df5caba3c..cb9571281a9 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ControllerGotLifeCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ControllerGotLifeCount.java @@ -25,9 +25,10 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue.common; +import java.io.ObjectStreamException; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.MageSingleton; import mage.abilities.dynamicvalue.DynamicValue; @@ -35,18 +36,14 @@ import mage.abilities.effects.Effect; import mage.game.Game; import mage.watchers.common.PlayerGainedLifeWatcher; -import java.io.ObjectStreamException; -import java.util.UUID; - /** * Amount of life the controller got this turn. - * + * * @author LevelX2 */ - public class ControllerGotLifeCount implements DynamicValue, MageSingleton { - private static final ControllerGotLifeCount fINSTANCE = new ControllerGotLifeCount(); + private static final ControllerGotLifeCount fINSTANCE = new ControllerGotLifeCount(); private Object readResolve() throws ObjectStreamException { return fINSTANCE; @@ -70,7 +67,7 @@ public class ControllerGotLifeCount implements DynamicValue, MageSingleton { } @Override - public DynamicValue copy() { + public ControllerGotLifeCount copy() { return new ControllerGotLifeCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ControllerLifeCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ControllerLifeCount.java index 688b28b63c9..e756e77e3e4 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ControllerLifeCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ControllerLifeCount.java @@ -7,6 +7,7 @@ import mage.game.Game; import mage.players.Player; public class ControllerLifeCount implements DynamicValue { + @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { Player p = game.getPlayer(sourceAbility.getControllerId()); @@ -17,7 +18,7 @@ public class ControllerLifeCount implements DynamicValue { } @Override - public DynamicValue copy() { + public ControllerLifeCount copy() { return new ControllerLifeCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java index 9f6a5312a62..fdf010b7045 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java @@ -29,7 +29,7 @@ public class CountersCount implements DynamicValue { } @Override - public DynamicValue copy() { + public CountersCount copy() { return new CountersCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/DevotionCount.java b/Mage/src/mage/abilities/dynamicvalue/common/DevotionCount.java index 439f2146e3b..fd8edb3ebe5 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/DevotionCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/DevotionCount.java @@ -4,6 +4,8 @@ */ package mage.abilities.dynamicvalue.common; +import java.util.ArrayList; +import java.util.Arrays; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCost; import mage.abilities.dynamicvalue.DynamicValue; @@ -12,11 +14,9 @@ import mage.constants.ColoredManaSymbol; import mage.game.Game; import mage.game.permanent.Permanent; -import java.util.ArrayList; -import java.util.Arrays; - /** - * Each colored mana symbol (e.g. {U}) in the mana costs of permanents you control counts toward your devotion to that color. + * Each colored mana symbol (e.g. {U}) in the mana costs of permanents you + * control counts toward your devotion to that color. * * @author LevelX2 */ @@ -36,8 +36,8 @@ public class DevotionCount implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { int devotion = 0; for (Permanent permanent : game.getBattlefield().getAllActivePermanents(sourceAbility.getControllerId())) { - for(ManaCost manaCost :permanent.getManaCost()) { - for(ColoredManaSymbol coloredManaSymbol: devotionColors) { + for (ManaCost manaCost : permanent.getManaCost()) { + for (ColoredManaSymbol coloredManaSymbol : devotionColors) { if (manaCost.containsColor(coloredManaSymbol)) { devotion++; break; // count each manaCost maximum of one time (Hybrid don't count for multiple colors of devotion) @@ -49,7 +49,7 @@ public class DevotionCount implements DynamicValue { } @Override - public DynamicValue copy() { + public DevotionCount copy() { return new DevotionCount(this); } @@ -62,7 +62,7 @@ public class DevotionCount implements DynamicValue { public String getMessage() { StringBuilder sb = new StringBuilder("devotion to "); int count = 0; - for (ColoredManaSymbol coloredManaSymbol:devotionColors) { + for (ColoredManaSymbol coloredManaSymbol : devotionColors) { if (count > 0) { sb.append(" and "); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/DevouredCreaturesCount.java b/Mage/src/mage/abilities/dynamicvalue/common/DevouredCreaturesCount.java index 7f3084786d9..4ce7c389bd5 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/DevouredCreaturesCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/DevouredCreaturesCount.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue.common; import mage.abilities.Ability; @@ -40,7 +39,6 @@ import mage.game.permanent.Permanent; * * @author LevelX2 */ - public class DevouredCreaturesCount implements DynamicValue { int multiplier; @@ -65,7 +63,7 @@ public class DevouredCreaturesCount implements DynamicValue { if (sourcePermanent != null) { for (Ability ability : sourcePermanent.getAbilities()) { if (ability instanceof DevourAbility) { - for (Effect abilityEffect: ability.getEffects()) { + for (Effect abilityEffect : ability.getEffects()) { if (abilityEffect instanceof DevourEffect) { DevourEffect devourEffect = (DevourEffect) abilityEffect; return devourEffect.getDevouredCreaturesAmount(game, sourcePermanent.getId()) * multiplier; diff --git a/Mage/src/mage/abilities/dynamicvalue/common/DiscardCostCardConvertedMana.java b/Mage/src/mage/abilities/dynamicvalue/common/DiscardCostCardConvertedMana.java index 773e73e12ed..b14708d05eb 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/DiscardCostCardConvertedMana.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/DiscardCostCardConvertedMana.java @@ -15,11 +15,11 @@ public class DiscardCostCardConvertedMana implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (Cost cost: sourceAbility.getCosts()) { + for (Cost cost : sourceAbility.getCosts()) { if (cost instanceof DiscardCardCost) { DiscardCardCost discardCost = (DiscardCardCost) cost; int cmc = 0; - for (Card card :discardCost.getCards()) { + for (Card card : discardCost.getCards()) { cmc += card.getManaCost().convertedManaCost(); } return cmc; @@ -29,7 +29,7 @@ public class DiscardCostCardConvertedMana implements DynamicValue { } @Override - public DynamicValue copy() { + public DiscardCostCardConvertedMana copy() { return new DiscardCostCardConvertedMana(); } @@ -38,7 +38,6 @@ public class DiscardCostCardConvertedMana implements DynamicValue { return ""; } - @Override public String getMessage() { return "the discarded card's converted mana cost"; diff --git a/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java b/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java index e61d565b90f..ca8f4f68cc9 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java @@ -74,7 +74,7 @@ public class DomainValue implements DynamicValue { } @Override - public DynamicValue copy() { + public DomainValue copy() { return new DomainValue(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java b/Mage/src/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java index dcbba5c951a..6bc0e8c51c2 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java @@ -27,15 +27,14 @@ */ package mage.abilities.dynamicvalue.common; +import java.util.List; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.game.Game; import mage.game.permanent.Permanent; -import java.util.List; -import java.util.UUID; - /** * * @author North, noxx @@ -73,7 +72,7 @@ public class EquipmentAttachedCount implements DynamicValue { } @Override - public DynamicValue copy() { + public EquipmentAttachedCount copy() { return new EquipmentAttachedCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java b/Mage/src/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java index eb24c0f60f3..29adcaf1eca 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java @@ -36,20 +36,18 @@ import mage.cards.Card; import mage.game.Game; /** - * Calculates the converted mana costs of a card that was - * exiled from hand as cost. - * If no card was exiled the getManaCostsToPay().getX() will - * be used as value. + * Calculates the converted mana costs of a card that was exiled from hand as + * cost. If no card was exiled the getManaCostsToPay().getX() will be used as + * value. * * * @author LevelX2 */ - public class ExileFromHandCostCardConvertedMana implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (Cost cost: sourceAbility.getCosts()) { + for (Cost cost : sourceAbility.getCosts()) { if (cost.isPaid() && cost instanceof ExileFromHandCost) { int xValue = 0; for (Card card : ((ExileFromHandCost) cost).getCards()) { @@ -62,7 +60,7 @@ public class ExileFromHandCostCardConvertedMana implements DynamicValue { } @Override - public DynamicValue copy() { + public ExileFromHandCostCardConvertedMana copy() { return new ExileFromHandCostCardConvertedMana(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java index a4734cb8daa..9ee09e5ea04 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java @@ -39,9 +39,9 @@ import mage.game.stack.Spell; * * @author LevelX2 */ -public class ManaSpentToCastCount implements DynamicValue{ +public class ManaSpentToCastCount implements DynamicValue { - public ManaSpentToCastCount(){ + public ManaSpentToCastCount() { } @Override @@ -61,7 +61,7 @@ public class ManaSpentToCastCount implements DynamicValue{ } @Override - public DynamicValue copy() { + public ManaSpentToCastCount copy() { return new ManaSpentToCastCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ManaTypeInManaPoolCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ManaTypeInManaPoolCount.java index 50275a242c2..1b0ebe8ff16 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ManaTypeInManaPoolCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ManaTypeInManaPoolCount.java @@ -34,7 +34,7 @@ public class ManaTypeInManaPoolCount implements DynamicValue { } @Override - public DynamicValue copy() { + public ManaTypeInManaPoolCount copy() { return new ManaTypeInManaPoolCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java b/Mage/src/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java index 3a227d20428..2603e6b02ca 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java @@ -25,22 +25,19 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue.common; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.game.Game; import mage.watchers.common.PlayerLostLifeWatcher; -import java.util.UUID; - /** * * @author LevelX2 */ - public class OpponentsLostLifeCount implements DynamicValue { @Override @@ -52,7 +49,7 @@ public class OpponentsLostLifeCount implements DynamicValue { PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get("PlayerLostLifeWatcher"); if (watcher != null) { int amountLifeLost = 0; - for(UUID opponent: game.getOpponents(controllerId)){ + for (UUID opponent : game.getOpponents(controllerId)) { amountLifeLost += watcher.getLiveLost(opponent); } return amountLifeLost; @@ -61,7 +58,7 @@ public class OpponentsLostLifeCount implements DynamicValue { } @Override - public DynamicValue copy() { + public OpponentsLostLifeCount copy() { return new OpponentsLostLifeCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java index 008969e24fd..9d70b0ac258 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ParleyCount.java @@ -81,7 +81,7 @@ public class ParleyCount implements DynamicValue, MageSingleton { } @Override - public DynamicValue copy() { + public ParleyCount copy() { return fINSTANCE; } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java index a1875905cb4..0e1e2cd35a0 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsOnBattlefieldCount.java @@ -1,3 +1,30 @@ +/* + * 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.abilities.dynamicvalue.common; import mage.abilities.Ability; @@ -43,7 +70,7 @@ public class PermanentsOnBattlefieldCount implements DynamicValue { } @Override - public DynamicValue copy() { + public PermanentsOnBattlefieldCount copy() { return new PermanentsOnBattlefieldCount(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java index 20ac6b22b9a..f53b9e1fbfb 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsTargetOpponentControlsCount.java @@ -1,3 +1,30 @@ +/* + * 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.abilities.dynamicvalue.common; import mage.abilities.Ability; @@ -11,7 +38,6 @@ import mage.game.Game; * * @author LoneFox */ - public class PermanentsTargetOpponentControlsCount implements DynamicValue { private FilterPermanent filter; @@ -36,25 +62,24 @@ public class PermanentsTargetOpponentControlsCount implements DynamicValue { } @Override - public DynamicValue copy() { + public PermanentsTargetOpponentControlsCount copy() { return new PermanentsTargetOpponentControlsCount(this); } @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - if(sourceAbility.getFirstTarget() != null) { + if (sourceAbility.getFirstTarget() != null) { filter.add(new ControllerIdPredicate(sourceAbility.getFirstTarget())); int value = game.getBattlefield().count(filter, sourceAbility.getSourceId(), sourceAbility.getControllerId(), game); return multiplier * value; - } - else { + } else { return 0; } } @Override public String toString() { - if(multiplier != null) { + if (multiplier != null) { return multiplier.toString(); } return "X"; diff --git a/Mage/src/mage/abilities/dynamicvalue/common/RemovedCountersForCostValue.java b/Mage/src/mage/abilities/dynamicvalue/common/RemovedCountersForCostValue.java index 4d27f4dacac..7fce69b56c9 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/RemovedCountersForCostValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/RemovedCountersForCostValue.java @@ -3,7 +3,6 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - package mage.abilities.dynamicvalue.common; import mage.abilities.Ability; @@ -21,7 +20,7 @@ public class RemovedCountersForCostValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (Cost cost: sourceAbility.getCosts()) { + for (Cost cost : sourceAbility.getCosts()) { if (cost instanceof RemoveVariableCountersSourceCost) { return ((RemoveVariableCountersSourceCost) cost).getAmount(); } @@ -31,11 +30,11 @@ public class RemovedCountersForCostValue implements DynamicValue { @Override public String getMessage() { - return "number of removed counters"; + return "number of removed counters"; } @Override - public DynamicValue copy() { + public RemovedCountersForCostValue copy() { return new RemovedCountersForCostValue(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/RevealTargetFromHandCostCount.java b/Mage/src/mage/abilities/dynamicvalue/common/RevealTargetFromHandCostCount.java index 373b5889e72..4e09ad6554c 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/RevealTargetFromHandCostCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/RevealTargetFromHandCostCount.java @@ -3,7 +3,6 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - package mage.abilities.dynamicvalue.common; import mage.abilities.Ability; @@ -21,7 +20,7 @@ public class RevealTargetFromHandCostCount implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (Cost cost: sourceAbility.getCosts()) { + for (Cost cost : sourceAbility.getCosts()) { if (cost instanceof RevealTargetFromHandCost) { return ((RevealTargetFromHandCost) cost).getNumberRevealedCards(); } @@ -31,11 +30,11 @@ public class RevealTargetFromHandCostCount implements DynamicValue { @Override public String getMessage() { - return "number of revealed cards"; + return "number of revealed cards"; } @Override - public DynamicValue copy() { + public RevealTargetFromHandCostCount copy() { return new RevealTargetFromHandCostCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesPower.java b/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesPower.java index acfb07d3a66..a563d3c93fa 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesPower.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesPower.java @@ -15,11 +15,11 @@ public class SacrificeCostCreaturesPower implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (Cost cost: sourceAbility.getCosts()) { + for (Cost cost : sourceAbility.getCosts()) { if (cost instanceof SacrificeTargetCost) { SacrificeTargetCost sacrificeCost = (SacrificeTargetCost) cost; int powerSum = 0; - for (Permanent permanent :sacrificeCost.getPermanents()) { + for (Permanent permanent : sacrificeCost.getPermanents()) { powerSum += permanent.getPower().getValue(); } return powerSum; @@ -29,7 +29,7 @@ public class SacrificeCostCreaturesPower implements DynamicValue { } @Override - public DynamicValue copy() { + public SacrificeCostCreaturesPower copy() { return new SacrificeCostCreaturesPower(); } @@ -38,7 +38,6 @@ public class SacrificeCostCreaturesPower implements DynamicValue { return "X"; } - @Override public String getMessage() { return "the sacrificed creature's power"; diff --git a/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesToughness.java b/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesToughness.java index 8df1b39c1b1..15256c9c716 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesToughness.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostCreaturesToughness.java @@ -15,11 +15,11 @@ public class SacrificeCostCreaturesToughness implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (Cost cost: sourceAbility.getCosts()) { + for (Cost cost : sourceAbility.getCosts()) { if (cost instanceof SacrificeTargetCost) { SacrificeTargetCost sacrificeCost = (SacrificeTargetCost) cost; int toughnessSum = 0; - for (Permanent permanent :sacrificeCost.getPermanents()) { + for (Permanent permanent : sacrificeCost.getPermanents()) { toughnessSum += permanent.getToughness().getValue(); } return toughnessSum; @@ -29,7 +29,7 @@ public class SacrificeCostCreaturesToughness implements DynamicValue { } @Override - public DynamicValue copy() { + public SacrificeCostCreaturesToughness copy() { return new SacrificeCostCreaturesToughness(); } @@ -38,7 +38,6 @@ public class SacrificeCostCreaturesToughness implements DynamicValue { return "X"; } - @Override public String getMessage() { return "the sacrificed creature's toughness"; diff --git a/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java b/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java index 2b50242ec4c..d029966a6a9 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java @@ -6,6 +6,7 @@ import mage.abilities.effects.Effect; import mage.game.Game; public class SignInversionDynamicValue implements DynamicValue { + private final DynamicValue value; public SignInversionDynamicValue(DynamicValue value) { @@ -22,7 +23,7 @@ public class SignInversionDynamicValue implements DynamicValue { } @Override - public DynamicValue copy() { + public SignInversionDynamicValue copy() { return new SignInversionDynamicValue(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/SourcePermanentPowerCount.java b/Mage/src/mage/abilities/dynamicvalue/common/SourcePermanentPowerCount.java index 040973ca7d7..70c54d46ec4 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/SourcePermanentPowerCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/SourcePermanentPowerCount.java @@ -21,7 +21,7 @@ public class SourcePermanentPowerCount implements DynamicValue { } @Override - public DynamicValue copy() { + public SourcePermanentPowerCount copy() { return new SourcePermanentPowerCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/StaticValue.java b/Mage/src/mage/abilities/dynamicvalue/common/StaticValue.java index 73c981fd64c..13a1befea65 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/StaticValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/StaticValue.java @@ -1,18 +1,19 @@ package mage.abilities.dynamicvalue.common; - import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.game.Game; public class StaticValue implements DynamicValue { + private int value = 0; private String message; - + public StaticValue(int value) { this(value, ""); } + public StaticValue(int value, String message) { this.value = value; this.message = message; @@ -29,7 +30,7 @@ public class StaticValue implements DynamicValue { } @Override - public DynamicValue copy() { + public StaticValue copy() { return new StaticValue(this); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/SunburstCount.java b/Mage/src/mage/abilities/dynamicvalue/common/SunburstCount.java index 0fa70eb8582..8cb1fbf5cd6 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/SunburstCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/SunburstCount.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.dynamicvalue.common; import mage.Mana; @@ -40,33 +39,32 @@ import mage.game.stack.StackObject; * * @author Nicolas */ +public class SunburstCount implements DynamicValue { + public SunburstCount() { -public class SunburstCount implements DynamicValue{ - public SunburstCount(){ - } - + @Override public int calculate(Game game, Ability source, Effect effect) { int count = 0; if (!game.getStack().isEmpty()) { StackObject spell = game.getStack().getFirst(); - if (spell != null && spell instanceof Spell && ((Spell)spell).getSourceId().equals(source.getSourceId())) { - Mana mana = ((Spell)spell).getSpellAbility().getManaCostsToPay().getPayment(); - if(mana.getBlack() > 0) { + if (spell != null && spell instanceof Spell && ((Spell) spell).getSourceId().equals(source.getSourceId())) { + Mana mana = ((Spell) spell).getSpellAbility().getManaCostsToPay().getPayment(); + if (mana.getBlack() > 0) { count++; } - if(mana.getBlue() > 0) { + if (mana.getBlue() > 0) { count++; } - if(mana.getGreen() > 0) { + if (mana.getGreen() > 0) { count++; } - if(mana.getRed() > 0) { + if (mana.getRed() > 0) { count++; } - if(mana.getWhite() > 0) { + if (mana.getWhite() > 0) { count++; } } @@ -75,14 +73,13 @@ public class SunburstCount implements DynamicValue{ } @Override - public DynamicValue copy() { + public SunburstCount copy() { return new SunburstCount(); } - @Override public String getMessage() { return "color of mana spent to cast it"; } - + } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/TargetConvertedManaCost.java b/Mage/src/mage/abilities/dynamicvalue/common/TargetConvertedManaCost.java index 97b33f5fba9..c56b5cfce51 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/TargetConvertedManaCost.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/TargetConvertedManaCost.java @@ -49,7 +49,7 @@ public class TargetConvertedManaCost implements DynamicValue { } @Override - public DynamicValue copy() { + public TargetConvertedManaCost copy() { return new TargetConvertedManaCost(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/TargetPermanentPowerCount.java b/Mage/src/mage/abilities/dynamicvalue/common/TargetPermanentPowerCount.java index d6bc27590fb..9cf6f74447e 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/TargetPermanentPowerCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/TargetPermanentPowerCount.java @@ -54,7 +54,7 @@ public class TargetPermanentPowerCount implements DynamicValue { } @Override - public DynamicValue copy() { + public TargetPermanentPowerCount copy() { return new TargetPermanentPowerCount(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/UrzaTerrainValue.java b/Mage/src/mage/abilities/dynamicvalue/common/UrzaTerrainValue.java index 9ab2a9dd55c..3db1e5f9aab 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/UrzaTerrainValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/UrzaTerrainValue.java @@ -8,6 +8,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; public class UrzaTerrainValue implements DynamicValue { + private final int value; public UrzaTerrainValue(int value) { @@ -19,24 +20,21 @@ public class UrzaTerrainValue implements DynamicValue { FilterControlledPermanent pp = new FilterControlledPermanent("Urza's Power Plant"); pp.add(new SubtypePredicate("Urza's Power-Plant")); PermanentsOnBattlefieldCount ppP = new PermanentsOnBattlefieldCount(pp); - if (ppP.calculate(game, sourceAbility, effect) < 1) - { + if (ppP.calculate(game, sourceAbility, effect) < 1) { return 1; } FilterControlledPermanent to = new FilterControlledPermanent("Urza's Tower"); to.add(new SubtypePredicate("Urza's Tower")); PermanentsOnBattlefieldCount toP = new PermanentsOnBattlefieldCount(to); - if (toP.calculate(game, sourceAbility, effect) < 1) - { + if (toP.calculate(game, sourceAbility, effect) < 1) { return 1; } FilterControlledPermanent mi = new FilterControlledPermanent("Urza's Mine"); mi.add(new SubtypePredicate("Urza's Mine")); PermanentsOnBattlefieldCount miP = new PermanentsOnBattlefieldCount(mi); - if (miP.calculate(game, sourceAbility, effect) < 1) - { + if (miP.calculate(game, sourceAbility, effect) < 1) { return 1; } @@ -44,7 +42,7 @@ public class UrzaTerrainValue implements DynamicValue { } @Override - public DynamicValue copy() { + public UrzaTerrainValue copy() { return new UrzaTerrainValue(value); } From c5873a01321d6c8442cb38c8d0a968d01a2517d8 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 30 Jul 2015 11:32:19 +0200 Subject: [PATCH 240/375] * Zedruu, the Greathearted - Fixed tooltip text, removed unused imports, simplified some logic. --- .../sets/commander/ZedruuTheGreathearted.java | 34 +++++----- ...anentsYouOwnThatOpponentsControlCount.java | 63 +++++++++++-------- 2 files changed, 57 insertions(+), 40 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java b/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java index 22c05643085..d7562042347 100644 --- a/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java +++ b/Mage.Sets/src/mage/sets/commander/ZedruuTheGreathearted.java @@ -27,34 +27,35 @@ */ package mage.sets.commander; -import java.util.ArrayList; -import java.util.List; import java.util.UUID; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; import mage.abilities.dynamicvalue.common.PermanentsYouOwnThatOpponentsControlCount; import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.TargetPlayer; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetOpponent; /** * - * @author anonymous + * @author andyfries */ public class ZedruuTheGreathearted extends CardImpl { @@ -68,8 +69,12 @@ public class ZedruuTheGreathearted extends CardImpl { this.toughness = new MageInt(4); // At the beginning of your upkeep, you gain X life and draw X cards, where X is the number of permanents you own that your opponents control. - Ability ability = new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(new PermanentsYouOwnThatOpponentsControlCount()), TargetController.YOU, false); - ability.addEffect(new DrawCardSourceControllerEffect(new PermanentsYouOwnThatOpponentsControlCount())); + Effect effect = new GainLifeEffect(new PermanentsYouOwnThatOpponentsControlCount()); + effect.setText("you gain X life"); + Ability ability = new BeginningOfUpkeepTriggeredAbility(effect, TargetController.YOU, false); + effect = new DrawCardSourceControllerEffect(new PermanentsYouOwnThatOpponentsControlCount()); + effect.setText("and draw X cards, where X is the number of permanents you own that your opponents control"); + ability.addEffect(effect); this.addAbility(ability); // {R}{W}{U}: Target opponent gains control of target permanent you control. @@ -90,7 +95,7 @@ public class ZedruuTheGreathearted extends CardImpl { class ZedruuTheGreatheartedEffect extends ContinuousEffectImpl { - MageObjectReference targetPermanentReference; + private MageObjectReference targetPermanentReference; public ZedruuTheGreatheartedEffect() { super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); @@ -115,10 +120,9 @@ public class ZedruuTheGreathearted extends CardImpl { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); Permanent permanent = targetPermanentReference.getPermanent(game); - if (player != null && permanent != null) { - return permanent.changeControllerId(player.getId(), game); + if (permanent != null) { + return permanent.changeControllerId(source.getFirstTarget(), game); } else { discard(); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java index 9e80bf4e7af..bd454179977 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/PermanentsYouOwnThatOpponentsControlCount.java @@ -1,45 +1,59 @@ +/* + * 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.abilities.dynamicvalue.common; +import java.util.Set; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; - -import java.util.List; -import java.util.Set; -import java.util.UUID; public class PermanentsYouOwnThatOpponentsControlCount implements DynamicValue { + @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - if (sourceAbility != null) { - Player controller = game.getPlayer(sourceAbility.getControllerId()); + Set opponentIds = game.getOpponents(sourceAbility.getControllerId()); + int count = 0; - if (controller != null) { - UUID controllerId = controller.getId(); - Set opponentIds = game.getOpponents(controllerId); - int count = 0; - - for (UUID opponentId : opponentIds){ - List opponentPermanents = game.getBattlefield().getAllActivePermanents(opponentId); - - for (Permanent opponentPermanent : opponentPermanents){ - if (opponentPermanent.getOwnerId().equals(controllerId)){ - count++; - } - } + for (Permanent permanent : game.getBattlefield().getActivePermanents(sourceAbility.getControllerId(), game)) { + if (!permanent.getOwnerId().equals(permanent.getControllerId()) && permanent.getOwnerId().equals(sourceAbility.getControllerId())) { + if (opponentIds.contains(permanent.getControllerId())) { + count++; } - - return count; } } - return 0; + return count; } @Override - public DynamicValue copy() { + public PermanentsYouOwnThatOpponentsControlCount copy() { return new PermanentsYouOwnThatOpponentsControlCount(); } @@ -53,4 +67,3 @@ public class PermanentsYouOwnThatOpponentsControlCount implements DynamicValue { return "1"; } } - From a3bc45279519c6421b18f33b9de6c1fd0e9dbe86 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 30 Jul 2015 16:13:27 +0200 Subject: [PATCH 241/375] Added Gustcloak Savior, Spurnmage Advocate and Gleancrawler; --- .../mage/sets/commander/BrionStoutarm.java | 11 +- .../sets/commander/SpurnmageAdvocate.java | 87 ++++++++++++ .../sets/elspethvskiora/GustcloakSavior.java | 52 ++++++++ .../sets/izzetvsgolgari/Gleancrawler.java | 54 ++++++++ .../mage/sets/judgment/SpurnmageAdvocate.java | 52 ++++++++ .../src/mage/sets/magic2014/GrimReturn.java | 8 +- .../mage/sets/onslaught/GustcloakSavior.java | 85 ++++++++++++ .../sets/prereleaseevents/Gleancrawler.java | 125 ++++++++++++++++++ .../src/mage/sets/ravnica/Gleancrawler.java | 54 ++++++++ .../sets/shadowmoor/TwilightShepherd.java | 31 +++-- .../src/mage/sets/zendikar/RavenousTrap.java | 15 +-- .../java/org/mage/test/player/TestPlayer.java | 15 +++ .../BecomesBlockedAllTriggeredAbility.java | 9 +- .../effects/common/DestroyTargetEffect.java | 81 ++++++------ .../common/RemoveFromCombatTargetEffect.java | 69 +++++----- .../common/ReturnToHandTargetEffect.java | 52 +++----- Mage/src/mage/players/Player.java | 8 +- Mage/src/mage/players/PlayerImpl.java | 29 ++-- .../common/CardsPutIntoGraveyardWatcher.java | 18 ++- 19 files changed, 692 insertions(+), 163 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/commander/SpurnmageAdvocate.java create mode 100644 Mage.Sets/src/mage/sets/elspethvskiora/GustcloakSavior.java create mode 100644 Mage.Sets/src/mage/sets/izzetvsgolgari/Gleancrawler.java create mode 100644 Mage.Sets/src/mage/sets/judgment/SpurnmageAdvocate.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/GustcloakSavior.java create mode 100644 Mage.Sets/src/mage/sets/prereleaseevents/Gleancrawler.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/Gleancrawler.java diff --git a/Mage.Sets/src/mage/sets/commander/BrionStoutarm.java b/Mage.Sets/src/mage/sets/commander/BrionStoutarm.java index 7443a670474..f500c52af55 100644 --- a/Mage.Sets/src/mage/sets/commander/BrionStoutarm.java +++ b/Mage.Sets/src/mage/sets/commander/BrionStoutarm.java @@ -76,7 +76,7 @@ public class BrionStoutarm extends CardImpl { // {R}, {tap}, Sacrifice a creature other than Brion Stoutarm: Brion Stoutarm deals damage equal to the sacrificed creature's power to target player. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BrionStoutarmEffect(), new ManaCostsImpl("{R}")); ability.addCost(new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1, filter, true))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true))); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } @@ -110,9 +110,9 @@ class BrionStoutarmEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int amount = 0; - for (Cost cost: source.getCosts()) { - if (cost instanceof SacrificeTargetCost && ((SacrificeTargetCost)cost).getPermanents().size() > 0) { - amount = ((SacrificeTargetCost)cost).getPermanents().get(0).getPower().getValue(); + for (Cost cost : source.getCosts()) { + if (cost instanceof SacrificeTargetCost && ((SacrificeTargetCost) cost).getPermanents().size() > 0) { + amount = ((SacrificeTargetCost) cost).getPermanents().get(0).getPower().getValue(); break; } } @@ -120,9 +120,8 @@ class BrionStoutarmEffect extends OneShotEffect { Player player = game.getPlayer(source.getFirstTarget()); if (player != null) { player.damage(amount, source.getSourceId(), game, false, true); - return true; } } - return false; + return true; } } diff --git a/Mage.Sets/src/mage/sets/commander/SpurnmageAdvocate.java b/Mage.Sets/src/mage/sets/commander/SpurnmageAdvocate.java new file mode 100644 index 00000000000..2391cab356a --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/SpurnmageAdvocate.java @@ -0,0 +1,87 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.other.OwnerPredicate; +import mage.target.common.TargetAttackingCreature; +import mage.target.common.TargetCardInASingleGraveyard; +import mage.target.targetpointer.SecondTargetPointer; + +/** + * + * @author LevelX2 + */ +public class SpurnmageAdvocate extends CardImpl { + + private static final FilterCard filter = new FilterCard("two target cards from an opponent's graveyard"); + + static { + filter.add(new OwnerPredicate(TargetController.OPPONENT)); + } + + public SpurnmageAdvocate(UUID ownerId) { + super(ownerId, 33, "Spurnmage Advocate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "CMD"; + this.subtype.add("Human"); + this.subtype.add("Nomad"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {T}: Return two target cards from an opponent's graveyard to his or her hand. Destroy target attacking creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new TapSourceCost()); + ability.addTarget(new TargetCardInASingleGraveyard(2, 2, filter)); + Effect effect = new DestroyTargetEffect(); + effect.setTargetPointer(new SecondTargetPointer()); + ability.addEffect(effect); + ability.addTarget(new TargetAttackingCreature()); + this.addAbility(ability); + } + + public SpurnmageAdvocate(final SpurnmageAdvocate card) { + super(card); + } + + @Override + public SpurnmageAdvocate copy() { + return new SpurnmageAdvocate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvskiora/GustcloakSavior.java b/Mage.Sets/src/mage/sets/elspethvskiora/GustcloakSavior.java new file mode 100644 index 00000000000..0a8b9bbc2fd --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvskiora/GustcloakSavior.java @@ -0,0 +1,52 @@ +/* + * 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.elspethvskiora; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class GustcloakSavior extends mage.sets.onslaught.GustcloakSavior { + + public GustcloakSavior(UUID ownerId) { + super(ownerId); + this.cardNumber = 11; + this.expansionSetCode = "DDO"; + } + + public GustcloakSavior(final GustcloakSavior card) { + super(card); + } + + @Override + public GustcloakSavior copy() { + return new GustcloakSavior(this); + } +} diff --git a/Mage.Sets/src/mage/sets/izzetvsgolgari/Gleancrawler.java b/Mage.Sets/src/mage/sets/izzetvsgolgari/Gleancrawler.java new file mode 100644 index 00000000000..79b57a8c2f4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/izzetvsgolgari/Gleancrawler.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.izzetvsgolgari; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class Gleancrawler extends mage.sets.prereleaseevents.Gleancrawler { + + public Gleancrawler(UUID ownerId) { + super(ownerId); + this.cardNumber = 64; + this.expansionSetCode = "DDJ"; + this.rarity = Rarity.RARE; + } + + public Gleancrawler(final Gleancrawler card) { + super(card); + } + + @Override + public Gleancrawler copy() { + return new Gleancrawler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/SpurnmageAdvocate.java b/Mage.Sets/src/mage/sets/judgment/SpurnmageAdvocate.java new file mode 100644 index 00000000000..7ac6d852660 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/SpurnmageAdvocate.java @@ -0,0 +1,52 @@ +/* + * 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.judgment; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class SpurnmageAdvocate extends mage.sets.commander.SpurnmageAdvocate { + + public SpurnmageAdvocate(UUID ownerId) { + super(ownerId); + this.cardNumber = 27; + this.expansionSetCode = "JUD"; + } + + public SpurnmageAdvocate(final SpurnmageAdvocate card) { + super(card); + } + + @Override + public SpurnmageAdvocate copy() { + return new SpurnmageAdvocate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2014/GrimReturn.java b/Mage.Sets/src/mage/sets/magic2014/GrimReturn.java index 0a93db0e9f8..ef9a63a835f 100644 --- a/Mage.Sets/src/mage/sets/magic2014/GrimReturn.java +++ b/Mage.Sets/src/mage/sets/magic2014/GrimReturn.java @@ -30,6 +30,7 @@ package mage.sets.magic2014; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; @@ -56,7 +57,6 @@ public class GrimReturn extends CardImpl { super(ownerId, 100, "Grim Return", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{B}"); this.expansionSetCode = "M14"; - // Choose target creature card in a graveyard that was put there from the battlefield this turn. Put that card onto the battlefield under your control. Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); effect.setText("Choose target creature card in a graveyard that was put there from the battlefield this turn. Put that card onto the battlefield under your control"); @@ -80,8 +80,10 @@ public class GrimReturn extends CardImpl { if (watcher != null) { FilterCard filter = new FilterCreatureCard(textFilter); List uuidPredicates = new ArrayList<>(); - for (UUID uuid :watcher.getCardsPutToGraveyardFromBattlefield()) { - uuidPredicates.add(new CardIdPredicate(uuid)); + for (MageObjectReference mor : watcher.getCardsPutToGraveyardFromBattlefield()) { + if (game.getState().getZoneChangeCounter(mor.getSourceId()) == mor.getZoneChangeCounter()) { + uuidPredicates.add(new CardIdPredicate(mor.getSourceId())); + } } filter.add(Predicates.or(uuidPredicates)); ability.getTargets().clear(); diff --git a/Mage.Sets/src/mage/sets/onslaught/GustcloakSavior.java b/Mage.Sets/src/mage/sets/onslaught/GustcloakSavior.java new file mode 100644 index 00000000000..c6b4892ca19 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/GustcloakSavior.java @@ -0,0 +1,85 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesBlockedAllTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.RemoveFromCombatTargetEffect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LevelX2 + */ +public class GustcloakSavior extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature you control"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public GustcloakSavior(UUID ownerId) { + super(ownerId, 36, "Gustcloak Savior", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{W}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Bird"); + this.subtype.add("Soldier"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Whenever a creature you control becomes blocked, you may untap that creature and remove it from combat. + Effect effect = new UntapTargetEffect(); + effect.setText("you may untap that creature"); + Ability ability = new BecomesBlockedAllTriggeredAbility(effect, true, filter, true); + effect = new RemoveFromCombatTargetEffect(); + effect.setText("and remove it from combat"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public GustcloakSavior(final GustcloakSavior card) { + super(card); + } + + @Override + public GustcloakSavior copy() { + return new GustcloakSavior(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prereleaseevents/Gleancrawler.java b/Mage.Sets/src/mage/sets/prereleaseevents/Gleancrawler.java new file mode 100644 index 00000000000..d3deaada3ad --- /dev/null +++ b/Mage.Sets/src/mage/sets/prereleaseevents/Gleancrawler.java @@ -0,0 +1,125 @@ +/* + * 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.prereleaseevents; + +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.keyword.TrampleAbility; +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.TargetController; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.watchers.common.CardsPutIntoGraveyardWatcher; + +/** + * + * @author LevelX2 + */ +public class Gleancrawler extends CardImpl { + + public Gleancrawler(UUID ownerId) { + super(ownerId, 27, "Gleancrawler", Rarity.SPECIAL, new CardType[]{CardType.CREATURE}, "{3}{B/G}{B/G}{B/G}"); + this.expansionSetCode = "PTC"; + this.subtype.add("Insect"); + this.subtype.add("Horror"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // ({B/G} can be paid with either {B} or {G}.) + this.addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("({B/G} can be paid with either {B} or {G}.)"))); + // Trample + this.addAbility(TrampleAbility.getInstance()); + // At the beginning of your end step, return to your hand all creature cards in your graveyard that were put there from the battlefield this turn. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new GleancrawlerEffect(), TargetController.YOU, false), new CardsPutIntoGraveyardWatcher()); + + } + + public Gleancrawler(final Gleancrawler card) { + super(card); + } + + @Override + public Gleancrawler copy() { + return new Gleancrawler(this); + } +} + +class GleancrawlerEffect extends OneShotEffect { + + boolean applied = false; + + public GleancrawlerEffect() { + super(Outcome.ReturnToHand); + this.staticText = "return to your hand all creature cards in your graveyard that were put there from the battlefield this turn"; + } + + public GleancrawlerEffect(final GleancrawlerEffect effect) { + super(effect); + } + + @Override + public GleancrawlerEffect copy() { + return new GleancrawlerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get("CardsPutIntoGraveyardWatcher"); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && watcher != null) { + Set cardsToGraveyardThisTurn = watcher.getCardsPutToGraveyardFromBattlefield(); + Cards cardsToHand = new CardsImpl(); + for (MageObjectReference mor : cardsToGraveyardThisTurn) { + if (game.getState().getZoneChangeCounter(mor.getSourceId()) == mor.getZoneChangeCounter()) { + Card card = game.getCard(mor.getSourceId()); + if (card != null && card.getCardType().contains(CardType.CREATURE) + && card.getOwnerId().equals(source.getControllerId())) { + cardsToHand.add(card); + } + } + } + controller.moveCards(cardsToHand, Zone.GRAVEYARD, Zone.HAND, source, game); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/Gleancrawler.java b/Mage.Sets/src/mage/sets/ravnica/Gleancrawler.java new file mode 100644 index 00000000000..fb84aee512e --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/Gleancrawler.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.ravnica; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class Gleancrawler extends mage.sets.prereleaseevents.Gleancrawler { + + public Gleancrawler(UUID ownerId) { + super(ownerId); + this.cardNumber = 247; + this.expansionSetCode = "RAV"; + this.rarity = Rarity.RARE; + } + + public Gleancrawler(final Gleancrawler card) { + super(card); + } + + @Override + public Gleancrawler copy() { + return new Gleancrawler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowmoor/TwilightShepherd.java b/Mage.Sets/src/mage/sets/shadowmoor/TwilightShepherd.java index 09f251c2d9c..94fc3a43426 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/TwilightShepherd.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/TwilightShepherd.java @@ -30,19 +30,23 @@ package mage.sets.shadowmoor; import java.util.Set; import java.util.UUID; import mage.MageInt; +import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.PersistAbility; +import mage.abilities.keyword.VigilanceAbility; 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.game.Game; +import mage.players.Player; import mage.watchers.common.CardsPutIntoGraveyardWatcher; /** @@ -104,17 +108,22 @@ class TwilightShepherdEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get("CardsPutIntoGraveyardWatcher"); - if (watcher != null) { - Set cardsInGraveyardId = watcher.getCardsPutToGraveyardFromBattlefield(); - for (UUID cardId : cardsInGraveyardId) { - Card card = game.getCard(cardId); - if (card != null - && card.getOwnerId().equals(source.getControllerId()) - && game.getState().getZone(card.getId()).match(Zone.GRAVEYARD)) { - applied = card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && watcher != null) { + Set cardsInGraveyard = watcher.getCardsPutToGraveyardFromBattlefield(); + Cards cardsToHand = new CardsImpl(); + for (MageObjectReference mor : cardsInGraveyard) { + if (game.getState().getZoneChangeCounter(mor.getSourceId()) == mor.getZoneChangeCounter()) { + Card card = game.getCard(mor.getSourceId()); + if (card != null + && card.getOwnerId().equals(source.getControllerId())) { + cardsToHand.add(card); + } } } + controller.moveCards(cardsToHand, Zone.GRAVEYARD, Zone.HAND, source, game); + return true; } - return applied; + return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/zendikar/RavenousTrap.java b/Mage.Sets/src/mage/sets/zendikar/RavenousTrap.java index d01bf7f2758..f21710f496f 100644 --- a/Mage.Sets/src/mage/sets/zendikar/RavenousTrap.java +++ b/Mage.Sets/src/mage/sets/zendikar/RavenousTrap.java @@ -27,21 +27,15 @@ */ package mage.sets.zendikar; -import java.util.ArrayList; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.costs.AlternativeCostImpl; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileGraveyardAllTargetPlayerEffect; import mage.cards.CardImpl; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.Game; -import mage.players.Player; import mage.target.TargetPlayer; import mage.watchers.common.CardsPutIntoGraveyardWatcher; @@ -56,7 +50,6 @@ public class RavenousTrap extends CardImpl { this.expansionSetCode = "ZEN"; this.subtype.add("Trap"); - // If an opponent had three or more cards put into his or her graveyard from anywhere this turn, you may pay {0} rather than pay Ravenous Trap's mana cost. this.getSpellAbility().addAlternativeCost( new RavenousTrapAlternativeCost()); @@ -97,7 +90,7 @@ class RavenousTrapAlternativeCost extends AlternativeCostImpl { public boolean isAvailable(Game game, Ability source) { CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get("CardsPutIntoGraveyardWatcher"); if (watcher != null) { - for (UUID opponentId: game.getOpponents(source.getControllerId())) { + for (UUID opponentId : game.getOpponents(source.getControllerId())) { if (watcher.getAmountCardsPutToGraveyard(opponentId) > 2) { return true; } @@ -108,6 +101,6 @@ class RavenousTrapAlternativeCost extends AlternativeCostImpl { @Override public String getText() { - return "If an opponent had three or more cards put into his or her graveyard from anywhere this turn, you may pay {0} rather than pay Ravenous Trap's mana cost"; + return "If an opponent had three or more cards put into his or her graveyard from anywhere this turn, you may pay {0} rather than pay {this}'s mana cost"; } } diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 4b8baa125c1..830c7af2a0c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1672,6 +1672,21 @@ public class TestPlayer implements Player { return computerPlayer.moveCards(cards, fromZone, toZone, source, game); } + @Override + public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { + return computerPlayer.moveCards(cards, fromZone, toZone, source, game); + } + + @Override + public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { + return computerPlayer.moveCards(card, fromZone, toZone, source, game); + } + + @Override + public boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { + return computerPlayer.moveCards(cards, fromZone, toZone, source, game); + } + @Override public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, Zone fromZone) { return computerPlayer.moveCardToHandWithInfo(card, sourceId, game, fromZone); diff --git a/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java index 452b40bfadb..58a00f4543c 100644 --- a/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.common; import mage.abilities.TriggeredAbilityImpl; @@ -41,7 +40,6 @@ import mage.target.targetpointer.FixedTarget; * * @author LevelX2 */ - public class BecomesBlockedAllTriggeredAbility extends TriggeredAbilityImpl { private FilterCreaturePermanent filter; @@ -50,6 +48,7 @@ public class BecomesBlockedAllTriggeredAbility extends TriggeredAbilityImpl { public BecomesBlockedAllTriggeredAbility(Effect effect, boolean optional) { this(effect, optional, new FilterCreaturePermanent("a creature"), false); } + public BecomesBlockedAllTriggeredAbility(Effect effect, boolean optional, FilterCreaturePermanent filter, boolean setTargetPointer) { super(Zone.BATTLEFIELD, effect, optional); this.filter = filter; @@ -72,7 +71,7 @@ public class BecomesBlockedAllTriggeredAbility extends TriggeredAbilityImpl { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) { if (setTargetPointer) { - for(Effect effect :this.getEffects()) { + for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(event.getTargetId())); } } @@ -83,9 +82,7 @@ public class BecomesBlockedAllTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - StringBuilder sb = new StringBuilder("Whenever ").append(filter.getMessage()); - sb.append(" becomes blocked, ").append(super.getRule()); - return sb.toString(); + return "Whenever " + filter.getMessage() + " becomes blocked, " + super.getRule(); } @Override diff --git a/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java b/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java index c001d57ae29..9339079cb1f 100644 --- a/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.effects.common; import java.util.UUID; @@ -37,6 +36,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; import mage.target.targetpointer.FirstTargetPointer; +import mage.target.targetpointer.SecondTargetPointer; import mage.util.CardUtil; /** @@ -84,8 +84,7 @@ public class DestroyTargetEffect extends OneShotEffect { } } } - } - else if (targetPointer.getTargets(game, source).size() > 0) { + } else if (targetPointer.getTargets(game, source).size() > 0) { for (UUID permanentId : targetPointer.getTargets(game, source)) { Permanent permanent = game.getPermanent(permanentId); if (permanent != null) { @@ -105,15 +104,23 @@ public class DestroyTargetEffect extends OneShotEffect { StringBuilder sb = new StringBuilder(); if (mode.getTargets().size() == 0) { sb.append("destroy that creature"); //TODO add possibility to specify text with targetPointer usage - } else if (mode.getTargets().get(0).getNumberOfTargets() == 1) { - String targetName = mode.getTargets().get(0).getTargetName(); - sb.append("destroy "); - if (!targetName.startsWith("another")) { - sb.append("target "); - } - sb.append(targetName); } else { - sb.append("Destroy ").append(CardUtil.numberToText(mode.getTargets().get(0).getNumberOfTargets())).append(" target ").append(mode.getTargets().get(0).getTargetName()); + Target target; + if (targetPointer instanceof SecondTargetPointer && mode.getTargets().size() > 1) { + target = mode.getTargets().get(1); + } else { + target = mode.getTargets().get(0); + } + if (target.getNumberOfTargets() == 1) { + String targetName = target.getTargetName(); + sb.append("destroy "); + if (!targetName.startsWith("another")) { + sb.append("target "); + } + sb.append(targetName); + } else { + sb.append("Destroy ").append(CardUtil.numberToText(target.getNumberOfTargets())).append(" target ").append(target.getTargetName()); + } } if (noRegen) { sb.append(". It can't be regenerated"); diff --git a/Mage/src/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java b/Mage/src/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java index 24eba041040..8c39c947169 100644 --- a/Mage/src/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/RemoveFromCombatTargetEffect.java @@ -1,37 +1,37 @@ /* -* Copyright 2012 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. -*/ - + * Copyright 2012 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.abilities.effects.common; -import mage.constants.Outcome; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; @@ -51,11 +51,13 @@ public class RemoveFromCombatTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); - if (permanent != null) { - permanent.removeFromCombat(game); + for (UUID targetId : getTargetPointer().getTargets(game, source)) { + Permanent permanent = game.getPermanent(targetId); + if (permanent != null) { + permanent.removeFromCombat(game); + } } - return false; + return true; } @Override @@ -65,6 +67,9 @@ public class RemoveFromCombatTargetEffect extends OneShotEffect { @Override public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } return "Remove target " + mode.getTargets().get(0).getTargetName() + " from combat"; } diff --git a/Mage/src/mage/abilities/effects/common/ReturnToHandTargetEffect.java b/Mage/src/mage/abilities/effects/common/ReturnToHandTargetEffect.java index 0edac1ef0f5..ebf5260bbb5 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnToHandTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnToHandTargetEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,26 +20,24 @@ * 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.abilities.effects.common; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.Outcome; import mage.constants.Zone; -import static mage.constants.Zone.BATTLEFIELD; -import static mage.constants.Zone.EXILED; -import static mage.constants.Zone.GRAVEYARD; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.util.CardUtil; @@ -72,40 +70,20 @@ public class ReturnToHandTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - boolean result = true; // in case no target is selected Player controller = game.getPlayer(source.getControllerId()); if (controller == null) { return false; } + Cards cardsToHand = new CardsImpl(); + Zone fromZone = game.getState().getZone(targetPointer.getFirst(game, source)); + for (UUID targetId : targetPointer.getTargets(game, source)) { - switch (game.getState().getZone(targetId)) { - case BATTLEFIELD: - Permanent permanent = game.getPermanent(targetId); - if (permanent != null) { - controller.moveCardToHandWithInfo((Card) permanent, source.getSourceId(), game, Zone.BATTLEFIELD, withName); - } else { - result = false; - } - break; - case GRAVEYARD: - Card card = game.getCard(targetId); - if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD, withName); - } else { - result = false; - } - break; - case EXILED: - card = game.getCard(targetId); - if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.EXILED, withName); - } else { - result = false; - } - break; + MageObject mageObject = game.getObject(targetId); + if (mageObject instanceof Card) { + cardsToHand.add((Card) mageObject); } } - return result; + return controller.moveCards(cardsToHand, fromZone, Zone.HAND, source, game); } @Override diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index d242c5a49de..60ea5a123af 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -612,10 +612,16 @@ public interface Player extends MageItem, Copyable { */ boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game); - boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game); + boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game); + boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); + + boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game); + + boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); + /** * Uses card.moveToZone and posts a inform message about moving the card * into the game log diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 0bc26e40f1f..032325c8251 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2869,6 +2869,11 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game) { + return moveCards(cards, fromZone, toZone, source, game, true); + } + + @Override + public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { ArrayList cardList = new ArrayList<>(); for (UUID cardId : cards) { if (fromZone.equals(Zone.BATTLEFIELD)) { @@ -2883,20 +2888,30 @@ public abstract class PlayerImpl implements Player, Serializable { } } } - return moveCards(cardList, fromZone, toZone, source, game); + return moveCards(cardList, fromZone, toZone, source, game, withName); } @Override public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game) { + return moveCards(card, fromZone, toZone, source, game, true); + } + + @Override + public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { ArrayList cardList = new ArrayList<>(); if (card != null) { cardList.add(card); } - return moveCards(cardList, fromZone, toZone, source, game); + return moveCards(cardList, fromZone, toZone, source, game, withName); } @Override public boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game) { + return moveCards(cards, fromZone, toZone, source, game, true); + } + + @Override + public boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { if (cards.isEmpty()) { return true; } @@ -2905,7 +2920,7 @@ public abstract class PlayerImpl implements Player, Serializable { case EXILED: boolean result = false; for (Card card : cards) { - result |= moveCardToExileWithInfo(card, null, "", source == null ? null : source.getSourceId(), game, fromZone, true); + result |= moveCardToExileWithInfo(card, null, "", source == null ? null : source.getSourceId(), game, fromZone, withName); } return result; case GRAVEYARD: @@ -2913,21 +2928,17 @@ public abstract class PlayerImpl implements Player, Serializable { case HAND: result = false; for (Card card : cards) { - result |= moveCardToHandWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone); + result |= moveCardToHandWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, withName); } return result; case BATTLEFIELD: result = false; for (Card card : cards) { - result |= putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId()); + result |= putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId(), false, !withName); } return result; case LIBRARY: result = false; - boolean withName = true; - if (fromZone.equals(Zone.HAND) || fromZone.equals(Zone.LIBRARY)) { - withName = false; - } for (Card card : cards) { result |= moveCardToLibraryWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, true, withName); } diff --git a/Mage/src/mage/watchers/common/CardsPutIntoGraveyardWatcher.java b/Mage/src/mage/watchers/common/CardsPutIntoGraveyardWatcher.java index 78195be8c11..c24c04d65e3 100644 --- a/Mage/src/mage/watchers/common/CardsPutIntoGraveyardWatcher.java +++ b/Mage/src/mage/watchers/common/CardsPutIntoGraveyardWatcher.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.watchers.common; import java.util.HashMap; @@ -34,6 +33,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; +import mage.MageObjectReference; import mage.constants.WatcherScope; import mage.constants.Zone; import mage.game.Game; @@ -42,16 +42,16 @@ import mage.game.events.ZoneChangeEvent; import mage.watchers.Watcher; /** - * Counts amount of cards put into graveyards of players during the current turn. - * Also the UUIDs of cards that went to graveyard from Battlefield this turn. + * Counts amount of cards put into graveyards of players during the current + * turn. Also the UUIDs of cards that went to graveyard from Battlefield this + * turn. * * @author LevelX2 */ public class CardsPutIntoGraveyardWatcher extends Watcher { private final Map amountOfCardsThisTurn = new HashMap<>(); - private final Set cardsPutToGraveyardFromBattlefield = new HashSet<>(); - + private final Set cardsPutToGraveyardFromBattlefield = new HashSet<>(); public CardsPutIntoGraveyardWatcher() { super("CardsPutIntoGraveyardWatcher", WatcherScope.GAME); @@ -81,7 +81,7 @@ public class CardsPutIntoGraveyardWatcher extends Watcher { } amountOfCardsThisTurn.put(playerId, amount); if (((ZoneChangeEvent) event).getFromZone().equals(Zone.BATTLEFIELD)) { - cardsPutToGraveyardFromBattlefield.add(event.getTargetId()); + cardsPutToGraveyardFromBattlefield.add(new MageObjectReference(event.getTargetId(), game)); } } } @@ -95,10 +95,8 @@ public class CardsPutIntoGraveyardWatcher extends Watcher { return 0; } - public Set getCardsPutToGraveyardFromBattlefield() { - Set cards = new HashSet<>(); - cards.addAll(cardsPutToGraveyardFromBattlefield); - return cards; + public Set getCardsPutToGraveyardFromBattlefield() { + return cardsPutToGraveyardFromBattlefield; } @Override From 009f2a85fd0e05398b95de2ad368f672b34e8830 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 30 Jul 2015 16:46:24 +0200 Subject: [PATCH 242/375] Fixed weird replacement effects showing from otehr games (#643). --- .../src/mage/player/human/HumanPlayer.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 5997c368ae7..30262797d8a 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -102,19 +102,17 @@ public class HumanPlayer extends PlayerImpl { protected static FilterCreatureForCombat filterCreatureForCombat = new FilterCreatureForCombat(); protected static FilterAttackingCreature filterAttack = new FilterAttackingCreature(); protected static FilterBlockingCreature filterBlock = new FilterBlockingCreature(); - protected static final Choice replacementEffectChoice = new ChoiceImpl(true); + protected final Choice replacementEffectChoice; private static final Logger log = Logger.getLogger(HumanPlayer.class); - static { - replacementEffectChoice.setMessage("Choose replacement effect to resolve first"); - } - protected HashSet autoSelectReplacementEffects = new HashSet<>(); protected ManaCost currentlyUnpaidMana; public HumanPlayer(String name, RangeOfInfluence range, int skill) { super(name, range); + replacementEffectChoice = new ChoiceImpl(true); + replacementEffectChoice.setMessage("Choose replacement effect to resolve first"); human = true; } @@ -122,6 +120,7 @@ public class HumanPlayer extends PlayerImpl { super(player); this.autoSelectReplacementEffects.addAll(autoSelectReplacementEffects); this.currentlyUnpaidMana = player.currentlyUnpaidMana; + this.replacementEffectChoice = player.replacementEffectChoice; } protected void waitForResponse(Game game) { @@ -515,7 +514,7 @@ public class HumanPlayer extends PlayerImpl { public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) { updateGameStatePriority("chooseTargetAmount", game); while (!abort) { - game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), source.getSourceId(), game), + game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), source == null ? null : source.getSourceId(), game), target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game), target.isRequired(source), getOptions(target, null)); From f1fa56a4a02f2f9112db517c0f72d1d5497929c3 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Thu, 30 Jul 2015 10:42:10 -0700 Subject: [PATCH 243/375] implemented Rainbow Vale --- .../mage/sets/fallenempires/RainbowVale.java | 52 +++++++ .../mage/sets/mastersedition/RainbowVale.java | 132 ++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/fallenempires/RainbowVale.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java diff --git a/Mage.Sets/src/mage/sets/fallenempires/RainbowVale.java b/Mage.Sets/src/mage/sets/fallenempires/RainbowVale.java new file mode 100644 index 00000000000..6a63f8a1244 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fallenempires/RainbowVale.java @@ -0,0 +1,52 @@ +/* + * 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.fallenempires; + +import java.util.UUID; + +/** + * + * @author anonymous + */ +public class RainbowVale extends mage.sets.mastersedition.RainbowVale { + + public RainbowVale(UUID ownerId) { + super(ownerId); + this.cardNumber = 184; + this.expansionSetCode = "FEM"; + } + + public RainbowVale(final RainbowVale card) { + super(card); + } + + @Override + public RainbowVale copy() { + return new RainbowVale(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java new file mode 100644 index 00000000000..08a86e1b8b9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java @@ -0,0 +1,132 @@ +/* + * 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.mastersedition; + +import mage.abilities.Ability; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +import java.util.UUID; + +/** + * + * @author andyfries + */ +public class RainbowVale extends CardImpl { + + public RainbowVale(UUID ownerId) { + super(ownerId, 179, "Rainbow Vale", Rarity.RARE, new CardType[]{CardType.LAND}, ""); + this.expansionSetCode = "MED"; + + // {tap}: Add one mana of any color to your mana pool. An opponent gains control of Rainbow Vale at the beginning of the next end step. + Ability ability = new AnyColorManaAbility(); + ability.addEffect(new RainbowValeEffect()); + } + + public RainbowVale(final RainbowVale card) { + super(card); + } + + @Override + public RainbowVale copy() { + return new RainbowVale(this); + } + + + class RainbowValeEffect extends OneShotEffect { + + public RainbowValeEffect() { + super(Outcome.Neutral); + staticText = "Add one mana of any color to your mana pool. An opponent gains control of Rainbow Vale at the beginning of the next end step."; + } + + public RainbowValeEffect(final RainbowValeEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new OpponentGainControlEffect()); + delayedAbility.addTarget(new TargetOpponent()); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + return true; + } + return false; + } + + @Override + public RainbowValeEffect copy() { + return new RainbowValeEffect(this); + } + } +} + +class OpponentGainControlEffect extends ContinuousEffectImpl { + + public OpponentGainControlEffect() { + super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + this.staticText = "An opponent gains control of {this} at the beginning of the next end step."; + } + + public OpponentGainControlEffect(final OpponentGainControlEffect effect) { + super(effect); + } + + @Override + public OpponentGainControlEffect copy() { + return new OpponentGainControlEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetOpponent = game.getPlayer(source.getFirstTarget()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null && targetOpponent != null) { + permanent.changeControllerId(targetOpponent.getId(), game); + game.informPlayers(permanent.getName() + " is now controlled by " + targetOpponent.getLogName()); + } else { + // no valid target exists, effect can be discarded + discard(); + } + return true; + } +} + From 5fae4878c0ae6451fbdf1ce04e8d2a556c0baf46 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 31 Jul 2015 15:46:14 +0200 Subject: [PATCH 244/375] Added a test, some minor changes. --- .../mage/sets/alarareborn/MeddlingMage.java | 13 +- .../sets/avacynrestored/WildDefiance.java | 4 +- .../src/mage/sets/worldwake/Groundswell.java | 28 +-- .../mage/sets/zendikar/CelestialMantle.java | 23 ++- .../AI/basic/PreventRepeatedActionsTest.java | 22 +++ .../abilities/keywords/LandfallTest.java | 184 ++++++++++-------- .../common/continuous/BoostTargetEffect.java | 5 +- 7 files changed, 165 insertions(+), 114 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java b/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java index 2ab7ca6092b..e460268a654 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java +++ b/Mage.Sets/src/mage/sets/alarareborn/MeddlingMage.java @@ -27,6 +27,7 @@ */ package mage.sets.alarareborn; +import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -35,13 +36,15 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.NameACardEffect; import mage.cards.CardImpl; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import java.util.UUID; - /** * * @author Plopman @@ -54,8 +57,6 @@ public class MeddlingMage extends CardImpl { this.subtype.add("Human"); this.subtype.add("Wizard"); - - this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -118,4 +119,4 @@ class MeddlingMageReplacementEffect extends ContinuousRuleModifyingEffectImpl { return object != null && !object.isCopy() && object.getName().equals(game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY)); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/avacynrestored/WildDefiance.java b/Mage.Sets/src/mage/sets/avacynrestored/WildDefiance.java index 309a9128d61..858c6b9a858 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/WildDefiance.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/WildDefiance.java @@ -93,7 +93,7 @@ class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityI if (permanent != null && permanent.getControllerId().equals(this.controllerId) && permanent.getCardType().contains(CardType.CREATURE)) { MageObject object = game.getObject(event.getSourceId()); if (object != null && object instanceof Spell) { - Card c = (Spell)object; + Card c = (Spell) object; if (c.getCardType().contains(CardType.INSTANT) || c.getCardType().contains(CardType.SORCERY)) { if (getTargets().size() == 0) { for (Effect effect : getEffects()) { @@ -109,6 +109,6 @@ class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityI @Override public String getRule() { - return "Whenever a creature you control becomes the target of an instant or sorcery spell, that creature gets +3/+3 until end of turn"; + return "Whenever a creature you control becomes the target of an instant or sorcery spell, that creature gets +3/+3 until end of turn."; } } diff --git a/Mage.Sets/src/mage/sets/worldwake/Groundswell.java b/Mage.Sets/src/mage/sets/worldwake/Groundswell.java index 9598babd39e..fdcb5411d82 100644 --- a/Mage.Sets/src/mage/sets/worldwake/Groundswell.java +++ b/Mage.Sets/src/mage/sets/worldwake/Groundswell.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,24 +20,22 @@ * 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.worldwake; import java.util.UUID; - +import mage.abilities.condition.common.LandfallCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.AddContinuousEffectToGame; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; -import mage.abilities.condition.LockedInCondition; -import mage.abilities.condition.common.LandfallCondition; -import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.cards.CardImpl; import mage.target.common.TargetCreaturePermanent; import mage.watchers.common.LandfallWatcher; @@ -54,8 +52,10 @@ public class Groundswell extends CardImpl { // Target creature gets +2/+2 until end of turn. //Landfall - If you had a land enter the battlefield under your control this turn, that creature gets +4/+4 until end of turn instead. this.getSpellAbility().addWatcher(new LandfallWatcher()); - this.getSpellAbility().addEffect(new ConditionalContinuousEffect(new BoostTargetEffect(4, 4, Duration.EndOfTurn), new BoostTargetEffect(2, 2, Duration.EndOfTurn), - new LockedInCondition(LandfallCondition.getInstance()), + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new AddContinuousEffectToGame(new BoostTargetEffect(4, 4, Duration.EndOfTurn)), + new AddContinuousEffectToGame(new BoostTargetEffect(2, 2, Duration.EndOfTurn)), + LandfallCondition.getInstance(), "Target creature gets +2/+2 until end of turn.
Landfall — If you had a land enter the battlefield under your control this turn, that creature gets +4/44 until end of turn instead")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java b/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java index b1a4a82922f..d6565ac388e 100644 --- a/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java +++ b/Mage.Sets/src/mage/sets/zendikar/CelestialMantle.java @@ -25,9 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.zendikar; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; @@ -36,7 +36,11 @@ import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; @@ -46,30 +50,32 @@ import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; - /** * * @author Loki */ public class CelestialMantle extends CardImpl { - public CelestialMantle (UUID ownerId) { + public CelestialMantle(UUID ownerId) { super(ownerId, 6, "Celestial Mantle", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}{W}{W}"); this.expansionSetCode = "ZEN"; this.subtype.add("Aura"); - + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + + // Enchanted creature gets +3/+3. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield))); + + // Whenever enchanted creature deals combat damage to a player, double its controller's life total. this.addAbility(new CelestialMantleAbility()); } - public CelestialMantle (final CelestialMantle card) { + public CelestialMantle(final CelestialMantle card) { super(card); } @@ -102,7 +108,7 @@ class CelestialMantleAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event; + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; Permanent p = game.getPermanent(event.getSourceId()); return damageEvent.isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId()); } @@ -114,6 +120,7 @@ class CelestialMantleAbility extends TriggeredAbilityImpl { } class CelestialMantleEffect extends OneShotEffect { + CelestialMantleEffect() { super(Outcome.GainLife); } diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java index 7237a3fc9b8..1a6259d8e10 100644 --- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java @@ -83,4 +83,26 @@ public class PreventRepeatedActionsTest extends CardTestPlayerBaseAI { assertTapped("Basalt Monolith", false); } + + /** + * AI gets stuck with two Kiora's Followers #1167 + */ + @Test + public void testKiorasFollower() { + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2, true); + // {T}: Untap another target permanent. + addCard(Zone.BATTLEFIELD, playerA, "Kiora's Follower", 1, true); + addCard(Zone.BATTLEFIELD, playerA, "Kiora's Follower", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2); + + attack(2, playerB, "Silvercoat Lion"); + attack(2, playerB, "Silvercoat Lion"); + + setStopAt(2, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 16); + assertTapped("Kiora's Follower", false); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/LandfallTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/LandfallTest.java index 5e3b1b177cc..e1eae68db04 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/LandfallTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/LandfallTest.java @@ -30,6 +30,7 @@ package org.mage.test.cards.abilities.keywords; import mage.abilities.keyword.IntimidateAbility; import mage.constants.PhaseStep; import mage.constants.Zone; +import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -37,22 +38,21 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class LandfallTest extends CardTestPlayerBase { @Test public void testNormalUse() { - addCard(Zone.BATTLEFIELD, playerA, "Plains",3); - addCard(Zone.HAND, playerA, "Plains"); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); + addCard(Zone.HAND, playerA, "Plains"); // Instant - {1}{W} // Target player gains 4 life. - // Landfall - If you had a land enter the battlefield under your control this turn, that player gains 8 life instead. - addCard(Zone.HAND, playerA, "Rest for the Weary",2); - + // Landfall - If you had a land enter the battlefield under your control this turn, that player gains 8 life instead. + addCard(Zone.HAND, playerA, "Rest for the Weary", 2); + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Plains"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rest for the Weary"); - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Rest for the Weary"); setStopAt(2, PhaseStep.BEGIN_COMBAT); @@ -61,57 +61,59 @@ public class LandfallTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Plains", 4); assertGraveyardCount(playerA, "Rest for the Weary", 2); assertLife(playerA, 32); // + 8 from 1 turn + 4 from second turn - assertLife(playerB, 20); - - } + assertLife(playerB, 20); + + } + /** - * If you Hive Mind an opponent's Rest for the Weary and redirect its target to yourself when it's not your turn, - * the game spits out this message and rolls back to before Rest for the Weary was cast. - * + * If you Hive Mind an opponent's Rest for the Weary and redirect its target + * to yourself when it's not your turn, the game spits out this message and + * rolls back to before Rest for the Weary was cast. + * */ @Test public void testHiveMind() { - addCard(Zone.BATTLEFIELD, playerA, "Plains",2); - + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + // Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for his or her copy. - addCard(Zone.BATTLEFIELD, playerB, "Hive Mind"); + addCard(Zone.BATTLEFIELD, playerB, "Hive Mind"); // Instant - {1}{W} // Target player gains 4 life. - // Landfall - If you had a land enter the battlefield under your control this turn, that player gains 8 life instead. - addCard(Zone.HAND, playerA, "Rest for the Weary",1); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rest for the Weary"); + // Landfall - If you had a land enter the battlefield under your control this turn, that player gains 8 life instead. + addCard(Zone.HAND, playerA, "Rest for the Weary", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rest for the Weary"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerA, "Rest for the Weary", 1); - assertLife(playerA, 24); - assertLife(playerB, 24); - - } - + assertLife(playerA, 24); + assertLife(playerB, 24); + + } + @Test public void testSurrakarMarauder() { - // Landfall - Whenever a land enters the battlefield under your control, Surrakar Marauder gains intimidate until end of turn. - addCard(Zone.BATTLEFIELD, playerA, "Surrakar Marauder",1); - addCard(Zone.HAND, playerA, "Plains"); - + // Landfall - Whenever a land enters the battlefield under your control, Surrakar Marauder gains intimidate until end of turn. + addCard(Zone.BATTLEFIELD, playerA, "Surrakar Marauder", 1); + addCard(Zone.HAND, playerA, "Plains"); + playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Plains"); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Plains", 1); - + assertAbility(playerA, "Surrakar Marauder", IntimidateAbility.getInstance(), true); - - assertLife(playerA, 20); - assertLife(playerB, 20); - - } - + + assertLife(playerA, 20); + assertLife(playerB, 20); + + } + /** * Searing Blaze's landfall doesn't appear to be working. My opponent played * a mountain, then played searing blaze targeting my Tasigur, the Golden @@ -122,82 +124,98 @@ public class LandfallTest extends CardTestPlayerBase { public void testSearingBlaze() { // Searing Blaze deals 1 damage to target player and 1 damage to target creature that player controls. // Landfall - If you had a land enter the battlefield under your control this turn, Searing Blaze deals 3 damage to that player and 3 damage to that creature instead. - addCard(Zone.HAND, playerA, "Searing Blaze",1); - addCard(Zone.BATTLEFIELD, playerA, "Mountain",1); - addCard(Zone.HAND, playerA, "Mountain"); + addCard(Zone.HAND, playerA, "Searing Blaze", 1); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); + addCard(Zone.HAND, playerA, "Mountain"); - addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion",1); + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); - playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mountain"); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Searing Blaze"); - - + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Searing Blaze"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Mountain", 2); - assertGraveyardCount(playerA, "Searing Blaze" , 1); - - assertLife(playerA, 20); - assertLife(playerB, 17); - - assertGraveyardCount(playerB, "Silvercoat Lion" , 1); - - } + assertGraveyardCount(playerA, "Searing Blaze", 1); + + assertLife(playerA, 20); + assertLife(playerB, 17); + + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + + } @Test public void testGroundswellWithoutLandfall() { // Target creature gets +2/+2 until end of turn. //Landfall - If you had a land enter the battlefield under your control this turn, that creature gets +4/+4 until end of turn instead. - addCard(Zone.HAND, playerB, "Groundswell",1); - addCard(Zone.BATTLEFIELD, playerB, "Forest",1); + addCard(Zone.HAND, playerB, "Groundswell", 1); + addCard(Zone.BATTLEFIELD, playerB, "Forest", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); - addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion",1); - attack(2, playerB, "Silvercoat Lion"); - castSpell(2, PhaseStep.DECLARE_ATTACKERS, playerB, "Groundswell", "Silvercoat Lion"); - - + castSpell(2, PhaseStep.DECLARE_ATTACKERS, playerB, "Groundswell", "Silvercoat Lion"); + setStopAt(2, PhaseStep.END_COMBAT); execute(); assertPermanentCount(playerB, "Forest", 1); - assertGraveyardCount(playerB, "Groundswell" , 1); + assertGraveyardCount(playerB, "Groundswell", 1); - assertPermanentCount(playerB, "Silvercoat Lion" , 1); + assertPermanentCount(playerB, "Silvercoat Lion", 1); assertPowerToughness(playerB, "Silvercoat Lion", 4, 4); - + assertLife(playerA, 16); // 2 + 4 - assertLife(playerB, 20); - } - + assertLife(playerB, 20); + } + + /* + 21:09: Turn 8 arucki (25 - 16) + 21:09: arucki draws a card + 21:09: Ability triggers: Sylvan Library [868] - At the beginning of your draw step, you may draw two additional cards. If you do, choose two cards in your hand drawn this turn. For each of those cards, pay 4 life or put the card on top of your library. + 21:09: arucki draws two cards + 21:09: arucki loses 4 life + 21:09: arucki pays 4 life to keep a card on hand + 21:09: arucki puts 1 card(s) back to library + 21:09: arucki plays Twilight Mire [f4d] + 21:10: arucki activates: Inkmoth Nexus [1b5] becomes a 1/1 Blinkmoth artifact creature with flying and infect until end of turn. It's still a land. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.). from Inkmoth Nexus [1b5] + 21:10: arucki casts Groundswell [b28] targeting Inkmoth Nexus [1b5] + 21:10: Ability triggers: Wild Defiance [990] - Whenever a creature you control becomes the target of an instant or sorcery spell, that creature gets +3/+3 until end of turn + 21:10: arucki puts Groundswell [b28] from stack into his or her graveyard + 21:10: arucki attacks with 1 creature + 21:10: Attacker: Inkmoth Nexus 1b5 unblocked + */ @Test + @Ignore public void testGroundswellWithLandfall() { // Target creature gets +2/+2 until end of turn. //Landfall - If you had a land enter the battlefield under your control this turn, that creature gets +4/+4 until end of turn instead. - addCard(Zone.HAND, playerB, "Groundswell",1); - addCard(Zone.HAND, playerB, "Forest"); + addCard(Zone.HAND, playerB, "Groundswell", 1); // Instant + addCard(Zone.BATTLEFIELD, playerB, "Forest"); + addCard(Zone.HAND, playerB, "Twilight Mire"); - addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion",1); + // Whenever a creature you control becomes the target of an instant or sorcery spell, that creature gets +3/+3 until end of turn. + addCard(Zone.BATTLEFIELD, playerB, "Wild Defiance", 1); - - playLand(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Forest"); + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); + + playLand(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Twilight Mire"); attack(2, playerB, "Silvercoat Lion"); - castSpell(2, PhaseStep.DECLARE_ATTACKERS, playerB, "Groundswell", "Silvercoat Lion"); - - + castSpell(2, PhaseStep.DECLARE_ATTACKERS, playerB, "Groundswell", "Silvercoat Lion"); + setStopAt(2, PhaseStep.END_COMBAT); execute(); - assertPermanentCount(playerB, "Forest", 1); - assertGraveyardCount(playerB, "Groundswell" , 1); + assertPermanentCount(playerB, "Twilight Mire", 1); + assertGraveyardCount(playerB, "Groundswell", 1); - assertPermanentCount(playerB, "Silvercoat Lion" , 1); - assertPowerToughness(playerB, "Silvercoat Lion", 6, 6); - - assertLife(playerA, 14); // 2 + 4 - assertLife(playerB, 20); - } + assertPermanentCount(playerB, "Silvercoat Lion", 1); + assertPowerToughness(playerB, "Silvercoat Lion", 9, 9); + + assertLife(playerA, 11); // 2 + 4 + 3 + assertLife(playerB, 20); + } } diff --git a/Mage/src/mage/abilities/effects/common/continuous/BoostTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BoostTargetEffect.java index 0cbb14b528d..1d11baae793 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BoostTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BoostTargetEffect.java @@ -115,8 +115,11 @@ public class BoostTargetEffect extends ContinuousEffectImpl { if (staticText != null && !staticText.isEmpty()) { return staticText; } - StringBuilder sb = new StringBuilder(); + if (mode == null || mode.getTargets().size() == 0) { + return "no target"; + } Target target = mode.getTargets().get(0); + StringBuilder sb = new StringBuilder(); if (target.getMaxNumberOfTargets() > 1) { if (target.getNumberOfTargets() < target.getNumberOfTargets()) { sb.append("up to "); From 539603af3d69cde0b23ac4d85c6621fefd0f0d38 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 31 Jul 2015 17:55:51 +0200 Subject: [PATCH 245/375] * Some minor fixes to tooltip texts. --- .../src/mage/sets/zendikar/GuulDrazVampire.java | 9 +++++---- .../src/mage/sets/zendikar/LavaballTrap.java | 11 +++++------ .../src/mage/sets/zendikar/PitfallTrap.java | 11 +++++------ .../src/mage/sets/zendikar/SlaughterCry.java | 17 +++++++++++------ .../src/mage/sets/zendikar/SpireBarrage.java | 12 +++++------- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Mage.Sets/src/mage/sets/zendikar/GuulDrazVampire.java b/Mage.Sets/src/mage/sets/zendikar/GuulDrazVampire.java index 1ba0cf97ec5..a05963c6ca2 100644 --- a/Mage.Sets/src/mage/sets/zendikar/GuulDrazVampire.java +++ b/Mage.Sets/src/mage/sets/zendikar/GuulDrazVampire.java @@ -29,6 +29,7 @@ package mage.sets.zendikar; import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.TenOrLessLifeCondition; @@ -49,7 +50,7 @@ import mage.constants.Zone; public class GuulDrazVampire extends CardImpl { private static final String rule1 = "As long as an opponent has 10 or less life, {this} gets +2/+1"; - private static final String rule2 = "As long as an opponent has 10 or less life, {this} has intimidate"; + private static final String rule2 = "and has intimidate. (It can't be blocked except by artifact creatures and/or creatures that share a color with it.)"; public GuulDrazVampire(UUID ownerId) { super(ownerId, 93, "Guul Draz Vampire", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}"); @@ -64,9 +65,9 @@ public class GuulDrazVampire extends CardImpl { // As long as an opponent has 10 or less life, Guul Draz Vampire gets +2/+1 and has intimidate. (It can't be blocked except by artifact creatures and/or creatures that share a color with it.) Condition condition = new TenOrLessLifeCondition(TenOrLessLifeCondition.CheckType.AN_OPPONENT); ConditionalContinuousEffect effect1 = new ConditionalContinuousEffect(new BoostSourceEffect(2, 1, Duration.WhileOnBattlefield), condition, rule1); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect1)); - ConditionalContinuousEffect effect2 = new ConditionalContinuousEffect(new GainAbilitySourceEffect(IntimidateAbility.getInstance()), condition, rule2); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect2)); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect1); + ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(IntimidateAbility.getInstance()), condition, rule2)); + this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/zendikar/LavaballTrap.java b/Mage.Sets/src/mage/sets/zendikar/LavaballTrap.java index 0c9f4be3efe..058b40ffe23 100644 --- a/Mage.Sets/src/mage/sets/zendikar/LavaballTrap.java +++ b/Mage.Sets/src/mage/sets/zendikar/LavaballTrap.java @@ -30,9 +30,6 @@ package mage.sets.zendikar; import java.util.HashMap; import java.util.Map; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.costs.AlternativeCostImpl; import mage.abilities.costs.Cost; @@ -40,8 +37,11 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.WatcherScope; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -59,7 +59,6 @@ public class LavaballTrap extends CardImpl { this.expansionSetCode = "ZEN"; this.subtype.add("Trap"); - // If an opponent had two or more lands enter the battlefield under his or her control this turn, you may pay {3}{R}{R} rather than pay Lavaball Trap's mana cost. this.getSpellAbility().addAlternativeCost(new LavaballTrapAlternativeCost()); this.getSpellAbility().addWatcher(new LavaballTrapWatcher()); @@ -67,7 +66,7 @@ public class LavaballTrap extends CardImpl { // Destroy two target lands. Lavaball Trap deals 4 damage to each creature. this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addEffect(new DamageAllEffect(4, new FilterCreaturePermanent())); - this.getSpellAbility().addTarget(new TargetLandPermanent(2)); + this.getSpellAbility().addTarget(new TargetLandPermanent(2, 2, new FilterLandPermanent("lands"), false)); } @@ -164,4 +163,4 @@ class LavaballTrapAlternativeCost extends AlternativeCostImpl { public String getText() { return "If an opponent had two or more lands enter the battlefield under his or her control this turn, you may pay {3}{R}{R} rather than pay Lavaball Trap's mana cost"; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/zendikar/PitfallTrap.java b/Mage.Sets/src/mage/sets/zendikar/PitfallTrap.java index 7d6e1f96dd7..7ba0ab5b4d7 100644 --- a/Mage.Sets/src/mage/sets/zendikar/PitfallTrap.java +++ b/Mage.Sets/src/mage/sets/zendikar/PitfallTrap.java @@ -28,14 +28,14 @@ package mage.sets.zendikar; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.costs.AlternativeCostImpl; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.filter.common.FilterAttackingCreature; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; @@ -48,7 +48,7 @@ import mage.target.common.TargetAttackingCreature; */ public class PitfallTrap extends CardImpl { - private static final FilterAttackingCreature filter = new FilterAttackingCreature("creature without flying"); + private static final FilterAttackingCreature filter = new FilterAttackingCreature("attacking creature without flying"); static { filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); @@ -59,10 +59,9 @@ public class PitfallTrap extends CardImpl { this.expansionSetCode = "ZEN"; this.subtype.add("Trap"); - // If exactly one creature is attacking, you may pay {W} rather than pay Pitfall Trap's mana cost. this.getSpellAbility().addAlternativeCost(new PitfallTrapAlternativeCost()); - + // Destroy target attacking creature without flying. this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addTarget(new TargetAttackingCreature(1, 1, filter, false)); @@ -106,4 +105,4 @@ class PitfallTrapAlternativeCost extends AlternativeCostImpl { public String getText() { return "If exactly one creature is attacking, you may pay {W} rather than pay Pitfall Trap's mana cost"; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/zendikar/SlaughterCry.java b/Mage.Sets/src/mage/sets/zendikar/SlaughterCry.java index 6fb34df8f7f..434d95e4dfc 100644 --- a/Mage.Sets/src/mage/sets/zendikar/SlaughterCry.java +++ b/Mage.Sets/src/mage/sets/zendikar/SlaughterCry.java @@ -28,13 +28,14 @@ package mage.sets.zendikar; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; import mage.target.common.TargetCreaturePermanent; /** @@ -47,10 +48,14 @@ public class SlaughterCry extends CardImpl { super(ownerId, 149, "Slaughter Cry", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}"); this.expansionSetCode = "ZEN"; - + // Target creature gets +3/+0 and gains first strike until end of turn. (It deals combat damage before creatures without first strike.) this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new BoostTargetEffect(3, 0, Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn)); + Effect effect = new BoostTargetEffect(3, 0, Duration.EndOfTurn); + effect.setText("Target creature gets +3/+0"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains first strike until end of turn. (It deals combat damage before creatures without first strike.)"); + this.getSpellAbility().addEffect(effect); } public SlaughterCry(final SlaughterCry card) { diff --git a/Mage.Sets/src/mage/sets/zendikar/SpireBarrage.java b/Mage.Sets/src/mage/sets/zendikar/SpireBarrage.java index e5c2426261d..55e035ac355 100644 --- a/Mage.Sets/src/mage/sets/zendikar/SpireBarrage.java +++ b/Mage.Sets/src/mage/sets/zendikar/SpireBarrage.java @@ -27,26 +27,25 @@ */ package mage.sets.zendikar; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.TargetController; +import java.util.UUID; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.common.TargetCreatureOrPlayer; -import java.util.UUID; - /** * * @author North */ public class SpireBarrage extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent("Mountains"); + private static final FilterLandPermanent filter = new FilterLandPermanent("Mountain you control"); static { filter.add(new SubtypePredicate("Mountain")); @@ -57,7 +56,6 @@ public class SpireBarrage extends CardImpl { super(ownerId, 150, "Spire Barrage", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{4}{R}"); this.expansionSetCode = "ZEN"; - // Spire Barrage deals damage to target creature or player equal to the number of Mountains you control. this.getSpellAbility().addEffect(new DamageTargetEffect(new PermanentsOnBattlefieldCount(filter))); this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); From 2b617fa6f7e44d9dbac4af53b6585849e220cc3d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 1 Aug 2015 18:27:17 +0200 Subject: [PATCH 246/375] * Fixed a bug of ConditionalTriggeredAbility if the ability triggered multiple times at the same time. --- .../mage/sets/magic2012/JacesArchivist.java | 28 ++-- .../multiplayer/BloodchiefAscensionTest.java | 138 ++++++++++++------ ...oGraveFromAnywhereAllTriggeredAbility.java | 11 +- .../ConditionalGainActivatedAbility.java | 11 +- .../ConditionalTriggeredAbility.java | 14 +- .../effects/common/LoseLifeTargetEffect.java | 12 +- Mage/src/mage/players/PlayerImpl.java | 2 +- 7 files changed, 137 insertions(+), 79 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2012/JacesArchivist.java b/Mage.Sets/src/mage/sets/magic2012/JacesArchivist.java index 5836f1f85d2..7c944d51a83 100644 --- a/Mage.Sets/src/mage/sets/magic2012/JacesArchivist.java +++ b/Mage.Sets/src/mage/sets/magic2012/JacesArchivist.java @@ -27,20 +27,22 @@ */ package mage.sets.magic2012; -import mage.constants.*; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.players.Player; -import java.util.UUID; - /** * @author Loki */ @@ -55,6 +57,7 @@ public class JacesArchivist extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); + // {U}, {T}: Each player discards his or her hand, then draws cards equal to the greatest number of cards a player discarded this way. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new JacesArchivistEffect(), new ColoredManaCost(ColoredManaSymbol.U)); ability.addCost(new TapSourceCost()); this.addAbility(ability); @@ -71,6 +74,7 @@ public class JacesArchivist extends CardImpl { } class JacesArchivistEffect extends OneShotEffect { + JacesArchivistEffect() { super(Outcome.Discard); staticText = "Each player discards his or her hand, then draws cards equal to the greatest number of cards a player discarded this way"; @@ -83,20 +87,18 @@ class JacesArchivistEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int maxDiscarded = 0; - Player sourcePlayer = game.getPlayer(source.getControllerId()); - for (UUID playerId : sourcePlayer.getInRange()) { + Player controller = game.getPlayer(source.getControllerId()); + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); if (player != null) { - int discarded = 0; - for (Card c : player.getHand().getCards(game)) { - if (player.discard(c, source, game)) - discarded++; - } - if (discarded > maxDiscarded) + int discarded = player.getHand().size(); + player.discard(discarded, false, source, game); + if (discarded > maxDiscarded) { maxDiscarded = discarded; + } } } - for (UUID playerId : sourcePlayer.getInRange()) { + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); if (player != null) { player.drawCards(maxDiscarded, game); diff --git a/Mage.Tests/src/test/java/org/mage/test/multiplayer/BloodchiefAscensionTest.java b/Mage.Tests/src/test/java/org/mage/test/multiplayer/BloodchiefAscensionTest.java index abad3873732..54944174eae 100644 --- a/Mage.Tests/src/test/java/org/mage/test/multiplayer/BloodchiefAscensionTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/multiplayer/BloodchiefAscensionTest.java @@ -39,108 +39,156 @@ import org.mage.test.serverside.base.CardTestMultiPlayerBase; * @author LevelX2 */ public class BloodchiefAscensionTest extends CardTestMultiPlayerBase { - - @Test + + @Test public void testBloodchiefAscensionAllPlayers() { // Enchantment // At the beginning of each end step, if an opponent lost 2 or more life this turn, you may put a quest counter on Bloodchief Ascension. (Damage causes loss of life.) - // Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life. + // Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life. addCard(Zone.BATTLEFIELD, playerA, "Bloodchief Ascension"); - - addCard(Zone.BATTLEFIELD, playerA, "Mountain",3); + + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); addCard(Zone.HAND, playerA, "Fireball"); - addCard(Zone.BATTLEFIELD, playerD, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerD, "Mountain", 3); addCard(Zone.HAND, playerD, "Fireball"); - addCard(Zone.BATTLEFIELD, playerC, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerC, "Mountain", 3); addCard(Zone.HAND, playerC, "Fireball"); - addCard(Zone.BATTLEFIELD, playerB, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 3); addCard(Zone.HAND, playerB, "Fireball"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Fireball", playerA); setChoice(playerA, "X=2"); - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerD, "Fireball", playerD); setChoice(playerD, "X=2"); - + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerC, "Fireball", playerC); setChoice(playerC, "X=2"); - + castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Fireball", playerB); setChoice(playerB, "X=2"); - - // Player order: A -> D -> C -> B + // Player order: A -> D -> C -> B setStopAt(4, PhaseStep.END_TURN); execute(); - + assertLife(playerA, 18); assertLife(playerB, 18); assertLife(playerC, 18); assertLife(playerD, 18); - + assertGraveyardCount(playerA, "Fireball", 1); assertGraveyardCount(playerB, "Fireball", 1); assertGraveyardCount(playerC, "Fireball", 1); assertGraveyardCount(playerD, "Fireball", 1); - - assertCounterCount("Bloodchief Ascension", CounterType.QUEST, 2); // 1 opponent out of range - } - /** - * One of my opponents in a multiplayer game had a Bloodchief Ascension in play. I took lethal damage on my turn, - * but he didn't get a counter on Bloodchief Ascension at my end step. I think he should, even though I had left - * the game from dying, because of: - * - * 800.4g. If a player leaves the game during his or her turn, that turn continues to its completion without an - * active player. If the active player would receive priority, instead the next player in turn order receives priority, - * or the top object on the stack resolves, or the phase or step ends, whichever is appropriate. - */ + } + + /** + * One of my opponents in a multiplayer game had a Bloodchief Ascension in + * play. I took lethal damage on my turn, but he didn't get a counter on + * Bloodchief Ascension at my end step. I think he should, even though I had + * left the game from dying, because of: + * + * 800.4g. If a player leaves the game during his or her turn, that turn + * continues to its completion without an active player. If the active + * player would receive priority, instead the next player in turn order + * receives priority, or the top object on the stack resolves, or the phase + * or step ends, whichever is appropriate. + */ @Test public void testBloodchiefAscension() { // Enchantment // At the beginning of each end step, if an opponent lost 2 or more life this turn, you may put a quest counter on Bloodchief Ascension. (Damage causes loss of life.) - // Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life. + // Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life. addCard(Zone.BATTLEFIELD, playerA, "Bloodchief Ascension"); - addCard(Zone.BATTLEFIELD, playerA, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); addCard(Zone.HAND, playerA, "Fireball"); - addCard(Zone.BATTLEFIELD, playerD, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerD, "Mountain", 3); addCard(Zone.HAND, playerD, "Fireball"); - addCard(Zone.BATTLEFIELD, playerC, "Mountain",3); + addCard(Zone.BATTLEFIELD, playerC, "Mountain", 3); addCard(Zone.HAND, playerC, "Fireball"); - addCard(Zone.BATTLEFIELD, playerB, "Mountain",21); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 21); addCard(Zone.HAND, playerB, "Fireball"); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Fireball", playerA); setChoice(playerA, "X=2"); - + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerD, "Fireball", playerD); setChoice(playerD, "X=2"); - + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerC, "Fireball", playerC); setChoice(playerC, "X=2"); - + castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Fireball", playerB); setChoice(playerB, "X=20"); - - // Player order: A -> D -> C -> B + // Player order: A -> D -> C -> B setStopAt(4, PhaseStep.END_TURN); execute(); - + assertLife(playerA, 18); assertLife(playerB, 0); assertLife(playerC, 18); assertLife(playerD, 18); - + Assert.assertTrue("playerB has lost", playerB.hasLost()); - + assertGraveyardCount(playerA, "Fireball", 1); assertGraveyardCount(playerC, "Fireball", 1); - assertGraveyardCount(playerD, "Fireball", 1); - - assertCounterCount("Bloodchief Ascension", CounterType.QUEST, 2); // 1 opponent out of range + assertGraveyardCount(playerD, "Fireball", 1); + + assertCounterCount("Bloodchief Ascension", CounterType.QUEST, 2); // 1 opponent out of range + + } + + /** + * Bloodchief Ascension effect is not working corretly on multiplayer. + * Whenever one player activated Jace's Archivist, the damage of the + * discarded cards was going on a single player, not on the players who + * discarded the cards. + */ + @Test + public void testJacesArchivist() { + // Enchantment + // At the beginning of each end step, if an opponent lost 2 or more life this turn, you may put a quest counter on Bloodchief Ascension. (Damage causes loss of life.) + // Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life. + + skipInitShuffling(); + addCard(Zone.LIBRARY, playerA, "Auramancer"); + addCard(Zone.HAND, playerA, "Auramancer", 2); + + addCard(Zone.BATTLEFIELD, playerD, "Bloodchief Ascension"); + addCounters(2, PhaseStep.UPKEEP, playerD, "Bloodchief Ascension", CounterType.QUEST, 3); + addCard(Zone.BATTLEFIELD, playerD, "Island", 1); + // {U}, {T}: Each player discards his or her hand, then draws cards equal to the greatest number of cards a player discarded this way. + addCard(Zone.BATTLEFIELD, playerD, "Jace's Archivist", 1); // {1}{U}{U} + addCard(Zone.LIBRARY, playerD, "Demolish"); + addCard(Zone.HAND, playerD, "Demolish", 1); + + addCard(Zone.HAND, playerC, "Cobblebrute", 4); + addCard(Zone.HAND, playerB, "Bellows Lizard", 5); + + // Player order: A -> D -> C -> B + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerD, "{U},{T}: Each player discards"); + setStopAt(2, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Auramancer", 3); + assertGraveyardCount(playerD, "Demolish", 2); + assertGraveyardCount(playerC, "Cobblebrute", 4); + + assertHandCount(playerA, 4); + assertHandCount(playerD, 4); + assertHandCount(playerC, 4); + assertHandCount(playerB, "Bellows Lizard", 5); + + assertLife(playerA, 14); + assertLife(playerD, 34); + assertLife(playerC, 12); + assertLife(playerB, 20); } } diff --git a/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java b/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java index 77fef28b1d6..fb2b469a727 100644 --- a/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java @@ -44,7 +44,6 @@ import mage.target.targetpointer.FixedTarget; * * @author LevelX2 */ - public class PutCardIntoGraveFromAnywhereAllTriggeredAbility extends TriggeredAbilityImpl { private final FilterCard filter; @@ -58,7 +57,7 @@ public class PutCardIntoGraveFromAnywhereAllTriggeredAbility extends TriggeredAb public PutCardIntoGraveFromAnywhereAllTriggeredAbility(Effect effect, boolean optional, FilterCard filter, TargetController targetController) { this(effect, optional, filter, targetController, SetTargetPointer.NONE); } - + public PutCardIntoGraveFromAnywhereAllTriggeredAbility(Effect effect, boolean optional, FilterCard filter, TargetController targetController, SetTargetPointer setTargetPointer) { this(Zone.BATTLEFIELD, effect, optional, filter, targetController, setTargetPointer); } @@ -110,13 +109,13 @@ public class PutCardIntoGraveFromAnywhereAllTriggeredAbility extends TriggeredAb if (card != null && filter.match(card, getSourceId(), getControllerId(), game)) { switch (setTargetPointer) { case CARD: - for (Effect effect: getEffects()) { - effect.setTargetPointer(new FixedTarget(card.getId())); + for (Effect effect : getEffects()) { + effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); } break; case PLAYER: - for (Effect effect: getEffects()) { - effect.setTargetPointer(new FixedTarget(card.getOwnerId())); + for (Effect effect : getEffects()) { + effect.setTargetPointer(new FixedTarget(card.getOwnerId(), 0)); } break; diff --git a/Mage/src/mage/abilities/decorator/ConditionalGainActivatedAbility.java b/Mage/src/mage/abilities/decorator/ConditionalGainActivatedAbility.java index f0456f2e11f..9fe5123f838 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalGainActivatedAbility.java +++ b/Mage/src/mage/abilities/decorator/ConditionalGainActivatedAbility.java @@ -28,8 +28,6 @@ package mage.abilities.decorator; import java.util.UUID; - -import mage.constants.Zone; import mage.abilities.ActivatedAbilityImpl; import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; @@ -38,6 +36,7 @@ import mage.abilities.costs.mana.ManaCosts; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.constants.EffectType; +import mage.constants.Zone; import mage.game.Game; /** @@ -47,12 +46,12 @@ import mage.game.Game; */ public class ConditionalGainActivatedAbility extends ActivatedAbilityImpl { - private Condition condition; - private String staticText = ""; + private final Condition condition; + private String staticText = ""; - private static final Effects emptyEffects = new Effects(); + private static final Effects emptyEffects = new Effects(); - public ConditionalGainActivatedAbility(Zone zone, Effect effect, ManaCosts cost, Condition condition, String rule) { + public ConditionalGainActivatedAbility(Zone zone, Effect effect, ManaCosts cost, Condition condition, String rule) { super(zone, effect, cost); this.condition = condition; this.staticText = rule; diff --git a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java index 7a05e126a7c..a6888eabba5 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java +++ b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java @@ -1,9 +1,11 @@ package mage.abilities.decorator; +import mage.abilities.Modes; import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.condition.Condition; import mage.abilities.effects.Effects; +import mage.constants.EffectType; import mage.game.Game; import mage.game.events.GameEvent; @@ -34,7 +36,7 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl { public ConditionalTriggeredAbility(final ConditionalTriggeredAbility triggered) { super(triggered); - this.ability = triggered.ability; + this.ability = triggered.ability.copy(); this.condition = triggered.condition; this.text = triggered.text; } @@ -74,4 +76,14 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl { return ability.getEffects(); } + @Override + public Modes getModes() { + return ability.getModes(); + } + + @Override + public Effects getEffects(Game game, EffectType effectType) { + return ability.getEffects(game, effectType); + } + } diff --git a/Mage/src/mage/abilities/effects/common/LoseLifeTargetEffect.java b/Mage/src/mage/abilities/effects/common/LoseLifeTargetEffect.java index b057048f2d9..501f3850958 100644 --- a/Mage/src/mage/abilities/effects/common/LoseLifeTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/LoseLifeTargetEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.abilities.effects.common; import mage.abilities.Ability; @@ -103,5 +102,4 @@ public class LoseLifeTargetEffect extends OneShotEffect { return sb.toString(); } - } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 032325c8251..2f92485f6ab 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -693,7 +693,7 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public Cards discard(int amount, boolean random, Ability source, Game game) { Cards discardedCards = new CardsImpl(); - if (this.getHand().size() == 1) { + if (this.getHand().size() == 1 || this.getHand().size() == amount) { discardedCards.addAll(this.getHand()); while (this.getHand().size() > 0) { discard(this.getHand().get(this.getHand().iterator().next(), game), source, game); From 7b59da919475f9d32596fed745adac86edd35161 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Sat, 1 Aug 2015 16:54:43 -0700 Subject: [PATCH 247/375] fixes for Rainbow Vale --- .../mage/sets/mastersedition/RainbowVale.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java index 08a86e1b8b9..edd576568d5 100644 --- a/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java +++ b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java @@ -54,6 +54,7 @@ public class RainbowVale extends CardImpl { // {tap}: Add one mana of any color to your mana pool. An opponent gains control of Rainbow Vale at the beginning of the next end step. Ability ability = new AnyColorManaAbility(); ability.addEffect(new RainbowValeEffect()); + this.addAbility(ability); } public RainbowVale(final RainbowVale card) { @@ -69,8 +70,8 @@ public class RainbowVale extends CardImpl { class RainbowValeEffect extends OneShotEffect { public RainbowValeEffect() { - super(Outcome.Neutral); - staticText = "Add one mana of any color to your mana pool. An opponent gains control of Rainbow Vale at the beginning of the next end step."; + super(Outcome.PutManaInPool); + staticText = "An opponent gains control of {this} at the beginning of the next end step."; } public RainbowValeEffect(final RainbowValeEffect effect) { @@ -103,13 +104,22 @@ class OpponentGainControlEffect extends ContinuousEffectImpl { public OpponentGainControlEffect() { super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); - this.staticText = "An opponent gains control of {this} at the beginning of the next end step."; + this.staticText = "an opponent gains control of {this}"; } public OpponentGainControlEffect(final OpponentGainControlEffect effect) { super(effect); } + @Override + public void init(Ability source, Game game){ + super.init(source, game); + Permanent permanent = game.getPermanent(source.getSourceId()); + Player targetOpponent = game.getPlayer(source.getFirstTarget()); + + game.informPlayers(permanent.getName() + " is now controlled by " + targetOpponent.getLogName()); + } + @Override public OpponentGainControlEffect copy() { return new OpponentGainControlEffect(this); @@ -121,7 +131,6 @@ class OpponentGainControlEffect extends ContinuousEffectImpl { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null && targetOpponent != null) { permanent.changeControllerId(targetOpponent.getId(), game); - game.informPlayers(permanent.getName() + " is now controlled by " + targetOpponent.getLogName()); } else { // no valid target exists, effect can be discarded discard(); From d60b6517049788aa130dee8752d109904e18eff9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 2 Aug 2015 08:49:35 +0200 Subject: [PATCH 248/375] * Dreadwing - Fixed wrong activation cost and tooltip text. --- .../src/mage/sets/conflux/Dreadwing.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/Dreadwing.java b/Mage.Sets/src/mage/sets/conflux/Dreadwing.java index bb6ceb0e65d..245e544e3e5 100644 --- a/Mage.Sets/src/mage/sets/conflux/Dreadwing.java +++ b/Mage.Sets/src/mage/sets/conflux/Dreadwing.java @@ -25,21 +25,21 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.conflux; 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.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; /** * @@ -53,9 +53,15 @@ public class Dreadwing extends CardImpl { this.subtype.add("Zombie"); this.power = new MageInt(1); - this.toughness = new MageInt(1); - SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(3, 0, Duration.EndOfTurn), new ManaCostsImpl(("{1}{U}{B}"))); - ability.getEffects().add(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn)); + this.toughness = new MageInt(1); + + // {1}{U}{R}: Dreadwing gets +3/+0 and gains flying until end of turn. + Effect effect = new BoostSourceEffect(3, 0, Duration.EndOfTurn); + effect.setText("{this} gets +3/+0"); + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl(("{1}{U}{R}"))); + effect = new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains flying until end of turn"); + ability.getEffects().add(effect); this.addAbility(ability); } From 6faeb19079be1ce6ae1b95624301676137d3ecc4 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 2 Aug 2015 09:21:48 +0200 Subject: [PATCH 249/375] * Primal Clay, Primal Plasma - Fixed enters the battlefield type choose handling. --- .../mage/sets/fifthedition/PrimalClay.java | 44 +++++++------------ .../sets/planechase2012/PrimalPlasma.java | 31 ++++++------- 2 files changed, 31 insertions(+), 44 deletions(-) diff --git a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java index 5ccc37709e5..d5f790e39c8 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java +++ b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java @@ -29,13 +29,13 @@ package mage.sets.fifthedition; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.FlyingAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.choices.Choice; import mage.choices.ChoiceImpl; @@ -48,9 +48,6 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; -import mage.game.permanent.PermanentCard; -import mage.game.permanent.PermanentToken; -import mage.game.permanent.token.Token; import mage.players.Player; /** @@ -122,49 +119,38 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { Choice choice = new ChoiceImpl(true); - choice.setMessage("Choose what the creature becomes to"); + choice.setMessage("Choose what " + permanent.getIdName() + " becomes to"); choice.getChoices().add(choice33); choice.getChoices().add(choice22); choice.getChoices().add(choice16); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - while(!choice.isChosen()) { + while (!choice.isChosen()) { controller.choose(Outcome.Neutral, choice, game); if (!controller.isInGame()) { return false; } } } - MageObject mageObject; - if (permanent instanceof PermanentCard) { - mageObject = ((PermanentCard) permanent).getCard(); - } else { - mageObject = ((PermanentToken) permanent).getToken(); - } + int power = 0; + int toughness = 0; switch (choice.getChoice()) { case choice33: - mageObject.getPower().setValue(3); - mageObject.getToughness().setValue(3); + power = 3; + toughness = 3; break; case choice22: - mageObject.getPower().setValue(2); - mageObject.getToughness().setValue(2); - if (mageObject instanceof Card) { - game.getState().addOtherAbility((Card)mageObject, FlyingAbility.getInstance()); - } else { - ((Token)mageObject).addAbility(FlyingAbility.getInstance()); - } + power = 2; + toughness = 2; + game.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.Custom), source); break; case choice16: - mageObject.getPower().setValue(1); - mageObject.getToughness().setValue(6); - if (mageObject instanceof Card) { - game.getState().addOtherAbility((Card)mageObject, DefenderAbility.getInstance()); - } else { - ((Token)mageObject).addAbility(DefenderAbility.getInstance()); - } + power = 1; + toughness = 6; + game.addEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom), source); break; } + game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom), source); } return false; diff --git a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java index df5864a7031..a638e785d59 100644 --- a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java +++ b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java @@ -29,13 +29,13 @@ package mage.sets.planechase2012; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.FlyingAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.choices.Choice; import mage.choices.ChoiceImpl; @@ -48,9 +48,6 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; -import mage.game.permanent.PermanentCard; -import mage.game.permanent.PermanentToken; -import mage.game.permanent.token.Token; import mage.players.Player; /** @@ -123,35 +120,39 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { Choice choice = new ChoiceImpl(true); - choice.setMessage("Choose what the creature becomes to"); + choice.setMessage("Choose what " + permanent.getIdName() + " becomes to"); choice.getChoices().add(choice33); choice.getChoices().add(choice22); choice.getChoices().add(choice16); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - while(!choice.isChosen()) { + while (!choice.isChosen()) { controller.choose(Outcome.Neutral, choice, game); if (!controller.isInGame()) { return false; } } } + int power = 0; + int toughness = 0; switch (choice.getChoice()) { case choice33: - permanent.getPower().setValue(3); - permanent.getToughness().setValue(3); + power = 3; + toughness = 3; break; case choice22: - permanent.getPower().setValue(2); - permanent.getToughness().setValue(2); - permanent.addAbility(FlyingAbility.getInstance(), source.getId(), game); + power = 2; + toughness = 2; + game.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.Custom), source); break; case choice16: - permanent.getPower().setValue(1); - permanent.getToughness().setValue(6); - permanent.addAbility(DefenderAbility.getInstance(), source.getId(), game); + power = 1; + toughness = 6; + game.addEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance(), Duration.Custom), source); break; } + game.addEffect(new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom), source); + } return false; From 2df109cf0bd72814fc406d38b45e227de6af5ee0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 2 Aug 2015 10:34:57 +0200 Subject: [PATCH 250/375] * Norin the Wary - Fixed that it also returned from commandzone if put there from commander replament effect. Some other move and return from exile fixes. --- .../src/mage/sets/dragonsmaze/AEtherling.java | 2 +- .../mage/sets/futuresight/Saltskitter.java | 6 +- .../src/mage/sets/guildpact/Ghostway.java | 27 ++-- .../mage/sets/judgment/AnuridBrushhopper.java | 4 +- .../mage/sets/planarchaos/FreneticSliver.java | 2 +- .../mage/sets/timespiral/NorinTheWary.java | 2 +- Mage.Tests/CMDNorinTheWary.dck | 75 +++++++++++ .../test/commander/duel/NorinTheWaryTest.java | 118 ++++++++++++++++++ ...rnToBattlefieldOwnerNextEndStepEffect.java | 16 ++- 9 files changed, 231 insertions(+), 21 deletions(-) create mode 100644 Mage.Tests/CMDNorinTheWary.dck create mode 100644 Mage.Tests/src/test/java/org/mage/test/commander/duel/NorinTheWaryTest.java diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java b/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java index a79869e862a..3dd30d6f2ad 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java @@ -55,7 +55,7 @@ public class AEtherling extends CardImpl { this.toughness = new MageInt(5); // {U}: Exile AEtherling. Return it to the battlefield under its owner's control at the beginning of the next end step. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileReturnToBattlefieldOwnerNextEndStepEffect(), new ManaCostsImpl("{U}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileReturnToBattlefieldOwnerNextEndStepEffect(true), new ManaCostsImpl("{U}"))); // {U}: AEtherling can't be blocked this turn this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedSourceEffect(), new ManaCostsImpl("{U}"))); // {1}: AEtherling gets +1/-1 until end of turn. diff --git a/Mage.Sets/src/mage/sets/futuresight/Saltskitter.java b/Mage.Sets/src/mage/sets/futuresight/Saltskitter.java index 70f9bc4bd43..f4e73a800f7 100644 --- a/Mage.Sets/src/mage/sets/futuresight/Saltskitter.java +++ b/Mage.Sets/src/mage/sets/futuresight/Saltskitter.java @@ -43,9 +43,9 @@ import mage.filter.predicate.permanent.AnotherPredicate; * @author fireshoes */ public class Saltskitter extends CardImpl { - + private static final FilterPermanent filter = new FilterCreaturePermanent("another creature"); - + static { filter.add(new AnotherPredicate()); } @@ -58,7 +58,7 @@ public class Saltskitter extends CardImpl { this.toughness = new MageInt(4); // Whenever another creature enters the battlefield, exile Saltskitter. Return Saltskitter to the battlefield under its owner's control at the beginning of the next end step. - this.addAbility(new EntersBattlefieldAllTriggeredAbility(new ExileReturnToBattlefieldOwnerNextEndStepEffect(), filter)); + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new ExileReturnToBattlefieldOwnerNextEndStepEffect(true), filter)); } public Saltskitter(final Saltskitter card) { diff --git a/Mage.Sets/src/mage/sets/guildpact/Ghostway.java b/Mage.Sets/src/mage/sets/guildpact/Ghostway.java index 776e27e8ac7..ab0e57b2cc7 100644 --- a/Mage.Sets/src/mage/sets/guildpact/Ghostway.java +++ b/Mage.Sets/src/mage/sets/guildpact/Ghostway.java @@ -31,8 +31,9 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.ReturnFromExileEffect; +import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; @@ -45,6 +46,7 @@ import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; /** @@ -94,22 +96,23 @@ class GhostwayEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); if (sourceObject != null && controller != null) { - int numberCreatures = 0; UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); for (Permanent creature : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { if (creature != null) { - controller.moveCardToExileWithInfo(creature, exileId,sourceObject.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true); - numberCreatures++; + int zcc = game.getState().getZoneChangeCounter(creature.getId()); + controller.moveCardToExileWithInfo(creature, exileId, sourceObject.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true); + if (zcc == game.getState().getZoneChangeCounter(creature.getId()) - 1) { + Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect(); + effect.setTargetPointer(new FixedTarget(creature.getId(), zcc + 1)); + AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); + + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + } } } - if (numberCreatures > 0) { - AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility( - new ReturnFromExileEffect(exileId, Zone.BATTLEFIELD, false)); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); - } return true; } return false; diff --git a/Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java b/Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java index e0685694697..d3be1aaddbb 100644 --- a/Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java +++ b/Mage.Sets/src/mage/sets/judgment/AnuridBrushhopper.java @@ -54,8 +54,8 @@ public class AnuridBrushhopper extends CardImpl { this.toughness = new MageInt(4); // Discard two cards: Exile Anurid Brushhopper. Return it to the battlefield under its owner's control at the beginning of the next end step. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, - new ExileReturnToBattlefieldOwnerNextEndStepEffect(), + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new ExileReturnToBattlefieldOwnerNextEndStepEffect(true), new DiscardTargetCost(new TargetCardInHand(2, new FilterCard("two cards"))))); } diff --git a/Mage.Sets/src/mage/sets/planarchaos/FreneticSliver.java b/Mage.Sets/src/mage/sets/planarchaos/FreneticSliver.java index 8a0c4422a4b..bcc9c5e9fc7 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/FreneticSliver.java +++ b/Mage.Sets/src/mage/sets/planarchaos/FreneticSliver.java @@ -97,7 +97,7 @@ class FreneticSliverEffect extends OneShotEffect { Player player = game.getPlayer(source.getControllerId()); if (player != null) { if (player.flipCoin(game)) { - return new ExileReturnToBattlefieldOwnerNextEndStepEffect().apply(game, source); + return new ExileReturnToBattlefieldOwnerNextEndStepEffect(true).apply(game, source); } else { Permanent perm = game.getPermanent(source.getSourceId()); if (perm != null) { diff --git a/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java b/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java index b87f928ade1..1b0a67fb131 100644 --- a/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java +++ b/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java @@ -73,7 +73,7 @@ public class NorinTheWary extends CardImpl { class NorinTheWaryTriggeredAbility extends TriggeredAbilityImpl { public NorinTheWaryTriggeredAbility() { - super(Zone.BATTLEFIELD, new ExileReturnToBattlefieldOwnerNextEndStepEffect(), false); + super(Zone.BATTLEFIELD, new ExileReturnToBattlefieldOwnerNextEndStepEffect(true), false); } public NorinTheWaryTriggeredAbility(final NorinTheWaryTriggeredAbility ability) { diff --git a/Mage.Tests/CMDNorinTheWary.dck b/Mage.Tests/CMDNorinTheWary.dck new file mode 100644 index 00000000000..74c3bd1c172 --- /dev/null +++ b/Mage.Tests/CMDNorinTheWary.dck @@ -0,0 +1,75 @@ +1 [BOK:108] In the Web of War +1 [7ED:319] Static Orb +1 [ALA:101] Goblin Assault +1 [8ED:204] Obliterate +1 [ORI:149] Ghirapur Gearcrafter +1 [SCG:85] Decree of Annihilation +1 [ONS:317] Forgotten Cave +1 [MRD:282] Great Furnace +1 [EVE:179] Springjack Pasture +1 [VIS:141] Anvil of Bogardan +1 [JOU:89] Bearer of the Heavens +1 [ODY:214] Price of Glory +1 [9ED:176] Blood Moon +1 [M10:212] Howling Mine +1 [CMD:114] Chaos Warp +1 [M12:153] Scrambleverse +1 [10E:204] Furnace of Rath +1 [ZEN:228] Valakut, the Molten Pinnacle +1 [M12:160] Warstorm Surge +1 [AVR:126] Archwing Dragon +1 [M15:149] Hoarding Dragon +1 [4ED:189] Strip Mine +1 [ORI:145] Fiery Impulse +1 [CSP:149] Scrying Sheets +1 [ORI:142] Enthralling Victor +1 [ORI:144] Fiery Conclusion +1 [ORI:139] Demolish +1 [MMQ:320] High Market +1 [M12:224] Buried Ruin +1 [TOR:113] Radiate +1 [M10:163] Warp World +1 [TSP:188] Word of Seizing +1 [DST:122] Genesis Chamber +1 [TSP:275] Kher Keep +1 [ORI:134] Call of the Full Moon +1 [ORI:136] Chandra's Fury +26 [CSP:154] Snow-Covered Mountain +1 [ONS:212] Gratuitous Violence +1 [ORI:133] Boggart Brute +1 [ONS:213] Insurrection +1 [TMP:210] Tooth and Claw +1 [ORI:129] Act of Treason +1 [BOK:120] Twist Allegiance +1 [CMD:136] Stranglehold +1 [M13:145] Reverberate +1 [EXO:102] Shattering Pulse +1 [9ED:312] Teferi's Puzzle Box +1 [M14:162] Wild Ricochet +1 [3ED:274] Sol Ring +1 [3ED:152] Fork +1 [DGM:34] Possibility Storm +1 [USG:188] Gamble +1 [5ED:64] Smoke +1 [STH:93] Mogg Infestation +1 [ULG:80] Goblin Welder +1 [ALA:119] Vicious Shadows +1 [ORI:163] Smash to Smithereens +1 [THS:135] Purphoros, God of the Forge +1 [CON:136] Font of Mythos +1 [7ED:307] Meekstone +1 [TSB:68] Pandemonium +1 [GTC:248] Thespian's Stage +1 [3ED:184] Wheel of Fortune +1 [M15:242] Darksteel Citadel +1 [M11:160] Wild Evocation +1 [RTR:111] Vandalblast +1 [TSP:175] Reiterate +1 [M14:148] Ogre Battledriver +1 [ORI:156] Molten Vortex +1 [MIR:183] Illicit Auction +1 [ULG:123] Crawlspace +1 [5ED:246] Jokulhaups +1 [JOU:93] Dictate of the Twin Gods +1 [5ED:249] Mana Flare +SB: 1 [TSP:171] Norin the Wary diff --git a/Mage.Tests/src/test/java/org/mage/test/commander/duel/NorinTheWaryTest.java b/Mage.Tests/src/test/java/org/mage/test/commander/duel/NorinTheWaryTest.java new file mode 100644 index 00000000000..cb5e232b7ef --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/commander/duel/NorinTheWaryTest.java @@ -0,0 +1,118 @@ +/* + * 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 org.mage.test.commander.duel; + +import java.io.FileNotFoundException; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.GameException; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestCommanderDuelBase; + +/** + * + * @author LevelX2 + */ +public class NorinTheWaryTest extends CardTestCommanderDuelBase { + + @Override + protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException { + // When a player casts a spell or a creature attacks, exile Norin the Wary. Return it to the battlefield under its owner's control at the beginning of the next end step. + setDecknamePlayerA("CMDNorinTheWary.dck"); // Commander = Norin the Wary {R} + return super.createNewGameAndPlayers(); + } + + @Test + public void castNorinTheWary() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary"); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Norin the Wary", 1); + } + + @Test + public void castNorinTheWaryToExile() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.HAND, playerA, "Lightning Bolt", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary"); + castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Lightning Bolt", playerB); + setChoice(playerA, "No"); + setStopAt(1, PhaseStep.END_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Lightning Bolt", 1); + assertPermanentCount(playerA, "Norin the Wary", 0); + assertExileCount("Norin the Wary", 1); + + assertLife(playerB, 37); + + } + + @Test + public void castNorinTheWaryToExileAndReturn() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.HAND, playerA, "Lightning Bolt", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary"); + castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Lightning Bolt", playerB); + setChoice(playerA, "No"); + setStopAt(2, PhaseStep.UPKEEP); + execute(); + + assertGraveyardCount(playerA, "Lightning Bolt", 1); + assertPermanentCount(playerA, "Norin the Wary", 1); + assertExileCount("Norin the Wary", 0); + + assertLife(playerB, 37); + + } + + @Test + public void castNorinTheWaryToCommandAndReturn() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.HAND, playerA, "Lightning Bolt", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary"); + castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Lightning Bolt", playerB); + setChoice(playerA, "Yes"); + setStopAt(2, PhaseStep.UPKEEP); + execute(); + + assertGraveyardCount(playerA, "Lightning Bolt", 1); + assertPermanentCount(playerA, "Norin the Wary", 1); + assertExileCount("Norin the Wary", 0); + + assertLife(playerB, 37); + + } +} diff --git a/Mage/src/mage/abilities/effects/common/ExileReturnToBattlefieldOwnerNextEndStepEffect.java b/Mage/src/mage/abilities/effects/common/ExileReturnToBattlefieldOwnerNextEndStepEffect.java index a49b20fd835..e608d796bf8 100644 --- a/Mage/src/mage/abilities/effects/common/ExileReturnToBattlefieldOwnerNextEndStepEffect.java +++ b/Mage/src/mage/abilities/effects/common/ExileReturnToBattlefieldOwnerNextEndStepEffect.java @@ -43,14 +43,27 @@ import mage.players.Player; public class ExileReturnToBattlefieldOwnerNextEndStepEffect extends OneShotEffect { private static final String effectText = "exile {this}. Return it to the battlefield under its owner's control at the beginning of the next end step"; + private boolean returnAlways; public ExileReturnToBattlefieldOwnerNextEndStepEffect() { + this(false); + } + + /** + * + * @param returnAlways return the permanent also if it does not go to exile + * but is moved to another zone (e.g. command zone by commander replacement + * effect) + */ + public ExileReturnToBattlefieldOwnerNextEndStepEffect(boolean returnAlways) { super(Outcome.Benefit); staticText = effectText; + this.returnAlways = returnAlways; } public ExileReturnToBattlefieldOwnerNextEndStepEffect(ExileReturnToBattlefieldOwnerNextEndStepEffect effect) { super(effect); + this.returnAlways = effect.returnAlways; } @Override @@ -60,7 +73,8 @@ public class ExileReturnToBattlefieldOwnerNextEndStepEffect extends OneShotEffec Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { int zcc = game.getState().getZoneChangeCounter(permanent.getId()); - if (controller.moveCardToExileWithInfo(permanent, source.getSourceId(), permanent.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true)) { + boolean exiled = controller.moveCardToExileWithInfo(permanent, source.getSourceId(), permanent.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true); + if (exiled || (returnAlways && (zcc == game.getState().getZoneChangeCounter(permanent.getId()) - 1))) { //create delayed triggered ability and return it from every public zone he was next moved to AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility( new ReturnToBattlefieldUnderOwnerControlSourceEffect(false, zcc + 1)); From d673f3e4b111ee2adffce6da4cf5c75c3a4060d9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 2 Aug 2015 10:50:55 +0200 Subject: [PATCH 251/375] * Rainbow Vale - Fixed handling of opponent choosing. --- .../mage/sets/mastersedition/RainbowVale.java | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java index edd576568d5..9e02da1308b 100644 --- a/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java +++ b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java @@ -27,20 +27,25 @@ */ package mage.sets.mastersedition; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.mana.AnyColorManaAbility; import mage.cards.CardImpl; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.Target; import mage.target.common.TargetOpponent; -import java.util.UUID; - /** * * @author andyfries @@ -66,7 +71,6 @@ public class RainbowVale extends CardImpl { return new RainbowVale(this); } - class RainbowValeEffect extends OneShotEffect { public RainbowValeEffect() { @@ -83,7 +87,6 @@ public class RainbowVale extends CardImpl { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new OpponentGainControlEffect()); - delayedAbility.addTarget(new TargetOpponent()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.setSourceObject(source.getSourceObject(game), game); @@ -102,22 +105,39 @@ public class RainbowVale extends CardImpl { class OpponentGainControlEffect extends ContinuousEffectImpl { + private UUID opponentId; + public OpponentGainControlEffect() { - super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.Detriment); this.staticText = "an opponent gains control of {this}"; + opponentId = null; } public OpponentGainControlEffect(final OpponentGainControlEffect effect) { super(effect); + this.opponentId = effect.opponentId; } @Override - public void init(Ability source, Game game){ + public void init(Ability source, Game game) { super.init(source, game); + Player controller = game.getPlayer(source.getControllerId()); Permanent permanent = game.getPermanent(source.getSourceId()); - Player targetOpponent = game.getPlayer(source.getFirstTarget()); - - game.informPlayers(permanent.getName() + " is now controlled by " + targetOpponent.getLogName()); + if (controller != null && permanent != null) { + if (game.getOpponents(controller.getId()).size() == 1) { + opponentId = game.getOpponents(controller.getId()).iterator().next(); + } else { + Target target = new TargetOpponent(true); + controller.chooseTarget(outcome, target, source, game); + opponentId = target.getFirstTarget(); + } + } + Player targetOpponent = game.getPlayer(opponentId); + if (targetOpponent != null && permanent != null) { + game.informPlayers(permanent.getName() + " is now controlled by " + targetOpponent.getLogName()); + } else { + discard(); + } } @Override @@ -127,10 +147,10 @@ class OpponentGainControlEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - Player targetOpponent = game.getPlayer(source.getFirstTarget()); + Player targetOpponent = game.getPlayer(opponentId); Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null && targetOpponent != null) { - permanent.changeControllerId(targetOpponent.getId(), game); + permanent.changeControllerId(opponentId, game); } else { // no valid target exists, effect can be discarded discard(); @@ -138,4 +158,3 @@ class OpponentGainControlEffect extends ContinuousEffectImpl { return true; } } - From eccc367920fc06ab4ff3c8f2c507caa59924bf91 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 2 Aug 2015 10:59:03 +0200 Subject: [PATCH 252/375] Some minor changes. --- Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java | 4 ++-- Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java | 2 +- .../src/test/java/org/mage/test/utils/ManaOptionsTest.java | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java b/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java index 28f969c85bc..4e35a0f736c 100644 --- a/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java +++ b/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java @@ -100,7 +100,7 @@ class YixlidJailerEffect extends ContinuousEffectImpl { if (player != null) { for (Card card : player.getGraveyard().getCards(game)) { if (card != null) { - card.getAbilities().clear(); // Will the abilities ever come back???? + card.getAbilities(game).clear(); // Will the abilities ever come back???? // TODO: Fix that (LevelX2) // game.getContinuousEffects().removeGainedEffectsForSource(card.getId()); // game.getState().resetTriggersForSourceId(card.getId()); @@ -127,4 +127,4 @@ class YixlidJailerEffect extends ContinuousEffectImpl { public boolean hasLayer(Layer layer) { return layer == Layer.AbilityAddingRemovingEffects_6; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java index 9e02da1308b..4cc33020179 100644 --- a/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java +++ b/Mage.Sets/src/mage/sets/mastersedition/RainbowVale.java @@ -134,7 +134,7 @@ class OpponentGainControlEffect extends ContinuousEffectImpl { } Player targetOpponent = game.getPlayer(opponentId); if (targetOpponent != null && permanent != null) { - game.informPlayers(permanent.getName() + " is now controlled by " + targetOpponent.getLogName()); + game.informPlayers(permanent.getLogName() + " is now controlled by " + targetOpponent.getLogName()); } else { discard(); } diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java index 2f0af102cbf..9d528310d3c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java @@ -346,6 +346,8 @@ public class ManaOptionsTest extends CardTestPlayerBase { Assert.assertEquals("{B}{B}", getManaOption(0, manaOptions)); } + // TODO + // Test Calciform Pools combination mana lands private String getManaOption(int index, ManaOptions manaOptions) { if (manaOptions.size() < index + 1) { return ""; From efb5e06e579a38b59141b217ef508a8eb6a02076 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 2 Aug 2015 12:39:02 +0200 Subject: [PATCH 253/375] * Rollback - Fixed that UI is locked after a accepted rollback request (fixes #1158). --- .../src/mage/player/human/HumanPlayer.java | 8 ++++---- .../java/mage/server/game/GameController.java | 20 +++++++++++++------ .../mage/sets/alarareborn/DefilerOfSouls.java | 2 +- .../sets/alarareborn/SagesOfTheAnima.java | 2 +- .../avacynrestored/BrunaLightOfAlabaster.java | 6 +++--- .../sets/avacynrestored/CavernOfSouls.java | 2 +- .../avacynrestored/DescentIntoMadness.java | 8 ++++---- .../mage/sets/avacynrestored/LairDelve.java | 2 +- .../mage/sets/avacynrestored/PrimalSurge.java | 2 +- .../sets/avacynrestored/RidersOfGavony.java | 2 +- .../mage/sets/avacynrestored/RiteOfRuin.java | 2 +- .../sets/bornofthegods/OracleOfBones.java | 2 +- .../sets/bornofthegods/WhimsOfTheFates.java | 6 +++--- .../CranialExtraction.java | 2 +- .../sets/championsofkamigawa/Mindblaze.java | 4 ++-- .../mage/sets/coldsnap/BlizzardSpecter.java | 2 +- .../mage/sets/commander/AllianceOfArms.java | 2 +- .../mage/sets/commander/CollectiveVoyage.java | 2 +- .../sets/commander/ManaChargedDragon.java | 2 +- .../src/mage/sets/commander/MindsAglow.java | 2 +- .../src/mage/sets/commander/SharedTrauma.java | 2 +- .../mage/sets/commander2013/LimDulsVault.java | 2 +- .../sets/commander2013/MysticBarrier.java | 2 +- .../sets/commander2013/OrderOfSuccession.java | 6 +++--- .../mage/sets/conflux/MaelstromArchangel.java | 2 +- .../sets/darkascension/CallToTheKindred.java | 2 +- .../mage/sets/darkascension/FaithsShield.java | 2 +- .../mage/sets/dragonsmaze/CatchRelease.java | 10 +++++----- .../mage/sets/dragonsmaze/PlasmCapture.java | 2 +- .../sets/dragonsoftarkir/RevealingWind.java | 2 +- .../ShorecrasherElemental.java | 2 +- .../src/mage/sets/eventide/Evershrike.java | 2 +- Mage.Sets/src/mage/sets/exodus/Cataclysm.java | 8 ++++---- .../mage/sets/fifthdawn/DawnsReflection.java | 2 +- .../mage/sets/fifthedition/PrimalClay.java | 2 +- .../mage/sets/fifthedition/SylvanLibrary.java | 2 +- .../mage/sets/fourthedition/ManaClash.java | 2 +- .../mage/sets/futuresight/CoalitionRelic.java | 2 +- .../src/mage/sets/gatecrash/DevourFlesh.java | 2 +- .../heroesvsmonsters/OrcishLumberjack.java | 2 +- .../mage/sets/iceage/DemonicConsultation.java | 2 +- .../src/mage/sets/iceage/OrcishLibrarian.java | 2 +- .../sets/innistrad/CreepingRenaissance.java | 2 +- .../mage/sets/innistrad/DivineReckoning.java | 2 +- .../sets/innistrad/GarrukTheVeilCursed.java | 2 +- .../src/mage/sets/innistrad/Nevermore.java | 2 +- .../sets/journeyintonyx/HallOfTriumph.java | 2 +- .../sets/journeyintonyx/MarketFestival.java | 2 +- .../src/mage/sets/judgment/CabalTherapy.java | 2 +- .../mage/sets/judgment/FlashOfInsight.java | 2 +- .../sets/khansoftarkir/ButcherOfTheHorde.java | 2 +- .../src/mage/sets/legions/MistformSliver.java | 2 +- .../sets/limitedalpha/NaturalSelection.java | 2 +- .../src/mage/sets/lorwyn/HoardersGreed.java | 2 +- .../src/mage/sets/magic2010/MirrorOfFate.java | 2 +- .../mage/sets/magic2010/SphinxAmbassador.java | 2 +- .../mage/sets/magic2011/ConundrumSphinx.java | 4 ++-- .../mage/sets/magic2014/DevoutInvocation.java | 2 +- .../mage/sets/magic2014/DoorOfDestinies.java | 2 +- .../src/mage/sets/magic2015/AEtherspouts.java | 6 +++--- .../src/mage/sets/magic2015/ObeliskOfUrd.java | 2 +- .../src/mage/sets/magic2015/StainTheMind.java | 2 +- .../magicorigins/InfiniteObliteration.java | 2 +- .../sets/magicorigins/SphinxsTutelage.java | 2 +- .../magicorigins/TalentOfTheTelepath.java | 2 +- .../src/mage/sets/mirrodin/ProteusStaff.java | 2 +- .../mirrodinbesieged/MitoticManipulation.java | 2 +- .../mirrodinbesieged/PhyrexianRevoker.java | 2 +- .../mage/sets/morningtide/DistantMelody.java | 2 +- .../sets/morningtide/LuminescentRain.java | 2 +- .../mage/sets/morningtide/RoarOfTheCrowd.java | 2 +- .../sets/newphyrexia/ApostlesBlessing.java | 2 +- .../mage/sets/newphyrexia/PsychicSurgery.java | 2 +- .../newphyrexia/ShrineOfPiercingVision.java | 2 +- .../src/mage/sets/newphyrexia/Xenograft.java | 2 +- .../mage/sets/ninthedition/StorageMatrix.java | 2 +- .../sets/ninthedition/TeferisPuzzleBox.java | 2 +- .../src/mage/sets/odyssey/TaintedPact.java | 2 +- .../mage/sets/onslaught/AkromasBlessing.java | 2 +- .../sets/onslaught/PatriarchsBidding.java | 2 +- .../src/mage/sets/onslaught/PeerPressure.java | 2 +- .../sets/onslaught/RiptideShapeshifter.java | 2 +- .../src/mage/sets/onslaught/Standardize.java | 2 +- .../src/mage/sets/onslaught/WordsOfWind.java | 2 +- .../DarigaazTheIgniter.java | 2 +- .../sets/planarchaos/VoidstoneGargoyle.java | 2 +- .../sets/planechase/VedalkenEngineer.java | 2 +- .../sets/planechase2012/PrimalPlasma.java | 2 +- .../src/mage/sets/planeshift/SunkenHope.java | 2 +- .../portalthreekingdoms/BurningOfXinye.java | 2 +- .../mage/sets/ravnica/CongregationAtDawn.java | 2 +- Mage.Sets/src/mage/sets/ravnica/Mindmoil.java | 2 +- .../returntoravnica/DestroyTheEvidence.java | 2 +- .../JaceArchitectOfThought.java | 2 +- .../sets/returntoravnica/SlaughterGames.java | 2 +- .../returntoravnica/TabletOfTheGuilds.java | 4 ++-- .../riseoftheeldrazi/HellcarverDemon.java | 2 +- .../SasayaOrochiAscendant.java | 2 +- .../sets/saviorsofkamigawa/UndyingFlames.java | 2 +- .../mage/sets/scarsofmirrodin/CloneShell.java | 2 +- .../mage/sets/scarsofmirrodin/Memoricide.java | 2 +- .../sets/scarsofmirrodin/MyrBattlesphere.java | 2 +- .../src/mage/sets/scourge/KaronaFalseGod.java | 2 +- .../mage/sets/shadowmoor/ManaforgeCinder.java | 2 +- .../mage/sets/shadowmoor/PlagueOfVermin.java | 6 +++--- .../shardsofalara/GiftOfTheGargantuan.java | 2 +- .../sets/speedvscunning/AquamorphEntity.java | 2 +- .../src/mage/sets/tempest/Grindstone.java | 2 +- .../src/mage/sets/tempest/Intuition.java | 2 +- .../src/mage/sets/tempest/ScrollRack.java | 2 +- Mage.Sets/src/mage/sets/tempest/WoodSage.java | 2 +- .../mage/sets/theros/XenagosTheReveler.java | 2 +- .../mage/sets/timespiral/Hypergenesis.java | 6 +++--- .../src/mage/sets/timespiral/StuffyDoll.java | 2 +- .../sets/urzaslegacy/HarmonicConvergence.java | 2 +- .../mage/sets/urzaslegacy/RavenFamiliar.java | 2 +- .../mage/sets/urzassaga/CarpetOfFlowers.java | 2 +- .../src/mage/sets/urzassaga/Persecute.java | 2 +- .../src/mage/sets/urzassaga/Smokestack.java | 2 +- .../src/mage/sets/urzassaga/Turnabout.java | 4 ++-- .../src/mage/sets/vintagemasters/Eureka.java | 6 +++--- .../mage/sets/visions/GoblinRecruiter.java | 2 +- .../src/mage/sets/visions/TeferisRealm.java | 2 +- .../src/mage/sets/weatherlight/Doomsday.java | 2 +- .../mage/sets/zendikar/BraveTheElements.java | 2 +- .../src/mage/sets/zendikar/KabiraEvangel.java | 2 +- .../mage/sets/zendikar/MerfolkWayfinder.java | 2 +- .../src/mage/sets/zendikar/WorldQueller.java | 4 ++-- .../java/org/mage/test/player/TestPlayer.java | 5 +++++ ...dManaAnyColorAttachedControllerEffect.java | 2 +- .../common/AddManaInAnyCombinationEffect.java | 2 +- .../effects/common/ChooseColorEffect.java | 2 +- .../common/ChooseCreatureTypeEffect.java | 2 +- .../effects/common/ChooseModeEffect.java | 2 +- .../effects/common/DynamicManaEffect.java | 2 +- .../effects/common/NameACardEffect.java | 2 +- .../effects/common/SacrificeAllEffect.java | 2 +- .../effects/common/SacrificeEffect.java | 2 +- ...ChosenNonWallCreatureTypeTargetEffect.java | 2 +- .../BecomesColorOrColorsTargetEffect.java | 2 +- .../continuous/BecomesColorSourceEffect.java | 2 +- .../continuous/BecomesColorTargetEffect.java | 2 +- .../GainProtectionFromColorSourceEffect.java | 2 +- .../GainProtectionFromColorTargetEffect.java | 2 +- .../effects/keyword/FatesealEffect.java | 2 +- .../abilities/effects/keyword/ScryEffect.java | 2 +- .../abilities/keyword/AnnihilatorAbility.java | 2 +- .../abilities/keyword/ConvokeAbility.java | 2 +- .../mage/abilities/keyword/KickerAbility.java | 2 +- .../abilities/keyword/ReplicateAbility.java | 2 +- .../mage/abilities/keyword/RippleAbility.java | 2 +- Mage/src/mage/game/GameImpl.java | 6 +++--- Mage/src/mage/game/combat/Combat.java | 4 ++-- Mage/src/mage/game/combat/CombatGroup.java | 2 +- Mage/src/mage/game/stack/StackObjImpl.java | 4 ++-- .../mage/game/turn/DeclareBlockersStep.java | 6 ++---- Mage/src/mage/game/turn/Phase.java | 7 +++++-- Mage/src/mage/players/Player.java | 8 ++++++++ Mage/src/mage/players/PlayerImpl.java | 11 +++++++--- 159 files changed, 231 insertions(+), 204 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 30262797d8a..c4015dd9b95 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -603,7 +603,7 @@ public class HumanPlayer extends PlayerImpl { passedUntilStackResolved = false; } } - while (isInGame()) { + while (canRespond()) { updateGameStatePriority("priority", game); game.firePriorityEvent(playerId); waitForResponse(game); @@ -697,7 +697,7 @@ public class HumanPlayer extends PlayerImpl { } game.firePlayManaEvent(playerId, "Pay " + promptText, options); waitForResponse(game); - if (!this.isInGame()) { + if (!this.canRespond()) { return false; } if (response.getBoolean() != null) { @@ -1028,7 +1028,7 @@ public class HumanPlayer extends PlayerImpl { public void assignDamage(int damage, List targets, String singleTargetName, UUID sourceId, Game game) { updateGameStatePriority("assignDamage", game); int remainingDamage = damage; - while (remainingDamage > 0 && isInGame()) { + while (remainingDamage > 0 && canRespond()) { Target target = new TargetCreatureOrPlayer(); if (singleTargetName != null) { target.setTargetName(singleTargetName); @@ -1208,7 +1208,7 @@ public class HumanPlayer extends PlayerImpl { if (!source.getAbilityType().equals(AbilityType.TRIGGERED)) { done = true; } - if (!isInGame()) { + if (!canRespond()) { return null; } } diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index ba324a5545b..49f8ae0e28b 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -487,13 +487,21 @@ public class GameController implements GameCallback { if (data instanceof Integer) { turnsToRollback = (Integer) data; if (game.canRollbackTurns(turnsToRollback)) { - requestsOpen = requestPermissionToRollback(userId, turnsToRollback); - if (requestsOpen == 0) { - game.rollbackTurns(turnsToRollback); - turnsToRollback = -1; - requestsOpen = -1; + UUID playerId = getPlayerId(userId); + if (game.getPriorityPlayerId().equals(playerId)) { + requestsOpen = requestPermissionToRollback(userId, turnsToRollback); + if (requestsOpen == 0) { + game.rollbackTurns(turnsToRollback); + turnsToRollback = -1; + requestsOpen = -1; + } else { + userReqestingRollback = userId; + } } else { - userReqestingRollback = userId; + Player player = game.getPlayer(playerId); + if (player != null) { + game.informPlayer(player, "You can only request a rollback if you have priority."); + } } } else { UUID playerId = getPlayerId(userId); diff --git a/Mage.Sets/src/mage/sets/alarareborn/DefilerOfSouls.java b/Mage.Sets/src/mage/sets/alarareborn/DefilerOfSouls.java index 8a6afe04c35..a7069ec7258 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/DefilerOfSouls.java +++ b/Mage.Sets/src/mage/sets/alarareborn/DefilerOfSouls.java @@ -108,7 +108,7 @@ class DefilerOfSoulsEffect extends OneShotEffect { //had, if thats the case this ability should fizzle. if (amount > 0 && target.canChoose(source.getSourceId(), player.getId(), game)) { boolean abilityApplied = false; - while (player.isInGame() && !target.isChosen() && target.canChoose(player.getId(), game)) { + while (player.canRespond() && !target.isChosen() && target.canChoose(player.getId(), game)) { player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } diff --git a/Mage.Sets/src/mage/sets/alarareborn/SagesOfTheAnima.java b/Mage.Sets/src/mage/sets/alarareborn/SagesOfTheAnima.java index 61b2394f775..b8d83c987f6 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/SagesOfTheAnima.java +++ b/Mage.Sets/src/mage/sets/alarareborn/SagesOfTheAnima.java @@ -120,7 +120,7 @@ class SagesOfTheAnimaReplacementEffect extends ReplacementEffectImpl { } } TargetCard target = new TargetCard(Zone.PICK, new FilterCard()); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/avacynrestored/BrunaLightOfAlabaster.java b/Mage.Sets/src/mage/sets/avacynrestored/BrunaLightOfAlabaster.java index 50c4d359344..574072de20b 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/BrunaLightOfAlabaster.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/BrunaLightOfAlabaster.java @@ -122,7 +122,7 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect { return false; } - while (player.isInGame() && player.chooseUse(Outcome.Benefit, "Attach an Aura from the battlefield?", source, game)) { + while (player.canRespond() && player.chooseUse(Outcome.Benefit, "Attach an Aura from the battlefield?", source, game)) { Target targetAura = new TargetPermanent(filterAura); if (player.choose(Outcome.Benefit, targetAura, source.getSourceId(), game)) { Permanent aura = game.getPermanent(targetAura.getFirstTarget()); @@ -137,7 +137,7 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect { } int count = player.getHand().count(filterAuraCard, game); - while (player.isInGame() && count > 0 && player.chooseUse(Outcome.Benefit, "Attach an Aura from your hand?", source, game)) { + while (player.canRespond() && count > 0 && player.chooseUse(Outcome.Benefit, "Attach an Aura from your hand?", source, game)) { TargetCard targetAura = new TargetCard(Zone.PICK, filterAuraCard); if (player.choose(Outcome.Benefit, player.getHand(), targetAura, game)) { Card aura = game.getCard(targetAura.getFirstTarget()); @@ -151,7 +151,7 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect { } count = player.getGraveyard().count(filterAuraCard, game); - while (player.isInGame() && count > 0 && player.chooseUse(Outcome.Benefit, "Attach an Aura from your graveyard?", source, game)) { + while (player.canRespond() && count > 0 && player.chooseUse(Outcome.Benefit, "Attach an Aura from your graveyard?", source, game)) { TargetCard targetAura = new TargetCard(Zone.PICK, filterAuraCard); if (player.choose(Outcome.Benefit, player.getGraveyard(), targetAura, game)) { Card aura = game.getCard(targetAura.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java b/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java index bb147a16330..00e88453cb5 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java @@ -115,7 +115,7 @@ class CavernOfSoulsEffect extends OneShotEffect { typeChoice.setMessage("Choose creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.Benefit, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DescentIntoMadness.java b/Mage.Sets/src/mage/sets/avacynrestored/DescentIntoMadness.java index cea5bb7a325..25472b037ab 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/DescentIntoMadness.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/DescentIntoMadness.java @@ -126,7 +126,7 @@ class DescentIntoMadnessEffect extends OneShotEffect { do { selectCards(currentPlayer, selectedObjects, count, source, game); currentPlayer = playerList.getNextInRange(controller, game); - } while (!currentPlayer.equals(controller) && controller.isInGame()); + } while (!currentPlayer.equals(controller) && controller.canRespond()); // move permanents and hand cards to exile for (UUID objectId : selectedObjects) { @@ -159,7 +159,7 @@ class DescentIntoMadnessEffect extends OneShotEffect { int amount = Math.min(count, player.getHand().size() + game.getBattlefield().getAllActivePermanents(player.getId()).size()); int cardsFromHand = 0; - while (player.isInGame() && amount > 0) { + while (player.canRespond() && amount > 0) { Target target; do { @@ -185,7 +185,7 @@ class DescentIntoMadnessEffect extends OneShotEffect { } } } - } while (amount > 0 && !target.getTargets().isEmpty() && player.isInGame()); + } while (amount > 0 && !target.getTargets().isEmpty() && player.canRespond()); if (amount > 0) { TargetCard targetInHand; do { @@ -207,7 +207,7 @@ class DescentIntoMadnessEffect extends OneShotEffect { cardsFromHand++; } } - } while (amount > 0 && !targetInHand.getTargets().isEmpty() && player.isInGame()); + } while (amount > 0 && !targetInHand.getTargets().isEmpty() && player.canRespond()); } } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/LairDelve.java b/Mage.Sets/src/mage/sets/avacynrestored/LairDelve.java index 2e77a4522c9..0021f383139 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/LairDelve.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/LairDelve.java @@ -107,7 +107,7 @@ class LairDelveEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/avacynrestored/PrimalSurge.java b/Mage.Sets/src/mage/sets/avacynrestored/PrimalSurge.java index 7dd2e0918d0..524cd8689c6 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/PrimalSurge.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/PrimalSurge.java @@ -113,7 +113,7 @@ class PrimalSurgeEffect extends OneShotEffect { } } } - } while (player.isInGame() && repeat); + } while (player.canRespond() && repeat); return true; } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java b/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java index 724543db09b..8a0ead3bfc9 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java @@ -102,7 +102,7 @@ class RidersOfGavonyEffect extends OneShotEffect { typeChoice.setMessage("Choose creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/RiteOfRuin.java b/Mage.Sets/src/mage/sets/avacynrestored/RiteOfRuin.java index 093d3868344..7a2a69f37aa 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/RiteOfRuin.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/RiteOfRuin.java @@ -100,7 +100,7 @@ class RiteOfRuinEffect extends OneShotEffect { LinkedList order = new LinkedList<>(); ChoiceImpl choice = new ChoiceImpl(true); choice.setChoices(choices); - while (controller.isInGame() && controller.choose(Outcome.Sacrifice, choice, game) && choices.size() > 1) { + while (controller.canRespond() && controller.choose(Outcome.Sacrifice, choice, game) && choices.size() > 1) { order.add(getCardType(choice.getChoice())); choices.remove(choice.getChoice()); choice.clearChoice(); diff --git a/Mage.Sets/src/mage/sets/bornofthegods/OracleOfBones.java b/Mage.Sets/src/mage/sets/bornofthegods/OracleOfBones.java index 15fa1489e8a..493f7cc1925 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/OracleOfBones.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/OracleOfBones.java @@ -111,7 +111,7 @@ class OracleOfBonesCastEffect extends OneShotEffect { controller.chooseUse(outcome, "Cast an instant or sorcery card from your hand without paying its mana cost?", source, game)) { Card cardToCast = null; boolean cancel = false; - while (controller.isInGame() && !cancel) { + while (controller.canRespond() && !cancel) { if (controller.chooseTarget(outcome, target, source, game)) { cardToCast = game.getCard(target.getFirstTarget()); if (cardToCast != null && cardToCast.getSpellAbility().canChooseTarget(game)) { diff --git a/Mage.Sets/src/mage/sets/bornofthegods/WhimsOfTheFates.java b/Mage.Sets/src/mage/sets/bornofthegods/WhimsOfTheFates.java index 0ed12b22c02..448bfea2e8c 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/WhimsOfTheFates.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/WhimsOfTheFates.java @@ -101,14 +101,14 @@ class WhimsOfTheFateEffect extends OneShotEffect { Map>> playerPermanents = new LinkedHashMap<>(); PlayerList playerList = game.getState().getPlayerList().copy(); - while (!playerList.get().equals(source.getControllerId()) && controller.isInGame()) { + while (!playerList.get().equals(source.getControllerId()) && controller.canRespond()) { playerList.getNext(); } Player currentPlayer = game.getPlayer(playerList.get()); Player nextPlayer; UUID firstNextPlayer = null; - while (!getNextPlayerInDirection(true, playerList, game).equals(firstNextPlayer) && controller.isInGame()) { + while (!getNextPlayerInDirection(true, playerList, game).equals(firstNextPlayer) && controller.canRespond()) { nextPlayer = game.getPlayer(playerList.get()); if (nextPlayer == null) { return false; @@ -116,7 +116,7 @@ class WhimsOfTheFateEffect extends OneShotEffect { if (firstNextPlayer == null) { firstNextPlayer = nextPlayer.getId(); } - if (!nextPlayer.isInGame()) { + if (!nextPlayer.canRespond()) { continue; } // if player is in range of controller he chooses 3 piles with all its permanents diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/CranialExtraction.java b/Mage.Sets/src/mage/sets/championsofkamigawa/CranialExtraction.java index e9fa3622af6..948126caae7 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/CranialExtraction.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/CranialExtraction.java @@ -96,7 +96,7 @@ class CranialExtractionEffect extends OneShotEffect { cardChoice.clearChoice(); while (!controller.choose(Outcome.Exile, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/Mindblaze.java b/Mage.Sets/src/mage/sets/championsofkamigawa/Mindblaze.java index 0c0943c2575..00550c441b6 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/Mindblaze.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/Mindblaze.java @@ -106,13 +106,13 @@ class MindblazeEffect extends OneShotEffect { numberChoice.setChoices(numbers); while (!playerControls.choose(Outcome.Neutral, cardChoice, game)) { - if (!playerControls.isInGame()) { + if (!playerControls.canRespond()) { return false; } } while (!playerControls.choose(Outcome.Neutral, numberChoice, game)) { - if (!playerControls.isInGame()) { + if (!playerControls.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java b/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java index b451efa5ee1..e9e77e9fbdf 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java +++ b/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java @@ -112,7 +112,7 @@ class ReturnToHandEffect extends OneShotEffect { Target target = new TargetControlledPermanent(1, 1, new FilterControlledPermanent(), true); if (target.canChoose(player.getId(), game)) { - while (player.isInGame() && !target.isChosen() && target.canChoose(player.getId(), game)) { + while (player.canRespond() && !target.isChosen() && target.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.ReturnToHand, target, source, game); } diff --git a/Mage.Sets/src/mage/sets/commander/AllianceOfArms.java b/Mage.Sets/src/mage/sets/commander/AllianceOfArms.java index 3ec3e4b7ee6..a9a20017a44 100644 --- a/Mage.Sets/src/mage/sets/commander/AllianceOfArms.java +++ b/Mage.Sets/src/mage/sets/commander/AllianceOfArms.java @@ -117,7 +117,7 @@ class AllianceOfArmsEffect extends OneShotEffect { protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { int xValue = 0; boolean payed = false; - while (player.isInGame() && !payed) { + while (player.canRespond() && !payed) { xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); if (xValue > 0) { Cost cost = new GenericManaCost(xValue); diff --git a/Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java b/Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java index 3c5d7f16a40..4c90f57ebc3 100644 --- a/Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java +++ b/Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java @@ -126,7 +126,7 @@ class CollectiveVoyageEffect extends OneShotEffect { protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { int xValue = 0; boolean payed = false; - while (player.isInGame() && !payed) { + while (player.canRespond() && !payed) { xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); if (xValue > 0) { Cost cost = new GenericManaCost(xValue); diff --git a/Mage.Sets/src/mage/sets/commander/ManaChargedDragon.java b/Mage.Sets/src/mage/sets/commander/ManaChargedDragon.java index 116b0b82e47..e12f2e8cbc0 100644 --- a/Mage.Sets/src/mage/sets/commander/ManaChargedDragon.java +++ b/Mage.Sets/src/mage/sets/commander/ManaChargedDragon.java @@ -96,7 +96,7 @@ class ManaChargedDragonEffect extends OneShotEffect { protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { int xValue = 0; boolean payed = false; - while (player.isInGame() && !payed) { + while (player.canRespond() && !payed) { xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); if (xValue > 0) { Cost cost = new GenericManaCost(xValue); diff --git a/Mage.Sets/src/mage/sets/commander/MindsAglow.java b/Mage.Sets/src/mage/sets/commander/MindsAglow.java index 12cba52d24e..5ba8d8bf439 100644 --- a/Mage.Sets/src/mage/sets/commander/MindsAglow.java +++ b/Mage.Sets/src/mage/sets/commander/MindsAglow.java @@ -115,7 +115,7 @@ class MindsAglowEffect extends OneShotEffect { protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { int xValue = 0; boolean payed = false; - while (player.isInGame() && !payed) { + while (player.canRespond() && !payed) { xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); if (xValue > 0) { Cost cost = new GenericManaCost(xValue); diff --git a/Mage.Sets/src/mage/sets/commander/SharedTrauma.java b/Mage.Sets/src/mage/sets/commander/SharedTrauma.java index bbbee2c23e9..79656863cff 100644 --- a/Mage.Sets/src/mage/sets/commander/SharedTrauma.java +++ b/Mage.Sets/src/mage/sets/commander/SharedTrauma.java @@ -116,7 +116,7 @@ class SharedTraumaEffect extends OneShotEffect { protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { int xValue = 0; boolean payed = false; - while (player.isInGame() && !payed) { + while (player.canRespond() && !payed) { xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); if (xValue > 0) { Cost cost = new GenericManaCost(xValue); diff --git a/Mage.Sets/src/mage/sets/commander2013/LimDulsVault.java b/Mage.Sets/src/mage/sets/commander2013/LimDulsVault.java index 70324bd4e97..16dfe1a4085 100644 --- a/Mage.Sets/src/mage/sets/commander2013/LimDulsVault.java +++ b/Mage.Sets/src/mage/sets/commander2013/LimDulsVault.java @@ -113,7 +113,7 @@ class LimDulsVaultEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard(doAgain ? textBottom : textTop)); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/commander2013/MysticBarrier.java b/Mage.Sets/src/mage/sets/commander2013/MysticBarrier.java index d09ebee60d1..51cbccf2b28 100644 --- a/Mage.Sets/src/mage/sets/commander2013/MysticBarrier.java +++ b/Mage.Sets/src/mage/sets/commander2013/MysticBarrier.java @@ -147,7 +147,7 @@ class MysticBarrierChooseEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { DIRECTION_CHOICE.clearChoice(); - while (!DIRECTION_CHOICE.isChosen() && controller.isInGame()) { + while (!DIRECTION_CHOICE.isChosen() && controller.canRespond()) { controller.choose(outcome, DIRECTION_CHOICE, game); } if (!DIRECTION_CHOICE.getChoice().isEmpty()) { diff --git a/Mage.Sets/src/mage/sets/commander2013/OrderOfSuccession.java b/Mage.Sets/src/mage/sets/commander2013/OrderOfSuccession.java index 207d3d143d9..e62790e6d4c 100644 --- a/Mage.Sets/src/mage/sets/commander2013/OrderOfSuccession.java +++ b/Mage.Sets/src/mage/sets/commander2013/OrderOfSuccession.java @@ -100,14 +100,14 @@ class OrderOfSuccessionEffect extends OneShotEffect { boolean left = source.getChoices().get(0).getChoice().equals("Left"); PlayerList playerList = game.getState().getPlayerList().copy(); // set playerlist to controller - while (!playerList.get().equals(source.getControllerId()) && controller.isInGame()) { + while (!playerList.get().equals(source.getControllerId()) && controller.canRespond()) { playerList.getNext(); } Player currentPlayer = game.getPlayer(playerList.get()); Player nextPlayer; UUID firstNextPlayer = null; - while (!getNextPlayerInDirection(left, playerList, game).equals(firstNextPlayer) && controller.isInGame()){ + while (!getNextPlayerInDirection(left, playerList, game).equals(firstNextPlayer) && controller.canRespond()){ nextPlayer = game.getPlayer(playerList.get()); if (nextPlayer == null) { return false; @@ -116,7 +116,7 @@ class OrderOfSuccessionEffect extends OneShotEffect { if (firstNextPlayer == null) { firstNextPlayer = nextPlayer.getId(); } - if (!nextPlayer.isInGame()) { + if (!nextPlayer.canRespond()) { continue; } // if player is in range he chooses a creature to control diff --git a/Mage.Sets/src/mage/sets/conflux/MaelstromArchangel.java b/Mage.Sets/src/mage/sets/conflux/MaelstromArchangel.java index 073e0230c0a..e3b790a50e3 100644 --- a/Mage.Sets/src/mage/sets/conflux/MaelstromArchangel.java +++ b/Mage.Sets/src/mage/sets/conflux/MaelstromArchangel.java @@ -104,7 +104,7 @@ class MaelstromArchangelCastEffect extends OneShotEffect { controller.chooseUse(outcome, "Cast a nonland card from your hand without paying its mana cost?", source, game)) { Card cardToCast = null; boolean cancel = false; - while (controller.isInGame() && !cancel) { + while (controller.canRespond() && !cancel) { if (controller.chooseTarget(outcome, target, source, game)) { cardToCast = game.getCard(target.getFirstTarget()); if (cardToCast != null && cardToCast.getSpellAbility().canChooseTarget(game)) { diff --git a/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java b/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java index 7d0fcaf0d4d..0e3912d65a8 100644 --- a/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java +++ b/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java @@ -154,7 +154,7 @@ class CallToTheKindredEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/darkascension/FaithsShield.java b/Mage.Sets/src/mage/sets/darkascension/FaithsShield.java index 8132dccf512..6c1971add28 100644 --- a/Mage.Sets/src/mage/sets/darkascension/FaithsShield.java +++ b/Mage.Sets/src/mage/sets/darkascension/FaithsShield.java @@ -95,7 +95,7 @@ class FaithsShieldEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(Outcome.Protect, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java b/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java index cbb123879ee..e40d9d7265f 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/CatchRelease.java @@ -119,7 +119,7 @@ class ReleaseSacrificeEffect extends OneShotEffect { Target target5 = new TargetControlledPermanent(1, 1, new FilterControlledPlaneswalkerPermanent(), true); if (target1.canChoose(player.getId(), game)) { - while (player.isInGame() && !target1.isChosen() && target1.canChoose(player.getId(), game)) { + while (player.canRespond() && !target1.isChosen() && target1.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target1, source, game); } Permanent artifact = game.getPermanent(target1.getFirstTarget()); @@ -130,7 +130,7 @@ class ReleaseSacrificeEffect extends OneShotEffect { } if (target2.canChoose(player.getId(), game)) { - while (player.isInGame() && !target2.isChosen() && target2.canChoose(player.getId(), game)) { + while (player.canRespond() && !target2.isChosen() && target2.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target2, source, game); } Permanent creature = game.getPermanent(target2.getFirstTarget()); @@ -141,7 +141,7 @@ class ReleaseSacrificeEffect extends OneShotEffect { } if (target3.canChoose(player.getId(), game)) { - while (player.isInGame() && !target3.isChosen() && target3.canChoose(player.getId(), game)) { + while (player.canRespond() && !target3.isChosen() && target3.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target3, source, game); } Permanent enchantment = game.getPermanent(target3.getFirstTarget()); @@ -152,7 +152,7 @@ class ReleaseSacrificeEffect extends OneShotEffect { } if (target4.canChoose(player.getId(), game)) { - while (player.isInGame() && !target4.isChosen() && target4.canChoose(player.getId(), game)) { + while (player.canRespond() && !target4.isChosen() && target4.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target4, source, game); } Permanent land = game.getPermanent(target4.getFirstTarget()); @@ -163,7 +163,7 @@ class ReleaseSacrificeEffect extends OneShotEffect { } if (target5.canChoose(player.getId(), game)) { - while (player.isInGame() && !target5.isChosen() && target5.canChoose(player.getId(), game)) { + while (player.canRespond() && !target5.isChosen() && target5.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target5, source, game); } Permanent planeswalker = game.getPermanent(target5.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java b/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java index 6d3398e9a0b..88a299b5c98 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java @@ -135,7 +135,7 @@ class PlasmCaptureManaEffect extends ManaEffect { for(int i = 0; i < amountOfMana; i++){ ChoiceColor choiceColor = new ChoiceColor(); while (!player.choose(Outcome.Benefit, choiceColor, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/RevealingWind.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/RevealingWind.java index 71108179dac..5baca9c6591 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/RevealingWind.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/RevealingWind.java @@ -102,7 +102,7 @@ class RevealingWindEffect extends OneShotEffect { if (controller != null && sourceObject != null) { while (game.getBattlefield().count(filter, source.getOriginalId(), source.getControllerId(), game) > 0 && controller.chooseUse(outcome, "Look at a face-down attacking creature?", source, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } Target target = new TargetCreaturePermanent(filter); diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/ShorecrasherElemental.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/ShorecrasherElemental.java index 05cd4d56750..24779808257 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/ShorecrasherElemental.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/ShorecrasherElemental.java @@ -150,7 +150,7 @@ class ShorecrasherElementalBoostEffect extends OneShotEffect { choice.getChoices().add(CHOICE_1); choice.getChoices().add(CHOICE_2); while (!choice.isChosen()) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } controller.choose(outcome, choice, game); diff --git a/Mage.Sets/src/mage/sets/eventide/Evershrike.java b/Mage.Sets/src/mage/sets/eventide/Evershrike.java index f413f47643e..776939f0dcd 100644 --- a/Mage.Sets/src/mage/sets/eventide/Evershrike.java +++ b/Mage.Sets/src/mage/sets/eventide/Evershrike.java @@ -122,7 +122,7 @@ class EvershrikeEffect extends OneShotEffect { filterAuraCard.add(new AuraCardCanAttachToPermanentId(evershrikePermanent.getId())); filterAuraCard.add(new ConvertedManaCostPredicate(ComparisonType.LessThan, xAmount)); int count = controller.getHand().count(filterAuraCard, game); - while (controller.isInGame() && count > 0 && controller.chooseUse(Outcome.Benefit, "Do you wish to put an Aura card from your hand onto Evershrike", source, game)) { + while (controller.canRespond() && count > 0 && controller.chooseUse(Outcome.Benefit, "Do you wish to put an Aura card from your hand onto Evershrike", source, game)) { TargetCard targetAura = new TargetCard(Zone.PICK, filterAuraCard); if (controller.choose(Outcome.Benefit, controller.getHand(), targetAura, game)) { Card aura = game.getCard(targetAura.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/exodus/Cataclysm.java b/Mage.Sets/src/mage/sets/exodus/Cataclysm.java index e9eac061644..ac1df0bf079 100644 --- a/Mage.Sets/src/mage/sets/exodus/Cataclysm.java +++ b/Mage.Sets/src/mage/sets/exodus/Cataclysm.java @@ -95,7 +95,7 @@ class CataclysmEffect extends OneShotEffect { Target target4 = new TargetControlledPermanent(1, 1, new FilterControlledLandPermanent(), true); if (target1.canChoose(player.getId(), game)) { - while (player.isInGame() && !target1.isChosen() && target1.canChoose(player.getId(), game)) { + while (player.canRespond() && !target1.isChosen() && target1.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target1, source, game); } Permanent artifact = game.getPermanent(target1.getFirstTarget()); @@ -106,7 +106,7 @@ class CataclysmEffect extends OneShotEffect { } if (target2.canChoose(player.getId(), game)) { - while (player.isInGame() && !target2.isChosen() && target2.canChoose(player.getId(), game)) { + while (player.canRespond() && !target2.isChosen() && target2.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target2, source, game); } Permanent creature = game.getPermanent(target2.getFirstTarget()); @@ -117,7 +117,7 @@ class CataclysmEffect extends OneShotEffect { } if (target3.canChoose(player.getId(), game)) { - while (player.isInGame() && !target3.isChosen() && target3.canChoose(player.getId(), game)) { + while (player.canRespond() && !target3.isChosen() && target3.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target3, source, game); } Permanent enchantment = game.getPermanent(target3.getFirstTarget()); @@ -128,7 +128,7 @@ class CataclysmEffect extends OneShotEffect { } if (target4.canChoose(player.getId(), game)) { - while (player.isInGame() && !target4.isChosen() && target4.canChoose(player.getId(), game)) { + while (player.canRespond() && !target4.isChosen() && target4.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target4, source, game); } Permanent land = game.getPermanent(target4.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/fifthdawn/DawnsReflection.java b/Mage.Sets/src/mage/sets/fifthdawn/DawnsReflection.java index 8a06a839efe..417381b270e 100644 --- a/Mage.Sets/src/mage/sets/fifthdawn/DawnsReflection.java +++ b/Mage.Sets/src/mage/sets/fifthdawn/DawnsReflection.java @@ -138,7 +138,7 @@ class DawnsReflectionManaEffect extends ManaEffect { Mana mana = new Mana(); for(int i = 0; i < x; i++){ ChoiceColor choiceColor = new ChoiceColor(); - while (controller.isInGame() && !controller.choose(Outcome.Benefit, choiceColor, game)) { + while (controller.canRespond() && !controller.choose(Outcome.Benefit, choiceColor, game)) { } if (choiceColor.getColor().isBlack()) { diff --git a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java index d5f790e39c8..561def505a0 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java +++ b/Mage.Sets/src/mage/sets/fifthedition/PrimalClay.java @@ -127,7 +127,7 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { if (controller != null) { while (!choice.isChosen()) { controller.choose(Outcome.Neutral, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/fifthedition/SylvanLibrary.java b/Mage.Sets/src/mage/sets/fifthedition/SylvanLibrary.java index 107198b3830..e6d7c57a60e 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/SylvanLibrary.java +++ b/Mage.Sets/src/mage/sets/fifthedition/SylvanLibrary.java @@ -130,7 +130,7 @@ class SylvanLibraryEffect extends OneShotEffect { int numberOfCardsToPutBack = cardsPutBack.size(); if (numberOfCardsToPutBack > 1) { TargetCard target2 = new TargetCard(Zone.PICK, new FilterCard("card to put on the top of your library (last chosen will be on top)")); - while (controller.isInGame() && cardsPutBack.size() > 1) { + while (controller.canRespond() && cardsPutBack.size() > 1) { controller.choose(Outcome.Benefit, cardsPutBack, target2, game); Card card = cardsPutBack.get(target2.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/fourthedition/ManaClash.java b/Mage.Sets/src/mage/sets/fourthedition/ManaClash.java index 3af50806837..2491e72b18a 100644 --- a/Mage.Sets/src/mage/sets/fourthedition/ManaClash.java +++ b/Mage.Sets/src/mage/sets/fourthedition/ManaClash.java @@ -86,7 +86,7 @@ class ManaClashEffect extends OneShotEffect { if (controller != null && targetOpponent != null) { boolean bothHeads = false; while (!bothHeads) { - if (!targetOpponent.isInGame() || !controller.isInGame()) { + if (!targetOpponent.canRespond() || !controller.canRespond()) { return false; } boolean controllerFlip = controller.flipCoin(game); diff --git a/Mage.Sets/src/mage/sets/futuresight/CoalitionRelic.java b/Mage.Sets/src/mage/sets/futuresight/CoalitionRelic.java index 8b07a5d5a3c..1c7ec71523c 100644 --- a/Mage.Sets/src/mage/sets/futuresight/CoalitionRelic.java +++ b/Mage.Sets/src/mage/sets/futuresight/CoalitionRelic.java @@ -103,7 +103,7 @@ class CoalitionRelicEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(); for (int i = 0; i < chargeCounters; i++) { while (!choice.isChosen()) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } player.choose(outcome, choice, game); diff --git a/Mage.Sets/src/mage/sets/gatecrash/DevourFlesh.java b/Mage.Sets/src/mage/sets/gatecrash/DevourFlesh.java index 08c0c7cd7c0..ca6a0813125 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/DevourFlesh.java +++ b/Mage.Sets/src/mage/sets/gatecrash/DevourFlesh.java @@ -94,7 +94,7 @@ class DevourFleshSacrificeEffect extends OneShotEffect { int realCount = game.getBattlefield().countAll(filter, player.getId(), game); if (realCount > 0) { Target target = new TargetControlledPermanent(1, 1, filter, true); - while (player.isInGame() && !target.isChosen() && target.canChoose(player.getId(), game)) { + while (player.canRespond() && !target.isChosen() && target.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Sacrifice, target, source, game); } Permanent permanent = game.getPermanent(target.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/heroesvsmonsters/OrcishLumberjack.java b/Mage.Sets/src/mage/sets/heroesvsmonsters/OrcishLumberjack.java index c6505ff9f7c..93277aa22f2 100644 --- a/Mage.Sets/src/mage/sets/heroesvsmonsters/OrcishLumberjack.java +++ b/Mage.Sets/src/mage/sets/heroesvsmonsters/OrcishLumberjack.java @@ -117,7 +117,7 @@ class OrcishLumberjackManaEffect extends ManaEffect { Mana mana = new Mana(); for(int i = 0; i < 3; i++){ while (!player.choose(Outcome.Benefit, manaChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java b/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java index 3400dc1a706..fec01eeb83c 100644 --- a/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java +++ b/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java @@ -93,7 +93,7 @@ class DemonicConsultationEffect extends OneShotEffect { Choice choice = new ChoiceImpl(); choice.setChoices(CardRepository.instance.getNames()); while (!player.choose(Outcome.Benefit, choice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/iceage/OrcishLibrarian.java b/Mage.Sets/src/mage/sets/iceage/OrcishLibrarian.java index d222dabce1b..2d1db6c7eb2 100644 --- a/Mage.Sets/src/mage/sets/iceage/OrcishLibrarian.java +++ b/Mage.Sets/src/mage/sets/iceage/OrcishLibrarian.java @@ -121,7 +121,7 @@ class OrcishLibrarianEffect extends OneShotEffect { } player.lookAtCards("OrcishLibrarian", cards, game); TargetCard target = new TargetCard (Zone.PICK, new FilterCard("card to put on the top of target player's library")); - while (player.isInGame() && cards.size() > 0) { + while (player.canRespond() && cards.size() > 0) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/innistrad/CreepingRenaissance.java b/Mage.Sets/src/mage/sets/innistrad/CreepingRenaissance.java index 1049985b973..d43daaec59b 100644 --- a/Mage.Sets/src/mage/sets/innistrad/CreepingRenaissance.java +++ b/Mage.Sets/src/mage/sets/innistrad/CreepingRenaissance.java @@ -93,7 +93,7 @@ class CreepingRenaissanceEffect extends OneShotEffect { typeChoice.getChoices().add(CardType.LAND.toString()); typeChoice.getChoices().add(CardType.PLANESWALKER.toString()); - while (controller.isInGame() && !controller.choose(Outcome.ReturnToHand, typeChoice, game)) { + while (controller.canRespond() && !controller.choose(Outcome.ReturnToHand, typeChoice, game)) { } String typeName = typeChoice.getChoice(); diff --git a/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java b/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java index e6b2260326a..f1a5bdd979c 100644 --- a/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java +++ b/Mage.Sets/src/mage/sets/innistrad/DivineReckoning.java @@ -95,7 +95,7 @@ class DivineReckoningEffect extends OneShotEffect { Target target = new TargetControlledPermanent(1, 1, new FilterControlledCreaturePermanent(), true); if (target.canChoose(player.getId(), game)) { - while (player.isInGame() && !target.isChosen() && target.canChoose(player.getId(), game)) { + while (player.canRespond() && !target.isChosen() && target.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.Benefit, target, source, game); } Permanent permanent = game.getPermanent(target.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java b/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java index b702789950c..4a5d8e531d0 100644 --- a/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java +++ b/Mage.Sets/src/mage/sets/innistrad/GarrukTheVeilCursed.java @@ -153,7 +153,7 @@ class GarrukTheVeilCursedEffect extends OneShotEffect { Target target = new TargetControlledPermanent(1, 1, filterCreature, false); boolean sacrificed = false; if (target.canChoose(controller.getId(), game)) { - while (controller.isInGame() && !target.isChosen() && target.canChoose(controller.getId(), game)) { + while (controller.canRespond() && !target.isChosen() && target.canChoose(controller.getId(), game)) { controller.chooseTarget(Outcome.Sacrifice, target, source, game); } diff --git a/Mage.Sets/src/mage/sets/innistrad/Nevermore.java b/Mage.Sets/src/mage/sets/innistrad/Nevermore.java index c5a02b4cbd0..dee67c6f07f 100644 --- a/Mage.Sets/src/mage/sets/innistrad/Nevermore.java +++ b/Mage.Sets/src/mage/sets/innistrad/Nevermore.java @@ -100,7 +100,7 @@ class NevermoreEffect1 extends OneShotEffect { cardChoice.setChoices(CardRepository.instance.getNonLandNames()); cardChoice.clearChoice(); while (!controller.choose(Outcome.Detriment, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/HallOfTriumph.java b/Mage.Sets/src/mage/sets/journeyintonyx/HallOfTriumph.java index 8e4ad8a781f..6fb34b789b2 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/HallOfTriumph.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/HallOfTriumph.java @@ -95,7 +95,7 @@ class HallOfTriumphEffect extends OneShotEffect { ChoiceColor colorChoice = new ChoiceColor(); colorChoice.setMessage("Choose color"); while (!player.choose(Outcome.BoostCreature, colorChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/MarketFestival.java b/Mage.Sets/src/mage/sets/journeyintonyx/MarketFestival.java index 6075982ce44..affa7e15e95 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/MarketFestival.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/MarketFestival.java @@ -148,7 +148,7 @@ class MarketFestivalManaEffect extends ManaEffect { choiceColor.setMessage("Second mana color for " + sourceObject.getLogName()); } while (!controller.choose(Outcome.Benefit, choiceColor, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/judgment/CabalTherapy.java b/Mage.Sets/src/mage/sets/judgment/CabalTherapy.java index b6c15bf2768..524c6e205e3 100644 --- a/Mage.Sets/src/mage/sets/judgment/CabalTherapy.java +++ b/Mage.Sets/src/mage/sets/judgment/CabalTherapy.java @@ -101,7 +101,7 @@ class CabalTherapyEffect extends OneShotEffect { cardChoice.clearChoice(); while (!controller.choose(Outcome.Discard, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/judgment/FlashOfInsight.java b/Mage.Sets/src/mage/sets/judgment/FlashOfInsight.java index 421391c7998..7d3422aac21 100644 --- a/Mage.Sets/src/mage/sets/judgment/FlashOfInsight.java +++ b/Mage.Sets/src/mage/sets/judgment/FlashOfInsight.java @@ -141,7 +141,7 @@ class FlashOfInsightEffect extends OneShotEffect { .append(" card").append(cards.size() > 1 ? "s":"") .append(" on the bottom of his or her library").toString()); } - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/ButcherOfTheHorde.java b/Mage.Sets/src/mage/sets/khansoftarkir/ButcherOfTheHorde.java index d24de33f7a5..cab7e99034a 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/ButcherOfTheHorde.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/ButcherOfTheHorde.java @@ -118,7 +118,7 @@ class ButcherOfTheHordeEffect extends OneShotEffect { abilityChoice.setChoices(abilities); while (!abilityChoice.isChosen()) { controller.choose(Outcome.AddAbility, abilityChoice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/legions/MistformSliver.java b/Mage.Sets/src/mage/sets/legions/MistformSliver.java index 495458f4e11..d401e139c89 100644 --- a/Mage.Sets/src/mage/sets/legions/MistformSliver.java +++ b/Mage.Sets/src/mage/sets/legions/MistformSliver.java @@ -103,7 +103,7 @@ public class MistformSliver extends CardImpl { typeChoice.setMessage("Choose creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.Detriment, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/limitedalpha/NaturalSelection.java b/Mage.Sets/src/mage/sets/limitedalpha/NaturalSelection.java index 38657372332..0a160360c1e 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/NaturalSelection.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/NaturalSelection.java @@ -108,7 +108,7 @@ class NaturalSelectionEffect extends OneShotEffect { you.lookAtCards("Natural Selection", cards, game); TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the top of target player's library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { you.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/lorwyn/HoardersGreed.java b/Mage.Sets/src/mage/sets/lorwyn/HoardersGreed.java index 1fca4665842..0b05ef52053 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/HoardersGreed.java +++ b/Mage.Sets/src/mage/sets/lorwyn/HoardersGreed.java @@ -86,7 +86,7 @@ class HoardersGreedEffect extends OneShotEffect { do { controller.loseLife(2, game); controller.drawCards(2, game); - } while (controller.isInGame() && ClashEffect.getInstance().apply(game, source)); + } while (controller.canRespond() && ClashEffect.getInstance().apply(game, source)); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2010/MirrorOfFate.java b/Mage.Sets/src/mage/sets/magic2010/MirrorOfFate.java index 501a3d8bafa..2452f5850b2 100644 --- a/Mage.Sets/src/mage/sets/magic2010/MirrorOfFate.java +++ b/Mage.Sets/src/mage/sets/magic2010/MirrorOfFate.java @@ -114,7 +114,7 @@ class MirrorOfFateEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on top of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/magic2010/SphinxAmbassador.java b/Mage.Sets/src/mage/sets/magic2010/SphinxAmbassador.java index d45e92ec373..595a34013f8 100644 --- a/Mage.Sets/src/mage/sets/magic2010/SphinxAmbassador.java +++ b/Mage.Sets/src/mage/sets/magic2010/SphinxAmbassador.java @@ -116,7 +116,7 @@ class SphinxAmbassadorEffect extends OneShotEffect { cardChoice.setChoices(choices); cardChoice.clearChoice(); while (!targetPlayer.choose(Outcome.Benefit, cardChoice, game)) { - if (!targetPlayer.isInGame()) { + if (!targetPlayer.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/ConundrumSphinx.java b/Mage.Sets/src/mage/sets/magic2011/ConundrumSphinx.java index b8143876eb4..18776c87e2f 100644 --- a/Mage.Sets/src/mage/sets/magic2011/ConundrumSphinx.java +++ b/Mage.Sets/src/mage/sets/magic2011/ConundrumSphinx.java @@ -95,8 +95,8 @@ class ConundrumSphinxEffect extends OneShotEffect { for (Player player: game.getPlayers().values()) { if(player.getLibrary().size() > 0){ cardChoice.clearChoice(); - while (!player.choose(Outcome.DrawCard, cardChoice, game) && player.isInGame()) { - if (!player.isInGame()) { + while (!player.choose(Outcome.DrawCard, cardChoice, game) && player.canRespond()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/magic2014/DevoutInvocation.java b/Mage.Sets/src/mage/sets/magic2014/DevoutInvocation.java index 6e918f15df8..3f71b0c0a72 100644 --- a/Mage.Sets/src/mage/sets/magic2014/DevoutInvocation.java +++ b/Mage.Sets/src/mage/sets/magic2014/DevoutInvocation.java @@ -94,7 +94,7 @@ class DevoutInvocationEffect extends OneShotEffect { if (controller != null) { int tappedAmount = 0; TargetPermanent target = new TargetPermanent(0,1,filter, false); - while (true && controller.isInGame()) { + while (true && controller.canRespond()) { target.clearChosen(); if (target.canChoose(source.getControllerId(), game)) { Map options = new HashMap<>(); diff --git a/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java b/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java index 5cbd32e4098..5bc3c1c2891 100644 --- a/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java +++ b/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java @@ -107,7 +107,7 @@ class ChooseCreatureTypeEffect extends OneShotEffect { typeChoice.setMessage("Choose creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/magic2015/AEtherspouts.java b/Mage.Sets/src/mage/sets/magic2015/AEtherspouts.java index c0590adff87..eeff32b8b5c 100644 --- a/Mage.Sets/src/mage/sets/magic2015/AEtherspouts.java +++ b/Mage.Sets/src/mage/sets/magic2015/AEtherspouts.java @@ -135,7 +135,7 @@ class AEtherspoutsEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.BATTLEFIELD, new FilterCard("order to put on the top of library (last choosen will be the top most)")); while (cards.size() > 1) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } player.choose(Outcome.Neutral, cards, target, game); @@ -174,7 +174,7 @@ class AEtherspoutsEffect extends OneShotEffect { } } target = new TargetCard(Zone.BATTLEFIELD, new FilterCard("order to put on bottom of library (last choosen will be bottommost card)")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); @@ -199,7 +199,7 @@ class AEtherspoutsEffect extends OneShotEffect { player.moveCardToLibraryWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD, false, false); } player = playerList.getNext(game); - } while (player != null && !player.getId().equals(game.getActivePlayerId()) && activePlayer.isInGame()); + } while (player != null && !player.getId().equals(game.getActivePlayerId()) && activePlayer.canRespond()); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java b/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java index 4b7687d0e3f..d4a6c4f3a15 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java +++ b/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java @@ -106,7 +106,7 @@ class ObeliskOfUrdEnterBattlefieldEffect extends OneShotEffect { typeChoice.setMessage("Choose a creature type:"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/magic2015/StainTheMind.java b/Mage.Sets/src/mage/sets/magic2015/StainTheMind.java index cb50105e033..804ef524c2f 100644 --- a/Mage.Sets/src/mage/sets/magic2015/StainTheMind.java +++ b/Mage.Sets/src/mage/sets/magic2015/StainTheMind.java @@ -92,7 +92,7 @@ class StainTheMindEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE cardChoice.setMessage("Name a nonland card"); while (!controller.choose(Outcome.Exile, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/magicorigins/InfiniteObliteration.java b/Mage.Sets/src/mage/sets/magicorigins/InfiniteObliteration.java index 3c432dcc1b6..030db436a14 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/InfiniteObliteration.java +++ b/Mage.Sets/src/mage/sets/magicorigins/InfiniteObliteration.java @@ -90,7 +90,7 @@ class InfiniteObliterationEffect extends SearchTargetGraveyardHandLibraryForCard cardChoice.setMessage("Name a creature card"); while (!controller.choose(Outcome.Exile, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/magicorigins/SphinxsTutelage.java b/Mage.Sets/src/mage/sets/magicorigins/SphinxsTutelage.java index 7e75184c2d9..b97b16398ba 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/SphinxsTutelage.java +++ b/Mage.Sets/src/mage/sets/magicorigins/SphinxsTutelage.java @@ -121,7 +121,7 @@ class SphinxsTutelageEffect extends OneShotEffect { } } targetPlayer.moveCards(cards, Zone.LIBRARY, Zone.GRAVEYARD, source, game); - } while (colorShared && targetPlayer.isInGame()); + } while (colorShared && targetPlayer.canRespond()); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java b/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java index 9094d046dcb..3614a8974e2 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java +++ b/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java @@ -130,7 +130,7 @@ class TalentOfTheTelepathEffect extends OneShotEffect { cardsToCast.remove(card); allCards.remove(card); } - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } target.clearChosen(); diff --git a/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java b/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java index 1d631448acc..90dc9c2a875 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java @@ -119,7 +119,7 @@ class ProteusStaffEffect extends OneShotEffect { controller.revealCards("Proteus Staff", cards, game); // and the rest on the bottom of his or her library in any order. - while (cards.size() > 0 && controller.isInGame()) { + while (cards.size() > 0 && controller.canRespond()) { if (cards.size() == 1) { Card card = cards.get(cards.iterator().next(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/MitoticManipulation.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/MitoticManipulation.java index def18f8114c..c911a7f3537 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/MitoticManipulation.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/MitoticManipulation.java @@ -130,7 +130,7 @@ class MitoticManipulationEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRevoker.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRevoker.java index fd0a2c97d80..279bd693526 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRevoker.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/PhyrexianRevoker.java @@ -103,7 +103,7 @@ class PhyrexianRevokerEffect1 extends OneShotEffect { cardChoice.setChoices(CardRepository.instance.getNonLandNames()); cardChoice.clearChoice(); while (!controller.choose(Outcome.Detriment, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/morningtide/DistantMelody.java b/Mage.Sets/src/mage/sets/morningtide/DistantMelody.java index 2c4c17f745b..7a5dd503b10 100644 --- a/Mage.Sets/src/mage/sets/morningtide/DistantMelody.java +++ b/Mage.Sets/src/mage/sets/morningtide/DistantMelody.java @@ -93,7 +93,7 @@ class DistantMelodyEffect extends OneShotEffect { typeChoice.setMessage("Choose a creature type:"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/morningtide/LuminescentRain.java b/Mage.Sets/src/mage/sets/morningtide/LuminescentRain.java index d677141a652..567db004db5 100644 --- a/Mage.Sets/src/mage/sets/morningtide/LuminescentRain.java +++ b/Mage.Sets/src/mage/sets/morningtide/LuminescentRain.java @@ -91,7 +91,7 @@ class LuminescentRainEffect extends OneShotEffect { typeChoice.setMessage("Choose a creature type:"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/morningtide/RoarOfTheCrowd.java b/Mage.Sets/src/mage/sets/morningtide/RoarOfTheCrowd.java index fa9e9d70501..bd30aad56e4 100644 --- a/Mage.Sets/src/mage/sets/morningtide/RoarOfTheCrowd.java +++ b/Mage.Sets/src/mage/sets/morningtide/RoarOfTheCrowd.java @@ -94,7 +94,7 @@ class RoarOfTheCrowdEffect extends OneShotEffect { typeChoice.setMessage("Choose a creature type:"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.LoseLife, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/ApostlesBlessing.java b/Mage.Sets/src/mage/sets/newphyrexia/ApostlesBlessing.java index 1106bb635aa..38f851c776d 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/ApostlesBlessing.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/ApostlesBlessing.java @@ -105,7 +105,7 @@ class ApostlesBlessingEffect extends OneShotEffect { if (controller != null) { ChoiceColorOrArtifact choice = new ChoiceColorOrArtifact(); while (!choice.isChosen()) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } controller.choose(outcome, choice, game); diff --git a/Mage.Sets/src/mage/sets/newphyrexia/PsychicSurgery.java b/Mage.Sets/src/mage/sets/newphyrexia/PsychicSurgery.java index 35a26e0db75..8178bb45663 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/PsychicSurgery.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/PsychicSurgery.java @@ -150,7 +150,7 @@ class PsychicSurgeryEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on top of his library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/newphyrexia/ShrineOfPiercingVision.java b/Mage.Sets/src/mage/sets/newphyrexia/ShrineOfPiercingVision.java index 9483fe13c92..e6670e7d7f5 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/ShrineOfPiercingVision.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/ShrineOfPiercingVision.java @@ -140,7 +140,7 @@ class ShrineOfPiercingVisionEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java b/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java index 88692fb2d1d..df7da676226 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java @@ -97,7 +97,7 @@ class XenograftEffect extends OneShotEffect { typeChoice.setMessage("Choose creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/ninthedition/StorageMatrix.java b/Mage.Sets/src/mage/sets/ninthedition/StorageMatrix.java index 62c863c93ef..2256c8e78f8 100644 --- a/Mage.Sets/src/mage/sets/ninthedition/StorageMatrix.java +++ b/Mage.Sets/src/mage/sets/ninthedition/StorageMatrix.java @@ -107,7 +107,7 @@ class StorageMatrixRestrictionEffect extends RestrictionEffect { Player player = game.getPlayer(game.getActivePlayerId()); if (player != null) { while (!player.choose(outcome, choiceImpl, game)) { - if (player.isInGame()) { + if (player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/ninthedition/TeferisPuzzleBox.java b/Mage.Sets/src/mage/sets/ninthedition/TeferisPuzzleBox.java index d4cebbe74e7..636a1fe1ad8 100644 --- a/Mage.Sets/src/mage/sets/ninthedition/TeferisPuzzleBox.java +++ b/Mage.Sets/src/mage/sets/ninthedition/TeferisPuzzleBox.java @@ -95,7 +95,7 @@ class TeferisPuzzleBoxEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/odyssey/TaintedPact.java b/Mage.Sets/src/mage/sets/odyssey/TaintedPact.java index 09b9c6d6f25..1674834f938 100644 --- a/Mage.Sets/src/mage/sets/odyssey/TaintedPact.java +++ b/Mage.Sets/src/mage/sets/odyssey/TaintedPact.java @@ -90,7 +90,7 @@ class TaintedPactEffect extends OneShotEffect{ return false; } Set names = new HashSet<>(); - while (player.isInGame() && player.getLibrary().size() > 0) { + while (player.canRespond() && player.getLibrary().size() > 0) { Card card = player.getLibrary().getFromTop(game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/onslaught/AkromasBlessing.java b/Mage.Sets/src/mage/sets/onslaught/AkromasBlessing.java index bf42de81296..4b301c061ec 100644 --- a/Mage.Sets/src/mage/sets/onslaught/AkromasBlessing.java +++ b/Mage.Sets/src/mage/sets/onslaught/AkromasBlessing.java @@ -99,7 +99,7 @@ class AkromasBlessingChooseColorEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(outcome, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/onslaught/PatriarchsBidding.java b/Mage.Sets/src/mage/sets/onslaught/PatriarchsBidding.java index e5a030662c2..42b4dfd2de0 100644 --- a/Mage.Sets/src/mage/sets/onslaught/PatriarchsBidding.java +++ b/Mage.Sets/src/mage/sets/onslaught/PatriarchsBidding.java @@ -102,7 +102,7 @@ class PatriarchsBiddingEffect extends OneShotEffect { typeChoice.setMessage("Choose a creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.PutCreatureInPlay, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { break; } } diff --git a/Mage.Sets/src/mage/sets/onslaught/PeerPressure.java b/Mage.Sets/src/mage/sets/onslaught/PeerPressure.java index af01dc3a377..0dd856326d4 100644 --- a/Mage.Sets/src/mage/sets/onslaught/PeerPressure.java +++ b/Mage.Sets/src/mage/sets/onslaught/PeerPressure.java @@ -97,7 +97,7 @@ class PeerPressureEffect extends OneShotEffect { choice.setMessage("Choose creature type"); choice.setChoices(CardRepository.instance.getCreatureTypes()); while (!controller.choose(Outcome.GainControl, choice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java b/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java index d7f7e5d00b1..0f4b766a2cd 100644 --- a/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java +++ b/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java @@ -102,7 +102,7 @@ class RiptideShapeshifterEffect extends OneShotEffect { choice.setMessage("Choose a creature type:"); choice.setChoices(CardRepository.instance.getCreatureTypes()); while (!player.choose(Outcome.BoostCreature, choice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/onslaught/Standardize.java b/Mage.Sets/src/mage/sets/onslaught/Standardize.java index c0f732a3706..760ae76aead 100644 --- a/Mage.Sets/src/mage/sets/onslaught/Standardize.java +++ b/Mage.Sets/src/mage/sets/onslaught/Standardize.java @@ -99,7 +99,7 @@ class StandardizeEffect extends OneShotEffect { types.remove("Wall"); typeChoice.setChoices(types); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/onslaught/WordsOfWind.java b/Mage.Sets/src/mage/sets/onslaught/WordsOfWind.java index 54cac4d5891..756f729d359 100644 --- a/Mage.Sets/src/mage/sets/onslaught/WordsOfWind.java +++ b/Mage.Sets/src/mage/sets/onslaught/WordsOfWind.java @@ -99,7 +99,7 @@ class WordsOfWindEffect extends ReplacementEffectImpl { List liste = game.getBattlefield().getActivePermanents(new FilterControlledPermanent(), playerId, game); if(!liste.isEmpty()){ while (!player.choose(Outcome.ReturnToHand, target, source.getSourceId(), game)){ - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/phyrexiavsthecoalition/DarigaazTheIgniter.java b/Mage.Sets/src/mage/sets/phyrexiavsthecoalition/DarigaazTheIgniter.java index b8176452454..032facd8255 100644 --- a/Mage.Sets/src/mage/sets/phyrexiavsthecoalition/DarigaazTheIgniter.java +++ b/Mage.Sets/src/mage/sets/phyrexiavsthecoalition/DarigaazTheIgniter.java @@ -101,7 +101,7 @@ class DarigaazTheIgniterEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(true); while (!choice.isChosen()) { controller.choose(outcome, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/planarchaos/VoidstoneGargoyle.java b/Mage.Sets/src/mage/sets/planarchaos/VoidstoneGargoyle.java index d222aeb8c4c..76bc947d8e7 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/VoidstoneGargoyle.java +++ b/Mage.Sets/src/mage/sets/planarchaos/VoidstoneGargoyle.java @@ -103,7 +103,7 @@ class VoidstoneGargoyleChooseCardEffect extends OneShotEffect { cardChoice.setChoices(CardRepository.instance.getNonLandNames()); cardChoice.clearChoice(); while (!controller.choose(Outcome.Detriment, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/planechase/VedalkenEngineer.java b/Mage.Sets/src/mage/sets/planechase/VedalkenEngineer.java index e3e2447e1ec..2e3e3d640d6 100644 --- a/Mage.Sets/src/mage/sets/planechase/VedalkenEngineer.java +++ b/Mage.Sets/src/mage/sets/planechase/VedalkenEngineer.java @@ -160,7 +160,7 @@ class VedalkenEngineerEffect extends ManaEffect { Mana mana = new Mana(); ChoiceColor choiceColor = new ChoiceColor(true); while (!controller.choose(Outcome.Benefit, choiceColor, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java index a638e785d59..4d91881eea1 100644 --- a/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java +++ b/Mage.Sets/src/mage/sets/planechase2012/PrimalPlasma.java @@ -128,7 +128,7 @@ class PrimalPlasmaReplacementEffect extends ReplacementEffectImpl { if (controller != null) { while (!choice.isChosen()) { controller.choose(Outcome.Neutral, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/planeshift/SunkenHope.java b/Mage.Sets/src/mage/sets/planeshift/SunkenHope.java index 4f161888409..9779bb3fb30 100644 --- a/Mage.Sets/src/mage/sets/planeshift/SunkenHope.java +++ b/Mage.Sets/src/mage/sets/planeshift/SunkenHope.java @@ -97,7 +97,7 @@ class ReturnToHandEffect extends OneShotEffect { Target target = new TargetControlledPermanent(1, 1, new FilterControlledCreaturePermanent(), true); if (target.canChoose(player.getId(), game)) { - while (player.isInGame() && !target.isChosen() && target.canChoose(player.getId(), game)) { + while (player.canRespond() && !target.isChosen() && target.canChoose(player.getId(), game)) { player.chooseTarget(Outcome.ReturnToHand, target, source, game); } diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/BurningOfXinye.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/BurningOfXinye.java index 4b31451bf46..7ec929aec5b 100644 --- a/Mage.Sets/src/mage/sets/portalthreekingdoms/BurningOfXinye.java +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/BurningOfXinye.java @@ -111,7 +111,7 @@ class BurningOfXinyeEffect extends OneShotEffect{ Target target = new TargetControlledPermanent(amount, amount, filter, true); if (amount > 0 && target.canChoose(source.getSourceId(), player.getId(), game)) { - while (!target.isChosen() && target.canChoose(player.getId(), game) && player.isInGame()) { + while (!target.isChosen() && target.canChoose(player.getId(), game) && player.canRespond()) { player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } diff --git a/Mage.Sets/src/mage/sets/ravnica/CongregationAtDawn.java b/Mage.Sets/src/mage/sets/ravnica/CongregationAtDawn.java index c8dca0990b5..6ca8d911a6d 100644 --- a/Mage.Sets/src/mage/sets/ravnica/CongregationAtDawn.java +++ b/Mage.Sets/src/mage/sets/ravnica/CongregationAtDawn.java @@ -107,7 +107,7 @@ class CongregationAtDawnEffect extends OneShotEffect { TargetCard targetToLib = new TargetCard(Zone.PICK, new FilterCard(textTop)); - while (revealed.size() > 1 && controller.isInGame()) { + while (revealed.size() > 1 && controller.canRespond()) { controller.choose(Outcome.Neutral, revealed, targetToLib, game); Card card = revealed.get(targetToLib.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/ravnica/Mindmoil.java b/Mage.Sets/src/mage/sets/ravnica/Mindmoil.java index b45b2478e6b..f0669f79591 100644 --- a/Mage.Sets/src/mage/sets/ravnica/Mindmoil.java +++ b/Mage.Sets/src/mage/sets/ravnica/Mindmoil.java @@ -91,7 +91,7 @@ class MindmoilEffect extends OneShotEffect { cards.add(card.getId()); } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (you.isInGame() && cards.size() > 1) { + while (you.canRespond() && cards.size() > 1) { you.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/returntoravnica/DestroyTheEvidence.java b/Mage.Sets/src/mage/sets/returntoravnica/DestroyTheEvidence.java index 590469bd589..c1a56bc3577 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/DestroyTheEvidence.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/DestroyTheEvidence.java @@ -102,7 +102,7 @@ class DestroyTheEvidenceEffect extends OneShotEffect { boolean landFound = false; Cards cards = new CardsImpl(); while (player.getLibrary().size() > 0 && !landFound) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } Card card = player.getLibrary().removeFromTop(game); diff --git a/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java b/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java index 58be732e789..3be54f89388 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java @@ -263,7 +263,7 @@ class JaceArchitectOfThoughtEffect2 extends OneShotEffect { } TargetCard targetCard = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cardsToLibrary.size() > 1) { + while (player.canRespond() && cardsToLibrary.size() > 1) { player.choose(Outcome.Neutral, cardsToLibrary, targetCard, game); Card card = cardsToLibrary.get(targetCard.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/returntoravnica/SlaughterGames.java b/Mage.Sets/src/mage/sets/returntoravnica/SlaughterGames.java index f8fc51cc664..4a9b31a1afe 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/SlaughterGames.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/SlaughterGames.java @@ -101,7 +101,7 @@ class SlaughterGamesEffect extends SearchTargetGraveyardHandLibraryForCardNameAn cardChoice.setMessage("Name a nonland card"); while (!controller.choose(Outcome.Exile, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java b/Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java index b844e1a25c7..ffe0df331bd 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java @@ -92,7 +92,7 @@ class TabletOfTheGuildsEntersBattlefieldEffect extends OneShotEffect { ChoiceColor colorChoice = new ChoiceColor(); colorChoice.setMessage("Choose the first color"); while (!player.choose(Outcome.GainLife, colorChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } @@ -101,7 +101,7 @@ class TabletOfTheGuildsEntersBattlefieldEffect extends OneShotEffect { colorChoice.getChoices().remove(colorChoice.getChoice()); colorChoice.setMessage("Choose the second color"); - while (!player.choose(Outcome.GainLife, colorChoice, game) && player.isInGame()) { + while (!player.choose(Outcome.GainLife, colorChoice, game) && player.canRespond()) { game.debugMessage("player canceled choosing type. retrying."); } game.getState().setValue(permanent.getId() + "_color2", colorChoice.getColor().toString()); diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/HellcarverDemon.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/HellcarverDemon.java index 0f479e09c9f..21e317a4214 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/HellcarverDemon.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/HellcarverDemon.java @@ -113,7 +113,7 @@ class HellcarverDemonEffect extends OneShotEffect { } } - while (player != null && player.isInGame() && player.chooseUse(Outcome.PlayForFree, "Cast another nonland card exiled with Hellcarver Demon without paying that card's mana cost?", source, game)) { + while (player != null && player.canRespond() && player.chooseUse(Outcome.PlayForFree, "Cast another nonland card exiled with Hellcarver Demon without paying that card's mana cost?", source, game)) { TargetCardInExile target = new TargetCardInExile(filter, source.getSourceId()); while (player.choose(Outcome.PlayForFree, game.getExile().getExileZone(source.getSourceId()), target, game)) { Card card = game.getCard(target.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SasayaOrochiAscendant.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SasayaOrochiAscendant.java index 1692019dc10..3bc2a38c378 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SasayaOrochiAscendant.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SasayaOrochiAscendant.java @@ -192,7 +192,7 @@ class SasayasEssenceManaEffectEffect extends ManaEffect { } else { while(!choice.isChosen()) { controller.choose(outcome, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/UndyingFlames.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/UndyingFlames.java index c9a1c61c0ed..a2e743fb821 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/UndyingFlames.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/UndyingFlames.java @@ -91,7 +91,7 @@ class UndyingFlamesEffect extends OneShotEffect { Player you = game.getPlayer(source.getControllerId()); Card sourceCard = game.getCard(source.getSourceId()); while (you != null && sourceCard != null - && you.getLibrary().size() > 0 && you.isInGame()) { + && you.getLibrary().size() > 0 && you.canRespond()) { Card card = you.getLibrary().removeFromTop(game); if (card != null) { you.moveCardToExileWithInfo(card, null, null, source.getSourceId(), game, Zone.LIBRARY, true); diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/CloneShell.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/CloneShell.java index b200bd833ea..4f984aaf754 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/CloneShell.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/CloneShell.java @@ -125,7 +125,7 @@ class CloneShellEffect extends OneShotEffect { if (cards.size() > 0) { TargetCard target2 = new TargetCard(Zone.PICK, filter2); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Benefit, cards, target2, game); Card card = cards.get(target2.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/Memoricide.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/Memoricide.java index 3b5df3a250f..1d4bea6649b 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/Memoricide.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/Memoricide.java @@ -93,7 +93,7 @@ class MemoricideEffect extends OneShotEffect { cardChoice.clearChoice(); while (!controller.choose(Outcome.Exile, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrBattlesphere.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrBattlesphere.java index 6b53dcbc271..c0c51087095 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrBattlesphere.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrBattlesphere.java @@ -109,7 +109,7 @@ class MyrBattlesphereEffect extends OneShotEffect { if (controller != null) { int tappedAmount = 0; TargetPermanent target = new TargetPermanent(0,1,filter, false); - while (true && controller.isInGame()) { + while (true && controller.canRespond()) { target.clearChosen(); if (target.canChoose(source.getControllerId(), game)) { Map options = new HashMap<>(); diff --git a/Mage.Sets/src/mage/sets/scourge/KaronaFalseGod.java b/Mage.Sets/src/mage/sets/scourge/KaronaFalseGod.java index bc93b1ed61a..9313ed5c764 100644 --- a/Mage.Sets/src/mage/sets/scourge/KaronaFalseGod.java +++ b/Mage.Sets/src/mage/sets/scourge/KaronaFalseGod.java @@ -148,7 +148,7 @@ class KaronaFalseGodEffect extends OneShotEffect { typeChoice.setMessage("Choose creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!controller.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/ManaforgeCinder.java b/Mage.Sets/src/mage/sets/shadowmoor/ManaforgeCinder.java index 46d33e9ab6c..c650a49008d 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/ManaforgeCinder.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/ManaforgeCinder.java @@ -105,7 +105,7 @@ class ManaforgeCinderManaEffect extends OneShotEffect { manaChoice.setMessage("Select black or red mana to add to your mana pool"); Mana mana = new Mana(); while (!controller.choose(Outcome.Benefit, manaChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/PlagueOfVermin.java b/Mage.Sets/src/mage/sets/shadowmoor/PlagueOfVermin.java index 4bf3c7225d6..a494bd2cb7e 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/PlagueOfVermin.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/PlagueOfVermin.java @@ -93,17 +93,17 @@ class PlagueOfVerminEffect extends OneShotEffect { int totalPaidLife; if (controller != null) { PlayerList playerList = game.getState().getPlayerList().copy(); - while (!playerList.get().equals(source.getControllerId()) && controller.isInGame()) { + while (!playerList.get().equals(source.getControllerId()) && controller.canRespond()) { playerList.getNext(); } Player currentPlayer = game.getPlayer(playerList.get()); UUID firstInactivePlayer = null; - while (controller.isInGame()) { + while (controller.canRespond()) { if (firstInactivePlayer == null) { firstInactivePlayer = currentPlayer.getId(); } - if (currentPlayer != null && currentPlayer.isInGame() && controller.getInRange().contains(currentPlayer.getId())) { + if (currentPlayer != null && currentPlayer.canRespond() && controller.getInRange().contains(currentPlayer.getId())) { currentLifePaid = 0; totalPaidLife = 0; if (currentPlayer.chooseUse(Outcome.AIDontUseIt, "Pay life?", source, game)) { diff --git a/Mage.Sets/src/mage/sets/shardsofalara/GiftOfTheGargantuan.java b/Mage.Sets/src/mage/sets/shardsofalara/GiftOfTheGargantuan.java index 68c2b74275f..d9ad98c8b73 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/GiftOfTheGargantuan.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/GiftOfTheGargantuan.java @@ -141,7 +141,7 @@ class GiftOfTheGargantuanEffect extends OneShotEffect { } TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/speedvscunning/AquamorphEntity.java b/Mage.Sets/src/mage/sets/speedvscunning/AquamorphEntity.java index be0377d3d78..803b119ff50 100644 --- a/Mage.Sets/src/mage/sets/speedvscunning/AquamorphEntity.java +++ b/Mage.Sets/src/mage/sets/speedvscunning/AquamorphEntity.java @@ -145,7 +145,7 @@ class AquamorphEntityReplacementEffect extends ReplacementEffectImpl { if (controller != null) { while(!choice.isChosen()) { controller.choose(Outcome.Neutral, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/tempest/Grindstone.java b/Mage.Sets/src/mage/sets/tempest/Grindstone.java index 785046a82be..64654c52cf3 100644 --- a/Mage.Sets/src/mage/sets/tempest/Grindstone.java +++ b/Mage.Sets/src/mage/sets/tempest/Grindstone.java @@ -116,7 +116,7 @@ class GrindstoneEffect extends OneShotEffect { } } targetPlayer.moveCards(cards, Zone.LIBRARY, Zone.GRAVEYARD, source, game); - } while (colorShared && targetPlayer.isInGame()); + } while (colorShared && targetPlayer.canRespond()); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/tempest/Intuition.java b/Mage.Sets/src/mage/sets/tempest/Intuition.java index c3434f60978..b53b71eddcb 100644 --- a/Mage.Sets/src/mage/sets/tempest/Intuition.java +++ b/Mage.Sets/src/mage/sets/tempest/Intuition.java @@ -114,7 +114,7 @@ class IntuitionEffect extends SearchEffect { TargetCard targetCard = new TargetCard(Zone.PICK, new FilterCard()); while(!opponent.choose(Outcome.Neutral, cards, targetCard, game)) { - if (!opponent.isInGame()) { + if (!opponent.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/tempest/ScrollRack.java b/Mage.Sets/src/mage/sets/tempest/ScrollRack.java index 50cf767d80e..c675affb015 100644 --- a/Mage.Sets/src/mage/sets/tempest/ScrollRack.java +++ b/Mage.Sets/src/mage/sets/tempest/ScrollRack.java @@ -124,7 +124,7 @@ class ScrollRackEffect extends OneShotEffect { TargetCardInExile target2 = new TargetCardInExile(filter2, source.getSourceId()); ExileZone scrollRackExileZone = game.getExile().getExileZone(source.getSourceId()); if (scrollRackExileZone != null) { - while (controller.isInGame() && scrollRackExileZone.count(filter, game) > 1) { + while (controller.canRespond() && scrollRackExileZone.count(filter, game) > 1) { controller.lookAtCards("exiled cards with " + sourceObject.getName(), scrollRackExileZone, game); controller.choose(Outcome.Neutral, scrollRackExileZone, target2, game); Card card = game.getCard(target2.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/tempest/WoodSage.java b/Mage.Sets/src/mage/sets/tempest/WoodSage.java index 867039608a8..3744b716831 100644 --- a/Mage.Sets/src/mage/sets/tempest/WoodSage.java +++ b/Mage.Sets/src/mage/sets/tempest/WoodSage.java @@ -103,7 +103,7 @@ class WoodSageEffect extends OneShotEffect { cardChoice.setChoices(CardRepository.instance.getCreatureNames()); cardChoice.setMessage("Name a creature card"); while (!controller.choose(Outcome.Detriment, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java b/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java index 276a35b4b4a..0166753702c 100644 --- a/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java +++ b/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java @@ -127,7 +127,7 @@ class XenagosManaEffect extends OneShotEffect { for (int i = 0; i < x; i++){ Mana mana = new Mana(); while (!player.choose(Outcome.Benefit, manaChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/timespiral/Hypergenesis.java b/Mage.Sets/src/mage/sets/timespiral/Hypergenesis.java index eb88827dd9e..de7538b305a 100644 --- a/Mage.Sets/src/mage/sets/timespiral/Hypergenesis.java +++ b/Mage.Sets/src/mage/sets/timespiral/Hypergenesis.java @@ -102,15 +102,15 @@ class HypergenesisEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { PlayerList playerList = game.getState().getPlayerList().copy(); - while (!playerList.get().equals(source.getControllerId()) && controller.isInGame()) { + while (!playerList.get().equals(source.getControllerId()) && controller.canRespond()) { playerList.getNext(); } Player currentPlayer = game.getPlayer(playerList.get()); UUID firstInactivePlayer = null; Target target = new TargetCardInHand(filter); - while (controller.isInGame()) { - if (currentPlayer != null && currentPlayer.isInGame() && controller.getInRange().contains(currentPlayer.getId())) { + while (controller.canRespond()) { + if (currentPlayer != null && currentPlayer.canRespond() && controller.getInRange().contains(currentPlayer.getId())) { if (firstInactivePlayer == null) { firstInactivePlayer = currentPlayer.getId(); } diff --git a/Mage.Sets/src/mage/sets/timespiral/StuffyDoll.java b/Mage.Sets/src/mage/sets/timespiral/StuffyDoll.java index e1495a01e1c..7927019a7b4 100644 --- a/Mage.Sets/src/mage/sets/timespiral/StuffyDoll.java +++ b/Mage.Sets/src/mage/sets/timespiral/StuffyDoll.java @@ -173,7 +173,7 @@ class StuffyDollGainLifeEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { UUID playerId = (UUID) game.getState().getValue(source.getSourceId() + "_player"); Player player = game.getPlayer(playerId); - if (player != null && player.isInGame()) { + if (player != null && player.canRespond()) { player.damage((Integer) this.getValue("damageAmount"), source.getSourceId(), game, false, true); } return true; diff --git a/Mage.Sets/src/mage/sets/urzaslegacy/HarmonicConvergence.java b/Mage.Sets/src/mage/sets/urzaslegacy/HarmonicConvergence.java index adc6e71cd4d..cf0f508360b 100644 --- a/Mage.Sets/src/mage/sets/urzaslegacy/HarmonicConvergence.java +++ b/Mage.Sets/src/mage/sets/urzaslegacy/HarmonicConvergence.java @@ -116,7 +116,7 @@ class HarmonicConvergenceEffect extends OneShotEffect { for (Permanent permanent : list) { cards.add(permanent); } - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { diff --git a/Mage.Sets/src/mage/sets/urzaslegacy/RavenFamiliar.java b/Mage.Sets/src/mage/sets/urzaslegacy/RavenFamiliar.java index 4ad677fd27d..6f708fa0d38 100644 --- a/Mage.Sets/src/mage/sets/urzaslegacy/RavenFamiliar.java +++ b/Mage.Sets/src/mage/sets/urzaslegacy/RavenFamiliar.java @@ -124,7 +124,7 @@ public class RavenFamiliar extends CardImpl { } target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/urzassaga/CarpetOfFlowers.java b/Mage.Sets/src/mage/sets/urzassaga/CarpetOfFlowers.java index 7b6794af6d4..8f6e677c103 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/CarpetOfFlowers.java +++ b/Mage.Sets/src/mage/sets/urzassaga/CarpetOfFlowers.java @@ -168,7 +168,7 @@ class CarpetOfFlowersEffect extends ManaEffect { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(Outcome.Protect, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/urzassaga/Persecute.java b/Mage.Sets/src/mage/sets/urzassaga/Persecute.java index 82d8dfe6f55..6f24e8c027e 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Persecute.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Persecute.java @@ -93,7 +93,7 @@ class PersecuteEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(outcome, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/urzassaga/Smokestack.java b/Mage.Sets/src/mage/sets/urzassaga/Smokestack.java index 87b8ade46eb..541c4a31bb5 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Smokestack.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Smokestack.java @@ -100,7 +100,7 @@ class SmokestackEffect extends OneShotEffect { //A spell or ability could have removed the only legal target this player //had, if thats the case this ability should fizzle. if (target.canChoose(activePlayer.getId(), game)) { - while (!target.isChosen() && target.canChoose(activePlayer.getId(), game) && activePlayer.isInGame()) { + while (!target.isChosen() && target.canChoose(activePlayer.getId(), game) && activePlayer.canRespond()) { activePlayer.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } diff --git a/Mage.Sets/src/mage/sets/urzassaga/Turnabout.java b/Mage.Sets/src/mage/sets/urzassaga/Turnabout.java index f3c1c5a1809..40ea435d881 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Turnabout.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Turnabout.java @@ -112,7 +112,7 @@ class TurnaboutEffect extends OneShotEffect { choiceImpl.setMessage("Choose card type to tap or untap"); choiceImpl.setChoices(choice); while (!controller.choose(Outcome.Neutral, choiceImpl, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } @@ -131,7 +131,7 @@ class TurnaboutEffect extends OneShotEffect { choiceImpl.setMessage("Choose to tap or untap"); choiceImpl.setChoices(choice2); while (!controller.choose(Outcome.Neutral, choiceImpl, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/vintagemasters/Eureka.java b/Mage.Sets/src/mage/sets/vintagemasters/Eureka.java index 1900a95d1fe..c47f7887e12 100644 --- a/Mage.Sets/src/mage/sets/vintagemasters/Eureka.java +++ b/Mage.Sets/src/mage/sets/vintagemasters/Eureka.java @@ -89,18 +89,18 @@ class EurekaEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { PlayerList playerList = game.getState().getPlayerList().copy(); - while (!playerList.get().equals(source.getControllerId()) && controller.isInGame()) { + while (!playerList.get().equals(source.getControllerId()) && controller.canRespond()) { playerList.getNext(); } Player currentPlayer = game.getPlayer(playerList.get()); UUID firstInactivePlayer = null; Target target = new TargetCardInHand(new FilterPermanentCard()); - while (controller.isInGame()) { + while (controller.canRespond()) { if (firstInactivePlayer == null) { firstInactivePlayer = currentPlayer.getId(); } - if (currentPlayer != null && currentPlayer.isInGame() && controller.getInRange().contains(currentPlayer.getId())) { + if (currentPlayer != null && currentPlayer.canRespond() && controller.getInRange().contains(currentPlayer.getId())) { target.clearChosen(); if (target.canChoose(source.getSourceId(), currentPlayer.getId(), game) diff --git a/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java b/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java index b278362bbc4..b2951b39274 100644 --- a/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java +++ b/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java @@ -120,7 +120,7 @@ class GoblinRecruiterEffect extends OneShotEffect { if (numberOfGoblins > 0) { if (cards.size() > 1) { TargetCard targetCard = new TargetCard(Zone.LIBRARY, putOnTopOfLibraryFilter); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Benefit, cards, targetCard, game); Card card = cards.get(targetCard.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/visions/TeferisRealm.java b/Mage.Sets/src/mage/sets/visions/TeferisRealm.java index 9664f0e51d0..170ffe82422 100644 --- a/Mage.Sets/src/mage/sets/visions/TeferisRealm.java +++ b/Mage.Sets/src/mage/sets/visions/TeferisRealm.java @@ -109,7 +109,7 @@ class TeferisRealmEffect extends OneShotEffect { choiceImpl.setMessage("Phase out which kind of permanents?"); choiceImpl.setChoices(choices); while(!player.choose(outcome, choiceImpl, game)) { - if (player.isInGame()) { + if (player.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/weatherlight/Doomsday.java b/Mage.Sets/src/mage/sets/weatherlight/Doomsday.java index 518336e86b3..201d7196b68 100644 --- a/Mage.Sets/src/mage/sets/weatherlight/Doomsday.java +++ b/Mage.Sets/src/mage/sets/weatherlight/Doomsday.java @@ -115,7 +115,7 @@ class DoomsdayEffect extends OneShotEffect { } //Put the chosen cards on top of your library in any order target = new TargetCard(Zone.PICK, new FilterCard("Card to put on top")); - while (cards.size() > 1 && player.isInGame()) { + while (cards.size() > 1 && player.canRespond()) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/zendikar/BraveTheElements.java b/Mage.Sets/src/mage/sets/zendikar/BraveTheElements.java index e5da2306596..caf72def1f8 100644 --- a/Mage.Sets/src/mage/sets/zendikar/BraveTheElements.java +++ b/Mage.Sets/src/mage/sets/zendikar/BraveTheElements.java @@ -106,7 +106,7 @@ class BraveTheElementsChooseColorEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(outcome, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/zendikar/KabiraEvangel.java b/Mage.Sets/src/mage/sets/zendikar/KabiraEvangel.java index 35c7d52e50c..b2d00f04395 100644 --- a/Mage.Sets/src/mage/sets/zendikar/KabiraEvangel.java +++ b/Mage.Sets/src/mage/sets/zendikar/KabiraEvangel.java @@ -118,7 +118,7 @@ class KabiraEvangelChooseColorEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(outcome, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java b/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java index 6ecc9dbbdfe..5232704f31f 100644 --- a/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java +++ b/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java @@ -116,7 +116,7 @@ class MerfolkWayfinderEffect extends OneShotEffect { player.revealCards("Merfolk Wayfinder", cardsToReveal, game); TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { + while (player.canRespond() && cards.size() > 1) { player.choose(Outcome.Neutral, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/sets/zendikar/WorldQueller.java b/Mage.Sets/src/mage/sets/zendikar/WorldQueller.java index c1c52dd604c..d85879e1ff7 100644 --- a/Mage.Sets/src/mage/sets/zendikar/WorldQueller.java +++ b/Mage.Sets/src/mage/sets/zendikar/WorldQueller.java @@ -120,7 +120,7 @@ class WorldQuellerEffect extends OneShotEffect { if (you != null && sourceCreature != null) { Choice choiceImpl = new ChoiceImpl(); choiceImpl.setChoices(choice); - while (you.isInGame() && !you.choose(Outcome.Neutral, choiceImpl, game)) {} + while (you.canRespond() && !you.choose(Outcome.Neutral, choiceImpl, game)) {} CardType type = null; String choosenType = choiceImpl.getChoice(); @@ -150,7 +150,7 @@ class WorldQuellerEffect extends OneShotEffect { // you always go first if (target.canChoose(you.getId(), game)) { - while (you.isInGame() && !target.isChosen() && target.canChoose(you.getId(), game)) { + while (you.canRespond() && !target.isChosen() && target.canChoose(you.getId(), game)) { you.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } Permanent permanent = game.getPermanent(target.getFirstTarget()); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 830c7af2a0c..79a7367c1c0 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1418,6 +1418,11 @@ public class TestPlayer implements Player { return computerPlayer.isInGame(); } + @Override + public boolean canRespond() { + return computerPlayer.canRespond(); + } + @Override public boolean hasWon() { return computerPlayer.hasWon(); diff --git a/Mage/src/mage/abilities/effects/common/AddManaAnyColorAttachedControllerEffect.java b/Mage/src/mage/abilities/effects/common/AddManaAnyColorAttachedControllerEffect.java index b81fd61aab9..d342c91b0c3 100644 --- a/Mage/src/mage/abilities/effects/common/AddManaAnyColorAttachedControllerEffect.java +++ b/Mage/src/mage/abilities/effects/common/AddManaAnyColorAttachedControllerEffect.java @@ -60,7 +60,7 @@ public class AddManaAnyColorAttachedControllerEffect extends ManaEffect { if (player != null) { ChoiceColor choice = new ChoiceColor(); while (!player.choose(outcome, choice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage/src/mage/abilities/effects/common/AddManaInAnyCombinationEffect.java b/Mage/src/mage/abilities/effects/common/AddManaInAnyCombinationEffect.java index 19f56cfeb80..4a87a976677 100644 --- a/Mage/src/mage/abilities/effects/common/AddManaInAnyCombinationEffect.java +++ b/Mage/src/mage/abilities/effects/common/AddManaInAnyCombinationEffect.java @@ -96,7 +96,7 @@ public class AddManaInAnyCombinationEffect extends ManaEffect { Mana mana = new Mana(); int amountOfManaLeft = amount.calculate(game, source, this); - while (amountOfManaLeft > 0 && player.isInGame()) { + while (amountOfManaLeft > 0 && player.canRespond()) { for (ColoredManaSymbol coloredManaSymbol: manaSymbols) { int number = player.getAmount(0, amountOfManaLeft, new StringBuilder("How many ").append(coloredManaSymbol.name()).append(" mana?").toString(), game); if (number > 0) { diff --git a/Mage/src/mage/abilities/effects/common/ChooseColorEffect.java b/Mage/src/mage/abilities/effects/common/ChooseColorEffect.java index 76c84fba229..8f22a961ad7 100644 --- a/Mage/src/mage/abilities/effects/common/ChooseColorEffect.java +++ b/Mage/src/mage/abilities/effects/common/ChooseColorEffect.java @@ -60,7 +60,7 @@ public class ChooseColorEffect extends OneShotEffect { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(outcome, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java b/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java index 16fe68f4b1d..2ebd99cc9d2 100644 --- a/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java +++ b/Mage/src/mage/abilities/effects/common/ChooseCreatureTypeEffect.java @@ -63,7 +63,7 @@ public class ChooseCreatureTypeEffect extends OneShotEffect { typeChoice.setMessage("Choose creature type"); typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); while (!controller.choose(outcome, typeChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage/src/mage/abilities/effects/common/ChooseModeEffect.java b/Mage/src/mage/abilities/effects/common/ChooseModeEffect.java index 83fcbb87039..796f3e7fce7 100644 --- a/Mage/src/mage/abilities/effects/common/ChooseModeEffect.java +++ b/Mage/src/mage/abilities/effects/common/ChooseModeEffect.java @@ -74,7 +74,7 @@ public class ChooseModeEffect extends OneShotEffect { choice.setMessage(choiceMessage); choice.getChoices().addAll(modes); while (!choice.isChosen()) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } controller.choose(Outcome.Neutral, choice, game); diff --git a/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java b/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java index 80df2007eb2..d6f5cf01087 100644 --- a/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java +++ b/Mage/src/mage/abilities/effects/common/DynamicManaEffect.java @@ -148,7 +148,7 @@ public class DynamicManaEffect extends BasicManaEffect { for (int i = 0; i < count; i++) { if (!choiceColor.isChosen()) { while (!controller.choose(Outcome.Benefit, choiceColor, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return computedMana; } } diff --git a/Mage/src/mage/abilities/effects/common/NameACardEffect.java b/Mage/src/mage/abilities/effects/common/NameACardEffect.java index 519969bd13c..0123f9fd6f6 100644 --- a/Mage/src/mage/abilities/effects/common/NameACardEffect.java +++ b/Mage/src/mage/abilities/effects/common/NameACardEffect.java @@ -94,7 +94,7 @@ public class NameACardEffect extends OneShotEffect { } cardChoice.clearChoice(); while (!controller.choose(Outcome.Detriment, cardChoice, game)) { - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage/src/mage/abilities/effects/common/SacrificeAllEffect.java b/Mage/src/mage/abilities/effects/common/SacrificeAllEffect.java index 12ca8a7485a..f00f0433c0a 100644 --- a/Mage/src/mage/abilities/effects/common/SacrificeAllEffect.java +++ b/Mage/src/mage/abilities/effects/common/SacrificeAllEffect.java @@ -92,7 +92,7 @@ public class SacrificeAllEffect extends OneShotEffect { int numTargets = Math.min(amount.calculate(game, source, this), game.getBattlefield().countAll(filter, player.getId(), game)); TargetControlledPermanent target = new TargetControlledPermanent(numTargets, numTargets, filter, true); if (target.canChoose(player.getId(), game)) { - while (!target.isChosen() && player.isInGame()) { + while (!target.isChosen() && player.canRespond()) { player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } perms.addAll(target.getTargets()); diff --git a/Mage/src/mage/abilities/effects/common/SacrificeEffect.java b/Mage/src/mage/abilities/effects/common/SacrificeEffect.java index ad24e45819a..a821c35458e 100644 --- a/Mage/src/mage/abilities/effects/common/SacrificeEffect.java +++ b/Mage/src/mage/abilities/effects/common/SacrificeEffect.java @@ -90,7 +90,7 @@ public class SacrificeEffect extends OneShotEffect{ // A spell or ability could have removed the only legal target this player // had, if thats the case this ability should fizzle. if (amount > 0 && target.canChoose(source.getSourceId(), player.getId(), game)) { - while (!target.isChosen() && target.canChoose(player.getId(), game) && player.isInGame()) { + while (!target.isChosen() && target.canChoose(player.getId(), game) && player.canRespond()) { player.chooseTarget(Outcome.Sacrifice, target, source, game); } diff --git a/Mage/src/mage/abilities/effects/common/continuous/BecomesChosenNonWallCreatureTypeTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BecomesChosenNonWallCreatureTypeTargetEffect.java index 3055295f8fd..316ef45e413 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BecomesChosenNonWallCreatureTypeTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BecomesChosenNonWallCreatureTypeTargetEffect.java @@ -40,7 +40,7 @@ public class BecomesChosenNonWallCreatureTypeTargetEffect extends OneShotEffect types.remove("Wall"); typeChoice.setChoices(types); while (!player.choose(Outcome.BoostCreature, typeChoice, game)) { - if (!player.isInGame()) { + if (!player.canRespond()) { return false; } } diff --git a/Mage/src/mage/abilities/effects/common/continuous/BecomesColorOrColorsTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorOrColorsTargetEffect.java index 87393154748..dcdbe3ef9f2 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BecomesColorOrColorsTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorOrColorsTargetEffect.java @@ -78,7 +78,7 @@ public class BecomesColorOrColorsTargetEffect extends OneShotEffect { } ChoiceColor choiceColor = new ChoiceColor(); controller.choose(Outcome.Benefit, choiceColor, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } if (!game.isSimulation()) diff --git a/Mage/src/mage/abilities/effects/common/continuous/BecomesColorSourceEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorSourceEffect.java index e7205a7b5bf..89f5c58ad6d 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BecomesColorSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorSourceEffect.java @@ -80,7 +80,7 @@ public class BecomesColorSourceEffect extends ContinuousEffectImpl { ChoiceColor choice = new ChoiceColor(); while(!choice.isChosen()) { controller.choose(Outcome.PutManaInPool, choice, game); - if(!controller.isInGame()) { + if(!controller.canRespond()) { return; } } diff --git a/Mage/src/mage/abilities/effects/common/continuous/BecomesColorTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorTargetEffect.java index 975beaa6e71..f1d1369cdb8 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BecomesColorTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorTargetEffect.java @@ -83,7 +83,7 @@ public class BecomesColorTargetEffect extends ContinuousEffectImpl { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(Outcome.PutManaInPool, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return; } } diff --git a/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorSourceEffect.java b/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorSourceEffect.java index 656c7b23fce..1dc0ffe2002 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorSourceEffect.java @@ -72,7 +72,7 @@ public class GainProtectionFromColorSourceEffect extends GainAbilitySourceEffect colorChoice.setMessage("Choose color for protection ability"); while (!colorChoice.isChosen()) { controller.choose(outcome, colorChoice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { discard(); return; } diff --git a/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorTargetEffect.java index a6af9b8dcc6..c54a6b44217 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/GainProtectionFromColorTargetEffect.java @@ -73,7 +73,7 @@ public class GainProtectionFromColorTargetEffect extends GainAbilityTargetEffect choice.clearChoice(); while (!choice.isChosen()) { controller.choose(Outcome.Protect, choice, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return; } } diff --git a/Mage/src/mage/abilities/effects/keyword/FatesealEffect.java b/Mage/src/mage/abilities/effects/keyword/FatesealEffect.java index beb7165fb05..4d19f86b4f4 100644 --- a/Mage/src/mage/abilities/effects/keyword/FatesealEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/FatesealEffect.java @@ -90,7 +90,7 @@ public class FatesealEffect extends OneShotEffect { target1.setRequired(false); // move cards to the bottom of the library while (cards.size() > 0 && controller.choose(Outcome.Detriment, cards, target1, game)) { - if (!controller.isInGame() || !opponent.isInGame()) { + if (!controller.canRespond() || !opponent.canRespond()) { return false; } Card card = cards.get(target1.getFirstTarget(), game); diff --git a/Mage/src/mage/abilities/effects/keyword/ScryEffect.java b/Mage/src/mage/abilities/effects/keyword/ScryEffect.java index 2bcb26468aa..0fc7e4ad760 100644 --- a/Mage/src/mage/abilities/effects/keyword/ScryEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/ScryEffect.java @@ -81,7 +81,7 @@ public class ScryEffect extends OneShotEffect { TargetCard target1 = new TargetCard(Zone.LIBRARY, filter1); target1.setRequired(false); // move cards to the bottom of the library - while (player.isInGame() && cards.size() > 0 && player.choose(Outcome.Detriment, cards, target1, game)) { + while (player.canRespond() && cards.size() > 0 && player.choose(Outcome.Detriment, cards, target1, game)) { Card card = cards.get(target1.getFirstTarget(), game); if (card != null) { cards.remove(card); diff --git a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java index 548d64cd76c..ae721fa50cf 100644 --- a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java +++ b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java @@ -127,7 +127,7 @@ class AnnihilatorEffect extends OneShotEffect { int amount = Math.min(count, game.getBattlefield().countAll(filter, player.getId(), game)); Target target = new TargetControlledPermanent(amount, amount, filter, false); if (target.canChoose(player.getId(), game)) { - while (!target.isChosen() && target.canChoose(player.getId(), game) && player.isInGame()) { + while (!target.isChosen() && target.canChoose(player.getId(), game) && player.canRespond()) { player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } for (int idx = 0; idx < target.getTargets().size(); idx++) { diff --git a/Mage/src/mage/abilities/keyword/ConvokeAbility.java b/Mage/src/mage/abilities/keyword/ConvokeAbility.java index ef920d57d42..aac3ab7ab74 100644 --- a/Mage/src/mage/abilities/keyword/ConvokeAbility.java +++ b/Mage/src/mage/abilities/keyword/ConvokeAbility.java @@ -214,7 +214,7 @@ class ConvokeEffect extends OneShotEffect { chooseManaType.setMessage("Choose mana color to reduce from " + perm.getName()); while (!chooseManaType.isChosen()) { controller.choose(Outcome.Benefit, chooseManaType, game); - if (!controller.isInGame()) { + if (!controller.canRespond()) { return false; } } diff --git a/Mage/src/mage/abilities/keyword/KickerAbility.java b/Mage/src/mage/abilities/keyword/KickerAbility.java index 9056b7bc2e1..9318c39e039 100644 --- a/Mage/src/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/mage/abilities/keyword/KickerAbility.java @@ -209,7 +209,7 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo this.resetKicker(game, ability); for (OptionalAdditionalCost kickerCost : kickerCosts) { boolean again = true; - while (player.isInGame() && again) { + while (player.canRespond() && again) { String times = ""; if (kickerCost.isRepeatable()) { int activatedCount = getKickedCounter(game, ability); diff --git a/Mage/src/mage/abilities/keyword/ReplicateAbility.java b/Mage/src/mage/abilities/keyword/ReplicateAbility.java index 4607b39af1d..8be57a3997e 100644 --- a/Mage/src/mage/abilities/keyword/ReplicateAbility.java +++ b/Mage/src/mage/abilities/keyword/ReplicateAbility.java @@ -113,7 +113,7 @@ public class ReplicateAbility extends StaticAbility implements OptionalAdditiona this.resetReplicate(); boolean again = true; - while (player.isInGame() && again) { + while (player.canRespond() && again) { String times = ""; if (additionalCost.isRepeatable()) { int numActivations = additionalCost.getActivateCount(); diff --git a/Mage/src/mage/abilities/keyword/RippleAbility.java b/Mage/src/mage/abilities/keyword/RippleAbility.java index 3b2735906be..ad404d5e871 100644 --- a/Mage/src/mage/abilities/keyword/RippleAbility.java +++ b/Mage/src/mage/abilities/keyword/RippleAbility.java @@ -106,7 +106,7 @@ class RippleEffect extends OneShotEffect { target1.setRequired(false); // choose cards to play for free - while (player.isInGame() && cards.count(sameNameFilter, game) > 0 && player.choose(Outcome.PlayForFree, cards, target1, game)) { + while (player.canRespond() && cards.count(sameNameFilter, game) > 0 && player.choose(Outcome.PlayForFree, cards, target1, game)) { Card card = cards.get(target1.getFirstTarget(), game); if (card != null) { player.cast(card.getSpellAbility(), game, true); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index f3a878d2206..e4c858c6d45 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -733,7 +733,7 @@ public abstract class GameImpl implements Game, Serializable { GameEvent event = new GameEvent(GameEvent.EventType.PLAY_TURN, null, null, extraTurn.getPlayerId()); if (!replaceEvent(event)) { Player extraPlayer = this.getPlayer(extraTurn.getPlayerId()); - if (extraPlayer != null && extraPlayer.isInGame()) { + if (extraPlayer != null && extraPlayer.canRespond()) { state.setExtraTurn(true); state.setTurnId(extraTurn.getId()); if (!this.isSimulation()) { @@ -1176,7 +1176,7 @@ public abstract class GameImpl implements Game, Serializable { } player = getPlayer(state.getPlayerList().get()); state.setPriorityPlayerId(player.getId()); - while (!player.isPassed() && player.isInGame() && !isPaused() && !gameOver(null)) { + while (!player.isPassed() && player.canRespond() && !isPaused() && !gameOver(null)) { if (!resuming) { // 603.3. Once an ability has triggered, its controller puts it on the stack as an object that’s not a card the next time a player would receive priority checkStateAndTriggered(); @@ -1270,7 +1270,7 @@ public abstract class GameImpl implements Game, Serializable { protected boolean allPassed() { for (Player player : state.getPlayers().values()) { - if (!player.isPassed() && player.isInGame()) { + if (!player.isPassed() && player.canRespond()) { return false; } } diff --git a/Mage/src/mage/game/combat/Combat.java b/Mage/src/mage/game/combat/Combat.java index 1ed22dcf96c..8474758049c 100644 --- a/Mage/src/mage/game/combat/Combat.java +++ b/Mage/src/mage/game/combat/Combat.java @@ -236,7 +236,7 @@ public class Combat implements Serializable, Copyable { if (!game.getPlayer(game.getActivePlayerId()).getAvailableAttackers(game).isEmpty()) { player.selectAttackers(game, attackerId); } - if (game.isPaused() || game.gameOver(null)) { + if (game.isPaused() || game.gameOver(null) || game.executingRollback()) { return; } // because of possible undo during declare attackers it's neccassary to call here the methods with "game.getCombat()." to get the valid combat object!!! @@ -393,7 +393,7 @@ public class Combat implements Serializable, Copyable { } while (choose) { controller.selectBlockers(game, defenderId); - if (game.isPaused() || game.gameOver(null)) { + if (game.isPaused() || game.gameOver(null) || game.executingRollback()) { return; } if (!this.checkBlockRestrictions(defender, game)) { diff --git a/Mage/src/mage/game/combat/CombatGroup.java b/Mage/src/mage/game/combat/CombatGroup.java index 1c50ff3d1b0..e7cf83c8a75 100644 --- a/Mage/src/mage/game/combat/CombatGroup.java +++ b/Mage/src/mage/game/combat/CombatGroup.java @@ -434,7 +434,7 @@ public class CombatGroup implements Serializable, Copyable { Player player = game.getPlayer(playerId); List blockerList = new ArrayList<>(blockers); blockerOrder.clear(); - while (true && player.isInGame()) { + while (true && player.canRespond()) { if (blockerList.size() == 1) { blockerOrder.add(blockerList.get(0)); break; diff --git a/Mage/src/mage/game/stack/StackObjImpl.java b/Mage/src/mage/game/stack/StackObjImpl.java index c2a725153ad..8ca3c7a6be5 100644 --- a/Mage/src/mage/game/stack/StackObjImpl.java +++ b/Mage/src/mage/game/stack/StackObjImpl.java @@ -182,7 +182,7 @@ public abstract class StackObjImpl implements StackObject { newTarget.clearChosen(); } } - } while (targetController.isInGame() && (targetId.equals(newTarget.getFirstTarget()) || newTarget.getTargets().size() != 1)); + } while (targetController.canRespond() && (targetId.equals(newTarget.getFirstTarget()) || newTarget.getTargets().size() != 1)); // choose a new target } else { // build a target definition with exactly one possible target to select that replaces old target @@ -235,7 +235,7 @@ public abstract class StackObjImpl implements StackObject { newTarget.addTarget(tempTarget.getFirstTarget(), target.getTargetAmount(targetId), ability, game, false); } } - } while (again && targetController.isInGame()); + } while (again && targetController.canRespond()); } } // keep the target else { diff --git a/Mage/src/mage/game/turn/DeclareBlockersStep.java b/Mage/src/mage/game/turn/DeclareBlockersStep.java index 6343853aa58..02b6d804089 100644 --- a/Mage/src/mage/game/turn/DeclareBlockersStep.java +++ b/Mage/src/mage/game/turn/DeclareBlockersStep.java @@ -25,15 +25,13 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.game.turn; +import java.util.UUID; import mage.constants.PhaseStep; import mage.game.Game; import mage.game.events.GameEvent.EventType; -import java.util.UUID; - /** * * @author BetaSteward_at_googlemail.com @@ -63,7 +61,7 @@ public class DeclareBlockersStep extends Step { public void beginStep(Game game, UUID activePlayerId) { super.beginStep(game, activePlayerId); game.getCombat().selectBlockers(game); - if (!game.isPaused()) { + if (!game.isPaused() && !game.executingRollback()) { game.getCombat().acceptBlockers(game); game.getCombat().damageAssignmentOrder(game); } diff --git a/Mage/src/mage/game/turn/Phase.java b/Mage/src/mage/game/turn/Phase.java index eac4f2308bb..a474976eaae 100644 --- a/Mage/src/mage/game/turn/Phase.java +++ b/Mage/src/mage/game/turn/Phase.java @@ -163,6 +163,9 @@ public abstract class Phase implements Serializable { currentStep = step; if (!game.getState().getTurnMods().skipStep(activePlayerId, currentStep.getType())) { playStep(game); + if (game.executingRollback()) { + return true; + } } } @@ -203,13 +206,13 @@ public abstract class Phase implements Serializable { if (!currentStep.skipStep(game, activePlayerId)) { game.getState().increaseStepNum(); prePriority(game, activePlayerId); - if (!game.isPaused() && !game.gameOver(null)) { + if (!game.isPaused() && !game.gameOver(null) && !game.executingRollback()) { currentStep.priority(game, activePlayerId, false); if (game.executingRollback()) { return; } } - if (!game.isPaused() && !game.gameOver(null)) { + if (!game.isPaused() && !game.gameOver(null) && !game.executingRollback()) { postPriority(game, activePlayerId); } } diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 60ea5a123af..023d63e04ca 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -214,6 +214,14 @@ public interface Player extends MageItem, Copyable { */ boolean isInGame(); + /** + * Player is still active in game (has not left, lost or won the game) and + * no abort state is given. + * + * @return + */ + boolean canRespond(); + /** * Called if other player left the game * diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 2f92485f6ab..fc0e8c1a280 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -1399,7 +1399,7 @@ public abstract class PlayerImpl implements Player, Serializable { filter.add(Predicates.not(new PermanentIdPredicate(permanent.getId()))); } // while targets left and there is still allowed to untap - while (isInGame() && leftForUntap.size() > 0 && numberToUntap > 0) { + while (canRespond() && leftForUntap.size() > 0 && numberToUntap > 0) { // player has to select the permanent he wants to untap for this restriction Ability ability = handledEntry.getKey().getValue().iterator().next(); if (ability != null) { @@ -1449,7 +1449,7 @@ public abstract class PlayerImpl implements Player, Serializable { } } - } while (isInGame() && playerCanceledSelection); + } while (canRespond() && playerCanceledSelection); if (!game.isSimulation()) { // show in log which permanents were selected to untap @@ -2017,6 +2017,11 @@ public abstract class PlayerImpl implements Player, Serializable { return !hasQuit() && !hasLost() && !hasWon() && !hasLeft(); } + @Override + public boolean canRespond() { // abort is checked here to get out of player requests + return !hasQuit() && !hasLost() && !hasWon() && !hasLeft() && !abort; + } + @Override public boolean hasWon() { if (!this.loses) { @@ -3014,7 +3019,7 @@ public abstract class PlayerImpl implements Player, Serializable { if (chooseOrder) { TargetCard target = new TargetCard(fromZone, new FilterCard("card to put on the top of your graveyard (last one chosen will be topmost)")); target.setRequired(true); - while (choosingPlayer.isInGame() && cards.size() > 1) { + while (choosingPlayer.canRespond() && cards.size() > 1) { choosingPlayer.chooseTarget(Outcome.Neutral, cards, target, source, game); UUID targetObjectId = target.getFirstTarget(); Card card = cards.get(targetObjectId, game); From 8dca887fadbbea41fb649ff17c5fe547a82ef23a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 2 Aug 2015 12:41:29 +0200 Subject: [PATCH 254/375] * Added tooltip to the flag in the player avatar. --- Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java index 5b8de71db4a..11a79b265b9 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -240,6 +240,7 @@ public class PlayerPanelExt extends javax.swing.JPanel { if (!player.getUserData().getFlagName().equals(flagName)) { flagName = player.getUserData().getFlagName(); this.avatarFlag.setIcon(CountryUtil.getCountryFlagIcon(flagName)); + this.avatarFlag.setToolTipText(CountryUtil.getCountryName(flagName)); avatar.repaint(); } } From 1d84f3a5b2f4d132a5a28f776696aca00efbaff1 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 2 Aug 2015 19:25:27 +0300 Subject: [PATCH 255/375] Implement cards: Addle, Ancient Kavu, Dead Ringers, and Raging Spirit --- .../src/mage/sets/apocalypse/DeadRingers.java | 102 +++++++++++++++++ Mage.Sets/src/mage/sets/invasion/Addle.java | 54 +++++++++ .../src/mage/sets/invasion/AncientKavu.java | 67 +++++++++++ .../src/mage/sets/mirage/RagingSpirit.java | 67 +++++++++++ .../src/mage/sets/vintagemasters/Addle.java | 107 ++++++++++++++++++ 5 files changed, 397 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java create mode 100644 Mage.Sets/src/mage/sets/invasion/Addle.java create mode 100644 Mage.Sets/src/mage/sets/invasion/AncientKavu.java create mode 100644 Mage.Sets/src/mage/sets/mirage/RagingSpirit.java create mode 100644 Mage.Sets/src/mage/sets/vintagemasters/Addle.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java b/Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java new file mode 100644 index 00000000000..60d856bbee0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java @@ -0,0 +1,102 @@ +/* + * 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.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class DeadRingers extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonblack creature"); + + static { + filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK))); + } + + public DeadRingers(UUID ownerId) { + super(ownerId, 37, "Dead Ringers", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{4}{B}"); + this.expansionSetCode = "APC"; + + // Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated. + this.getSpellAbility().addEffect(new DeadRingersEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, filter, false)); + } + + public DeadRingers(final DeadRingers card) { + super(card); + } + + @Override + public DeadRingers copy() { + return new DeadRingers(this); + } +} + +class DeadRingersEffect extends DestroyTargetEffect { + + public DeadRingersEffect() { + super(true); + staticText = "estroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated."; + } + + public DeadRingersEffect(final DeadRingersEffect effect) { + super(effect); + } + + @Override + public DeadRingersEffect copy() { + return new DeadRingersEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Target target = source.getTargets().get(0); + Permanent first = game.getPermanentOrLKIBattlefield(target.getTargets().get(0)); + Permanent second = game.getPermanentOrLKIBattlefield(target.getTargets().get(1)); + if(first != null && second != null && first.getColor(game).equals(second.getColor(game))) { + return super.apply(game, source); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/Addle.java b/Mage.Sets/src/mage/sets/invasion/Addle.java new file mode 100644 index 00000000000..c24d025e91e --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/Addle.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.invasion; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class Addle extends mage.sets.vintagemasters.Addle { + + public Addle(UUID ownerId) { + super(ownerId); + this.cardNumber = 91; + this.expansionSetCode = "INV"; + this.rarity = Rarity.UNCOMMON; + } + + public Addle(final Addle card) { + super(card); + } + + @Override + public Addle copy() { + return new Addle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/AncientKavu.java b/Mage.Sets/src/mage/sets/invasion/AncientKavu.java new file mode 100644 index 00000000000..9a2e595139c --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/AncientKavu.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.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesColorSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class AncientKavu extends CardImpl { + + public AncientKavu(UUID ownerId) { + super(ownerId, 136, "Ancient Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "INV"; + this.subtype.add("Kavu"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {2}: Ancient Kavu becomes colorless until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorSourceEffect(new ObjectColor(), Duration.EndOfTurn), new ManaCostsImpl("{2}"))); + } + + public AncientKavu(final AncientKavu card) { + super(card); + } + + @Override + public AncientKavu copy() { + return new AncientKavu(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/RagingSpirit.java b/Mage.Sets/src/mage/sets/mirage/RagingSpirit.java new file mode 100644 index 00000000000..436e9f76045 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/RagingSpirit.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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesColorSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class RagingSpirit extends CardImpl { + + public RagingSpirit(UUID ownerId) { + super(ownerId, 188, "Raging Spirit", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Spirit"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {2}: Raging Spirit becomes colorless until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorSourceEffect(new ObjectColor(), Duration.EndOfTurn), new ManaCostsImpl("{2}"))); + } + + public RagingSpirit(final RagingSpirit card) { + super(card); + } + + @Override + public RagingSpirit copy() { + return new RagingSpirit(this); + } +} diff --git a/Mage.Sets/src/mage/sets/vintagemasters/Addle.java b/Mage.Sets/src/mage/sets/vintagemasters/Addle.java new file mode 100644 index 00000000000..baa462bbf4e --- /dev/null +++ b/Mage.Sets/src/mage/sets/vintagemasters/Addle.java @@ -0,0 +1,107 @@ +/* + * 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.vintagemasters; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LoneFox + */ +public class Addle extends CardImpl { + + public Addle(UUID ownerId) { + super(ownerId, 103, "Addle", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{B}"); + this.expansionSetCode = "VMA"; + + // Choose a color. Target player reveals his or her hand and you choose a card of that color from it. That player discards that card. + this.getSpellAbility().addEffect(new AddleEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public Addle(final Addle card) { + super(card); + } + + @Override + public Addle copy() { + return new Addle(this); + } +} + +class AddleEffect extends OneShotEffect { + + AddleEffect() { + super(Outcome.Discard); + staticText = "Choose a color. Target player reveals his or her hand and you choose a card of that color from it. That player discards that card."; + } + + AddleEffect(final AddleEffect effect) { + super(effect); + } + + @Override + public AddleEffect copy() { + return new AddleEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if(controller != null) { + ChoiceColor choice = new ChoiceColor(); + controller.choose(outcome, choice, game); + ObjectColor color = choice.getColor(); + if(color != null) { + game.informPlayers(new StringBuilder(controller.getLogName()).append(" chooses ").append(color).toString()); + FilterCard filter = new FilterCard(); + filter.add(new ColorPredicate(color)); + Effect effect = new DiscardCardYouChooseTargetEffect(filter); + return effect.apply(game, source); + } + } + return false; + } +} From 7963188f7627e34d09391061a2845641fb120e17 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 2 Aug 2015 21:13:49 +0300 Subject: [PATCH 256/375] Fix typo --- Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java b/Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java index 60d856bbee0..22e8ab64b2d 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java +++ b/Mage.Sets/src/mage/sets/apocalypse/DeadRingers.java @@ -77,7 +77,7 @@ class DeadRingersEffect extends DestroyTargetEffect { public DeadRingersEffect() { super(true); - staticText = "estroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated."; + staticText = "Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated."; } public DeadRingersEffect(final DeadRingersEffect effect) { From 2934942a78ee50b3cee8cb4440bafd4587e54ff7 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 2 Aug 2015 22:07:16 +0300 Subject: [PATCH 257/375] Implement cards: Betrayal, Insolence, and Seizures. Fix Lust for War, which was incorrectly giving an ability to enchanted creature --- Mage.Sets/src/mage/sets/iceage/Seizures.java | 121 ++++++++++++++++++ .../src/mage/sets/planeshift/Insolence.java | 74 +++++++++++ .../sets/riseoftheeldrazi/LustForWar.java | 20 +-- Mage.Sets/src/mage/sets/visions/Betrayal.java | 81 ++++++++++++ ...BecomesTappedAttachedTriggeredAbility.java | 80 ++++++++++++ .../DamageAttachedControllerEffect.java | 88 +++++++++++++ 6 files changed, 455 insertions(+), 9 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/iceage/Seizures.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/Insolence.java create mode 100644 Mage.Sets/src/mage/sets/visions/Betrayal.java create mode 100644 Mage/src/mage/abilities/common/BecomesTappedAttachedTriggeredAbility.java create mode 100644 Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java diff --git a/Mage.Sets/src/mage/sets/iceage/Seizures.java b/Mage.Sets/src/mage/sets/iceage/Seizures.java new file mode 100644 index 00000000000..5fdc2881cc2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/Seizures.java @@ -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.iceage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class Seizures extends CardImpl { + + public Seizures(UUID ownerId) { + super(ownerId, 47, "Seizures", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + this.expansionSetCode = "ICE"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Whenever enchanted creature becomes tapped, Seizures deals 3 damage to that creature's controller unless that player pays {3}. + this.addAbility(new BecomesTappedAttachedTriggeredAbility(new SeizuresEffect(), false)); + } + + public Seizures(final Seizures card) { + super(card); + } + + @Override + public Seizures copy() { + return new Seizures(this); + } +} + + +class SeizuresEffect extends OneShotEffect { + + public SeizuresEffect() { + super(Outcome.Damage); + staticText = "{this} deals 3 damage to that creature's controller unless that player pays {3}"; + } + + public SeizuresEffect(final SeizuresEffect effect) { + super(effect); + } + + @Override + public SeizuresEffect copy() { + return new SeizuresEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if(enchantment == null) { + return false; + } + Permanent enchanted = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo()); + if(enchanted == null) { + return false; + } + Player player = game.getPlayer(enchanted.getControllerId()); + if(player != null) { + Cost cost = new ManaCostsImpl("{3}"); + if(cost.canPay(source, source.getSourceId(), player.getId(), game) + && player.chooseUse(Outcome.Benefit, "Pay " + cost.getText() + " to avoid damage?", source, game)) { + cost.clearPaid(); + if(cost.pay(source, game, source.getSourceId(), player.getId(), false)) { + return true; + } + } + player.damage(3, source.getSourceId(), game, false, true); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/Insolence.java b/Mage.Sets/src/mage/sets/planeshift/Insolence.java new file mode 100644 index 00000000000..4fdcbf1b6c5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/Insolence.java @@ -0,0 +1,74 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.target.TargetPermanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; +import mage.abilities.effects.common.DamageAttachedControllerEffect; + + +/** + * + * @author LoneFox + */ +public class Insolence extends CardImpl { + + public Insolence(UUID ownerId) { + super(ownerId, 63, "Insolence", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Whenever enchanted creature becomes tapped, Insolence deals 2 damage to that creature's controller. + this.addAbility(new BecomesTappedAttachedTriggeredAbility(new DamageAttachedControllerEffect(2), false)); + } + + public Insolence(final Insolence card) { + super(card); + } + + @Override + public Insolence copy() { + return new Insolence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/LustForWar.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/LustForWar.java index 403a433405f..0f72528f309 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/LustForWar.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/LustForWar.java @@ -28,17 +28,20 @@ package mage.sets.riseoftheeldrazi; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; -import mage.abilities.common.BecomesTappedTriggeredAbility; +import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.DamageAttachedControllerEffect; import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -56,17 +59,16 @@ public class LustForWar extends CardImpl { // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); // Whenever enchanted creature becomes tapped, Lust for War deals 3 damage to that creature's controller. - Ability attachedAbility = new BecomesTappedTriggeredAbility(new DamageControllerEffect(3)); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(attachedAbility, AttachmentType.AURA))); + this.addAbility(new BecomesTappedAttachedTriggeredAbility(new DamageAttachedControllerEffect(3), false)); // Enchanted creature attacks each turn if able. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA))); + new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA))); } public LustForWar(final LustForWar card) { diff --git a/Mage.Sets/src/mage/sets/visions/Betrayal.java b/Mage.Sets/src/mage/sets/visions/Betrayal.java new file mode 100644 index 00000000000..db86ed389fc --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/Betrayal.java @@ -0,0 +1,81 @@ +/* + * 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.visions; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class Betrayal extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public Betrayal(UUID ownerId) { + super(ownerId, 26, "Betrayal", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + this.expansionSetCode = "VIS"; + this.subtype.add("Aura"); + + // Enchant creature an opponent controls + TargetPermanent auraTarget = new TargetCreaturePermanent(filter); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Whenever enchanted creature becomes tapped, you draw a card. + this.addAbility(new BecomesTappedAttachedTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); + } + + public Betrayal(final Betrayal card) { + super(card); + } + + @Override + public Betrayal copy() { + return new Betrayal(this); + } +} diff --git a/Mage/src/mage/abilities/common/BecomesTappedAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesTappedAttachedTriggeredAbility.java new file mode 100644 index 00000000000..3c09bae181c --- /dev/null +++ b/Mage/src/mage/abilities/common/BecomesTappedAttachedTriggeredAbility.java @@ -0,0 +1,80 @@ +/* + * 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.abilities.common; + +import mage.constants.Zone; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; + +/** + * + * @author LoneFox + */ +public class BecomesTappedAttachedTriggeredAbility extends TriggeredAbilityImpl { + + public BecomesTappedAttachedTriggeredAbility(Effect effect, boolean isOptional) { + super(Zone.BATTLEFIELD, effect, isOptional); + } + + public BecomesTappedAttachedTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect); + } + + public BecomesTappedAttachedTriggeredAbility(final BecomesTappedAttachedTriggeredAbility ability) { + super(ability); + } + + @Override + public BecomesTappedAttachedTriggeredAbility copy() { + return new BecomesTappedAttachedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TAPPED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent enchantment = game.getPermanent(this.getSourceId()); + if(enchantment == null) { + return false; + } + Permanent enchanted = game.getPermanent(enchantment.getAttachedTo()); + return enchanted != null && event.getTargetId().equals(enchanted.getId()); + } + + @Override + public String getRule() { + return "Whenever enchanted creature becomes tapped, " + super.getRule(); + } +} diff --git a/Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java b/Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java new file mode 100644 index 00000000000..59d67607b10 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java @@ -0,0 +1,88 @@ +/* + * 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.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author LoneFox + */ +public class DamageAttachedControllerEffect extends OneShotEffect { + + protected int amount; + + public DamageAttachedControllerEffect(int amount) { + super(Outcome.Damage); + this.amount = amount; + } + + public DamageAttachedControllerEffect(final DamageAttachedControllerEffect effect) { + super(effect); + this.amount = effect.amount; + } + + @Override + public DamageAttachedControllerEffect copy() { + return new DamageAttachedControllerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if(enchantment == null) { + return false; + } + Permanent enchanted = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo()); + if(enchanted == null) { + return false; + } + Player player = game.getPlayer(enchanted.getControllerId()); + if(player != null) { + player.damage(amount, source.getSourceId(), game, false, true); + return true; + } + return false; + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + return "{this} deals " + amount + " to that creature's controller"; + } + +} From 22c1631587ae941d4bd60a18950da7f000a19d80 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 3 Aug 2015 12:23:16 +0200 Subject: [PATCH 258/375] * Duegar Hedge-Mage - Set triggered abilities to optional. --- .../sets/betrayersofkamigawa/BudokaPupil.java | 8 +-- .../sets/betrayersofkamigawa/CallowJushi.java | 4 +- .../betrayersofkamigawa/CunningBandit.java | 4 +- .../betrayersofkamigawa/FaithfulSquire.java | 21 +++--- .../sets/betrayersofkamigawa/HiredMuscle.java | 6 +- .../championsofkamigawa/KitsuneMystic.java | 11 ++- .../mage/sets/commander/DuergarHedgeMage.java | 4 +- .../mage/sets/commander2013/SunDroplet.java | 4 +- .../src/mage/sets/eventide/HagHedgeMage.java | 14 ++-- .../src/mage/sets/eventide/HelixPinnacle.java | 5 +- .../mage/sets/eventide/NoggleHedgeMage.java | 14 ++-- .../sets/fatereforged/FlamewakePhoenix.java | 3 +- .../mage/sets/fatereforged/FrontierSiege.java | 8 +-- .../mage/sets/innistrad/ScreechingBat.java | 4 +- .../mage/sets/innistrad/StalkingVampire.java | 11 ++- .../sets/khansoftarkir/MarduHeartPiercer.java | 4 +- .../sets/khansoftarkir/MarduHordechief.java | 6 +- .../sets/khansoftarkir/MarduSkullhunter.java | 6 +- .../sets/khansoftarkir/MarduWarshrieker.java | 4 +- .../sets/khansoftarkir/TimelyHordemate.java | 4 +- .../mage/sets/khansoftarkir/WingmateRoc.java | 6 +- Mage.Sets/src/mage/sets/legends/LandTax.java | 7 +- .../src/mage/sets/limitedalpha/ManaVault.java | 4 +- .../src/mage/sets/lorwyn/EyesOfTheWisent.java | 7 +- .../sets/mercadianmasques/NetherSpirit.java | 4 +- .../src/mage/sets/ravnica/FiremaneAngel.java | 22 +++--- .../DeathOfAThousandStings.java | 7 +- .../mage/sets/sorinvstibalt/LavabornMuse.java | 6 +- .../mage/sets/timespiral/DeepSeaKraken.java | 2 +- .../sets/worldwake/ShorelineSalvager.java | 8 +-- .../sets/zendikar/BloodchiefAscension.java | 12 ++-- .../mage/sets/zendikar/HellfireMongrel.java | 10 +-- .../sets/zendikar/LuminarchAscension.java | 2 +- Mage/src/mage/abilities/TriggeredAbility.java | 67 ++++++++++--------- .../mage/abilities/TriggeredAbilityImpl.java | 9 ++- .../common/OnEventTriggeredAbility.java | 61 +++++++++-------- .../ConditionalTriggeredAbility.java | 19 ++++-- 37 files changed, 202 insertions(+), 196 deletions(-) diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/BudokaPupil.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/BudokaPupil.java index b62b7be6920..476c169bda6 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/BudokaPupil.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/BudokaPupil.java @@ -71,13 +71,13 @@ public class BudokaPupil extends CardImpl { this.flipCardName = "Ichiga, Who Topples Oaks"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Budoka Pupil. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); // At the beginning of the end step, if there are two or more ki counters on Budoka Pupil, you may flip it. this.addAbility(new ConditionalTriggeredAbility( - new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new IchigaWhoTopplesOaks())), + new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new IchigaWhoTopplesOaks()), true), new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), - "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.", true)); + "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.")); } public BudokaPupil(final BudokaPupil card) { @@ -107,7 +107,7 @@ class IchigaWhoTopplesOaks extends Token { // Remove a ki counter from Ichiga, Who Topples Oaks: Target creature gets +2/+2 until end of turn. Ability ability = new SimpleActivatedAbility( Zone.BATTLEFIELD, - new BoostTargetEffect(2,2, Duration.EndOfTurn), + new BoostTargetEffect(2, 2, Duration.EndOfTurn), new RemoveCountersSourceCost(CounterType.KI.createInstance())); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/CallowJushi.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/CallowJushi.java index 5398adce4aa..10d30538375 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/CallowJushi.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/CallowJushi.java @@ -70,13 +70,13 @@ public class CallowJushi extends CardImpl { this.flipCardName = "Jaraku the Interloper"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Callow Jushi. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); // At the beginning of the end step, if there are two or more ki counters on Callow Jushi, you may flip it. this.addAbility(new ConditionalTriggeredAbility( new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new JarakuTheInterloper())), new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), - "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.", true)); + "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.")); } public CallowJushi(final CallowJushi card) { diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/CunningBandit.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/CunningBandit.java index e887396724a..33245d2dd50 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/CunningBandit.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/CunningBandit.java @@ -70,13 +70,13 @@ public class CunningBandit extends CardImpl { this.flipCardName = "Azamuki, Treachery Incarnate"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Cunning Bandit. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); // At the beginning of the end step, if there are two or more ki counters on Cunning Bandit, you may flip it. this.addAbility(new ConditionalTriggeredAbility( new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new AzamukiTreacheryIncarnate())), new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), - "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.", true)); + "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.")); } public CunningBandit(final CunningBandit card) { diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FaithfulSquire.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FaithfulSquire.java index d9502221675..60cc38d784a 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FaithfulSquire.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FaithfulSquire.java @@ -27,16 +27,14 @@ * or implied, of BetaSteward_at_googlemail.com. * */ - package mage.sets.betrayersofkamigawa; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; -import mage.constants.Zone; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.*; +import mage.abilities.common.OnEventTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.decorator.ConditionalTriggeredAbility; @@ -45,15 +43,16 @@ import mage.abilities.effects.common.PreventDamageToTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterSpiritOrArcaneCard; import mage.game.events.GameEvent; import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; - - /** * @author LevelX2 */ @@ -79,9 +78,9 @@ public class FaithfulSquire extends CardImpl { this.addAbility(new ConditionalTriggeredAbility( new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new KaisoMemoryOfLoyalty())), new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), - "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.", true)); + "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.")); - } + } public FaithfulSquire(final FaithfulSquire card) { super(card); diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/HiredMuscle.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/HiredMuscle.java index 69d3a50a0a1..d837323a7e3 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/HiredMuscle.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/HiredMuscle.java @@ -70,14 +70,14 @@ public class HiredMuscle extends CardImpl { this.flipCard = true; this.flipCardName = "Scarmaker"; - // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Hired Muscle. + // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Hired Muscle. this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); - + // At the beginning of the end step, if there are two or more ki counters on Hired Muscle, you may flip it. this.addAbility(new ConditionalTriggeredAbility( new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new Scarmaker())), new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), - "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.", true)); + "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.")); } public HiredMuscle(final HiredMuscle card) { diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/KitsuneMystic.java b/Mage.Sets/src/mage/sets/championsofkamigawa/KitsuneMystic.java index 566d4f8dbae..1d5d17b9d2f 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/KitsuneMystic.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/KitsuneMystic.java @@ -28,10 +28,6 @@ package mage.sets.championsofkamigawa; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.OnEventTriggeredAbility; @@ -42,6 +38,10 @@ import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.FlipSourceEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterEnchantmentPermanent; import mage.filter.predicate.Predicate; import mage.filter.predicate.mageobject.SubtypePredicate; @@ -72,8 +72,7 @@ public class KitsuneMystic extends CardImpl { // At the beginning of the end step, if Kitsune Mystic is enchanted by two or more Auras, flip it. this.addAbility(new ConditionalTriggeredAbility( new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new AutumnTailKitsuneSage())), - new EnchantedCondition(2),"At the beginning of the end step, if {this} is enchanted by two or more Auras, flip it.", false - )); + new EnchantedCondition(2), "At the beginning of the end step, if {this} is enchanted by two or more Auras, flip it.")); } public KitsuneMystic(final KitsuneMystic card) { diff --git a/Mage.Sets/src/mage/sets/commander/DuergarHedgeMage.java b/Mage.Sets/src/mage/sets/commander/DuergarHedgeMage.java index c8aca6974f8..74cbf400920 100644 --- a/Mage.Sets/src/mage/sets/commander/DuergarHedgeMage.java +++ b/Mage.Sets/src/mage/sets/commander/DuergarHedgeMage.java @@ -60,8 +60,8 @@ public class DuergarHedgeMage extends CardImpl { filter2.add(new SubtypePredicate("Plains")); filter3.add(new CardTypePredicate(CardType.ENCHANTMENT)); } - private String rule1 = "When {this} enters the battlefield, if you control two or more Mountains, you may destroy target artifact."; - private String rule2 = "When {this} enters the battlefield, if you control two or more Plains, you may destroy target enchantment."; + private final String rule1 = "When {this} enters the battlefield, if you control two or more Mountains, you may destroy target artifact."; + private final String rule2 = "When {this} enters the battlefield, if you control two or more Plains, you may destroy target enchantment."; public DuergarHedgeMage(UUID ownerId) { super(ownerId, 195, "Duergar Hedge-Mage", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R/W}"); diff --git a/Mage.Sets/src/mage/sets/commander2013/SunDroplet.java b/Mage.Sets/src/mage/sets/commander2013/SunDroplet.java index acc33c800a6..815034633f3 100644 --- a/Mage.Sets/src/mage/sets/commander2013/SunDroplet.java +++ b/Mage.Sets/src/mage/sets/commander2013/SunDroplet.java @@ -63,10 +63,10 @@ public class SunDroplet extends CardImpl { // Whenever you're dealt damage, put that many charge counters on Sun Droplet. this.addAbility(new SunDropletTriggeredAbility()); // At the beginning of each upkeep, you may remove a charge counter from Sun Droplet. If you do, you gain 1 life. - Effect effect = new DoIfCostPaid(new GainLifeEffect(1),new RemoveCountersSourceCost(CounterType.CHARGE.createInstance(1))); + Effect effect = new DoIfCostPaid(new GainLifeEffect(1), new RemoveCountersSourceCost(CounterType.CHARGE.createInstance(1))); this.addAbility(new ConditionalTriggeredAbility(new BeginningOfUpkeepTriggeredAbility(effect, TargetController.ANY, false), new SourceHasCounterCondition(CounterType.CHARGE, 1), - "At the beginning of each upkeep, you may remove a charge counter from Sun Droplet. If you do, you gain 1 life", false)); + "At the beginning of each upkeep, you may remove a charge counter from Sun Droplet. If you do, you gain 1 life")); } public SunDroplet(final SunDroplet card) { diff --git a/Mage.Sets/src/mage/sets/eventide/HagHedgeMage.java b/Mage.Sets/src/mage/sets/eventide/HagHedgeMage.java index 05effd0fbab..dc278fa1bbf 100644 --- a/Mage.Sets/src/mage/sets/eventide/HagHedgeMage.java +++ b/Mage.Sets/src/mage/sets/eventide/HagHedgeMage.java @@ -47,18 +47,18 @@ import mage.target.common.TargetCardInYourGraveyard; /** * * @author jeffwadsworth - + * */ public class HagHedgeMage extends CardImpl { - + private final static FilterLandPermanent filter = new FilterLandPermanent(); private final static FilterLandPermanent filter2 = new FilterLandPermanent(); - + static { filter.add(new SubtypePredicate("Swamp")); filter2.add(new SubtypePredicate("Forest")); } - + private String rule = "When {this} enters the battlefield, if you control two or more Swamps, you may have target player discard a card."; private String rule2 = "When {this} enters the battlefield, if you control two or more Forests, you may put target card from your graveyard on top of your library."; @@ -72,12 +72,12 @@ public class HagHedgeMage extends CardImpl { this.toughness = new MageInt(2); // When Hag Hedge-Mage enters the battlefield, if you control two or more Swamps, you may have target player discard a card. - Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1), true), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1), rule, true); + Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1), true), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1), rule); ability.addTarget(new TargetPlayer()); this.addAbility(ability); - + // When Hag Hedge-Mage enters the battlefield, if you control two or more Forests, you may put target card from your graveyard on top of your library. - Ability ability2 = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new PutOnLibraryTargetEffect(true), true), new PermanentsOnTheBattlefieldCondition(filter2, CountType.MORE_THAN, 1), rule2, true); + Ability ability2 = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new PutOnLibraryTargetEffect(true), true), new PermanentsOnTheBattlefieldCondition(filter2, CountType.MORE_THAN, 1), rule2); ability2.addTarget(new TargetCardInYourGraveyard()); this.addAbility(ability2); } diff --git a/Mage.Sets/src/mage/sets/eventide/HelixPinnacle.java b/Mage.Sets/src/mage/sets/eventide/HelixPinnacle.java index 4ee82c7e94e..412e96bafd8 100644 --- a/Mage.Sets/src/mage/sets/eventide/HelixPinnacle.java +++ b/Mage.Sets/src/mage/sets/eventide/HelixPinnacle.java @@ -56,7 +56,6 @@ public class HelixPinnacle extends CardImpl { super(ownerId, 68, "Helix Pinnacle", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{G}"); this.expansionSetCode = "EVE"; - // Shroud this.addAbility(ShroudAbility.getInstance()); @@ -64,12 +63,12 @@ public class HelixPinnacle extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.TOWER.createInstance(), new ManacostVariableValue(), true), new ManaCostsImpl("{X}"))); - + // At the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game. this.addAbility(new ConditionalTriggeredAbility( new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new WinGameSourceControllerEffect(), TargetController.YOU, false), new SourceHasCounterCondition(CounterType.TOWER, 100), - rule, false )); + rule)); } diff --git a/Mage.Sets/src/mage/sets/eventide/NoggleHedgeMage.java b/Mage.Sets/src/mage/sets/eventide/NoggleHedgeMage.java index 855a008226f..ca34334442c 100644 --- a/Mage.Sets/src/mage/sets/eventide/NoggleHedgeMage.java +++ b/Mage.Sets/src/mage/sets/eventide/NoggleHedgeMage.java @@ -48,18 +48,18 @@ import mage.target.TargetPlayer; /** * * @author jeffwadsworth - + * */ public class NoggleHedgeMage extends CardImpl { - + private final static FilterLandPermanent filter = new FilterLandPermanent(); private final static FilterLandPermanent filter2 = new FilterLandPermanent(); - + static { filter.add(new SubtypePredicate("Island")); filter2.add(new SubtypePredicate("Mountain")); } - + private String rule = "When {this} enters the battlefield, if you control two or more Islands, you may tap two target permanents."; private String rule2 = "When {this} enters the battlefield, if you control two or more Mountains, you may have {this} deal 2 damage to target player."; @@ -73,12 +73,12 @@ public class NoggleHedgeMage extends CardImpl { this.toughness = new MageInt(2); // When Noggle Hedge-Mage enters the battlefield, if you control two or more Islands, you may tap two target permanents. - Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new TapTargetEffect(), true), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1), rule, true); + Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new TapTargetEffect(), true), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1), rule); ability.addTarget(new TargetPermanent(2, new FilterPermanent())); this.addAbility(ability); - + // When Noggle Hedge-Mage enters the battlefield, if you control two or more Mountains, you may have Noggle Hedge-Mage deal 2 damage to target player. - Ability ability2 = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2), true), new PermanentsOnTheBattlefieldCondition(filter2, CountType.MORE_THAN, 1), rule2, true); + Ability ability2 = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2), true), new PermanentsOnTheBattlefieldCondition(filter2, CountType.MORE_THAN, 1), rule2); ability2.addTarget(new TargetPlayer()); this.addAbility(ability2); } diff --git a/Mage.Sets/src/mage/sets/fatereforged/FlamewakePhoenix.java b/Mage.Sets/src/mage/sets/fatereforged/FlamewakePhoenix.java index 6253286a82a..64c1c219294 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/FlamewakePhoenix.java +++ b/Mage.Sets/src/mage/sets/fatereforged/FlamewakePhoenix.java @@ -71,8 +71,7 @@ public class FlamewakePhoenix extends CardImpl { new DoIfCostPaid(new ReturnToBattlefieldUnderOwnerControlSourceEffect(), new ManaCostsImpl("{R")), TargetController.YOU, false, false), FerociousCondition.getInstance(), - "Ferocious — At the beginning of combat on your turn, if you control a creature with power 4 or greater, you may pay {R}. If you do, return {this} from your graveyard to the battlefield.", - false + "Ferocious — At the beginning of combat on your turn, if you control a creature with power 4 or greater, you may pay {R}. If you do, return {this} from your graveyard to the battlefield." )); } diff --git a/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java b/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java index af1e120216e..f02ca1e3c0b 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java +++ b/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java @@ -76,8 +76,8 @@ public class FrontierSiege extends CardImpl { this.expansionSetCode = "FRF"; // As Frontier Siege enters the battlefield, choose Khans or Dragons. - this.addAbility(new EntersBattlefieldAbility(new ChooseModeEffect("Khans or Dragons?","Khans", "Dragons"),null, true, - "As {this} enters the battlefield, choose Khans or Dragons.","")); + this.addAbility(new EntersBattlefieldAbility(new ChooseModeEffect("Khans or Dragons?", "Khans", "Dragons"), null, true, + "As {this} enters the battlefield, choose Khans or Dragons.", "")); // * Khans - At the beginning of each of your main phases, add {G}{G} to your mana pool. this.addAbility(new ConditionalTriggeredAbility( @@ -89,7 +89,7 @@ public class FrontierSiege extends CardImpl { Ability ability2 = new ConditionalTriggeredAbility( new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new FrontierSiegeFightEffect(), filter, true, SetTargetPointer.PERMANENT, ""), new ModeChoiceSourceCondition("Dragons"), - ruleTrigger2, true); + ruleTrigger2); ability2.addTarget(new TargetCreaturePermanent(filter2)); this.addAbility(ability2); @@ -108,7 +108,7 @@ public class FrontierSiege extends CardImpl { class FrontierSiegeKhansTriggeredAbility extends TriggeredAbilityImpl { public FrontierSiegeKhansTriggeredAbility() { - super(Zone.BATTLEFIELD, new AddManaToManaPoolSourceControllerEffect(new Mana(0,2,0,0,0,0,0)), false); + super(Zone.BATTLEFIELD, new AddManaToManaPoolSourceControllerEffect(new Mana(0, 2, 0, 0, 0, 0, 0)), false); } diff --git a/Mage.Sets/src/mage/sets/innistrad/ScreechingBat.java b/Mage.Sets/src/mage/sets/innistrad/ScreechingBat.java index 5948bfa65c0..b3453bcd2e6 100644 --- a/Mage.Sets/src/mage/sets/innistrad/ScreechingBat.java +++ b/Mage.Sets/src/mage/sets/innistrad/ScreechingBat.java @@ -68,7 +68,7 @@ public class ScreechingBat extends CardImpl { // At the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Screeching Bat. this.addAbility(new TransformAbility()); - this.addAbility(new ConditionalTriggeredAbility(new ScreechingBatBeginningOfUpkeepTriggeredAbility(), new TransformedCondition(true), "", true)); + this.addAbility(new ConditionalTriggeredAbility(new ScreechingBatBeginningOfUpkeepTriggeredAbility(), new TransformedCondition(true), "")); } public ScreechingBat(final ScreechingBat card) { @@ -84,7 +84,7 @@ public class ScreechingBat extends CardImpl { class ScreechingBatBeginningOfUpkeepTriggeredAbility extends TriggeredAbilityImpl { public ScreechingBatBeginningOfUpkeepTriggeredAbility() { - super(Zone.BATTLEFIELD, new ScreechingBatTransformSourceEffect()); + super(Zone.BATTLEFIELD, new ScreechingBatTransformSourceEffect(), true); } public ScreechingBatBeginningOfUpkeepTriggeredAbility(final ScreechingBatBeginningOfUpkeepTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/sets/innistrad/StalkingVampire.java b/Mage.Sets/src/mage/sets/innistrad/StalkingVampire.java index ad2db3b4221..2535c9ccb8e 100644 --- a/Mage.Sets/src/mage/sets/innistrad/StalkingVampire.java +++ b/Mage.Sets/src/mage/sets/innistrad/StalkingVampire.java @@ -27,14 +27,13 @@ */ package mage.sets.innistrad; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.MageInt; -import mage.cards.CardImpl; - import java.util.UUID; +import mage.MageInt; import mage.abilities.condition.common.TransformedCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; /** * @author nantuko @@ -54,7 +53,7 @@ public class StalkingVampire extends CardImpl { this.toughness = new MageInt(5); // At the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Stalking Vampire. - this.addAbility(new ConditionalTriggeredAbility(new ScreechingBatBeginningOfUpkeepTriggeredAbility(), new TransformedCondition(), "", true)); + this.addAbility(new ConditionalTriggeredAbility(new ScreechingBatBeginningOfUpkeepTriggeredAbility(), new TransformedCondition(), "")); } public StalkingVampire(final StalkingVampire card) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHeartPiercer.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHeartPiercer.java index 033f51b6ca2..f1c30c2f600 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHeartPiercer.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHeartPiercer.java @@ -56,8 +56,8 @@ public class MarduHeartPiercer extends CardImpl { this.toughness = new MageInt(3); // Raid - When Mardu Heart-Piercer enters the battlefield, if you attacked with a creature this turn, Mardu Heart-Piercer deals 2 damage to target creature or player. - Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2)), RaidCondition.getInstance(), - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, {this} deals 2 damage to target creature or player.", false); + Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2)), RaidCondition.getInstance(), + "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, {this} deals 2 damage to target creature or player."); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java index 299076753d0..4452b0dd55b 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java @@ -55,8 +55,8 @@ public class MarduHordechief extends CardImpl { this.toughness = new MageInt(3); // Raid - When Mardu Hordechief enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield - this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new MarduHordechiefToken())), RaidCondition.getInstance(), - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield.", false), + this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new MarduHordechiefToken())), RaidCondition.getInstance(), + "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield."), new PlayerAttackedWatcher()); } @@ -82,4 +82,4 @@ class MarduHordechiefToken extends Token { power = new MageInt(1); toughness = new MageInt(1); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduSkullhunter.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduSkullhunter.java index 30527e67f8b..edf6cec6f80 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduSkullhunter.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduSkullhunter.java @@ -58,10 +58,10 @@ public class MarduSkullhunter extends CardImpl { // Mardu Skullhunter enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - + // Raid - When Mardu Skullhunter enters the battlefield, if you attacked with a creature this turn, target opponent discards a card. - Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1)), RaidCondition.getInstance(), - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, target opponent discards a card.", false); + Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1)), RaidCondition.getInstance(), + "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, target opponent discards a card."); ability.addTarget(new TargetOpponent()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduWarshrieker.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduWarshrieker.java index f9b1153e60e..754c0bfdc42 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduWarshrieker.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduWarshrieker.java @@ -55,8 +55,8 @@ public class MarduWarshrieker extends CardImpl { this.toughness = new MageInt(3); // Raid - When Mardu Warshrieker enters the battlefield, if you attacked with a creature this turn, add {R}{W}{B} to your mana pool. - this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new AddManaToManaPoolSourceControllerEffect(new Mana(1,0,0,1,1,0,0))), RaidCondition.getInstance(), - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, add {R}{W}{B} to your mana pool.", false), + this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new AddManaToManaPoolSourceControllerEffect(new Mana(1, 0, 0, 1, 1, 0, 0))), RaidCondition.getInstance(), + "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, add {R}{W}{B} to your mana pool."), new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/TimelyHordemate.java b/Mage.Sets/src/mage/sets/khansoftarkir/TimelyHordemate.java index d6887609b9e..752f4feaa87 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/TimelyHordemate.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/TimelyHordemate.java @@ -65,8 +65,8 @@ public class TimelyHordemate extends CardImpl { this.toughness = new MageInt(2); // Raid - When Timely Hordemate enters the battlefield, if you attacked this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield. - Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()), RaidCondition.getInstance(), - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield.", false); + Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()), RaidCondition.getInstance(), + "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield."); ability.addTarget(new TargetCardInYourGraveyard(filter)); this.addAbility(ability, new PlayerAttackedWatcher()); diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/WingmateRoc.java b/Mage.Sets/src/mage/sets/khansoftarkir/WingmateRoc.java index 4d8acfaf0de..900b263134d 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/WingmateRoc.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/WingmateRoc.java @@ -60,10 +60,10 @@ public class WingmateRoc extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // Raid - When Wingmate Roc enters the battlefield, if you attacked with a creature this turn, put a 3/4 white Bird creature token with flying onto the battlefield. - this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WingmateRocToken())), RaidCondition.getInstance(), - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, put a 3/4 white Bird creature token with flying onto the battlefield.", false), + this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WingmateRocToken())), RaidCondition.getInstance(), + "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, put a 3/4 white Bird creature token with flying onto the battlefield."), new PlayerAttackedWatcher()); // Whenever Wingmate Roc attacks, you gain 1 life for each attacking creature. diff --git a/Mage.Sets/src/mage/sets/legends/LandTax.java b/Mage.Sets/src/mage/sets/legends/LandTax.java index e88e6284dc2..ffd80349b0c 100644 --- a/Mage.Sets/src/mage/sets/legends/LandTax.java +++ b/Mage.Sets/src/mage/sets/legends/LandTax.java @@ -52,12 +52,11 @@ public class LandTax extends CardImpl { // At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, and put them into your hand. If you do, shuffle your library. this.addAbility(new ConditionalTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 3, new FilterBasicLandCard()), true),TargetController.YOU, true), + new BeginningOfUpkeepTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 3, new FilterBasicLandCard()), true), TargetController.YOU, true), new OpponentControllsMoreCondition(new FilterLandPermanent("lands")), - "At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, and put them into your hand. If you do, shuffle your library", - true + "At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, and put them into your hand. If you do, shuffle your library" )); - + } public LandTax(final LandTax card) { diff --git a/Mage.Sets/src/mage/sets/limitedalpha/ManaVault.java b/Mage.Sets/src/mage/sets/limitedalpha/ManaVault.java index c363dc2eeea..be0e1a38f9f 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/ManaVault.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/ManaVault.java @@ -62,14 +62,14 @@ public class ManaVault extends CardImpl { // At the beginning of your upkeep, you may pay {4}. If you do, untap Mana Vault. this.addAbility(new BeginningOfUpkeepTriggeredAbility( Zone.BATTLEFIELD, - new DoIfCostPaid(new UntapSourceEffect(), new GenericManaCost(4),"Pay {4} to untap {this}?"), + new DoIfCostPaid(new UntapSourceEffect(), new GenericManaCost(4), "Pay {4} to untap {this}?"), TargetController.YOU, false)); // At the beginning of your draw step, if Mana Vault is tapped, it deals 1 damage to you. this.addAbility(new ConditionalTriggeredAbility( new BeginningOfDrawTriggeredAbility(Zone.BATTLEFIELD, new DamageControllerEffect(1), TargetController.YOU, false), SourceTappedCondition.getInstance(), - "At the beginning of your draw step, if {this} is tapped, it deals 1 damage to you.", false)); + "At the beginning of your draw step, if {this} is tapped, it deals 1 damage to you.")); // {tap}: Add {3} to your mana pool. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(3), new TapSourceCost())); } diff --git a/Mage.Sets/src/mage/sets/lorwyn/EyesOfTheWisent.java b/Mage.Sets/src/mage/sets/lorwyn/EyesOfTheWisent.java index 3ccd3418d76..643ea3ea7b2 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/EyesOfTheWisent.java +++ b/Mage.Sets/src/mage/sets/lorwyn/EyesOfTheWisent.java @@ -58,13 +58,12 @@ public class EyesOfTheWisent extends CardImpl { this.expansionSetCode = "LRW"; this.subtype.add("Elemental"); - // Whenever an opponent casts a blue spell during your turn, you may put a 4/4 green Elemental creature token onto the battlefield. this.addAbility(new ConditionalTriggeredAbility( new SpellCastOpponentTriggeredAbility(new CreateTokenEffect(new EyesOfTheWisentElementalToken()), filter, true), new MyTurnCondition(), - "Whenever an opponent casts a blue spell during your turn, you may put a 4/4 green Elemental creature token onto the battlefield.", - true)); + "Whenever an opponent casts a blue spell during your turn, you may put a 4/4 green Elemental creature token onto the battlefield." + )); } public EyesOfTheWisent(final EyesOfTheWisent card) { @@ -89,4 +88,4 @@ class EyesOfTheWisentElementalToken extends Token { toughness = new MageInt(4); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/NetherSpirit.java b/Mage.Sets/src/mage/sets/mercadianmasques/NetherSpirit.java index 25fed1974c5..5502ad72413 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/NetherSpirit.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/NetherSpirit.java @@ -61,7 +61,7 @@ public class NetherSpirit extends CardImpl { // At the beginning of your upkeep, if Nether Spirit is the only creature card in your graveyard, you may return Nether Spirit to the battlefield. TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), TargetController.YOU, true); - this.addAbility(new ConditionalTriggeredAbility(ability, new NetherSpiritCondition(), "At the beginning of your upkeep, if Nether Spirit is the only creature card in your graveyard, you may return Nether Spirit to the battlefield.", true)); + this.addAbility(new ConditionalTriggeredAbility(ability, new NetherSpiritCondition(), "At the beginning of your upkeep, if {this} is the only creature card in your graveyard, you may return {this} to the battlefield.")); } public NetherSpirit(final NetherSpirit card) { @@ -75,7 +75,7 @@ public class NetherSpirit extends CardImpl { } class NetherSpiritCondition implements Condition { - + @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/ravnica/FiremaneAngel.java b/Mage.Sets/src/mage/sets/ravnica/FiremaneAngel.java index d23339da7fe..91b1bbe4eaf 100644 --- a/Mage.Sets/src/mage/sets/ravnica/FiremaneAngel.java +++ b/Mage.Sets/src/mage/sets/ravnica/FiremaneAngel.java @@ -28,9 +28,6 @@ package mage.sets.ravnica; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -41,10 +38,12 @@ import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; -import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.PhaseStep; +import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; @@ -70,12 +69,12 @@ public class FiremaneAngel extends CardImpl { // At the beginning of your upkeep, if Firemane Angel is in your graveyard or on the battlefield, you may gain 1 life. Ability ability = new ConditionalTriggeredAbility( new BeginningOfUpkeepTriggeredAbility(Zone.ALL, new GainLifeEffect(1), TargetController.YOU, true), - SourceOnBattelfieldOrGraveyardCondition.getInstance(), - "At the beginning of your upkeep, if {this} is in your graveyard or on the battlefield, you may gain 1 life", true); + SourceOnBattelfieldOrGraveyardCondition.getInstance(), + "At the beginning of your upkeep, if {this} is in your graveyard or on the battlefield, you may gain 1 life"); this.addAbility(ability); // {6}{R}{R}{W}{W}: Return Firemane Angel from your graveyard to the battlefield. Activate this ability only during your upkeep. - this.addAbility(new ConditionalActivatedAbility(Zone.GRAVEYARD, - new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl("{6}{R}{R}{W}{W}"), new IsStepCondition(PhaseStep.UPKEEP), null)); + this.addAbility(new ConditionalActivatedAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl("{6}{R}{R}{W}{W}"), new IsStepCondition(PhaseStep.UPKEEP), null)); } public FiremaneAngel(final FiremaneAngel card) { @@ -98,8 +97,8 @@ class SourceOnBattelfieldOrGraveyardCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return (game.getState().getZone(source.getSourceId()).equals(Zone.GRAVEYARD) || - game.getState().getZone(source.getSourceId()).equals(Zone.BATTLEFIELD)); + return (game.getState().getZone(source.getSourceId()).equals(Zone.GRAVEYARD) + || game.getState().getZone(source.getSourceId()).equals(Zone.BATTLEFIELD)); } @Override @@ -107,5 +106,4 @@ class SourceOnBattelfieldOrGraveyardCondition implements Condition { return "if {this} is in your graveyard or on the battlefield"; } - -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/DeathOfAThousandStings.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/DeathOfAThousandStings.java index 52c9424e24f..07ac0051eef 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/DeathOfAThousandStings.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/DeathOfAThousandStings.java @@ -53,7 +53,6 @@ public class DeathOfAThousandStings extends CardImpl { this.expansionSetCode = "SOK"; this.subtype.add("Arcane"); - // Target player loses 1 life and you gain 1 life. this.getSpellAbility().addEffect(new LoseLifeTargetEffect(1)); this.getSpellAbility().addTarget(new TargetPlayer()); @@ -64,10 +63,10 @@ public class DeathOfAThousandStings extends CardImpl { // At the beginning of your upkeep, if you have more cards in hand than each opponent, you may return Death of a Thousand Stings from your graveyard to your hand. Ability ability = new ConditionalTriggeredAbility( new BeginningOfUpkeepTriggeredAbility(Zone.GRAVEYARD, - new ReturnSourceFromGraveyardToHandEffect(), - TargetController.YOU, true), + new ReturnSourceFromGraveyardToHandEffect(), + TargetController.YOU, true), new MoreCardsInHandThanOpponentsCondition(), - "At the beginning of your upkeep, if you have more cards in hand than each opponent, you may return {this} from your graveyard to your hand.", true); + "At the beginning of your upkeep, if you have more cards in hand than each opponent, you may return {this} from your graveyard to your hand."); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/sorinvstibalt/LavabornMuse.java b/Mage.Sets/src/mage/sets/sorinvstibalt/LavabornMuse.java index 03353d0dbf7..ca767c08246 100644 --- a/Mage.Sets/src/mage/sets/sorinvstibalt/LavabornMuse.java +++ b/Mage.Sets/src/mage/sets/sorinvstibalt/LavabornMuse.java @@ -58,9 +58,8 @@ public class LavabornMuse extends CardImpl { // At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Lavaborn Muse deals 3 damage to him or her. this.addAbility(new ConditionalTriggeredAbility( new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3), TargetController.OPPONENT, false, true), - new CardsInActivePlayersHandCondition(), - "At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, {this} deals 3 damage to him or her.", - false)); + new CardsInActivePlayersHandCondition(), + "At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, {this} deals 3 damage to him or her.")); } public LavabornMuse(final LavabornMuse card) { @@ -83,4 +82,3 @@ class CardsInActivePlayersHandCondition implements Condition { return player != null && player.getHand().size() <= 2; } } - diff --git a/Mage.Sets/src/mage/sets/timespiral/DeepSeaKraken.java b/Mage.Sets/src/mage/sets/timespiral/DeepSeaKraken.java index ac50ef010e6..1a319bc947f 100644 --- a/Mage.Sets/src/mage/sets/timespiral/DeepSeaKraken.java +++ b/Mage.Sets/src/mage/sets/timespiral/DeepSeaKraken.java @@ -73,7 +73,7 @@ public class DeepSeaKraken extends CardImpl { // Whenever an opponent casts a spell, if Deep-Sea Kraken is suspended, remove a time counter from it. this.addAbility(new ConditionalTriggeredAbility( new SpellCastAllTriggeredAbility(Zone.EXILED, new RemoveCounterSourceEffect(CounterType.TIME.createInstance()), filter, false, SetTargetPointer.NONE), SuspendedCondition.getInstance(), - "Whenever an opponent casts a spell, if Deep-Sea Kraken is suspended, remove a time counter from it.", false)); + "Whenever an opponent casts a spell, if Deep-Sea Kraken is suspended, remove a time counter from it.")); } public DeepSeaKraken(final DeepSeaKraken card) { diff --git a/Mage.Sets/src/mage/sets/worldwake/ShorelineSalvager.java b/Mage.Sets/src/mage/sets/worldwake/ShorelineSalvager.java index f452d321786..765fc14cb19 100644 --- a/Mage.Sets/src/mage/sets/worldwake/ShorelineSalvager.java +++ b/Mage.Sets/src/mage/sets/worldwake/ShorelineSalvager.java @@ -28,15 +28,15 @@ package mage.sets.worldwake; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.TargetController; import mage.MageInt; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; @@ -64,7 +64,7 @@ public class ShorelineSalvager extends CardImpl { this.toughness = new MageInt(3); // Whenever Shoreline Salvager deals combat damage to a player, if you control an Island, you may draw a card. - this.addAbility(new ConditionalTriggeredAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), true), new PermanentsOnTheBattlefieldCondition(filter), rule, true)); + this.addAbility(new ConditionalTriggeredAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), true), new PermanentsOnTheBattlefieldCondition(filter), rule)); } public ShorelineSalvager(final ShorelineSalvager card) { diff --git a/Mage.Sets/src/mage/sets/zendikar/BloodchiefAscension.java b/Mage.Sets/src/mage/sets/zendikar/BloodchiefAscension.java index de0290a429d..ee80fdde649 100644 --- a/Mage.Sets/src/mage/sets/zendikar/BloodchiefAscension.java +++ b/Mage.Sets/src/mage/sets/zendikar/BloodchiefAscension.java @@ -29,21 +29,21 @@ package mage.sets.zendikar; import java.util.UUID; import mage.abilities.Ability; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.TargetController; -import mage.constants.Zone; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.OpponentLostLifeCondition; +import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.SetTargetPointer; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterCard; @@ -69,7 +69,7 @@ public class BloodchiefAscension extends CardImpl { new PutCardIntoGraveFromAnywhereAllTriggeredAbility( new LoseLifeTargetEffect(2), true, new FilterCard("a card"), TargetController.OPPONENT, SetTargetPointer.PLAYER), new SourceHasCounterCondition(CounterType.QUEST, 3), - "Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life", true); + "Whenever a card is put into an opponent's graveyard from anywhere, if {this} has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life"); ability.addEffect(new GainLifeEffect(2)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/zendikar/HellfireMongrel.java b/Mage.Sets/src/mage/sets/zendikar/HellfireMongrel.java index a4a5ba090ba..00260eb4154 100644 --- a/Mage.Sets/src/mage/sets/zendikar/HellfireMongrel.java +++ b/Mage.Sets/src/mage/sets/zendikar/HellfireMongrel.java @@ -30,11 +30,9 @@ package mage.sets.zendikar; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -42,9 +40,7 @@ import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.GameEvent; import mage.players.Player; -import mage.target.targetpointer.FixedTarget; /** * @@ -64,9 +60,9 @@ public class HellfireMongrel extends CardImpl { // At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Hellfire Mongrel deals 2 damage to him or her. this.addAbility(new ConditionalTriggeredAbility( new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), TargetController.OPPONENT, false, true), - new CardsInActivePlayersHandCondition(), - "At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, {this} deals 2 damage to him or her.", - false)); + new CardsInActivePlayersHandCondition(), + "At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, {this} deals 2 damage to him or her." + )); } public HellfireMongrel(final HellfireMongrel card) { diff --git a/Mage.Sets/src/mage/sets/zendikar/LuminarchAscension.java b/Mage.Sets/src/mage/sets/zendikar/LuminarchAscension.java index 5464750d433..466a68220af 100644 --- a/Mage.Sets/src/mage/sets/zendikar/LuminarchAscension.java +++ b/Mage.Sets/src/mage/sets/zendikar/LuminarchAscension.java @@ -61,7 +61,7 @@ public class LuminarchAscension extends CardImpl { this.expansionSetCode = "ZEN"; // At the beginning of each opponent's end step, if you didn't lose life this turn, you may put a quest counter on Luminarch Ascension. - this.addAbility(new ConditionalTriggeredAbility(new LuminarchAscensionTriggeredAbility(), YouLostNoLifeThisTurnCondition.getInstance(), rule, true)); + this.addAbility(new ConditionalTriggeredAbility(new LuminarchAscensionTriggeredAbility(), YouLostNoLifeThisTurnCondition.getInstance(), rule)); // {1}{W}: Put a 4/4 white Angel creature token with flying onto the battlefield. Activate this ability only if Luminarch Ascension has four or more quest counters on it. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new AngelToken()), new ManaCostsImpl("{1}{W}")); diff --git a/Mage/src/mage/abilities/TriggeredAbility.java b/Mage/src/mage/abilities/TriggeredAbility.java index b2c5e9cb535..b00b022a552 100644 --- a/Mage/src/mage/abilities/TriggeredAbility.java +++ b/Mage/src/mage/abilities/TriggeredAbility.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities; import java.util.UUID; @@ -39,19 +38,25 @@ import mage.game.events.GameEvent; public interface TriggeredAbility extends Ability { void trigger(Game game, UUID controllerId); - + /** - * This check for the relevant event types is called at first to prevent further actions if - * the current event is ignored from this triggered ability + * This check for the relevant event types is called at first to prevent + * further actions if the current event is ignored from this triggered + * ability + * * @param event * @param game * @return */ boolean checkEventType(GameEvent event, Game game); + boolean checkTrigger(GameEvent event, Game game); + boolean checkInterveningIfClause(Game game); + boolean isOptional(); + @Override TriggeredAbility copy(); - + } diff --git a/Mage/src/mage/abilities/TriggeredAbilityImpl.java b/Mage/src/mage/abilities/TriggeredAbilityImpl.java index fdbcf485ee5..0c9cf7411c5 100644 --- a/Mage/src/mage/abilities/TriggeredAbilityImpl.java +++ b/Mage/src/mage/abilities/TriggeredAbilityImpl.java @@ -84,7 +84,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge }*/ @Override public boolean resolve(Game game) { - if (optional) { + if (isOptional()) { MageObject object = game.getObject(getSourceId()); Player player = game.getPlayer(this.getControllerId()); if (player != null) { @@ -124,7 +124,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge StringBuilder sb = new StringBuilder(); if (!superRule.isEmpty()) { String ruleLow = superRule.toLowerCase(); - if (optional) { + if (isOptional()) { if (ruleLow.startsWith("you ")) { if (!ruleLow.startsWith("you may")) { StringBuilder newRule = new StringBuilder(superRule); @@ -197,4 +197,9 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge return super.isInUseableZone(game, source, event); } + @Override + public boolean isOptional() { + return optional; + } + } diff --git a/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java b/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java index b1130c36a49..c724b43fbe3 100644 --- a/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.common; import mage.abilities.TriggeredAbilityImpl; @@ -58,13 +57,17 @@ public class OnEventTriggeredAbility extends TriggeredAbilityImpl { } public OnEventTriggeredAbility(EventType eventType, String eventName, boolean allPlayers, Effect effect) { + this(eventType, eventName, allPlayers, effect, false); + } + + public OnEventTriggeredAbility(EventType eventType, String eventName, boolean allPlayers, Effect effect, boolean optional) { super(Zone.BATTLEFIELD, effect); this.eventType = eventType; this.eventName = eventName; this.allPlayers = allPlayers; } - public OnEventTriggeredAbility(OnEventTriggeredAbility ability) { + public OnEventTriggeredAbility(final OnEventTriggeredAbility ability) { super(ability); this.eventType = ability.eventType; this.eventName = ability.eventName; @@ -78,7 +81,7 @@ public class OnEventTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (allPlayers || event.getPlayerId().equals(this.controllerId) ) { + if (allPlayers || event.getPlayerId().equals(this.controllerId)) { return true; } return false; diff --git a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java index a6888eabba5..abc62f152c4 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java +++ b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java @@ -21,16 +21,20 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl { protected Condition condition; protected String text; + /** + * Triggered ability with a condition. Set the optionality for the trigger + * ability itself. + * + * @param ability + * @param condition + * @param text if null or empty, the rule text of the triggered ability + * itself is used. + */ public ConditionalTriggeredAbility(TriggeredAbility ability, Condition condition, String text) { - this(ability, condition, text, false); - } - - public ConditionalTriggeredAbility(TriggeredAbility ability, Condition condition, String text, boolean optional) { super(ability.getZone(), null); this.ability = ability; this.modes = ability.getModes(); this.condition = condition; - this.optional = optional; this.text = text; } @@ -86,4 +90,9 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl { return ability.getEffects(game, effectType); } + @Override + public boolean isOptional() { + return ability.isOptional(); + } + } From a02c0fac2fcd105ea5e839909bb821ae87eae29c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 3 Aug 2015 14:45:08 +0200 Subject: [PATCH 259/375] * Fixed a bug that prevented that cards from Classic Six Edition were shown in mage. --- Mage.Sets/src/mage/sets/ClassicSixthEdition.java | 1 - Mage.Sets/src/mage/sets/FifthEdition.java | 6 +++--- Mage/src/mage/util/ClassScanner.java | 12 ++++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Mage.Sets/src/mage/sets/ClassicSixthEdition.java b/Mage.Sets/src/mage/sets/ClassicSixthEdition.java index 543300a0f50..191829e2a60 100644 --- a/Mage.Sets/src/mage/sets/ClassicSixthEdition.java +++ b/Mage.Sets/src/mage/sets/ClassicSixthEdition.java @@ -28,7 +28,6 @@ package mage.sets; import java.util.GregorianCalendar; - import mage.cards.ExpansionSet; import mage.constants.SetType; diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index 5f3a0b10e3b..91d596d49a0 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -1,12 +1,12 @@ package mage.sets; import java.util.GregorianCalendar; -import mage.constants.SetType; import mage.cards.ExpansionSet; +import mage.constants.SetType; public class FifthEdition extends ExpansionSet { - private static final FifthEdition fINSTANCE = new FifthEdition(); + private static final FifthEdition fINSTANCE = new FifthEdition(); public static FifthEdition getInstance() { return fINSTANCE; @@ -19,7 +19,7 @@ public class FifthEdition extends ExpansionSet { this.numBoosterCommon = 11; this.numBoosterUncommon = 3; this.numBoosterRare = 1; - this.ratioBoosterMythic = 0; + this.ratioBoosterMythic = 0; } } diff --git a/Mage/src/mage/util/ClassScanner.java b/Mage/src/mage/util/ClassScanner.java index 434258be2ed..88406c6250e 100644 --- a/Mage/src/mage/util/ClassScanner.java +++ b/Mage/src/mage/util/ClassScanner.java @@ -47,13 +47,13 @@ import java.util.jar.JarInputStream; public class ClassScanner { public static List findClasses(List packages, Class type) { - List cards = new ArrayList(); + List cards = new ArrayList<>(); try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); assert classLoader != null; - HashMap dirs = new HashMap(); - TreeSet jars = new TreeSet(); + HashMap dirs = new HashMap<>(); + TreeSet jars = new TreeSet<>(); for (String packageName : packages) { String path = packageName.replace('.', '/'); Enumeration resources = classLoader.getResources(path); @@ -84,7 +84,7 @@ public class ClassScanner { } private static List findClasses(File directory, String packageName, Class type) { - List cards = new ArrayList(); + List cards = new ArrayList<>(); if (!directory.exists()) { return cards; } @@ -104,7 +104,7 @@ public class ClassScanner { } private static List findClassesInJar(File file, List packages, Class type) { - List cards = new ArrayList(); + List cards = new ArrayList<>(); if (!file.exists()) { return cards; } @@ -117,7 +117,7 @@ public class ClassScanner { break; } if (jarEntry.getName().endsWith(".class")) { - String className = jarEntry.getName().replace('/', '.').replace(".class", ""); + String className = jarEntry.getName().replace(".class", "").replace('/', '.'); int packageNameEnd = className.lastIndexOf('.'); String packageName = packageNameEnd != -1 ? className.substring(0, packageNameEnd) : ""; if (packages.contains(packageName)) { From 1ba5dbda973118c1e59fad2b830a413c5042691c Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 3 Aug 2015 16:06:25 +0300 Subject: [PATCH 260/375] Implement cards: Dralnu's Pet, Malicious Advice, and Mask of Intolerance --- .../sets/apocalypse/MaskOfIntolerance.java | 82 +++++++++++ .../src/mage/sets/planeshift/DralnusPet.java | 132 ++++++++++++++++++ .../mage/sets/planeshift/MaliciousAdvice.java | 91 ++++++++++++ .../dynamicvalue/common/DomainValue.java | 12 +- 4 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/DralnusPet.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java b/Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java new file mode 100644 index 00000000000..5a5cebcb196 --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.IntCompareCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.dynamicvalue.common.DomainValue; +import mage.abilities.effects.common.DamageTargetEffect; +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.target.targetpointer.FixedTarget; + +/** + * + * @author LoneFox + */ +public class MaskOfIntolerance extends CardImpl { + + public MaskOfIntolerance(UUID ownerId) { + super(ownerId, 138, "Mask of Intolerance", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "APC"; + + // At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, Mask of Intolerance deals 3 damage to him or her. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3), TargetController.ANY, false); + this.addAbility(new ConditionalTriggeredAbility(ability, new MaskOfIntoleranceCondition(), + "At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, Mask of Intolerance deals 3 damage to him or her.")); + } + + public MaskOfIntolerance(final MaskOfIntolerance card) { + super(card); + } + + @Override + public MaskOfIntolerance copy() { + return new MaskOfIntolerance(this); + } +} + +class MaskOfIntoleranceCondition extends IntCompareCondition { + + public MaskOfIntoleranceCondition() { + super(ComparisonType.GreaterThan, 3); + } + + @Override + protected int getInputValue(Game game, Ability source) { + return new DomainValue(1, game.getActivePlayerId()).calculate(game, source, null); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/DralnusPet.java b/Mage.Sets/src/mage/sets/planeshift/DralnusPet.java new file mode 100644 index 00000000000..11e62798662 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/DralnusPet.java @@ -0,0 +1,132 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.costs.Cost; +import mage.abilities.costs.Costs; +import mage.abilities.costs.CostsImpl; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.EntersBattlefieldEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author LoneFox + * @author LevelX + */ +public class DralnusPet extends CardImpl { + + public DralnusPet(UUID ownerId) { + super(ownerId, 23, "Dralnu's Pet", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); + this.expansionSetCode = "PLS"; + this.subtype.add("Shapeshifter"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Kicker-{2}{B}, Discard a creature card. + Costs kickerCosts = new CostsImpl<>(); + kickerCosts.add(new ManaCostsImpl<>("{2}{B}")); + kickerCosts.add(new DiscardCardCost(new FilterCreatureCard())); + this.addAbility(new KickerAbility(kickerCosts)); + // If Dralnu's Pet was kicked, it enters the battlefield with flying and with X +1/+1 counters on it, where X is the discarded card's converted mana cost. + Ability ability = new EntersBattlefieldAbility(new DralnusPetEffect(), KickedCondition.getInstance(), true, + "If {this} was kicked, it enters the battlefield with flying and with X +1/+1 counters on it, where X is the discarded card's converted mana cost", ""); + ability.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield)); + this.addAbility(ability); + } + + public DralnusPet(final DralnusPet card) { + super(card); + } + + @Override + public DralnusPet copy() { + return new DralnusPet(this); + } +} + +class DralnusPetEffect extends OneShotEffect { + + public DralnusPetEffect() { + super(Outcome.BoostCreature); + this.staticText = "and with X +1/+1 counters on it, where X is the discarded card's converted mana cost"; + } + + public DralnusPetEffect(final DralnusPetEffect effect) { + super(effect); + } + + @Override + public DralnusPetEffect copy() { + return new DralnusPetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (controller != null && permanent != null) { + Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY); + if (obj != null && obj instanceof SpellAbility) { + int cmc = 0; + for (Cost cost : ((SpellAbility) obj).getCosts()) { + if (cost instanceof DiscardCardCost && ((DiscardCardCost) cost).getCards().size() > 0) { + cmc = ((DiscardCardCost) cost).getCards().get(0).getManaCost().convertedManaCost(); + } + if (cmc > 0) { + return new AddCountersSourceEffect(CounterType.P1P1.createInstance(cmc), true).apply(game, source); + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java b/Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java new file mode 100644 index 00000000000..9633c1f4193 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java @@ -0,0 +1,91 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.target.TargetPermanent; + +/** + * + * @author LoneFox + */ +public class MaliciousAdvice extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifacts, creatures, and/or lands"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public MaliciousAdvice(UUID ownerId) { + super(ownerId, 114, "Malicious Advice", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{X}{U}{B}"); + this.expansionSetCode = "PLS"; + + // Tap X target artifacts, creatures, and/or lands. You lose X life. + Effect effect = new TapTargetEffect(); + effect.setText("Tap X target artifacts, creatures, and/or lands"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(new ManacostVariableValue())); + // Correct number of targets will be set in adjustTargets + // I'm not sure if/why this needs to be here, but other such cards do have it... + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if(ability instanceof SpellAbility) { + ability.getTargets().clear(); + ability.addTarget(new TargetPermanent(ability.getManaCostsToPay().getX(), filter)); + } + } + + public MaliciousAdvice(final MaliciousAdvice card) { + super(card); + } + + @Override + public MaliciousAdvice copy() { + return new MaliciousAdvice(this); + } +} diff --git a/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java b/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java index ca8f4f68cc9..9d021891669 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java @@ -15,6 +15,7 @@ public class DomainValue implements DynamicValue { private Integer amount; private boolean countTargetPlayer; + private UUID player; public DomainValue() { this(1); @@ -33,9 +34,15 @@ public class DomainValue implements DynamicValue { this.countTargetPlayer = countTargetPlayer; } + public DomainValue(Integer amount, UUID player) { + this(amount, false); + this.player = player; + } + public DomainValue(final DomainValue dynamicValue) { this.amount = dynamicValue.amount; this.countTargetPlayer = dynamicValue.countTargetPlayer; + this.player = dynamicValue.player; } @Override @@ -46,7 +53,10 @@ public class DomainValue implements DynamicValue { int haveSwamps = 0; int haveForests = 0; UUID targetPlayer; - if (countTargetPlayer) { + if(player != null) { + targetPlayer = player; + } + else if(countTargetPlayer) { targetPlayer = sourceAbility.getTargets().getFirstTarget(); } else { targetPlayer = sourceAbility.getControllerId(); From 300c12c06ae6c3bd785f2a1cc49fc146605c387d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 3 Aug 2015 16:20:20 +0200 Subject: [PATCH 261/375] * Reality Acid - Fixed that the triggered ability did force sacrifice of wrong permanents. --- .../mage/sets/planarchaos/RealityAcid.java | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java index efce801ac89..4357565e296 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java +++ b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java @@ -30,9 +30,10 @@ package mage.sets.planarchaos; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.common.LeavesBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.ZoneChangeTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.VanishingSacrificeAbility; @@ -41,11 +42,13 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; +import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; +import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; /** * @@ -64,14 +67,16 @@ public class RealityAcid extends CardImpl { this.getSpellAbility().addEffect(new AttachEffect(Outcome.GainControl)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - + // Vanishing 3 this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3)))); this.addAbility(new VanishingUpkeepAbility(3)); this.addAbility(new VanishingSacrificeAbility()); - + // When Reality Acid leaves the battlefield, enchanted permanent's controller sacrifices it. - this.addAbility(new LeavesBattlefieldTriggeredAbility(new RealityAcidLeavesBattlefieldTriggeredEffect(), false)); + Effect effect = new SacrificeTargetEffect(); + effect.setText("enchanted permanent's controller sacrifices it"); + this.addAbility(new RealityAcidTriggeredAbility(effect, false)); } public RealityAcid(final RealityAcid card) { @@ -84,35 +89,36 @@ public class RealityAcid extends CardImpl { } } -class RealityAcidLeavesBattlefieldTriggeredEffect extends OneShotEffect { - - public RealityAcidLeavesBattlefieldTriggeredEffect() { - super(Outcome.Benefit); - this.staticText = "enchanted permanent's controller sacrifices it"; +class RealityAcidTriggeredAbility extends ZoneChangeTriggeredAbility { + + public RealityAcidTriggeredAbility(Effect effect, boolean optional) { + super(Zone.BATTLEFIELD, null, effect, "When {this} leaves the battlefield, ", optional); } - - public RealityAcidLeavesBattlefieldTriggeredEffect(final RealityAcidLeavesBattlefieldTriggeredEffect effect) { - super(effect); + + public RealityAcidTriggeredAbility(RealityAcidTriggeredAbility ability) { + super(ability); } - + @Override - public RealityAcidLeavesBattlefieldTriggeredEffect copy() { - return new RealityAcidLeavesBattlefieldTriggeredEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (controller != null && sourcePermanent != null) { - if (sourcePermanent.getAttachedTo() != null) { + public boolean checkTrigger(GameEvent event, Game game) { + if (super.checkTrigger(event, game)) { + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId()); + if (sourcePermanent != null && sourcePermanent.getAttachedTo() != null) { Permanent attachedTo = game.getPermanent(sourcePermanent.getAttachedTo()); if (attachedTo != null) { - attachedTo.sacrifice(source.getSourceId(), game); + for (Effect effect : getEffects()) { + effect.setTargetPointer(new FixedTarget(attachedTo.getId(), attachedTo.getZoneChangeCounter(game))); + } } } return true; } return false; } -} \ No newline at end of file + + @Override + public RealityAcidTriggeredAbility copy() { + return new RealityAcidTriggeredAbility(this); + } + +} From 96bbe01aae28e956df94756e55053b9db92f7c7b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 3 Aug 2015 16:21:38 +0200 Subject: [PATCH 262/375] * Fixed a bug of auras leaving and returning to battlefield multiple times not be able to target new targets. --- .../effects/AuraReplacementEffect.java | 4 +- .../abilities/keyword/SuspendAbility.java | 172 +++++++++--------- .../keyword/VanishingUpkeepAbility.java | 10 +- 3 files changed, 96 insertions(+), 90 deletions(-) diff --git a/Mage/src/mage/abilities/effects/AuraReplacementEffect.java b/Mage/src/mage/abilities/effects/AuraReplacementEffect.java index eb62e657c20..8c4a0e063e9 100644 --- a/Mage/src/mage/abilities/effects/AuraReplacementEffect.java +++ b/Mage/src/mage/abilities/effects/AuraReplacementEffect.java @@ -119,8 +119,8 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { if (targetId == null) { Target target = card.getSpellAbility().getTargets().get(0); enchantCardInGraveyard = target instanceof TargetCardInGraveyard; - if (enchantCardInGraveyard && target != null) { - target.clearChosen(); + if (target != null) { + target.clearChosen(); // neccessary if e.g. aura is blinked multiple times } Player player = game.getPlayer(card.getOwnerId()); Outcome auraOutcome = Outcome.BoostCreature; diff --git a/Mage/src/mage/abilities/keyword/SuspendAbility.java b/Mage/src/mage/abilities/keyword/SuspendAbility.java index 559b9c5c9a4..03b50951133 100644 --- a/Mage/src/mage/abilities/keyword/SuspendAbility.java +++ b/Mage/src/mage/abilities/keyword/SuspendAbility.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.keyword; import java.util.ArrayList; @@ -63,93 +62,97 @@ import mage.players.Player; * * 502.59. Suspend * - * 502.59a Suspend is a keyword that represents three abilities. The first is a static - * ability that functions while the card with suspend is in a player's hand. The second - * and third are triggered abilities that function in the removed-from-the-game zone. - * "Suspend N--[cost]" means "If you could play this card from your hand, you may pay - * [cost] and remove it from the game with N time counters on it. This is a special - * action that doesn't use the stack," and "At the beginning of your upkeep, if this - * card is suspended, remove a time counter from it," and "When the last time counter - * is removed from this card, if it's removed from the game, play it without paying its - * mana cost if able. If you can't, it remains removed from the game. If you play it - * this way and it's a creature, it gains haste until you lose control of it." + * 502.59a Suspend is a keyword that represents three abilities. The first is a + * static ability that functions while the card with suspend is in a player's + * hand. The second and third are triggered abilities that function in the + * removed-from-the-game zone. "Suspend N--[cost]" means "If you could play this + * card from your hand, you may pay [cost] and remove it from the game with N + * time counters on it. This is a special action that doesn't use the stack," + * and "At the beginning of your upkeep, if this card is suspended, remove a + * time counter from it," and "When the last time counter is removed from this + * card, if it's removed from the game, play it without paying its mana cost if + * able. If you can't, it remains removed from the game. If you play it this way + * and it's a creature, it gains haste until you lose control of it." * - * 502.59b A card is "suspended" if it's in the removed-from-the-game zone, has suspend, - * and has a time counter on it. + * 502.59b A card is "suspended" if it's in the removed-from-the-game zone, has + * suspend, and has a time counter on it. * - * 502.59c Playing a spell as an effect of its suspend ability follows the rules for - * paying alternative costs in rules 409.1b and 409.1f-h. + * 502.59c Playing a spell as an effect of its suspend ability follows the rules + * for paying alternative costs in rules 409.1b and 409.1f-h. * - * The phrase "if you could play this card from your hand" checks only for timing - * restrictions and permissions. This includes both what's inherent in the card's - * type (for example, if the card with suspend is a creature, it must be your main - * phase and the stack must be empty) and what's imposed by other abilities, such - * as flash or Meddling Mage's ability. Whether you could actually follow all steps - * in playing the card is irrelevant. If the card is impossible to play due to a - * lack of legal targets or an unpayable mana cost, for example, it may still be - * removed from the game with suspend. + * The phrase "if you could play this card from your hand" checks only for + * timing restrictions and permissions. This includes both what's inherent in + * the card's type (for example, if the card with suspend is a creature, it must + * be your main phase and the stack must be empty) and what's imposed by other + * abilities, such as flash or Meddling Mage's ability. Whether you could + * actually follow all steps in playing the card is irrelevant. If the card is + * impossible to play due to a lack of legal targets or an unpayable mana cost, + * for example, it may still be removed from the game with suspend. * - * Removing a card from the game with its suspend ability is not playing that card. - * This action doesn't use the stack and can't be responded to. + * Removing a card from the game with its suspend ability is not playing that + * card. This action doesn't use the stack and can't be responded to. * * If a spell with suspend has targets, the targets are chosen when the spell is * played, not when it's removed from the game. * - * If the first triggered ability of suspend is countered, no time counter is removed. - * The ability will trigger again during its owner's next upkeep. + * If the first triggered ability of suspend is countered, no time counter is + * removed. The ability will trigger again during its owner's next upkeep. * - * When the last time counter is removed from a suspended card, the second triggered - * ability of suspend will trigger. It doesn't matter why the time counter was removed - * or whose effect removed it. (The _Time Spiral_ reminder text is misleading on this point.) + * When the last time counter is removed from a suspended card, the second + * triggered ability of suspend will trigger. It doesn't matter why the time + * counter was removed or whose effect removed it. (The _Time Spiral_ reminder + * text is misleading on this point.) * - * If the second triggered ability of suspend is countered, the card can't be played. - * It remains in the removed-from-the-game zone without any time counters on it for the - * rest of the game, and it's no longer considered suspended. + * If the second triggered ability of suspend is countered, the card can't be + * played. It remains in the removed-from-the-game zone without any time + * counters on it for the rest of the game, and it's no longer considered + * suspended. * - * If the second triggered ability of suspend resolves, the card's owner must play the - * spell if possible, even if that player doesn't want to. Normal timing considerations - * for the spell are ignored (for example, if the suspended card is a creature and this - * ability resolves during your upkeep, you’re able to play the card), but other play - * restrictions are not ignored. + * If the second triggered ability of suspend resolves, the card's owner must + * play the spell if possible, even if that player doesn't want to. Normal + * timing considerations for the spell are ignored (for example, if the + * suspended card is a creature and this ability resolves during your upkeep, + * you’re able to play the card), but other play restrictions are not ignored. * - * If the second triggered ability of suspend resolves and the suspended card can't be - * played due to a lack of legal targets or a play restriction, for example, it remains - * in the removed-from-the-game zone without any time counters on it for the rest of the - * game, and it's no longer considered suspended. + * If the second triggered ability of suspend resolves and the suspended card + * can't be played due to a lack of legal targets or a play restriction, for + * example, it remains in the removed-from-the-game zone without any time + * counters on it for the rest of the game, and it's no longer considered + * suspended. * - * As the second triggered ability of suspend resolves, if playing the suspended card - * involves an additional cost, the card's owner must pay that cost if able. If he or - * she can't, the card remains removed from the game. If the additional cost includes - * mana, the situation is more complex. If the player has enough mana in his or her mana - * pool to pay the cost, that player must do so. If the player can't possibly pay the - * cost, the card remains removed from the game. However, if the player has the means - * to produce enough mana to pay the cost, then he or she has a choice: The player may - * play the spell, produce mana, and pay the cost. Or the player may choose to play no - * mana abilities, thus making the card impossible to play because the additional mana - * can't be paid. + * As the second triggered ability of suspend resolves, if playing the suspended + * card involves an additional cost, the card's owner must pay that cost if + * able. If he or she can't, the card remains removed from the game. If the + * additional cost includes mana, the situation is more complex. If the player + * has enough mana in his or her mana pool to pay the cost, that player must do + * so. If the player can't possibly pay the cost, the card remains removed from + * the game. However, if the player has the means to produce enough mana to pay + * the cost, then he or she has a choice: The player may play the spell, produce + * mana, and pay the cost. Or the player may choose to play no mana abilities, + * thus making the card impossible to play because the additional mana can't be + * paid. * - * A creature played via suspend comes into play with haste. It still has haste after - * the first turn it's in play as long as the same player controls it. As soon as another - * player takes control of it, it loses haste. + * A creature played via suspend comes into play with haste. It still has haste + * after the first turn it's in play as long as the same player controls it. As + * soon as another player takes control of it, it loses haste. * * * @author LevelX2 * */ - - public class SuspendAbility extends ActivatedAbilityImpl { private String ruleText; private boolean gainedTemporary; /** - * Gives the card the SuspendAbility - * - * @param suspend - amount of time counters, if Integer.MAX_VALUE is set there will be {X} costs and X counters added - * @param cost - null is used for temporary gained suspend ability - * @param card - card that has the suspend ability - */ + * Gives the card the SuspendAbility + * + * @param suspend - amount of time counters, if Integer.MAX_VALUE is set + * there will be {X} costs and X counters added + * @param cost - null is used for temporary gained suspend ability + * @param card - card that has the suspend ability + */ public SuspendAbility(int suspend, ManaCost cost, Card card) { this(suspend, cost, card, false); } @@ -165,16 +168,16 @@ public class SuspendAbility extends ActivatedAbilityImpl { } StringBuilder sb = new StringBuilder("Suspend "); if (cost != null) { - sb.append(suspend == Integer.MAX_VALUE ? "X":suspend).append(" - ").append(cost.getText()); + sb.append(suspend == Integer.MAX_VALUE ? "X" : suspend).append(" - ").append(cost.getText()); if (!shortRule) { sb.append(" (Rather than cast this card from your hand, pay ") - .append(cost.getText()) - .append(" and exile it with ") - .append((suspend == 1 ? "a time counter": (suspend == Integer.MAX_VALUE ? "X time counters": suspend + " time counters"))) - .append(" on it.") - .append(" At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.") - .append(card.getCardType().contains(CardType.CREATURE)? " If you play it this way and it's a creature, it gains haste until you lose control of it.":"") - .append(")"); + .append(cost.getText()) + .append(" and exile it with ") + .append((suspend == 1 ? "a time counter" : (suspend == Integer.MAX_VALUE ? "X time counters" : suspend + " time counters"))) + .append(" on it.") + .append(" At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.") + .append(card.getCardType().contains(CardType.CREATURE) ? " If you play it this way and it's a creature, it gains haste until you lose control of it." : "") + .append(")
"); } if (card.getManaCost().isEmpty()) { setRuleAtTheTop(true); @@ -186,8 +189,9 @@ public class SuspendAbility extends ActivatedAbilityImpl { } /** - * Adds suspend to a card that does not have it regularly - * e.g. Epochrasite or added by Jhoira of the Ghitu + * Adds suspend to a card that does not have it regularly e.g. Epochrasite + * or added by Jhoira of the Ghitu + * * @param card * @param source * @param game @@ -229,10 +233,10 @@ public class SuspendAbility extends ActivatedAbilityImpl { @Override public boolean canActivate(UUID playerId, Game game) { MageObject object = game.getObject(sourceId); - return (object.getCardType().contains(CardType.INSTANT) || - object.hasAbility(FlashAbility.getInstance().getId(), game) || - game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST_AS_INSTANT, this, playerId, game) || - game.canPlaySorcery(playerId)); + return (object.getCardType().contains(CardType.INSTANT) + || object.hasAbility(FlashAbility.getInstance().getId(), game) + || game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST_AS_INSTANT, this, playerId, game) + || game.canPlaySorcery(playerId)); } @Override @@ -252,11 +256,12 @@ public class SuspendAbility extends ActivatedAbilityImpl { } class SuspendExileEffect extends OneShotEffect { + private int suspend; public SuspendExileEffect(int suspend) { super(Outcome.PutCardInPlay); - this.staticText = new StringBuilder("Suspend ").append(suspend == Integer.MAX_VALUE ? "X":suspend).toString(); + this.staticText = new StringBuilder("Suspend ").append(suspend == Integer.MAX_VALUE ? "X" : suspend).toString(); this.suspend = suspend; } @@ -281,8 +286,9 @@ class SuspendExileEffect extends OneShotEffect { suspend = source.getManaCostsToPay().getX(); } card.addCounters(CounterType.TIME.createInstance(suspend), game); - if (!game.isSimulation()) - game.informPlayers(new StringBuilder(controller.getLogName()).append(" suspends (").append(suspend).append(") ").append(card.getName()).toString()); + if (!game.isSimulation()) { + game.informPlayers(controller.getLogName() + " suspends (" + suspend + ") " + card.getLogName()); + } return true; } } @@ -357,14 +363,14 @@ class SuspendPlayCardEffect extends OneShotEffect { List abilitiesToRemove = new ArrayList<>(); for (Ability ability : card.getAbilities()) { if (ability instanceof SuspendAbility) { - if (((SuspendAbility)ability).isGainedTemporary()) { + if (((SuspendAbility) ability).isGainedTemporary()) { abilitiesToRemove.add(ability); } } } if (!abilitiesToRemove.isEmpty()) { for (Ability ability : card.getAbilities()) { - if (ability instanceof SuspendBeginningOfUpkeepTriggeredAbility || ability instanceof SuspendPlayCardAbility ) { + if (ability instanceof SuspendBeginningOfUpkeepTriggeredAbility || ability instanceof SuspendPlayCardAbility) { abilitiesToRemove.add(ability); } } @@ -434,4 +440,4 @@ class SuspendBeginningOfUpkeepTriggeredAbility extends ConditionalTriggeredAbili public SuspendBeginningOfUpkeepTriggeredAbility copy() { return new SuspendBeginningOfUpkeepTriggeredAbility(this); } -} \ No newline at end of file +} diff --git a/Mage/src/mage/abilities/keyword/VanishingUpkeepAbility.java b/Mage/src/mage/abilities/keyword/VanishingUpkeepAbility.java index 0d7d96b7c57..188ef1bf5a6 100644 --- a/Mage/src/mage/abilities/keyword/VanishingUpkeepAbility.java +++ b/Mage/src/mage/abilities/keyword/VanishingUpkeepAbility.java @@ -31,14 +31,14 @@ public class VanishingUpkeepAbility extends BeginningOfUpkeepTriggeredAbility { @Override public String getRule() { - return new StringBuilder("Vanishing ") - .append(vanishingAmount) - .append(" (This permanent enters the battlefield with ").append(CardUtil.numberToText(vanishingAmount)) - .append(" time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)").toString(); + return "Vanishing " + vanishingAmount + + " (This permanent enters the battlefield with " + CardUtil.numberToText(vanishingAmount) + + " time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)"; } } class VanishingEffect extends OneShotEffect { + VanishingEffect() { super(Outcome.Sacrifice); } @@ -47,7 +47,6 @@ class VanishingEffect extends OneShotEffect { super(effect); } - @Override public boolean apply(Game game, Ability source) { Permanent p = game.getPermanent(source.getSourceId()); @@ -55,6 +54,7 @@ class VanishingEffect extends OneShotEffect { int amount = p.getCounters().getCount(CounterType.TIME); if (amount > 0) { p.removeCounters(CounterType.TIME.createInstance(), game); + game.informPlayers("Removed a time counter from " + p.getLogName() + " (" + amount + " left)"); } return true; } From c1db04812d42f9280b8c286967707b4ebabf3be3 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 3 Aug 2015 20:00:36 +0300 Subject: [PATCH 263/375] Text and coding style fixes from review --- .../src/mage/sets/apocalypse/MaskOfIntolerance.java | 2 +- .../src/mage/sets/planeshift/MaliciousAdvice.java | 3 --- Mage.Sets/src/mage/sets/vintagemasters/Addle.java | 2 +- .../abilities/dynamicvalue/common/DomainValue.java | 12 ++++++------ .../common/DamageAttachedControllerEffect.java | 2 +- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java b/Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java index 5a5cebcb196..c0ac3330e6e 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java +++ b/Mage.Sets/src/mage/sets/apocalypse/MaskOfIntolerance.java @@ -56,7 +56,7 @@ public class MaskOfIntolerance extends CardImpl { // At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, Mask of Intolerance deals 3 damage to him or her. TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3), TargetController.ANY, false); this.addAbility(new ConditionalTriggeredAbility(ability, new MaskOfIntoleranceCondition(), - "At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, Mask of Intolerance deals 3 damage to him or her.")); + "At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, {this} deals 3 damage to him or her.")); } public MaskOfIntolerance(final MaskOfIntolerance card) { diff --git a/Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java b/Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java index 9633c1f4193..a08dc49ceb0 100644 --- a/Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java +++ b/Mage.Sets/src/mage/sets/planeshift/MaliciousAdvice.java @@ -67,9 +67,6 @@ public class MaliciousAdvice extends CardImpl { effect.setText("Tap X target artifacts, creatures, and/or lands"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(new ManacostVariableValue())); - // Correct number of targets will be set in adjustTargets - // I'm not sure if/why this needs to be here, but other such cards do have it... - this.getSpellAbility().addTarget(new TargetPermanent(filter)); } @Override diff --git a/Mage.Sets/src/mage/sets/vintagemasters/Addle.java b/Mage.Sets/src/mage/sets/vintagemasters/Addle.java index baa462bbf4e..3ce4e067d53 100644 --- a/Mage.Sets/src/mage/sets/vintagemasters/Addle.java +++ b/Mage.Sets/src/mage/sets/vintagemasters/Addle.java @@ -95,7 +95,7 @@ class AddleEffect extends OneShotEffect { controller.choose(outcome, choice, game); ObjectColor color = choice.getColor(); if(color != null) { - game.informPlayers(new StringBuilder(controller.getLogName()).append(" chooses ").append(color).toString()); + game.informPlayers(controller.getLogName() + " chooses " + color + "."); FilterCard filter = new FilterCard(); filter.add(new ColorPredicate(color)); Effect effect = new DiscardCardYouChooseTargetEffect(filter); diff --git a/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java b/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java index 9d021891669..06c0efeef47 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/DomainValue.java @@ -15,7 +15,7 @@ public class DomainValue implements DynamicValue { private Integer amount; private boolean countTargetPlayer; - private UUID player; + private UUID playerId; public DomainValue() { this(1); @@ -34,15 +34,15 @@ public class DomainValue implements DynamicValue { this.countTargetPlayer = countTargetPlayer; } - public DomainValue(Integer amount, UUID player) { + public DomainValue(Integer amount, UUID playerId) { this(amount, false); - this.player = player; + this.playerId = playerId; } public DomainValue(final DomainValue dynamicValue) { this.amount = dynamicValue.amount; this.countTargetPlayer = dynamicValue.countTargetPlayer; - this.player = dynamicValue.player; + this.playerId = dynamicValue.playerId; } @Override @@ -53,8 +53,8 @@ public class DomainValue implements DynamicValue { int haveSwamps = 0; int haveForests = 0; UUID targetPlayer; - if(player != null) { - targetPlayer = player; + if(playerId != null) { + targetPlayer = playerId; } else if(countTargetPlayer) { targetPlayer = sourceAbility.getTargets().getFirstTarget(); diff --git a/Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java b/Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java index 59d67607b10..b248481aad9 100644 --- a/Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java +++ b/Mage/src/mage/abilities/effects/common/DamageAttachedControllerEffect.java @@ -82,7 +82,7 @@ public class DamageAttachedControllerEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - return "{this} deals " + amount + " to that creature's controller"; + return "{this} deals " + amount + " damage to that creature's controller"; } } From dd8e4b52144cca1f291e430ae256046616580253 Mon Sep 17 00:00:00 2001 From: Xavierv3131 Date: Mon, 3 Aug 2015 15:57:33 -0400 Subject: [PATCH 264/375] Implemented Coastal Piracy Implemented the card Coastal Piracy from MMQ and 8ED. --- .../sets/eighthedition/CoastalPiracy.java | 53 +++++++++ .../sets/mercadianmasques/CoastalPiracy.java | 106 ++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java diff --git a/Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java b/Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java new file mode 100644 index 00000000000..3a39041be0b --- /dev/null +++ b/Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java @@ -0,0 +1,53 @@ +/* + * 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.eightediton; + +import java.util.UUID; + +/** + * + * @author Xavierv3131 + */ +public class CoastalPiracy extends mage.sets.mercadianmasques.CoastalPiracy { + + public CoastalPiracy(UUID ownerId) { + super(ownerId); + this.cardNumber = 67; + this.expansionSetCode = "8ED"; + this.rarity = Rarity.RARE; + } + + public CoastalPiracy(final CoastalPiracy card) { + super(card); + } + + @Override + public CoastalPiracy copy() { + return new CoastalPiracy(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java b/Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java new file mode 100644 index 00000000000..3f82bc4f48e --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java @@ -0,0 +1,106 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; + +/** +* +* @author Xavierv3131 +*/ +public class CoastalPiracy extends CardImpl { + + public CoastalPiracy(UUID ownerId) { + super(ownerId, 68, "Coastal Piracy", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); + this.expansionSetCode = "MMQ"; + + + // Whenever a creature you control deals combat damage to an opponent, you may draw a card. + this.addAbility(new CoastalPiracyTriggeredAbility()); + } + + public CoastalPiracy(final CoastalPiracy card) { + super(card); + } + + @Override + public CoastalPiracy copy() { + return new CoastalPiracy(this); + } +} + +class CoastalPiracyTriggeredAbility extends TriggeredAbilityImpl { + + public CoastalPiracyTriggeredAbility() { + super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1)); + this.optional = true; + } + + public CoastalPiracyTriggeredAbility(final CoastalPiracyTriggeredAbility ability) { + super(ability); + } + + @Override + public CoastalPiracyTriggeredAbility copy() { + return new CoastalPiracyTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (((DamagedPlayerEvent) event).isCombatDamage()) && + game.getOpponents(this.controllerId).contains(((DamagedPlayerEvent) event).getPlayerId())) { + Permanent creature = game.getPermanent(event.getSourceId()); + if (creature != null && creature.getControllerId().equals(controllerId)) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a creature you control deals combat damage to an opponent, you may draw a card."; + } + +} \ No newline at end of file From 0a8d9adda62461f69709b3e73f9d6e6bb6326246 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Mon, 3 Aug 2015 21:42:34 -0700 Subject: [PATCH 265/375] implemented Urborg Justice --- .../mage/sets/weatherlight/UrborgJustice.java | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java diff --git a/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java b/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java new file mode 100644 index 00000000000..92b876666df --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java @@ -0,0 +1,145 @@ +/* + * 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.weatherlight; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.SacrificeControllerEffect; +import mage.abilities.effects.common.SacrificeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.WatcherScope; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetOpponent; +import mage.watchers.Watcher; + +/** + * + * @author andyfries + */ +public class UrborgJustice extends CardImpl { + + public UrborgJustice(UUID ownerId) { + super(ownerId, 26, "Urborg Justice", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{B}{B}"); + this.expansionSetCode = "WTH"; + + // Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn. + this.getSpellAbility().addWatcher(new UrborgJusticeWatcher()); + SacrificeEffect sacrificeEffect = new SacrificeEffect(new FilterCreaturePermanent(), new UrborgJusticeDynamicValue(), ""); + sacrificeEffect.setText("Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn"); + + this.getSpellAbility().addEffect(sacrificeEffect); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public UrborgJustice(final UrborgJustice card) { + super(card); + } + + @Override + public UrborgJustice copy() { + return new UrborgJustice(this); + } +} + +class UrborgJusticeWatcher extends Watcher { + + private int creaturesCount = 0; + + public UrborgJusticeWatcher() { + super("YourCreaturesDied", WatcherScope.PLAYER); + condition = true; + } + + public UrborgJusticeWatcher(final UrborgJusticeWatcher watcher) { + super(watcher); + this.creaturesCount = watcher.creaturesCount; + } + + @Override + public UrborgJusticeWatcher copy() { + return new UrborgJusticeWatcher(this); + } + + public int getCreaturesCount() { + return creaturesCount; + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).isDiesEvent()) { + Permanent card = (Permanent)game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); + if (card != null && card.getOwnerId().equals(this.controllerId) && card.getCardType().contains(CardType.CREATURE)) { + creaturesCount++; + } + } + } + + @Override + public void reset() { + super.reset(); + creaturesCount = 0; + } +} + +class UrborgJusticeDynamicValue implements DynamicValue { + @Override + public UrborgJusticeDynamicValue copy() { + return new UrborgJusticeDynamicValue(); + } + + @Override + public String toString() { + return "1"; + } + + @Override + public String getMessage() { + return "creature put into your graveyard from the battlefield this turn"; + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + UrborgJusticeWatcher watcher = (UrborgJusticeWatcher) game.getState().getWatchers().get("YourCreaturesDied", sourceAbility.getControllerId()); + if (watcher != null) { + return watcher.getCreaturesCount(); + } + return 0; + } +} From 5e250dca06650a5f3fd09f3abdc0d2cbe779cf46 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Aug 2015 08:26:15 +0200 Subject: [PATCH 266/375] * Release 1.4.2v5 --- Mage.Common/src/mage/utils/MageVersion.java | 2 +- Mage/src/mage/cards/repository/CardRepository.java | 2 +- Utils/release/getting_implemented_cards.txt | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java index cc72ce6562a..59ec03f9cd2 100644 --- a/Mage.Common/src/mage/utils/MageVersion.java +++ b/Mage.Common/src/mage/utils/MageVersion.java @@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable { public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; public final static int MAGE_VERSION_PATCH = 2; - public final static String MAGE_VERSION_MINOR_PATCH = "v4"; + public final static String MAGE_VERSION_MINOR_PATCH = "v5"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 019be833338..997e68430ac 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -60,7 +60,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 41; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 30; + private static final long CARD_CONTENT_VERSION = 31; private final Random random = new Random(); private Dao cardDao; diff --git a/Utils/release/getting_implemented_cards.txt b/Utils/release/getting_implemented_cards.txt index 60049b9bff6..212b6db2e4c 100644 --- a/Utils/release/getting_implemented_cards.txt +++ b/Utils/release/getting_implemented_cards.txt @@ -158,6 +158,9 @@ git log 60c7a2b34b5dd9a64bd415b65424a559294cf52b..HEAD --diff-filter=A --name-st since 1.4.2.v4 git log 193177d9999d56729a687ca3b1a2fc3f3b96d9e2..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt +since 1.4.2.v5 +git log 8dca887fadbbea41fb649ff17c5fe547a82ef23a..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt + 3. Copy added_cards.txt to trunk\Utils folder 4. Run script: > perl extract_in_wiki_format.perl From f0180f4a51104d205796005a82fe3c2435ee302d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Aug 2015 08:28:56 +0200 Subject: [PATCH 267/375] * Costal Piracy - Fixed import and package statements. --- Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java b/Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java index 3a39041be0b..25ce5da873e 100644 --- a/Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java +++ b/Mage.Sets/src/mage/sets/eighthedition/CoastalPiracy.java @@ -25,9 +25,10 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.sets.eightediton; +package mage.sets.eighthedition; import java.util.UUID; +import mage.constants.Rarity; /** * @@ -50,4 +51,4 @@ public class CoastalPiracy extends mage.sets.mercadianmasques.CoastalPiracy { public CoastalPiracy copy() { return new CoastalPiracy(this); } -} \ No newline at end of file +} From a644e66b7fc1fe3ab9b92c135f95f294bf303d36 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Aug 2015 17:54:17 +0200 Subject: [PATCH 268/375] * Some rework of card movement. --- .../mage/sets/apocalypse/WildResearch.java | 33 +++---- .../betrayersofkamigawa/QuillmaneBaku.java | 19 ++--- .../sets/bornofthegods/Peregrination.java | 35 ++++---- .../sets/bornofthegods/SatyrWayfinder.java | 8 +- .../src/mage/sets/coldsnap/ScryingSheets.java | 27 +++--- .../mage/sets/commander/DesecratorHag.java | 10 +-- .../src/mage/sets/commander/KodamasReach.java | 34 ++++---- .../mage/sets/commander/WhirlpoolWhelm.java | 9 +- .../mage/sets/commander2014/GraveSifter.java | 15 ++-- .../mage/sets/conflux/SkywardEyeProphets.java | 12 +-- .../mage/sets/darksteel/PulseOfTheFields.java | 10 +-- .../mage/sets/darksteel/PulseOfTheGrid.java | 10 +-- .../sets/darksteel/SwordOfLightAndShadow.java | 9 +- .../src/mage/sets/dissension/RiseFall.java | 18 ++-- .../mage/sets/dragonsmaze/MorgueBurst.java | 8 +- .../sets/dragonsoftarkir/FoulRenewal.java | 4 +- .../dragonsoftarkir/NarsetTranscendent.java | 32 +++---- .../dragonsoftarkir/ProfanerOfTheDead.java | 6 +- .../sets/dragonsoftarkir/VolcanicVision.java | 4 +- .../sets/elspethvstezzeret/EchoingTruth.java | 11 ++- .../fatereforged/RenownedWeaponsmith.java | 6 +- .../sets/fatereforged/SageEyeAvengers.java | 2 +- .../fatereforged/SoulfireGrandMaster.java | 33 +++---- .../sets/fatereforged/SuddenReclamation.java | 16 ++-- .../fatereforged/TasigurTheGoldenFang.java | 2 +- .../sets/fatereforged/TemurSabertooth.java | 8 +- .../src/mage/sets/fifthedition/Recall.java | 37 ++++---- .../sets/futuresight/LinessaZephyrMage.java | 26 +++--- .../sets/futuresight/VenserShaperSavant.java | 19 +++-- .../mage/sets/gatecrash/DinrovaHorror.java | 12 +-- .../src/mage/sets/gatecrash/DomriRade.java | 19 ++--- .../mage/sets/iceage/DemonicConsultation.java | 51 +++++------ .../src/mage/sets/innistrad/CaravanVigil.java | 15 ++-- Mage.Sets/src/mage/sets/invasion/Recoil.java | 17 ++-- .../journeyintonyx/AthreosGodOfPassage.java | 22 ++--- .../mage/sets/journeyintonyx/BrainMaggot.java | 21 ++--- .../src/mage/sets/journeyintonyx/Hubris.java | 16 ++-- .../journeyintonyx/NessianGameWarden.java | 22 ++--- .../sets/journeyintonyx/ScourgeOfFleets.java | 22 +++-- .../src/mage/sets/magic2011/Cultivate.java | 42 ++++----- .../src/mage/sets/magic2015/Quickling.java | 11 +-- .../src/mage/sets/mirage/ForbiddenCrypt.java | 34 ++++---- .../mage/sets/mirrodin/SpoilsOfTheVault.java | 29 +++---- .../sets/modernmasters/PetalsOfInsight.java | 32 +++---- .../sets/modernmasters2015/AllSunsDawn.java | 32 ++++--- .../src/mage/sets/onslaught/ChainOfVapor.java | 25 +++--- .../src/mage/sets/onslaught/WeirdHarvest.java | 28 +++--- .../sets/planeshift/SkyshipWeatherlight.java | 50 ++++++----- .../mage/sets/ravnica/CloudstoneCurio.java | 4 +- .../src/mage/sets/ravnica/DarkConfidant.java | 25 +++--- .../sets/returntoravnica/FaerieImpostor.java | 15 ++-- .../JaceArchitectOfThought.java | 2 +- .../saviorsofkamigawa/ElderPineOfJukai.java | 6 +- .../scarsofmirrodin/CerebralEruption.java | 24 +++--- .../sets/scarsofmirrodin/PsychicMiasma.java | 14 +-- .../sets/shadowmoor/AdviceFromTheFae.java | 21 ++--- .../mage/sets/shardsofalara/AdNauseam.java | 5 +- .../sets/shardsofalara/CruelUltimatum.java | 9 +- .../sets/shardsofalara/TidehollowSculler.java | 16 ++-- .../src/mage/sets/tenthedition/Abundance.java | 27 +++--- .../src/mage/sets/torment/MesmericFiend.java | 17 ++-- .../mage/sets/urzassaga/IllGottenGains.java | 22 ++--- .../sets/urzassaga/NoRestForTheWicked.java | 14 +-- .../src/mage/sets/zendikar/GoblinGuide.java | 23 +++-- .../combat/damage/GravebladeMarauderTest.java | 58 +++++++++++++ .../java/org/mage/test/player/TestPlayer.java | 8 +- .../common/ReturnToHandFromGraveyardCost.java | 18 ++-- .../ReturnToHandTargetPermanentCost.java | 7 +- .../ClashWinReturnToHandSpellEffect.java | 2 +- .../abilities/effects/common/EnvoyEffect.java | 16 ++-- ...ReturnFromGraveyardToHandTargetEffect.java | 31 +++---- ...ReturnSourceFromGraveyardToHandEffect.java | 13 ++- .../ReturnToHandFromBattlefieldAllEffect.java | 11 +-- .../common/ReturnToHandSourceEffect.java | 33 +++---- .../common/ReturnToHandSpellEffect.java | 2 +- .../RevealLibraryPutIntoHandEffect.java | 22 ++--- .../DiscardCardYouChooseTargetEffect.java | 6 +- .../search/SearchLibraryPutInHandEffect.java | 8 +- .../effects/keyword/SweepEffect.java | 10 +-- .../abilities/keyword/AuraSwapAbility.java | 85 +++++++++---------- .../abilities/keyword/TransmuteAbility.java | 51 ++++++----- Mage/src/mage/players/Player.java | 6 +- Mage/src/mage/players/PlayerImpl.java | 20 +++-- 83 files changed, 798 insertions(+), 816 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/triggers/combat/damage/GravebladeMarauderTest.java diff --git a/Mage.Sets/src/mage/sets/apocalypse/WildResearch.java b/Mage.Sets/src/mage/sets/apocalypse/WildResearch.java index 37eba90ac71..7784cb8d7f8 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/WildResearch.java +++ b/Mage.Sets/src/mage/sets/apocalypse/WildResearch.java @@ -28,6 +28,7 @@ package mage.sets.apocalypse; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -51,9 +52,10 @@ import mage.target.common.TargetCardInLibrary; * @author emerald000 */ public class WildResearch extends CardImpl { - + private static final FilterCard filterEnchantment = new FilterCard("enchantment card"); private static final FilterCard filterInstant = new FilterCard("instant card"); + static { filterEnchantment.add(new CardTypePredicate(CardType.ENCHANTMENT)); filterInstant.add(new CardTypePredicate(CardType.INSTANT)); @@ -65,7 +67,7 @@ public class WildResearch extends CardImpl { // {1}{W}: Search your library for an enchantment card and reveal that card. Put it into your hand, then discard a card at random. Then shuffle your library. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WildResearchEffect(filterEnchantment), new ManaCostsImpl<>("{1}{W}"))); - + // {1}{U}: Search your library for an instant card and reveal that card. Put it into your hand, then discard a card at random. Then shuffle your library. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WildResearchEffect(filterInstant), new ManaCostsImpl<>("{1}{U}"))); @@ -82,43 +84,44 @@ public class WildResearch extends CardImpl { } class WildResearchEffect extends OneShotEffect { - + protected final FilterCard filter; - + WildResearchEffect(FilterCard filter) { super(Outcome.DrawCard); this.staticText = "Search your library for an " + filter.getMessage() + " and reveal that card. Put it into your hand, then discard a card at random. Then shuffle your library."; this.filter = filter; } - + WildResearchEffect(final WildResearchEffect effect) { super(effect); this.filter = effect.filter; } - + @Override public WildResearchEffect copy() { return new WildResearchEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { TargetCardInLibrary target = new TargetCardInLibrary(filter); - if (player.searchLibrary(target, game)) { + if (controller.searchLibrary(target, game)) { if (target.getTargets().size() > 0) { - Card card = player.getLibrary().remove(target.getFirstTarget(), game); + Card card = controller.getLibrary().remove(target.getFirstTarget(), game); if (card != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); Cards cards = new CardsImpl(); cards.add(card); - player.revealCards("Wild Research", cards, game, true); + controller.revealCards(sourceObject.getIdName(), cards, game, true); } } } - player.discardOne(true, source, game); - player.shuffleLibrary(game); + controller.discardOne(true, source, game); + controller.shuffleLibrary(game); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java index e8b0b354db3..b367b8f020f 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.betrayersofkamigawa; import java.util.UUID; @@ -39,7 +38,6 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; @@ -69,7 +67,7 @@ public class QuillmaneBaku extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); - + // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku. this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); @@ -87,11 +85,11 @@ public class QuillmaneBaku extends CardImpl { int maxConvManaCost = 0; for (Cost cost : ability.getCosts()) { if (cost instanceof RemoveVariableCountersSourceCost) { - maxConvManaCost = ((RemoveVariableCountersSourceCost)cost).getAmount(); + maxConvManaCost = ((RemoveVariableCountersSourceCost) cost).getAmount(); } } ability.getTargets().clear(); - FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with converted mana cost " + maxConvManaCost + " or less"); + FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with converted mana cost " + maxConvManaCost + " or less"); newFilter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, maxConvManaCost + 1)); TargetCreaturePermanent target = new TargetCreaturePermanent(newFilter); ability.getTargets().add(target); @@ -106,7 +104,7 @@ public class QuillmaneBaku extends CardImpl { public QuillmaneBaku copy() { return new QuillmaneBaku(this); } - + class QuillmaneBakuReturnEffect extends OneShotEffect { public QuillmaneBakuReturnEffect() { @@ -125,16 +123,15 @@ public class QuillmaneBaku extends CardImpl { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { - player.moveCardToHandWithInfo((Card) permanent, source.getSourceId(), game, Zone.BATTLEFIELD); - return true; + controller.moveCards(permanent, null, Zone.HAND, source, game); } - return false; + return true; } } } diff --git a/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java b/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java index 0f0abeabc8c..d5fdc7aca32 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java @@ -27,8 +27,8 @@ */ package mage.sets.bornofthegods; -import java.util.List; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -44,7 +44,6 @@ import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.common.FilterBasicLandCard; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; @@ -59,7 +58,6 @@ public class Peregrination extends CardImpl { super(ownerId, 132, "Peregrination", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{G}"); this.expansionSetCode = "BNG"; - // Seach your library for up to two basic land cards, reveal those cards, and put one onto the battlefield tapped and the other into your hand. Shuffle your library, then scry 1. this.getSpellAbility().addEffect(new PeregrinationEffect()); Effect effect = new ScryEffect(1); @@ -97,36 +95,39 @@ class PeregrinationEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller == null || sourceObject == null) { + return false; + } TargetCardInLibrary target = new TargetCardInLibrary(0, 2, new FilterBasicLandCard()); - Player player = game.getPlayer(source.getControllerId()); - if (player.searchLibrary(target, game)) { + if (controller.searchLibrary(target, game)) { if (target.getTargets().size() > 0) { Cards revealed = new CardsImpl(); - for (UUID cardId: target.getTargets()) { - Card card = player.getLibrary().getCard(cardId, game); + for (UUID cardId : target.getTargets()) { + Card card = controller.getLibrary().getCard(cardId, game); revealed.add(card); } - player.revealCards("Peregrination", revealed, game); + controller.revealCards(sourceObject.getIdName(), revealed, game); if (target.getTargets().size() == 2) { - TargetCard target2 = new TargetCard(Zone.PICK, filter); - player.choose(Outcome.Benefit, revealed, target2, game); + TargetCard target2 = new TargetCard(Zone.LIBRARY, filter); + controller.choose(Outcome.Benefit, revealed, target2, game); Card card = revealed.get(target2.getFirstTarget(), game); - player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); revealed.remove(card); card = revealed.getCards(game).iterator().next(); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - } - else if (target.getTargets().size() == 1) { + controller.moveCards(card, null, Zone.HAND, source, game); + } else if (target.getTargets().size() == 1) { Card card = revealed.getCards(game).iterator().next(); - player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); } } - player.shuffleLibrary(game); + controller.shuffleLibrary(game); return true; } - player.shuffleLibrary(game); + controller.shuffleLibrary(game); return false; } diff --git a/Mage.Sets/src/mage/sets/bornofthegods/SatyrWayfinder.java b/Mage.Sets/src/mage/sets/bornofthegods/SatyrWayfinder.java index 11c738d3975..cd46582a1a4 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/SatyrWayfinder.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/SatyrWayfinder.java @@ -103,13 +103,13 @@ class SatyrWayfinderEffect extends OneShotEffect { if (!cards.isEmpty()) { controller.revealCards(sourceObject.getName(), cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, filterPutInHand); - if (properCardFound && - controller.chooseUse(outcome, "Put a land card into your hand?", source, game) && - controller.choose(Outcome.DrawCard, cards, target, game)) { + if (properCardFound + && controller.chooseUse(outcome, "Put a land card into your hand?", source, game) + && controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { cards.remove(card); - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); } } diff --git a/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java b/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java index 5196fbb0293..2669da9ec02 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java +++ b/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java @@ -28,6 +28,7 @@ package mage.sets.coldsnap; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -57,7 +58,7 @@ public class ScryingSheets extends CardImpl { // {tap}: Add {1} to your mana pool. this.addAbility(new ColorlessManaAbility()); - + // {1}{snow}, {tap}: Look at the top card of your library. If that card is snow, you may reveal it and put it into your hand. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScryingSheetsEffect(), new ManaCostsImpl<>("{1}{snow}")); ability.addCost(new TapSourceCost()); @@ -75,35 +76,35 @@ public class ScryingSheets extends CardImpl { } class ScryingSheetsEffect extends OneShotEffect { - + ScryingSheetsEffect() { super(Outcome.Benefit); this.staticText = "Look at the top card of your library. If that card is snow, you may reveal it and put it into your hand"; } - + ScryingSheetsEffect(final ScryingSheetsEffect effect) { super(effect); } - + @Override public ScryingSheetsEffect copy() { return new ScryingSheetsEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null && player.getLibrary().size() > 0) { - Card card = player.getLibrary().getFromTop(game); + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { CardsImpl cards = new CardsImpl(); cards.add(card); - player.lookAtCards("Scrying Sheets", cards, game); + controller.lookAtCards(sourceObject.getIdName(), cards, game); if (card.getSupertype().contains("Snow")) { - if (player.chooseUse(outcome, new StringBuilder("Reveal ").append(card.getName()).append(" and put it into your hand?").toString(), source, game)) { - card = player.getLibrary().removeFromTop(game); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - player.revealCards("Scrying Sheets", cards, game); + if (controller.chooseUse(outcome, "Reveal " + card.getLogName() + " and put it into your hand?", source, game)) { + controller.moveCards(card, null, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName(), cards, game); } } } diff --git a/Mage.Sets/src/mage/sets/commander/DesecratorHag.java b/Mage.Sets/src/mage/sets/commander/DesecratorHag.java index e596914c128..6f13d8c35af 100644 --- a/Mage.Sets/src/mage/sets/commander/DesecratorHag.java +++ b/Mage.Sets/src/mage/sets/commander/DesecratorHag.java @@ -113,22 +113,20 @@ class DesecratorHagEffect extends OneShotEffect { } } if (cards.size() == 0) { - return false; + return true; } if (cards.size() > 1 && you.choose(Outcome.DrawCard, cards, target, game)) { if (target != null) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - return you.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + return you.moveCards(card, null, Zone.HAND, source, game); } } } else { - for (Card card : cards.getCards(game)) { - return you.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); - } + return you.moveCards(cards, null, Zone.HAND, source, game); } } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/commander/KodamasReach.java b/Mage.Sets/src/mage/sets/commander/KodamasReach.java index 1be260fab28..6b7883e9e8b 100644 --- a/Mage.Sets/src/mage/sets/commander/KodamasReach.java +++ b/Mage.Sets/src/mage/sets/commander/KodamasReach.java @@ -27,8 +27,8 @@ */ package mage.sets.commander; -import java.util.List; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -57,7 +57,6 @@ public class KodamasReach extends CardImpl { this.expansionSetCode = "CMD"; this.subtype.add("Arcane"); - // Search your library for up to two basic land cards, reveal those cards, and put one onto the battlefield tapped and the other into your hand. Then shuffle your library. this.getSpellAbility().addEffect(new KodamasReachEffect()); } @@ -92,43 +91,46 @@ class KodamasReachEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller == null || sourceObject == null) { + return false; + } TargetCardInLibrary target = new TargetCardInLibrary(0, 2, new FilterBasicLandCard()); - Player player = game.getPlayer(source.getControllerId()); - if (player.searchLibrary(target, game)) { + if (controller.searchLibrary(target, game)) { if (target.getTargets().size() > 0) { Cards revealed = new CardsImpl(); - for (UUID cardId: target.getTargets()) { - Card card = player.getLibrary().getCard(cardId, game); + for (UUID cardId : target.getTargets()) { + Card card = controller.getLibrary().getCard(cardId, game); revealed.add(card); } - player.revealCards("Kodama's Reach", revealed, game); + controller.revealCards(sourceObject.getIdName(), revealed, game); if (target.getTargets().size() == 2) { TargetCard target2 = new TargetCard(Zone.PICK, filter); - player.choose(Outcome.Benefit, revealed, target2, game); + controller.choose(Outcome.Benefit, revealed, target2, game); Card card = revealed.get(target2.getFirstTarget(), game); if (card != null) { - player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); revealed.remove(card); } card = revealed.getCards(game).iterator().next(); if (card != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); } - } - else if (target.getTargets().size() == 1) { + } else if (target.getTargets().size() == 1) { Card card = revealed.getCards(game).iterator().next(); if (card != null) { - player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); } } } - player.shuffleLibrary(game); + controller.shuffleLibrary(game); return true; } - player.shuffleLibrary(game); + controller.shuffleLibrary(game); return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/commander/WhirlpoolWhelm.java b/Mage.Sets/src/mage/sets/commander/WhirlpoolWhelm.java index 88036f444a0..b8c2db6801f 100644 --- a/Mage.Sets/src/mage/sets/commander/WhirlpoolWhelm.java +++ b/Mage.Sets/src/mage/sets/commander/WhirlpoolWhelm.java @@ -51,7 +51,6 @@ public class WhirlpoolWhelm extends CardImpl { super(ownerId, 69, "Whirlpool Whelm", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); this.expansionSetCode = "CMD"; - // Clash with an opponent, then return target creature to its owner's hand. If you win, you may put that creature on top of its owner's library instead. this.getSpellAbility().addEffect(new WhirlpoolWhelmEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); @@ -90,15 +89,15 @@ class WhirlpoolWhelmEffect extends OneShotEffect { if (controller != null) { boolean topOfLibrary = false; if (ClashEffect.getInstance().apply(game, source)) { - topOfLibrary = controller.chooseUse(outcome, "Put " + creature.getLogName() + " to top of libraray instead?" , source, game); + topOfLibrary = controller.chooseUse(outcome, "Put " + creature.getLogName() + " to top of libraray instead?", source, game); } if (topOfLibrary) { - controller.moveCardToHandWithInfo(creature, source.getSourceId(), game, Zone.BATTLEFIELD); - } else { controller.moveCardToLibraryWithInfo(creature, source.getSourceId(), game, Zone.BATTLEFIELD, true, true); + } else { + controller.moveCards(creature, null, Zone.HAND, source, game); } return true; } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/commander2014/GraveSifter.java b/Mage.Sets/src/mage/sets/commander2014/GraveSifter.java index 11a5d889289..e9dd6df2171 100644 --- a/Mage.Sets/src/mage/sets/commander2014/GraveSifter.java +++ b/Mage.Sets/src/mage/sets/commander2014/GraveSifter.java @@ -32,8 +32,8 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; +import mage.cards.CardsImpl; import mage.cards.repository.CardRepository; import mage.choices.Choice; import mage.choices.ChoiceImpl; @@ -101,22 +101,17 @@ class GraveSifterEffect extends OneShotEffect { typeChoice.setChoices(CardRepository.instance.getCreatureTypes()); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - for (UUID playerId: controller.getInRange()) { + for (UUID playerId : controller.getInRange()) { Player player = game.getPlayer(playerId); if (player != null) { typeChoice.clearChoice(); if (player.choose(outcome, typeChoice, game)) { game.informPlayers(player.getLogName() + " has chosen: " + typeChoice.getChoice()); - FilterCard filter = new FilterCreatureCard("creature cards with creature type " + typeChoice.getChoice()+ " from your graveyard"); + FilterCard filter = new FilterCreatureCard("creature cards with creature type " + typeChoice.getChoice() + " from your graveyard"); filter.add(new SubtypePredicate(typeChoice.getChoice())); - Target target = new TargetCardInYourGraveyard(0,Integer.MAX_VALUE, filter); + Target target = new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, filter); player.chooseTarget(outcome, target, source, game); - for (UUID cardId: target.getTargets()) { - Card card = game.getCard(cardId); - if (card !=null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); - } - } + player.moveCards(new CardsImpl(target.getTargets()), null, Zone.HAND, source, game); } } diff --git a/Mage.Sets/src/mage/sets/conflux/SkywardEyeProphets.java b/Mage.Sets/src/mage/sets/conflux/SkywardEyeProphets.java index f5ceb039692..09778edade8 100644 --- a/Mage.Sets/src/mage/sets/conflux/SkywardEyeProphets.java +++ b/Mage.Sets/src/mage/sets/conflux/SkywardEyeProphets.java @@ -28,10 +28,6 @@ package mage.sets.conflux; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -42,6 +38,10 @@ import mage.abilities.keyword.VigilanceAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.players.Player; @@ -73,7 +73,7 @@ public class SkywardEyeProphets extends CardImpl { public SkywardEyeProphets copy() { return new SkywardEyeProphets(this); } - + public static class SkywardEyeProphetsEffect extends OneShotEffect { public SkywardEyeProphetsEffect() { @@ -108,7 +108,7 @@ public class SkywardEyeProphets extends CardImpl { if (card.getCardType().contains(CardType.LAND)) { return controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId()); } else { - return controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); } } return true; diff --git a/Mage.Sets/src/mage/sets/darksteel/PulseOfTheFields.java b/Mage.Sets/src/mage/sets/darksteel/PulseOfTheFields.java index 49191523e34..a6ee275f3b7 100644 --- a/Mage.Sets/src/mage/sets/darksteel/PulseOfTheFields.java +++ b/Mage.Sets/src/mage/sets/darksteel/PulseOfTheFields.java @@ -66,21 +66,21 @@ public class PulseOfTheFields extends CardImpl { } class PulseOfTheFieldsReturnToHandEffect extends OneShotEffect { - + PulseOfTheFieldsReturnToHandEffect() { super(Outcome.Benefit); this.staticText = "Then if an opponent has more life than you, return {this} to its owner's hand"; } - + PulseOfTheFieldsReturnToHandEffect(final PulseOfTheFieldsReturnToHandEffect effect) { super(effect); } - + @Override public PulseOfTheFieldsReturnToHandEffect copy() { return new PulseOfTheFieldsReturnToHandEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -89,7 +89,7 @@ class PulseOfTheFieldsReturnToHandEffect extends OneShotEffect { Player player = game.getPlayer(playerId); if (player != null && player.getLife() > controller.getLife()) { Card card = game.getCard(source.getSourceId()); - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.STACK); + controller.moveCards(card, null, Zone.HAND, source, game); return true; } } diff --git a/Mage.Sets/src/mage/sets/darksteel/PulseOfTheGrid.java b/Mage.Sets/src/mage/sets/darksteel/PulseOfTheGrid.java index 74a9349270e..1e8179a260f 100644 --- a/Mage.Sets/src/mage/sets/darksteel/PulseOfTheGrid.java +++ b/Mage.Sets/src/mage/sets/darksteel/PulseOfTheGrid.java @@ -66,21 +66,21 @@ public class PulseOfTheGrid extends CardImpl { } class PulseOfTheGridReturnToHandEffect extends OneShotEffect { - + PulseOfTheGridReturnToHandEffect() { super(Outcome.Benefit); this.staticText = "Draw two cards, then discard a card. Then if an opponent has more cards in hand than you, return {this} to its owner's hand"; } - + PulseOfTheGridReturnToHandEffect(final PulseOfTheGridReturnToHandEffect effect) { super(effect); } - + @Override public PulseOfTheGridReturnToHandEffect copy() { return new PulseOfTheGridReturnToHandEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -89,7 +89,7 @@ class PulseOfTheGridReturnToHandEffect extends OneShotEffect { Player player = game.getPlayer(playerId); if (player != null && player.getHand().size() > controller.getHand().size()) { Card card = game.getCard(source.getSourceId()); - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.STACK); + controller.moveCards(card, null, Zone.HAND, source, game); return true; } } diff --git a/Mage.Sets/src/mage/sets/darksteel/SwordOfLightAndShadow.java b/Mage.Sets/src/mage/sets/darksteel/SwordOfLightAndShadow.java index b090e5ffd8b..7efdd4e8fe6 100644 --- a/Mage.Sets/src/mage/sets/darksteel/SwordOfLightAndShadow.java +++ b/Mage.Sets/src/mage/sets/darksteel/SwordOfLightAndShadow.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.darksteel; import java.util.UUID; @@ -105,7 +104,7 @@ public class SwordOfLightAndShadow extends CardImpl { // Target may only be added if possible target exists. Else the gain life effect won't trigger, becuase there is no valid target for the // return to hand ability if (controller.getGraveyard().count(new FilterCreatureCard(), ability.getSourceId(), ability.getControllerId(), game) > 0) { - ability.addTarget(new TargetCardInYourGraveyard(0,1,new FilterCreatureCard("creature card from your graveyard"))); + ability.addTarget(new TargetCardInYourGraveyard(0, 1, new FilterCreatureCard("creature card from your graveyard"))); } } } @@ -118,7 +117,7 @@ class SwordOfLightAndShadowAbility extends TriggeredAbilityImpl { public SwordOfLightAndShadowAbility() { super(Zone.BATTLEFIELD, new SwordOfLightAndShadowReturnToHandTargetEffect(), false); this.addEffect(new GainLifeEffect(3)); - + } public SwordOfLightAndShadowAbility(final SwordOfLightAndShadowAbility ability) { @@ -178,8 +177,8 @@ class SwordOfLightAndShadowReturnToHandTargetEffect extends OneShotEffect { case GRAVEYARD: Card card = game.getCard(targetId); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); - } else { + controller.moveCards(card, null, Zone.HAND, source, game); + } else { result = false; } break; diff --git a/Mage.Sets/src/mage/sets/dissension/RiseFall.java b/Mage.Sets/src/mage/sets/dissension/RiseFall.java index bfae9994127..91403495f23 100644 --- a/Mage.Sets/src/mage/sets/dissension/RiseFall.java +++ b/Mage.Sets/src/mage/sets/dissension/RiseFall.java @@ -29,15 +29,15 @@ package mage.sets.dissension; import java.util.UUID; import mage.MageObject; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.game.Game; @@ -54,9 +54,9 @@ import mage.target.common.TargetCreaturePermanent; public class RiseFall extends SplitCard { public RiseFall(UUID ownerId) { - super(ownerId, 156, "Rise", "Fall", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{U}{B}","{B}{R}", false ); + super(ownerId, 156, "Rise", "Fall", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{U}{B}", "{B}{R}", false); this.expansionSetCode = "DIS"; - + // Rise // Return target creature card from a graveyard and target creature on the battlefield to their owners' hands. getLeftHalfCard().getSpellAbility().addEffect(new RiseEffect()); @@ -99,14 +99,16 @@ class RiseEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { + Cards cardsToHand = new CardsImpl(); Card cardInGraveyard = game.getCard(getTargetPointer().getFirst(game, source)); if (cardInGraveyard != null) { - controller.moveCardToHandWithInfo(cardInGraveyard, source.getSourceId(), game, Zone.GRAVEYARD); + cardsToHand.add(cardInGraveyard); } Permanent permanent = game.getPermanent(source.getTargets().get(1).getFirstTarget()); if (permanent != null) { - controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + cardsToHand.add(permanent); } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return false; @@ -147,7 +149,7 @@ class FallEffect extends OneShotEffect { cards.add(card); } targetPlayer.revealCards(sourceObject.getName(), cards, game); - for (Card cardToDiscard: cards.getCards(game)) { + for (Card cardToDiscard : cards.getCards(game)) { if (!cardToDiscard.getCardType().contains(CardType.LAND)) { targetPlayer.discard(cardToDiscard, source, game); } diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/MorgueBurst.java b/Mage.Sets/src/mage/sets/dragonsmaze/MorgueBurst.java index 2e3983e47e1..43f7b05fb55 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/MorgueBurst.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/MorgueBurst.java @@ -28,15 +28,14 @@ package mage.sets.dragonsmaze; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.game.Game; @@ -55,7 +54,6 @@ public class MorgueBurst extends CardImpl { super(ownerId, 86, "Morgue Burst", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{4}{B}{R}"); this.expansionSetCode = "DGM"; - // Return target creature card from your graveyard to your hand. Morgue Burst deals damage to target creature or player equal to the power of the card returned this way. this.getSpellAbility().addEffect(new MorgueBurstEffect()); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); @@ -93,7 +91,7 @@ class MorgueBurstEffect extends OneShotEffect { if (card != null) { Player player = game.getPlayer(card.getOwnerId()); if (player != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.HAND); + player.moveCards(card, null, Zone.HAND, source, game); int damage = card.getPower().getValue(); Permanent creature = game.getPermanent(source.getTargets().get(1).getTargets().get(0)); if (creature != null) { diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/FoulRenewal.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/FoulRenewal.java index 7323fddb268..68212d32e00 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/FoulRenewal.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/FoulRenewal.java @@ -95,9 +95,9 @@ class FoulRenewalEffect extends OneShotEffect { Card card = game.getCard(targetPointer.getFirst(game, source)); if (card != null) { int xValue = card.getToughness().getValue() * -1; - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + controller.moveCards(card, null, Zone.HAND, source, game); if (xValue != 0) { - ContinuousEffect effect = new BoostTargetEffect(xValue,xValue, Duration.EndOfTurn); + ContinuousEffect effect = new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(source.getTargets().get(1).getFirstTarget())); game.addEffect(effect, source); } diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/NarsetTranscendent.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/NarsetTranscendent.java index a490b0d3a06..639d3f36c38 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/NarsetTranscendent.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/NarsetTranscendent.java @@ -60,7 +60,6 @@ import mage.game.stack.Spell; import mage.players.Player; import mage.target.targetpointer.FixedTarget; - /** * * @author LevelX2 @@ -73,13 +72,13 @@ public class NarsetTranscendent extends CardImpl { this.subtype.add("Narset"); this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(6)), false)); - + // +1: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand. this.addAbility(new LoyaltyAbility(new NarsetTranscendentEffect1(), 1)); - + // -2: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. this.addAbility(new LoyaltyAbility(new CreateDelayedTriggeredAbilityEffect(new NarsetTranscendentTriggeredAbility()), -2)); - + // -9:You get an emblem with "Your opponents can't cast noncreature spells." this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new NarsetTranscendentEmblem()), -9)); } @@ -119,11 +118,11 @@ class NarsetTranscendentEffect1 extends OneShotEffect { if (card != null) { CardsImpl cards = new CardsImpl(); cards.add(card); - controller.lookAtCards(sourceObject.getName(), cards, game); + controller.lookAtCards(sourceObject.getIdName(), cards, game); if (!card.getCardType().contains(CardType.CREATURE) && !card.getCardType().contains(CardType.LAND)) { - if (controller.chooseUse(outcome, "Reveal " + card.getName() + " and put it into your hand?", source, game)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - controller.revealCards(sourceObject.getName(), cards, game); + if (controller.chooseUse(outcome, "Reveal " + card.getLogName() + " and put it into your hand?", source, game)) { + controller.moveCards(card, null, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName(), cards, game); } } return true; @@ -142,6 +141,7 @@ class NarsetTranscendentTriggeredAbility extends DelayedTriggeredAbility { private NarsetTranscendentTriggeredAbility(final NarsetTranscendentTriggeredAbility ability) { super(ability); } + @Override public NarsetTranscendentTriggeredAbility copy() { return new NarsetTranscendentTriggeredAbility(this); @@ -157,9 +157,9 @@ class NarsetTranscendentTriggeredAbility extends DelayedTriggeredAbility { if (event.getPlayerId().equals(this.getControllerId())) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getFromZone().equals(Zone.HAND)) { - if (spell.getCard() != null && - spell.getCard().getCardType().contains(CardType.INSTANT) || spell.getCard().getCardType().contains(CardType.SORCERY)) { - for(Effect effect: getEffects()) { + if (spell.getCard() != null + && spell.getCard().getCardType().contains(CardType.INSTANT) || spell.getCard().getCardType().contains(CardType.SORCERY)) { + for (Effect effect : getEffects()) { effect.setTargetPointer(new FixedTarget(spell.getId())); } return true; @@ -171,7 +171,7 @@ class NarsetTranscendentTriggeredAbility extends DelayedTriggeredAbility { @Override public String getRule() { - return "When you cast your next instant or sorcery spell from your hand this turn, " + super.getRule() ; + return "When you cast your next instant or sorcery spell from your hand this turn, " + super.getRule(); } } @@ -226,11 +226,11 @@ class NarsetTranscendentGainReboundEffect extends ContinuousEffectImpl { class NarsetTranscendentEmblem extends Emblem { // "Your opponents can't cast noncreature spells. - + public NarsetTranscendentEmblem() { - + this.setName("EMBLEM: Narset Transcendent"); - + this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new NarsetTranscendentCantCastEffect())); } } @@ -269,7 +269,7 @@ class NarsetTranscendentCantCastEffect extends ContinuousRuleModifyingEffectImpl public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.CAST_SPELL; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/ProfanerOfTheDead.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/ProfanerOfTheDead.java index b3c97cb4142..46e06e3a618 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/ProfanerOfTheDead.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/ProfanerOfTheDead.java @@ -34,6 +34,8 @@ import mage.abilities.common.ExploitCreatureTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.ExploitAbility; import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; @@ -99,9 +101,11 @@ class ProfanerOfTheDeadReturnEffect extends OneShotEffect { FilterCreaturePermanent filter = new FilterCreaturePermanent(); filter.add(new ControllerPredicate(TargetController.OPPONENT)); filter.add(new ToughnessPredicate(Filter.ComparisonType.LessThan, exploitedCreature.getToughness().getValue())); + Cards cardsToHand = new CardsImpl(); for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { - controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + cardsToHand.add(permanent); } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/VolcanicVision.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/VolcanicVision.java index 350cc728fac..b579e59ca82 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/VolcanicVision.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/VolcanicVision.java @@ -105,10 +105,10 @@ class VolcanicVisionReturnToHandTargetEffect extends OneShotEffect { case GRAVEYARD: Card card = game.getCard(targetId); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + controller.moveCards(card, null, Zone.HAND, source, game); int damage = card.getManaCost().convertedManaCost(); if (damage > 0) { - for(Permanent creature: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { + for (Permanent creature : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { creature.damage(damage, source.getSourceId(), game, false, true); } } diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/EchoingTruth.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/EchoingTruth.java index 772509be82a..2e52c6bcb58 100644 --- a/Mage.Sets/src/mage/sets/elspethvstezzeret/EchoingTruth.java +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/EchoingTruth.java @@ -32,12 +32,13 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; 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.predicate.Predicates; import mage.filter.predicate.mageobject.NamePredicate; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; @@ -96,11 +97,13 @@ class ReturnToHandAllNamedPermanentsEffect extends OneShotEffect { if (permanent.getName().isEmpty()) { filter.add(new PermanentIdPredicate(permanent.getId())); // if no name (face down creature) only the creature itself is selected } else { - filter.add(new NamePredicate(permanent.getName())); + filter.add(new NamePredicate(permanent.getName())); } - for (Permanent perm: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { - controller.moveCardToHandWithInfo(perm, source.getSourceId(), game, Zone.BATTLEFIELD); + Cards cardsToHand = new CardsImpl(); + for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { + cardsToHand.add(perm); } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return true; diff --git a/Mage.Sets/src/mage/sets/fatereforged/RenownedWeaponsmith.java b/Mage.Sets/src/mage/sets/fatereforged/RenownedWeaponsmith.java index 1797c0979be..f82c282471f 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/RenownedWeaponsmith.java +++ b/Mage.Sets/src/mage/sets/fatereforged/RenownedWeaponsmith.java @@ -115,7 +115,7 @@ class RenownedWeaponsmithCondition implements Condition { @Override public boolean apply(Game game, Ability source) { MageObject object = game.getObject(source.getSourceId()); - return (object != null + return (object != null && object.getCardType().contains(CardType.ARTIFACT)); } } @@ -149,8 +149,8 @@ class RenownedWeaponsmithEffect extends OneShotEffect { Card card = game.getCard(target.getFirstTarget()); Cards revealed = new CardsImpl(); revealed.add(card); - controller.revealCards(sourceObject.getName(), revealed, game); - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.revealCards(sourceObject.getIdName(), revealed, game); + controller.moveCards(revealed, null, Zone.HAND, source, game); } } controller.shuffleLibrary(game); diff --git a/Mage.Sets/src/mage/sets/fatereforged/SageEyeAvengers.java b/Mage.Sets/src/mage/sets/fatereforged/SageEyeAvengers.java index f14d8c67ae7..191c9540b6b 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/SageEyeAvengers.java +++ b/Mage.Sets/src/mage/sets/fatereforged/SageEyeAvengers.java @@ -100,7 +100,7 @@ class SageEyeAvengersEffect extends OneShotEffect { if (sourceObject != null && controller != null) { Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); if (targetCreature != null && targetCreature.getPower().getValue() < sourceObject.getPower().getValue()) { - controller.moveCardToHandWithInfo(targetCreature, source.getSourceId(), game, Zone.BATTLEFIELD); + controller.moveCards(targetCreature, null, Zone.HAND, source, game); } return true; } diff --git a/Mage.Sets/src/mage/sets/fatereforged/SoulfireGrandMaster.java b/Mage.Sets/src/mage/sets/fatereforged/SoulfireGrandMaster.java index 00b2744e19f..55fb26acdff 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/SoulfireGrandMaster.java +++ b/Mage.Sets/src/mage/sets/fatereforged/SoulfireGrandMaster.java @@ -130,28 +130,28 @@ class GainAbilitySpellsEffect extends ContinuousEffectImpl { Player player = game.getPlayer(source.getControllerId()); Permanent permanent = game.getPermanent(source.getSourceId()); if (player != null && permanent != null) { - for (Card card: game.getExile().getAllCards(game)) { + for (Card card : game.getExile().getAllCards(game)) { if (card.getOwnerId().equals(source.getControllerId()) && filter.match(card, game)) { game.getState().addOtherAbility(card, ability); } } - for (Card card: player.getLibrary().getCards(game)) { + for (Card card : player.getLibrary().getCards(game)) { if (filter.match(card, game)) { game.getState().addOtherAbility(card, ability); } } - for (Card card: player.getHand().getCards(game)) { + for (Card card : player.getHand().getCards(game)) { if (filter.match(card, game)) { game.getState().addOtherAbility(card, ability); } } - for (Card card: player.getGraveyard().getCards(game)) { + for (Card card : player.getGraveyard().getCards(game)) { if (filter.match(card, game)) { game.getState().addOtherAbility(card, ability); } } for (StackObject stackObject : game.getStack()) { - if (stackObject.getControllerId().equals(source.getControllerId())) { + if (stackObject.getControllerId().equals(source.getControllerId())) { Card card = game.getCard(stackObject.getSourceId()); if (card != null && filter.match(card, game)) { if (!card.getAbilities().contains(ability)) { @@ -199,15 +199,15 @@ class SoulfireGrandMasterCastFromHandReplacementEffect extends ReplacementEffect @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - MageObject mageObject = game.getObject(spellId); - if (mageObject == null || !(mageObject instanceof Spell) || ((Spell)mageObject).isCopiedSpell()) { + MageObject mageObject = game.getObject(spellId); + if (mageObject == null || !(mageObject instanceof Spell) || ((Spell) mageObject).isCopiedSpell()) { return false; } else { Card sourceCard = game.getCard(spellId); if (sourceCard != null) { Player player = game.getPlayer(sourceCard.getOwnerId()); if (player != null) { - player.moveCardToHandWithInfo(sourceCard, source.getSourceId(), game, Zone.STACK); + player.moveCards(sourceCard, null, Zone.HAND, source, game); discard(); return true; } @@ -215,6 +215,7 @@ class SoulfireGrandMasterCastFromHandReplacementEffect extends ReplacementEffect } return false; } + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.ZONE_CHANGE; @@ -225,21 +226,21 @@ class SoulfireGrandMasterCastFromHandReplacementEffect extends ReplacementEffect //Something hit the stack from the hand, see if its a spell with this ability. ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (spellId == null && // because this effect works only once, spellId has to be null here - zEvent.getFromZone() == Zone.HAND && - zEvent.getToZone() == Zone.STACK && - event.getPlayerId().equals(source.getControllerId())) { + zEvent.getFromZone() == Zone.HAND + && zEvent.getToZone() == Zone.STACK + && event.getPlayerId().equals(source.getControllerId())) { MageObject object = game.getObject(event.getTargetId()); if (object instanceof Card) { - if (filter.match((Card)object, game)) { + if (filter.match((Card) object, game)) { this.spellId = event.getTargetId(); } } } else { // the spell goes to graveyard now so move it to hand again - if (zEvent.getFromZone() == Zone.STACK && - zEvent.getToZone() == Zone.GRAVEYARD && - event.getTargetId().equals(spellId)) { - Spell spell = game.getStack().getSpell(spellId); + if (zEvent.getFromZone() == Zone.STACK + && zEvent.getToZone() == Zone.GRAVEYARD + && event.getTargetId().equals(spellId)) { + Spell spell = game.getStack().getSpell(spellId); if (spell != null && !spell.isCountered()) { return true; } diff --git a/Mage.Sets/src/mage/sets/fatereforged/SuddenReclamation.java b/Mage.Sets/src/mage/sets/fatereforged/SuddenReclamation.java index 3d9e62e2566..cb213a637ed 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/SuddenReclamation.java +++ b/Mage.Sets/src/mage/sets/fatereforged/SuddenReclamation.java @@ -33,6 +33,8 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; 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; @@ -89,24 +91,26 @@ class SuddenReclamationEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { + Cards cardsToHand = new CardsImpl(); Target target = new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard")); target.setNotTarget(true); - if (target.canChoose(source.getSourceId(), controller.getId(), game) && - controller.chooseTarget(outcome, target, source, game)) { + if (target.canChoose(source.getSourceId(), controller.getId(), game) + && controller.chooseTarget(outcome, target, source, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + cardsToHand.add(card); } } target = new TargetCardInYourGraveyard(new FilterLandCard("land card from your graveyard")); target.setNotTarget(true); - if (target.canChoose(source.getSourceId(), controller.getId(), game) && - controller.chooseTarget(outcome, target, source, game)) { + if (target.canChoose(source.getSourceId(), controller.getId(), game) + && controller.chooseTarget(outcome, target, source, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + cardsToHand.add(card); } } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/fatereforged/TasigurTheGoldenFang.java b/Mage.Sets/src/mage/sets/fatereforged/TasigurTheGoldenFang.java index 466312f6bcb..4219bb760d4 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/TasigurTheGoldenFang.java +++ b/Mage.Sets/src/mage/sets/fatereforged/TasigurTheGoldenFang.java @@ -120,7 +120,7 @@ class TasigurTheGoldenFangEffect extends OneShotEffect { opponent.chooseTarget(outcome, target, source, game); Card card = game.getCard(target.getFirstTarget()); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + controller.moveCards(card, null, Zone.HAND, source, game); } } } diff --git a/Mage.Sets/src/mage/sets/fatereforged/TemurSabertooth.java b/Mage.Sets/src/mage/sets/fatereforged/TemurSabertooth.java index 465bb3dcfda..a953de52613 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/TemurSabertooth.java +++ b/Mage.Sets/src/mage/sets/fatereforged/TemurSabertooth.java @@ -103,13 +103,13 @@ class TemurSabertoothEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - Target target = new TargetPermanent(1,1, filter, true); + Target target = new TargetPermanent(1, 1, filter, true); if (target.canChoose(source.getSourceId(), controller.getId(), game)) { - if (controller.chooseUse(outcome, "Return another creature to hand?", source, game) && - controller.chooseTarget(outcome, target, source, game)) { + if (controller.chooseUse(outcome, "Return another creature to hand?", source, game) + && controller.chooseTarget(outcome, target, source, game)) { Permanent toHand = game.getPermanent(target.getFirstTarget()); if (toHand != null) { - controller.moveCardToHandWithInfo(toHand, source.getSourceId(), game, Zone.BATTLEFIELD); + controller.moveCards(toHand, null, Zone.HAND, source, game); } game.addEffect(new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), source); } diff --git a/Mage.Sets/src/mage/sets/fifthedition/Recall.java b/Mage.Sets/src/mage/sets/fifthedition/Recall.java index cbbb5e68973..ff5e44b188d 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/Recall.java +++ b/Mage.Sets/src/mage/sets/fifthedition/Recall.java @@ -31,8 +31,9 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileSpellEffect; -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; @@ -52,7 +53,6 @@ public class Recall extends CardImpl { super(ownerId, 93, "Recall", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{X}{X}{U}"); this.expansionSetCode = "5ED"; - // Discard X cards, then return a card from your graveyard to your hand for each card discarded this way. this.getSpellAbility().addEffect(new RecallEffect()); // Exile Recall. @@ -75,38 +75,33 @@ class RecallEffect extends OneShotEffect { super(Outcome.ReturnToHand); this.staticText = "Discard X cards, then return a card from your graveyard to your hand for each card discarded this way. "; } - + public RecallEffect(final RecallEffect effect) { super(effect); } - + @Override public RecallEffect copy() { return new RecallEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { // Discard X cards - int amount = source.getManaCostsToPay().getX(); - int discarded = Math.min(amount, player.getHand().size()); - player.discard(amount, false, source, game); - - // then return a card from your graveyard to your hand for each card discarded this way - TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(discarded, new FilterCard()); - target.choose(Outcome.ReturnToHand, player.getId(), source.getSourceId(), game); - for (UUID targetId : target.getTargets()) { - Card card = game.getCard(targetId); - if (card != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); - } + Cards cardsDiscarded = controller.discard(source.getManaCostsToPay().getX(), false, source, game); + if (!cardsDiscarded.isEmpty()) { + // then return a card from your graveyard to your hand for each card discarded this way + TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(cardsDiscarded.size(), new FilterCard()); + target.setNotTarget(true); + target.choose(Outcome.ReturnToHand, controller.getId(), source.getSourceId(), game); + controller.moveCards(new CardsImpl(target.getTargets()), null, Zone.HAND, source, game); } - + return true; } return false; } - + } diff --git a/Mage.Sets/src/mage/sets/futuresight/LinessaZephyrMage.java b/Mage.Sets/src/mage/sets/futuresight/LinessaZephyrMage.java index 16b11f8a818..2d70219a2a8 100644 --- a/Mage.Sets/src/mage/sets/futuresight/LinessaZephyrMage.java +++ b/Mage.Sets/src/mage/sets/futuresight/LinessaZephyrMage.java @@ -76,13 +76,13 @@ public class LinessaZephyrMage extends CardImpl { ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); - + // Grandeur - Discard another card named Linessa, Zephyr Mage: Target player returns a creature he or she controls to its owner's hand, then repeats this process for an artifact, an enchantment, and a land. ability = new GrandeurAbility(new LinessaZephyrMageEffect(), "Linessa, Zephyr Mage"); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } - + public LinessaZephyrMage(final LinessaZephyrMage card) { super(card); } @@ -105,21 +105,21 @@ public class LinessaZephyrMage extends CardImpl { } class LinessaZephyrMageEffect extends OneShotEffect { - + LinessaZephyrMageEffect() { super(Outcome.ReturnToHand); this.staticText = "Target player returns a creature he or she controls to its owner's hand, then repeats this process for an artifact, an enchantment, and a land"; } - + LinessaZephyrMageEffect(final LinessaZephyrMageEffect effect) { super(effect); } - + @Override public LinessaZephyrMageEffect copy() { return new LinessaZephyrMageEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -132,7 +132,7 @@ class LinessaZephyrMageEffect extends OneShotEffect { if (target.choose(Outcome.ReturnToHand, targetPlayer.getId(), source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { - targetPlayer.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + targetPlayer.moveCards(permanent, null, Zone.HAND, source, game); } } @@ -144,10 +144,10 @@ class LinessaZephyrMageEffect extends OneShotEffect { if (target.choose(Outcome.ReturnToHand, targetPlayer.getId(), source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { - targetPlayer.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + targetPlayer.moveCards(permanent, null, Zone.HAND, source, game); } } - + // an enchantment, filter = new FilterControlledPermanent("enchantment you control"); filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); @@ -156,10 +156,10 @@ class LinessaZephyrMageEffect extends OneShotEffect { if (target.choose(Outcome.ReturnToHand, targetPlayer.getId(), source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { - targetPlayer.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + targetPlayer.moveCards(permanent, null, Zone.HAND, source, game); } } - + // and a land. filter = new FilterControlledPermanent("land you control"); filter.add(new CardTypePredicate(CardType.LAND)); @@ -168,10 +168,10 @@ class LinessaZephyrMageEffect extends OneShotEffect { if (target.choose(Outcome.ReturnToHand, targetPlayer.getId(), source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { - targetPlayer.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + targetPlayer.moveCards(permanent, null, Zone.HAND, source, game); } } - + return true; } } diff --git a/Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java b/Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java index 6cf33d4ecbb..1045ba09c7c 100644 --- a/Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java +++ b/Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java @@ -103,18 +103,19 @@ class VenserShaperSavantEffect extends OneShotEffect { if (controller != null) { Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { - return controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + return controller.moveCards(permanent, null, Zone.HAND, source, game); } /** - * 01.05.2007 If a spell is returned to its owner's hand, it's removed from - * the stack and thus will not resolve. The spell isn't countered; it just no longer exists. - * 01.05.2007 If a copy of a spell is returned to its owner's hand, it's moved there, - * then it will cease to exist as a state-based action. - * 01.05.2007 If Venser's enters-the-battlefield ability targets a spell cast with flashback, - * that spell will be exiled instead of returning to its owner's hand. + * 01.05.2007 If a spell is returned to its owner's hand, it's + * removed from the stack and thus will not resolve. The spell isn't + * countered; it just no longer exists. 01.05.2007 If a copy of a + * spell is returned to its owner's hand, it's moved there, then it + * will cease to exist as a state-based action. 01.05.2007 If + * Venser's enters-the-battlefield ability targets a spell cast with + * flashback, that spell will be exiled instead of returning to its + * owner's hand. */ - Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); if (spell != null) { Card card = null; @@ -123,7 +124,7 @@ class VenserShaperSavantEffect extends OneShotEffect { } game.getStack().remove(spell); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.STACK); + controller.moveCards(card, null, Zone.HAND, source, game); } return true; } diff --git a/Mage.Sets/src/mage/sets/gatecrash/DinrovaHorror.java b/Mage.Sets/src/mage/sets/gatecrash/DinrovaHorror.java index 5eab7a69163..042d85b8e69 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/DinrovaHorror.java +++ b/Mage.Sets/src/mage/sets/gatecrash/DinrovaHorror.java @@ -28,15 +28,15 @@ package mage.sets.gatecrash; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -95,8 +95,8 @@ class DinrovaHorrorEffect extends OneShotEffect { if (target != null) { Player controller = game.getPlayer(target.getControllerId()); if (controller != null) { - controller.moveCardToHandWithInfo(target, source.getSourceId(), game, Zone.BATTLEFIELD); - controller.discard(1, source, game); + controller.moveCards(target, null, Zone.HAND, source, game); + controller.discard(1, false, source, game); return true; } } diff --git a/Mage.Sets/src/mage/sets/gatecrash/DomriRade.java b/Mage.Sets/src/mage/sets/gatecrash/DomriRade.java index 40ec318e1bd..0d92cdf0bac 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/DomriRade.java +++ b/Mage.Sets/src/mage/sets/gatecrash/DomriRade.java @@ -29,11 +29,6 @@ package mage.sets.gatecrash; import java.util.UUID; import mage.MageObject; - -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.EntersBattlefieldAbility; @@ -50,7 +45,11 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; @@ -71,8 +70,6 @@ public class DomriRade extends CardImpl { this.expansionSetCode = "GTC"; this.subtype.add("Domri"); - - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false)); // +1: Look at the top card of your library. If it's a creature card, you may reveal it and put it into your hand. @@ -127,8 +124,8 @@ class DomriRadeEffect1 extends OneShotEffect { controller.lookAtCards(sourceObject.getName(), cards, game); if (card.getCardType().contains(CardType.CREATURE)) { if (controller.chooseUse(outcome, "Reveal " + card.getName() + " and put it into your hand?", source, game)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - controller.revealCards(sourceObject.getName(), cards, game); + controller.moveCards(card, null, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName(), cards, game); } } return true; @@ -139,7 +136,9 @@ class DomriRadeEffect1 extends OneShotEffect { } class DomriRadeEmblem extends Emblem { + // "Creatures you control have double strike, trample, hexproof and haste." + public DomriRadeEmblem() { this.setName("EMBLEM: Domri Rade"); FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); @@ -156,7 +155,7 @@ class DomriRadeEmblem extends Emblem { } class DomriRadeTargetOtherCreaturePermanent extends TargetCreaturePermanent { - + public DomriRadeTargetOtherCreaturePermanent() { super(); } diff --git a/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java b/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java index fec01eeb83c..79f6528f5b4 100644 --- a/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java +++ b/Mage.Sets/src/mage/sets/iceage/DemonicConsultation.java @@ -28,6 +28,7 @@ package mage.sets.iceage; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -54,7 +55,6 @@ public class DemonicConsultation extends CardImpl { super(ownerId, 9, "Demonic Consultation", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{B}"); this.expansionSetCode = "ICE"; - // Name a card. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal the named card. Put that card into your hand and exile all other cards revealed this way. this.getSpellAbility().addEffect(new DemonicConsultationEffect()); } @@ -70,63 +70,58 @@ public class DemonicConsultation extends CardImpl { } class DemonicConsultationEffect extends OneShotEffect { - + DemonicConsultationEffect() { super(Outcome.Benefit); this.staticText = "Name a card. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal the named card. Put that card into your hand and exile all other cards revealed this way"; } - + DemonicConsultationEffect(final DemonicConsultationEffect effect) { super(effect); } - + @Override public DemonicConsultationEffect copy() { return new DemonicConsultationEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { // Name a card. Choice choice = new ChoiceImpl(); choice.setChoices(CardRepository.instance.getNames()); - while (!player.choose(Outcome.Benefit, choice, game)) { - if (!player.canRespond()) { + while (!controller.choose(Outcome.Benefit, choice, game)) { + if (!controller.canRespond()) { return false; } } String name = choice.getChoice(); game.informPlayers("Card named: " + name); - + // Exile the top six cards of your library, - int num = Math.min(6, player.getLibrary().size()); - for (int i = 0; i < num; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - player.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); - } - } - + controller.moveCards(controller.getLibrary().getTopCards(game, 6), null, Zone.EXILED, source, game); + // then reveal cards from the top of your library until you reveal the named card. - Cards cards = new CardsImpl(Zone.LIBRARY); - while (player.getLibrary().size() > 0) { - Card card = player.getLibrary().removeFromTop(game); + Cards cardsToReaveal = new CardsImpl(); + Card cardToHand = null; + while (controller.getLibrary().size() > 0) { + Card card = controller.getLibrary().removeFromTop(game); if (card != null) { - cards.add(card); + cardsToReaveal.add(card); // Put that card into your hand if (card.getName().equals(name)) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + cardToHand = card; break; } - // and exile all other cards revealed this way. - else { - player.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); - } } } - player.revealCards("Demonic Consultation", cards, game); + controller.moveCards(cardToHand, null, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName(), cardsToReaveal, game); + cardsToReaveal.remove(cardToHand); + controller.moveCards(cardsToReaveal, null, Zone.EXILED, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/innistrad/CaravanVigil.java b/Mage.Sets/src/mage/sets/innistrad/CaravanVigil.java index aed1c1e2af2..4dc4e3bd417 100644 --- a/Mage.Sets/src/mage/sets/innistrad/CaravanVigil.java +++ b/Mage.Sets/src/mage/sets/innistrad/CaravanVigil.java @@ -29,10 +29,6 @@ package mage.sets.innistrad; import java.util.UUID; import mage.MageObject; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.condition.common.MorbidCondition; import mage.abilities.effects.OneShotEffect; @@ -40,6 +36,10 @@ 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.common.FilterBasicLandCard; import mage.game.Game; import mage.players.Player; @@ -55,7 +55,6 @@ public class CaravanVigil extends CardImpl { super(ownerId, 173, "Caravan Vigil", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{G}"); this.expansionSetCode = "ISD"; - // Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. // Morbid - You may put that card onto the battlefield instead of putting it into your hand if a creature died this turn. this.getSpellAbility().addEffect(new CaravanVigilEffect()); @@ -103,10 +102,10 @@ class CaravanVigilEffect extends OneShotEffect { && controller.chooseUse(Outcome.PutLandInPlay, "Do you wish to put the card onto the battlefield instead?", source, game)) { controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId()); } else { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); } - controller.revealCards(sourceObject.getName(), cards, game); - } + controller.revealCards(sourceObject.getIdName(), cards, game); + } } controller.shuffleLibrary(game); return true; diff --git a/Mage.Sets/src/mage/sets/invasion/Recoil.java b/Mage.Sets/src/mage/sets/invasion/Recoil.java index f062d0bb68b..8b220966d18 100644 --- a/Mage.Sets/src/mage/sets/invasion/Recoil.java +++ b/Mage.Sets/src/mage/sets/invasion/Recoil.java @@ -50,11 +50,10 @@ public class Recoil extends CardImpl { super(ownerId, 264, "Recoil", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}{B}"); this.expansionSetCode = "INV"; - // Return target permanent to its owner's hand. Then that player discards a card. this.getSpellAbility().addEffect(new RecoilEffect()); - this.getSpellAbility().addTarget(new TargetPermanent()); - + this.getSpellAbility().addTarget(new TargetPermanent()); + } public Recoil(final Recoil card) { @@ -86,13 +85,11 @@ class RecoilEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent target = game.getPermanent(source.getFirstTarget()); - if (target != null) { - Player controller = game.getPlayer(target.getControllerId()); - if (controller != null) { - controller.moveCardToHandWithInfo(target, source.getSourceId(), game, Zone.BATTLEFIELD); - controller.discard(1, source, game); - return true; - } + Player controller = game.getPlayer(target.getControllerId()); + if (target != null && controller != null) { + controller.moveCards(target, null, Zone.HAND, source, game); + controller.discard(1, false, source, game); + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java b/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java index b5024166052..46f26f68d52 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java @@ -64,12 +64,12 @@ import mage.target.common.TargetOpponent; public class AthreosGodOfPassage extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you own"); - + static { filter.add(new AnotherPredicate()); filter.add(new OwnerPredicate(TargetController.YOU)); } - + public AthreosGodOfPassage(UUID ownerId) { super(ownerId, 146, "Athreos, God of Passage", Rarity.MYTHIC, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{W}{B}"); this.expansionSetCode = "JOU"; @@ -84,12 +84,12 @@ public class AthreosGodOfPassage extends CardImpl { // As long as your devotion to white and black is less than seven, Athreos isn't a creature. Effect effect = new LoseCreatureTypeSourceEffect(new DevotionCount(ColoredManaSymbol.W, ColoredManaSymbol.B), 7); effect.setText("As long as your devotion to white and black is less than seven, Athreos isn't a creature"); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); // Whenever another creature you own dies, return it to your hand unless target opponent pays 3 life. Ability ability = new AthreosDiesCreatureTriggeredAbility(new AthreosGodOfPassageReturnEffect(), false, filter); ability.addTarget(new TargetOpponent()); this.addAbility(ability); - + } public AthreosGodOfPassage(final AthreosGodOfPassage card) { @@ -103,21 +103,21 @@ public class AthreosGodOfPassage extends CardImpl { } class AthreosGodOfPassageReturnEffect extends OneShotEffect { - + public AthreosGodOfPassageReturnEffect() { super(Outcome.Benefit); this.staticText = "return it to your hand unless target opponent pays 3 life"; } - + public AthreosGodOfPassageReturnEffect(final AthreosGodOfPassageReturnEffect effect) { super(effect); } - + @Override public AthreosGodOfPassageReturnEffect copy() { return new AthreosGodOfPassageReturnEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -134,13 +134,13 @@ class AthreosGodOfPassageReturnEffect extends OneShotEffect { if (cost.pay(source, game, source.getSourceId(), opponent.getId(), false)) { paid = true; } - } + } } if (opponent == null || !paid) { if (game.getState().getZone(creature.getId()).equals(Zone.GRAVEYARD)) { - controller.moveCardToHandWithInfo(creature, source.getSourceId(), game, Zone.GRAVEYARD); + controller.moveCards(creature, null, Zone.HAND, source, game); } - } + } } return true; } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java b/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java index e2ce4ed1bcb..3f758c3321a 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/BrainMaggot.java @@ -27,7 +27,6 @@ */ package mage.sets.journeyintonyx; -import java.util.LinkedList; import java.util.UUID; import mage.MageInt; import mage.MageObject; @@ -74,7 +73,7 @@ public class BrainMaggot extends CardImpl { Ability ability = new EntersBattlefieldTriggeredAbility(new BrainMaggotExileEffect()); ability.addTarget(new TargetOpponent()); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new BrainMaggotReturnExiledCardAbility())); - this.addAbility(ability); + this.addAbility(ability); } public BrainMaggot(final BrainMaggot card) { @@ -110,7 +109,7 @@ class BrainMaggotExileEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && opponent != null && sourcePermanent != null) { if (!opponent.getHand().isEmpty()) { - opponent.revealCards(sourcePermanent.getName(), opponent.getHand(), game); + opponent.revealCards(sourcePermanent.getIdName(), opponent.getHand(), game); FilterCard filter = new FilterNonlandCard("nonland card to exile"); TargetCard target = new TargetCard(Zone.HAND, filter); @@ -130,11 +129,10 @@ class BrainMaggotExileEffect extends OneShotEffect { } /** - * Returns the exiled card as source permanent leaves battlefield - * Uses no stack + * Returns the exiled card as source permanent leaves battlefield Uses no stack + * * @author LevelX2 */ - class BrainMaggotReturnExiledCardAbility extends DelayedTriggeredAbility { public BrainMaggotReturnExiledCardAbility() { @@ -190,18 +188,13 @@ class BrainMaggotReturnExiledCardEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); if (sourceObject != null && controller != null) { - int zoneChangeCounter = (sourceObject instanceof PermanentToken) ? source.getSourceObjectZoneChangeCounter() : source.getSourceObjectZoneChangeCounter() -1; + int zoneChangeCounter = (sourceObject instanceof PermanentToken) ? source.getSourceObjectZoneChangeCounter() : source.getSourceObjectZoneChangeCounter() - 1; ExileZone exile = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source.getSourceId(), zoneChangeCounter)); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (exile != null && sourcePermanent != null) { - LinkedList cards = new LinkedList<>(exile); - for (UUID cardId : cards) { - Card card = game.getCard(cardId); - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.EXILED); - } - exile.clear(); + controller.moveCards(exile, null, Zone.HAND, source, game); return true; - } + } } return false; } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/Hubris.java b/Mage.Sets/src/mage/sets/journeyintonyx/Hubris.java index c9ac8245496..0193cf32751 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/Hubris.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/Hubris.java @@ -31,6 +31,8 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; @@ -52,12 +54,10 @@ public class Hubris extends CardImpl { super(ownerId, 41, "Hubris", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); this.expansionSetCode = "JOU"; - // Return target creature and all Auras attached to it to their owners' hand. this.getSpellAbility().addEffect(new HubrisReturnEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - } public Hubris(final Hubris card) { @@ -96,16 +96,12 @@ class HubrisReturnEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - for (UUID targetId: targetPointer.getTargets(game, source)) { + for (UUID targetId : targetPointer.getTargets(game, source)) { Permanent creature = game.getPermanent(targetId); if (creature != null) { - controller.moveCardToHandWithInfo(creature, source.getSourceId(), game, Zone.BATTLEFIELD); - for (UUID attachementId: creature.getAttachments()) { - Permanent attachment = game.getPermanent(attachementId); - if (attachment != null && filter.match(attachment, game)) { - controller.moveCardToHandWithInfo(attachment, source.getSourceId(), game, Zone.BATTLEFIELD); - } - } + Cards cardsToHand = new CardsImpl(creature.getAttachments()); + cardsToHand.add(creature); + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); } } return true; diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java b/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java index c0da2b6ed25..2926899d604 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java @@ -101,36 +101,30 @@ class NessianGameWardenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (player == null || sourcePermanent == null) { + if (controller == null || sourcePermanent == null) { return false; } Cards cards = new CardsImpl(); int count = new PermanentsOnBattlefieldCount(filter).calculate(game, source, this); - count = Math.min(player.getLibrary().size(), count); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards(sourcePermanent.getName(), cards, game); + cards.addAll(controller.getLibrary().getTopCards(game, count)); + controller.lookAtCards(sourcePermanent.getIdName(), cards, game); if (!cards.isEmpty()) { TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to put into your hand")); - if (target.canChoose(source.getSourceId(), player.getId(), game) && player.choose(Outcome.DrawCard, cards, target, game)) { + if (target.canChoose(source.getSourceId(), controller.getId(), game) && controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { - player.revealCards(sourcePermanent.getName(), new CardsImpl(card), game); + controller.revealCards(sourcePermanent.getName(), new CardsImpl(card), game); cards.remove(card); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); } } } - player.putCardsOnBottomOfLibrary(cards, game, source, true); + controller.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/ScourgeOfFleets.java b/Mage.Sets/src/mage/sets/journeyintonyx/ScourgeOfFleets.java index b6b3b9e6720..29a3a66637f 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/ScourgeOfFleets.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/ScourgeOfFleets.java @@ -33,6 +33,8 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; @@ -78,27 +80,27 @@ public class ScourgeOfFleets extends CardImpl { } class ScourgeOfFleetsEffect extends OneShotEffect { - + private static final FilterControlledPermanent filter = new FilterControlledPermanent("number of Islands you control"); - + static { filter.add(new SubtypePredicate("Island")); } - + public ScourgeOfFleetsEffect() { super(Outcome.Benefit); this.staticText = "return each creature your opponents control with toughness X or less, where X is the number of Islands you control"; } - + public ScourgeOfFleetsEffect(final ScourgeOfFleetsEffect effect) { super(effect); } - + @Override public ScourgeOfFleetsEffect copy() { return new ScourgeOfFleetsEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -106,10 +108,12 @@ class ScourgeOfFleetsEffect extends OneShotEffect { int islands = game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game); FilterPermanent creatureFilter = new FilterCreaturePermanent(); creatureFilter.add(new ControllerPredicate(TargetController.OPPONENT)); - creatureFilter.add(new ToughnessPredicate(Filter.ComparisonType.LessThan, islands +1)); - for (Permanent permanent: game.getBattlefield().getActivePermanents(creatureFilter, source.getControllerId(), source.getSourceId(), game)) { - controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + creatureFilter.add(new ToughnessPredicate(Filter.ComparisonType.LessThan, islands + 1)); + Cards cardsToHand = new CardsImpl(); + for (Permanent permanent : game.getBattlefield().getActivePermanents(creatureFilter, source.getControllerId(), source.getSourceId(), game)) { + cardsToHand.add(permanent); } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2011/Cultivate.java b/Mage.Sets/src/mage/sets/magic2011/Cultivate.java index b4fe191ce45..b68d4a6bdeb 100644 --- a/Mage.Sets/src/mage/sets/magic2011/Cultivate.java +++ b/Mage.Sets/src/mage/sets/magic2011/Cultivate.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,16 +20,15 @@ * 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.magic2011; -import java.util.List; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -93,41 +92,44 @@ class CultivateEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller == null || sourceObject == null) { + return false; + } TargetCardInLibrary target = new TargetCardInLibrary(0, 2, new FilterBasicLandCard()); - Player player = game.getPlayer(source.getControllerId()); - if (player.searchLibrary(target, game)) { + if (controller.searchLibrary(target, game)) { if (target.getTargets().size() > 0) { Cards revealed = new CardsImpl(); - for (UUID cardId: (List)target.getTargets()) { - Card card = player.getLibrary().getCard(cardId, game); + for (UUID cardId : target.getTargets()) { + Card card = controller.getLibrary().getCard(cardId, game); revealed.add(card); } - player.revealCards("Cultivate", revealed, game); + controller.revealCards(sourceObject.getIdName(), revealed, game); if (target.getTargets().size() == 2) { TargetCard target2 = new TargetCard(Zone.LIBRARY, filter); - player.choose(Outcome.Benefit, revealed, target2, game); + controller.choose(Outcome.Benefit, revealed, target2, game); Card card = revealed.get(target2.getFirstTarget(), game); if (card != null) { - player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); revealed.remove(card); } card = revealed.getCards(game).iterator().next(); if (card != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); } - } - else if (target.getTargets().size() == 1) { + } else if (target.getTargets().size() == 1) { Card card = revealed.getCards(game).iterator().next(); if (card != null) { - player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); + controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true); } } } - player.shuffleLibrary(game); + controller.shuffleLibrary(game); return true; } - player.shuffleLibrary(game); + controller.shuffleLibrary(game); return false; } diff --git a/Mage.Sets/src/mage/sets/magic2015/Quickling.java b/Mage.Sets/src/mage/sets/magic2015/Quickling.java index 21d407e9e75..569c612cf4b 100644 --- a/Mage.Sets/src/mage/sets/magic2015/Quickling.java +++ b/Mage.Sets/src/mage/sets/magic2015/Quickling.java @@ -79,6 +79,7 @@ public class Quickling extends CardImpl { return new Quickling(this); } } + class QuicklingEffect extends OneShotEffect { private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature you control"); @@ -88,12 +89,12 @@ class QuicklingEffect extends OneShotEffect { filter.add(new AnotherPredicate()); } - QuicklingEffect ( ) { + QuicklingEffect() { super(Outcome.ReturnToHand); staticText = effectText; } - QuicklingEffect ( QuicklingEffect effect ) { + QuicklingEffect(QuicklingEffect effect) { super(effect); } @@ -106,13 +107,13 @@ class QuicklingEffect extends OneShotEffect { if (target.canChoose(controller.getId(), game) && controller.chooseUse(outcome, "Return another creature you control to its owner's hand?", source, game)) { controller.chooseTarget(Outcome.ReturnToHand, target, source, game); Permanent permanent = game.getPermanent(target.getFirstTarget()); - if ( permanent != null ) { + if (permanent != null) { targetChosen = true; - controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + controller.moveCards(permanent, null, Zone.HAND, source, game); } } - if ( !targetChosen ) { + if (!targetChosen) { new SacrificeSourceEffect().apply(game, source); } return true; diff --git a/Mage.Sets/src/mage/sets/mirage/ForbiddenCrypt.java b/Mage.Sets/src/mage/sets/mirage/ForbiddenCrypt.java index e886dc432b5..ef346c00eac 100644 --- a/Mage.Sets/src/mage/sets/mirage/ForbiddenCrypt.java +++ b/Mage.Sets/src/mage/sets/mirage/ForbiddenCrypt.java @@ -57,7 +57,6 @@ public class ForbiddenCrypt extends CardImpl { super(ownerId, 22, "Forbidden Crypt", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); this.expansionSetCode = "MIR"; - // If you would draw a card, return a card from your graveyard to your hand instead. If you can't, you lose the game. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ForbiddenCryptDrawCardReplacementEffect())); // If a card would be put into your graveyard from anywhere, exile that card instead. @@ -80,7 +79,7 @@ class ForbiddenCryptDrawCardReplacementEffect extends ReplacementEffectImpl { super(Duration.WhileOnBattlefield, Outcome.Neutral); this.staticText = "If you would draw a card, return a card from your graveyard to your hand instead. If you can't, you lose the game"; } - + public ForbiddenCryptDrawCardReplacementEffect(final ForbiddenCryptDrawCardReplacementEffect effect) { super(effect); } @@ -92,22 +91,23 @@ class ForbiddenCryptDrawCardReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { boolean cardReturned = false; TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(); - if (target.canChoose(source.getSourceId(), player.getId(), game)) { - if (target.choose(Outcome.ReturnToHand, player.getId(), source.getSourceId(), game)) { + target.setNotTarget(true); + if (target.canChoose(source.getSourceId(), controller.getId(), game)) { + if (target.choose(Outcome.ReturnToHand, controller.getId(), source.getSourceId(), game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + controller.moveCards(card, null, Zone.HAND, source, game); cardReturned = true; } } } if (!cardReturned) { - game.informPlayers(new StringBuilder(player.getLogName()).append(" can't return a card from graveyard to hand.").toString()); - player.lost(game); + game.informPlayers(controller.getLogName() + " can't return a card from graveyard to hand."); + controller.lost(game); } return true; } @@ -118,12 +118,12 @@ class ForbiddenCryptDrawCardReplacementEffect extends ReplacementEffectImpl { public boolean checksEventType(GameEvent event, Game game) { return event.getType() == EventType.DRAW_CARD; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { return event.getPlayerId().equals(source.getControllerId()); } - + } class ForbiddenCryptPutIntoYourGraveyardReplacementEffect extends ReplacementEffectImpl { @@ -132,7 +132,7 @@ class ForbiddenCryptPutIntoYourGraveyardReplacementEffect extends ReplacementEff super(Duration.WhileOnBattlefield, Outcome.Detriment); this.staticText = "If a card would be put into your graveyard from anywhere, exile that card instead"; } - + public ForbiddenCryptPutIntoYourGraveyardReplacementEffect(final ForbiddenCryptPutIntoYourGraveyardReplacementEffect effect) { super(effect); } @@ -141,7 +141,7 @@ class ForbiddenCryptPutIntoYourGraveyardReplacementEffect extends ReplacementEff public ForbiddenCryptPutIntoYourGraveyardReplacementEffect copy() { return new ForbiddenCryptPutIntoYourGraveyardReplacementEffect(this); } - + @Override public boolean apply(Game game, Ability source) { return true; @@ -166,12 +166,12 @@ class ForbiddenCryptPutIntoYourGraveyardReplacementEffect extends ReplacementEff } return true; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == EventType.ZONE_CHANGE; - } - + } + @Override public boolean applies(GameEvent event, Ability source, Game game) { if (((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) { @@ -185,5 +185,5 @@ class ForbiddenCryptPutIntoYourGraveyardReplacementEffect extends ReplacementEff } return false; } - + } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java b/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java index f2017a43afa..d2eeb3bd174 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java @@ -53,7 +53,6 @@ public class SpoilsOfTheVault extends CardImpl { super(ownerId, 78, "Spoils of the Vault", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{B}"); this.expansionSetCode = "MRD"; - // Name a card. Reveal cards from the top of your library until you reveal the named card, then put that card into your hand. Exile all other cards revealed this way, and you lose 1 life for each of the exiled cards. this.getSpellAbility().addEffect(new NameACardEffect(NameACardEffect.TypeOfName.ALL)); this.getSpellAbility().addEffect(new SpoilsOfTheVaultEffect()); @@ -69,7 +68,6 @@ public class SpoilsOfTheVault extends CardImpl { } } - class SpoilsOfTheVaultEffect extends OneShotEffect { public SpoilsOfTheVaultEffect() { @@ -94,28 +92,25 @@ class SpoilsOfTheVaultEffect extends OneShotEffect { if (sourceObject == null || controller == null || cardName == null || cardName.isEmpty()) { return false; } - - Cards cards = new CardsImpl(); + + Cards cardsToReveal = new CardsImpl(); + Cards cardsToExile = new CardsImpl(); while (controller.getLibrary().size() > 0) { Card card = controller.getLibrary().removeFromTop(game); if (card != null) { - cards.add(card); - if(card.getName().equals(cardName)){ - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + cardsToReveal.add(card); + if (card.getName().equals(cardName)) { + controller.moveCards(card, null, Zone.HAND, source, game); break; + } else { + cardsToExile.add(card); } - else{ - controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); - } - } - else{ - break; } } - - controller.revealCards(sourceObject.getName(), cards, game); - controller.loseLife(cards.size(), game); - + controller.revealCards(sourceObject.getIdName(), cardsToReveal, game); + controller.moveCards(cardsToExile, null, Zone.EXILED, source, game); + controller.loseLife(cardsToExile.size(), game); + return true; } } diff --git a/Mage.Sets/src/mage/sets/modernmasters/PetalsOfInsight.java b/Mage.Sets/src/mage/sets/modernmasters/PetalsOfInsight.java index 8a75832ee6b..6c15cb1f329 100644 --- a/Mage.Sets/src/mage/sets/modernmasters/PetalsOfInsight.java +++ b/Mage.Sets/src/mage/sets/modernmasters/PetalsOfInsight.java @@ -28,6 +28,7 @@ package mage.sets.modernmasters; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -52,7 +53,6 @@ public class PetalsOfInsight extends CardImpl { this.expansionSetCode = "MMA"; this.subtype.add("Arcane"); - // Look at the top three cards of your library. You may put those cards on the bottom of your library in any order. If you do, return Petals of Insight to its owner's hand. Otherwise, draw three cards. this.getSpellAbility().addEffect(new PetalsOfInsightEffect()); } @@ -85,33 +85,23 @@ class PetalsOfInsightEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller == null || sourceObject == null) { return false; } Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Petals of Insight", cards, game); - if (player.chooseUse(outcome, "Put the cards on the bottom of your library in any order?", source, game)) { - player.putCardsOnBottomOfLibrary(cards, game, source, true); + cards.addAll(controller.getLibrary().getTopCards(game, 3)); + + controller.lookAtCards(sourceObject.getIdName(), cards, game); + if (controller.chooseUse(outcome, "Put the cards on the bottom of your library in any order?", source, game)) { + controller.putCardsOnBottomOfLibrary(cards, game, source, true); Card spellCard = game.getStack().getSpell(source.getSourceId()).getCard(); if (spellCard != null) { - player.moveCardToHandWithInfo(spellCard, source.getSourceId(), game, Zone.STACK); + controller.moveCards(spellCard, null, Zone.HAND, source, game); } } else { - for (UUID cardId: cards) { - Card card = game.getCard(cardId); - if (card != null) { - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - } - player.drawCards(3, game); + controller.drawCards(3, game); } return true; } diff --git a/Mage.Sets/src/mage/sets/modernmasters2015/AllSunsDawn.java b/Mage.Sets/src/mage/sets/modernmasters2015/AllSunsDawn.java index 7c68912d601..0b01857a2ed 100644 --- a/Mage.Sets/src/mage/sets/modernmasters2015/AllSunsDawn.java +++ b/Mage.Sets/src/mage/sets/modernmasters2015/AllSunsDawn.java @@ -34,6 +34,8 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileSpellEffect; 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; @@ -56,7 +58,7 @@ public class AllSunsDawn extends CardImpl { private final static FilterCard filterBlue = new FilterCard("blue card from your graveyard"); private final static FilterCard filterBlack = new FilterCard("black card from your graveyard"); private final static FilterCard filterWhite = new FilterCard("white card from your graveyard"); - + static { filterGreen.add(new ColorPredicate(ObjectColor.GREEN)); filterRed.add(new ColorPredicate(ObjectColor.RED)); @@ -64,18 +66,18 @@ public class AllSunsDawn extends CardImpl { filterBlack.add(new ColorPredicate(ObjectColor.BLACK)); filterWhite.add(new ColorPredicate(ObjectColor.WHITE)); } - + public AllSunsDawn(UUID ownerId) { super(ownerId, 138, "All Suns' Dawn", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{G}"); this.expansionSetCode = "MM2"; - // For each color, return up to one target card of that color from your graveyard to your hand. + // For each color, return up to one target card of that color from your graveyard to your hand. this.getSpellAbility().addEffect(new AllSunsDawnEffect()); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,1,filterGreen)); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,1,filterRed)); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,1,filterBlue)); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,1,filterBlack)); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,1,filterWhite)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, filterGreen)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, filterRed)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, filterBlue)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, filterBlack)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, filterWhite)); // Exile All Suns' Dawn. this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); } @@ -91,32 +93,34 @@ public class AllSunsDawn extends CardImpl { } class AllSunsDawnEffect extends OneShotEffect { - + public AllSunsDawnEffect() { super(Outcome.ReturnToHand); this.staticText = "For each color, return up to one target card of that color from your graveyard to your hand. Exile {this}"; } - + public AllSunsDawnEffect(final AllSunsDawnEffect effect) { super(effect); } - + @Override public AllSunsDawnEffect copy() { return new AllSunsDawnEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - for(Target target: source.getTargets()) { + Cards cardsToHand = new CardsImpl(); + for (Target target : source.getTargets()) { UUID targetId = target.getFirstTarget(); Card card = game.getCard(targetId); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD, true); + cardsToHand.add(card); } } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java b/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java index b03ec15c5ae..dd376b43af1 100644 --- a/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java +++ b/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java @@ -28,14 +28,13 @@ package mage.sets.onslaught; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; -import mage.constants.Outcome; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.game.Game; @@ -55,7 +54,6 @@ public class ChainOfVapor extends CardImpl { super(ownerId, 73, "Chain of Vapor", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{U}"); this.expansionSetCode = "ONS"; - // Return target nonland permanent to its owner's hand. Then that permanent's controller may sacrifice a land. If the player does, he or she may copy this spell and may choose a new target for that copy. this.getSpellAbility().addEffect(new ChainOfVaporEffect()); this.getSpellAbility().addTarget(new TargetNonlandPermanent()); @@ -94,16 +92,14 @@ class ChainOfVaporEffect extends OneShotEffect { } Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - if (!controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD)){ - return false; - } + controller.moveCards(permanent, null, Zone.HAND, source, game); Player player = game.getPlayer(permanent.getControllerId()); - if (player.chooseUse(Outcome.ReturnToHand, "Sacrifice a land to copy this spell?", source, game)){ + if (player.chooseUse(Outcome.ReturnToHand, "Sacrifice a land to copy this spell?", source, game)) { TargetControlledPermanent target = new TargetControlledPermanent(new FilterControlledLandPermanent()); - if (player.chooseTarget(Outcome.Sacrifice, target, source, game)){ + if (player.chooseTarget(Outcome.Sacrifice, target, source, game)) { Permanent land = game.getPermanent(target.getFirstTarget()); - if(land != null){ - if(land.sacrifice(source.getSourceId(), game)){ + if (land != null) { + if (land.sacrifice(source.getSourceId(), game)) { Spell spell = game.getStack().getSpell(source.getSourceId()); if (spell != null) { Spell copy = spell.copySpell(); @@ -123,9 +119,10 @@ class ChainOfVaporEffect extends OneShotEffect { } } } + return true; } - - return true; + + return false; } @Override diff --git a/Mage.Sets/src/mage/sets/onslaught/WeirdHarvest.java b/Mage.Sets/src/mage/sets/onslaught/WeirdHarvest.java index 1be7a060ebc..788ec1f3ab5 100644 --- a/Mage.Sets/src/mage/sets/onslaught/WeirdHarvest.java +++ b/Mage.Sets/src/mage/sets/onslaught/WeirdHarvest.java @@ -30,9 +30,9 @@ package mage.sets.onslaught; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.Cards; import mage.cards.CardsImpl; @@ -55,7 +55,6 @@ public class WeirdHarvest extends CardImpl { super(ownerId, 299, "Weird Harvest", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{X}{G}{G}"); this.expansionSetCode = "ONS"; - // Each player may search his or her library for up to X creature cards, reveal those cards, and put them into his or her hand. Then each player who searched his or her library this way shuffles it. getSpellAbility().addEffect(new WeirdHarvestEffect()); } @@ -89,20 +88,21 @@ class WeirdHarvestEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { int xValue = source.getManaCostsToPay().getX(); if (xValue > 0) { List usingPlayers = new ArrayList<>(); - this.chooseAndSearchLibrary(usingPlayers, controller, xValue, source, game); - for (UUID playerId: controller.getInRange()) { + this.chooseAndSearchLibrary(usingPlayers, controller, xValue, source, sourceObject, game); + for (UUID playerId : controller.getInRange()) { if (!playerId.equals(controller.getId())) { Player player = game.getPlayer(playerId); if (player != null) { - this.chooseAndSearchLibrary(usingPlayers, player, xValue, source, game); + this.chooseAndSearchLibrary(usingPlayers, player, xValue, source, sourceObject, game); } } } - for (Player player: usingPlayers) { + for (Player player : usingPlayers) { player.shuffleLibrary(game); } return true; @@ -111,21 +111,15 @@ class WeirdHarvestEffect extends OneShotEffect { return false; } - private void chooseAndSearchLibrary(List usingPlayers, Player player, int xValue, Ability source, Game game) { + private void chooseAndSearchLibrary(List usingPlayers, Player player, int xValue, Ability source, MageObject sourceObject, Game game) { if (player.chooseUse(Outcome.PutCardInPlay, "Search your library for up " + xValue + " creature cards and put them into your hand?", source, game)) { usingPlayers.add(player); TargetCardInLibrary target = new TargetCardInLibrary(0, xValue, new FilterCreatureCard()); if (player.searchLibrary(target, game)) { if (target.getTargets().size() > 0) { - Cards cards = new CardsImpl(); - for (UUID cardId: (List)target.getTargets()) { - Card card = player.getLibrary().getCard(cardId, game); - if (card != null) { - cards.add(card); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - } - } - player.revealCards("Weird Harvest", cards, game); + Cards cards = new CardsImpl(target.getTargets()); + player.moveCards(cards, null, Zone.HAND, source, game); + player.revealCards(sourceObject.getIdName() + " (" + player.getName() + ")", cards, game); } } } diff --git a/Mage.Sets/src/mage/sets/planeshift/SkyshipWeatherlight.java b/Mage.Sets/src/mage/sets/planeshift/SkyshipWeatherlight.java index 4342192abcb..22a1c755e1b 100644 --- a/Mage.Sets/src/mage/sets/planeshift/SkyshipWeatherlight.java +++ b/Mage.Sets/src/mage/sets/planeshift/SkyshipWeatherlight.java @@ -34,61 +34,60 @@ import mage.util.CardUtil; * @author nick.myers */ public class SkyshipWeatherlight extends CardImpl { - + public SkyshipWeatherlight(UUID ownerId) { super(ownerId, 133, "Skyship Weatherlight", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}"); this.expansionSetCode = "PLS"; this.supertype.add("Legendary"); - + // When Skyship Weatherlight enters the battlefield, search your library for any number of artifact and/or creature cards and exile them. Then shuffle your library. this.addAbility(new EntersBattlefieldTriggeredAbility(new SkyshipWeatherlightEffect(), false)); - + // {4}, {tap}, Choose a card at random that was removed from the game with Skyship Weatherlight. Put that card into your hand. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SkyshipWeatherlightEffect2(), new GenericManaCost(4)); ability.addCost(new TapSourceCost()); this.addAbility(ability); } - + public SkyshipWeatherlight(final SkyshipWeatherlight card) { super(card); } - + @Override public SkyshipWeatherlight copy() { return new SkyshipWeatherlight(this); } - + } class SkyshipWeatherlightEffect extends SearchEffect { - + private static final FilterCard filter = new FilterCard("artifact and/or creature card"); - - + static { filter.add(Predicates.or( - new CardTypePredicate(CardType.ARTIFACT), - new CardTypePredicate(CardType.CREATURE))); + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE))); } - + public SkyshipWeatherlightEffect() { - + super(new TargetCardInLibrary(0, Integer.MAX_VALUE, filter), Outcome.Neutral); this.staticText = "search your library for any number of artifact and/or creature cards and remove them from the game. Then shuffle your library"; - + } - + public SkyshipWeatherlightEffect(final SkyshipWeatherlightEffect effect) { super(effect); } - + @Override public SkyshipWeatherlightEffect copy() { return new SkyshipWeatherlightEffect(this); } - + @Override - public boolean apply (Game game, Ability source) { + public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); if (sourceObject != null && controller != null) { @@ -108,25 +107,25 @@ class SkyshipWeatherlightEffect extends SearchEffect { } return false; } - + } class SkyshipWeatherlightEffect2 extends OneShotEffect { - + public SkyshipWeatherlightEffect2() { super(Outcome.ReturnToHand); this.staticText = "Choose a card at random that was removed from the game with {this}. Put that card into your hand"; } - + public SkyshipWeatherlightEffect2(final SkyshipWeatherlightEffect2 effect) { super(effect); } - + @Override public SkyshipWeatherlightEffect2 copy() { return new SkyshipWeatherlightEffect2(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); @@ -134,12 +133,11 @@ class SkyshipWeatherlightEffect2 extends OneShotEffect { if (sourceObject != null && controller != null) { ExileZone exZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter())); if (exZone != null) { - Card card = exZone.getRandom(game); - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.EXILED); + controller.moveCards(exZone.getRandom(game), null, Zone.HAND, source, game); } return true; } return false; } - + } diff --git a/Mage.Sets/src/mage/sets/ravnica/CloudstoneCurio.java b/Mage.Sets/src/mage/sets/ravnica/CloudstoneCurio.java index db7a7afef5e..661f4f5883b 100644 --- a/Mage.Sets/src/mage/sets/ravnica/CloudstoneCurio.java +++ b/Mage.Sets/src/mage/sets/ravnica/CloudstoneCurio.java @@ -57,6 +57,7 @@ import mage.target.TargetPermanent; public class CloudstoneCurio extends CardImpl { private static final FilterPermanent filter = new FilterPermanent("a nonartifact permanent"); + static { filter.add(Predicates.not(new CardTypePredicate(CardType.ARTIFACT))); filter.add(new ControllerPredicate(TargetController.YOU)); @@ -69,7 +70,6 @@ public class CloudstoneCurio extends CardImpl { // Whenever a nonartifact permanent enters the battlefield under your control, you may return another permanent you control that shares a card type with it to its owner's hand. this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new CloudstoneCurioEffect(), filter, true, SetTargetPointer.PERMANENT, "", true)); - } public CloudstoneCurio(final CloudstoneCurio card) { @@ -120,7 +120,7 @@ class CloudstoneCurioEffect extends OneShotEffect { if (target.canChoose(controller.getId(), game) && controller.chooseTarget(outcome, target, source, game)) { Permanent returningCreature = game.getPermanent(target.getFirstTarget()); if (returningCreature != null) { - controller.moveCardToHandWithInfo(returningCreature, source.getSourceId(), game, Zone.BATTLEFIELD); + controller.moveCards(returningCreature, null, Zone.HAND, source, game); } } } diff --git a/Mage.Sets/src/mage/sets/ravnica/DarkConfidant.java b/Mage.Sets/src/mage/sets/ravnica/DarkConfidant.java index 830ed264fa4..d5c22e87007 100644 --- a/Mage.Sets/src/mage/sets/ravnica/DarkConfidant.java +++ b/Mage.Sets/src/mage/sets/ravnica/DarkConfidant.java @@ -28,10 +28,6 @@ package mage.sets.ravnica; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -40,8 +36,11 @@ 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.TargetController; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -76,6 +75,7 @@ public class DarkConfidant extends CardImpl { } class DarkConfidantEffect extends OneShotEffect { + DarkConfidantEffect() { super(Outcome.DrawCard); this.staticText = "reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost"; @@ -87,17 +87,16 @@ class DarkConfidantEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (player != null && sourcePermanent != null) { - if (player.getLibrary().size() > 0) { - Card card = player.getLibrary().removeFromTop(game); + if (controller != null && sourcePermanent != null) { + if (controller.getLibrary().size() > 0) { + Card card = controller.getLibrary().removeFromTop(game); if (card != null) { - Cards cards = new CardsImpl(); - cards.add(card); - player.revealCards(sourcePermanent.getName(), cards, game); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - player.loseLife(card.getManaCost().convertedManaCost(), game); + Cards cards = new CardsImpl(card); + controller.revealCards(sourcePermanent.getIdName(), cards, game); + controller.moveCards(card, null, Zone.HAND, source, game); + controller.loseLife(card.getManaCost().convertedManaCost(), game); } return true; diff --git a/Mage.Sets/src/mage/sets/returntoravnica/FaerieImpostor.java b/Mage.Sets/src/mage/sets/returntoravnica/FaerieImpostor.java index 4d786071745..a4f918823d2 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/FaerieImpostor.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/FaerieImpostor.java @@ -28,9 +28,6 @@ package mage.sets.returntoravnica; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -38,7 +35,9 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.AnotherPredicate; @@ -88,12 +87,12 @@ class FaerieImpostorEffect extends OneShotEffect { filter.add(new AnotherPredicate()); } - FaerieImpostorEffect ( ) { + FaerieImpostorEffect() { super(Outcome.ReturnToHand); staticText = effectText; } - FaerieImpostorEffect ( FaerieImpostorEffect effect ) { + FaerieImpostorEffect(FaerieImpostorEffect effect) { super(effect); } @@ -108,13 +107,13 @@ class FaerieImpostorEffect extends OneShotEffect { controller.choose(Outcome.ReturnToHand, target, source.getSourceId(), game); Permanent permanent = game.getPermanent(target.getFirstTarget()); - if ( permanent != null ) { + if (permanent != null) { targetChosen = true; - controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + controller.moveCards(permanent, null, Zone.HAND, source, game); } } - if ( !targetChosen ) { + if (!targetChosen) { new SacrificeSourceEffect().apply(game, source); } return true; diff --git a/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java b/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java index 3be54f89388..93753306a08 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/JaceArchitectOfThought.java @@ -258,7 +258,7 @@ class JaceArchitectOfThoughtEffect2 extends OneShotEffect { for (UUID cardUuid : cardsToHand) { Card card = cardsToHand.get(cardUuid, game); if (card != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + player.moveCards(card, null, Zone.HAND, source, game); } } diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/ElderPineOfJukai.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/ElderPineOfJukai.java index ac6b74af586..860c187ec2f 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/ElderPineOfJukai.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/ElderPineOfJukai.java @@ -99,13 +99,13 @@ class ElderPineOfJukaiEffect extends OneShotEffect { MageObject sourceObject = game.getObject(source.getSourceId()); if (controller == null || sourceObject == null) { return false; - } + } Cards cards = new CardsImpl(); cards.addAll(controller.getLibrary().getTopCards(game, 3)); controller.revealCards(sourceObject.getName(), cards, game); - for (Card card: cards.getCards(game)) { + for (Card card : cards.getCards(game)) { if (card.getCardType().contains(CardType.LAND)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); cards.remove(card); } } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/CerebralEruption.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/CerebralEruption.java index 318cd6d1486..404279a7b39 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/CerebralEruption.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/CerebralEruption.java @@ -1,16 +1,16 @@ /* * Copyright 2011 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 @@ -20,7 +20,7 @@ * 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. @@ -28,6 +28,7 @@ package mage.sets.scarsofmirrodin; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -55,7 +56,6 @@ public class CerebralEruption extends CardImpl { super(ownerId, 86, "Cerebral Eruption", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{R}{R}"); this.expansionSetCode = "SOM"; - // Target opponent reveals the top card of his or her library. Cerebral Eruption deals damage equal to the revealed card's converted mana cost to that player and each creature he or she controls. If a land card is revealed this way, return Cerebral Eruption to its owner's hand. this.getSpellAbility().addTarget(new TargetOpponent()); this.getSpellAbility().addEffect(new CerebralEruptionEffect()); @@ -87,21 +87,21 @@ class CerebralEruptionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getFirstTarget()); - if (player != null && player.getLibrary().size() > 0) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (player != null && sourceObject != null && player.getLibrary().size() > 0) { Card card = player.getLibrary().getFromTop(game); - Cards cards = new CardsImpl(); - cards.add(card); - player.revealCards("Cerebral Eruption", cards, game); + Cards cards = new CardsImpl(card); + player.revealCards(sourceObject.getIdName(), cards, game); game.getState().setValue(source.getSourceId().toString(), card); int damage = card.getManaCost().convertedManaCost(); player.damage(damage, source.getSourceId(), game, false, true); - for (Permanent perm: game.getBattlefield().getAllActivePermanents(filter, player.getId(), game)) { + for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, player.getId(), game)) { perm.damage(damage, source.getSourceId(), game, false, true); } if (card.getCardType().contains(CardType.LAND)) { Card spellCard = game.getStack().getSpell(source.getSourceId()).getCard(); if (spellCard != null) { - player.moveCardToHandWithInfo(spellCard, source.getSourceId(), game, Zone.STACK); + player.moveCards(spellCard, null, Zone.HAND, source, game); } } return true; diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java index 389297a1198..99de7634a75 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/PsychicMiasma.java @@ -1,16 +1,16 @@ /* * Copyright 2011 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 @@ -20,7 +20,7 @@ * 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. @@ -50,7 +50,6 @@ public class PsychicMiasma extends CardImpl { super(ownerId, 76, "Psychic Miasma", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{B}"); this.expansionSetCode = "SOM"; - // Target player discards a card. If a land card is discarded this way, return Psychic Miasma to its owner's hand. this.getSpellAbility().addTarget(new TargetPlayer()); this.getSpellAbility().addEffect(new PsychicMiasmaEffect()); @@ -86,9 +85,10 @@ class PsychicMiasmaEffect extends OneShotEffect { if (discardedCard != null && discardedCard.getCardType().contains(CardType.LAND)) { Card spellCard = game.getStack().getSpell(source.getSourceId()).getCard(); if (spellCard != null) { - player.moveCardToHandWithInfo(spellCard, source.getSourceId(), game, Zone.STACK); + player.moveCards(spellCard, null, Zone.HAND, source, game); } } + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java b/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java index 402a2e440ab..99251d9485a 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java @@ -100,7 +100,7 @@ class AdviceFromTheFaeEffect extends OneShotEffect { for (Card card : cardsFromTopLibrary) { cards.add(card); } - controller.lookAtCards(mageObject.getName(), cards, game); + controller.lookAtCards(mageObject.getIdName(), cards, game); int max = 0; for (UUID playerId : controller.getInRange()) { FilterCreaturePermanent filter = new FilterCreaturePermanent(); @@ -111,20 +111,11 @@ class AdviceFromTheFaeEffect extends OneShotEffect { } } } - if (game.getBattlefield().countAll(new FilterControlledCreaturePermanent(), controller.getId(), game) > max) { - TargetCard target = new TargetCard(2, Zone.LIBRARY, new FilterCard()); - if (controller.choose(Outcome.DrawCard, cards, target, game)) { - controller.moveCardToHandWithInfo(game.getCard(target.getFirstTarget()), source.getSourceId(), game, Zone.LIBRARY); - cards.remove(game.getCard(target.getFirstTarget())); - controller.moveCardToHandWithInfo(game.getCard(target.getTargets().get(1)), source.getSourceId(), game, Zone.LIBRARY); - cards.remove(game.getCard(target.getTargets().get(1))); - } - } else { - TargetCard target = new TargetCard(1, Zone.LIBRARY, new FilterCard()); - if (controller.choose(Outcome.DrawCard, cards, target, game)) { - controller.moveCardToHandWithInfo(game.getCard(target.getFirstTarget()), source.getSourceId(), game, Zone.LIBRARY); - cards.remove(game.getCard(target.getFirstTarget())); - } + boolean moreCreatures = game.getBattlefield().countAll(new FilterControlledCreaturePermanent(), controller.getId(), game) > max; + TargetCard target = new TargetCard(moreCreatures ? 2 : 1, Zone.LIBRARY, new FilterCard()); + if (controller.choose(Outcome.DrawCard, cards, target, game)) { + cards.removeAll(target.getTargets()); + controller.moveCards(new CardsImpl(target.getTargets()), null, Zone.HAND, source, game); } controller.putCardsOnBottomOfLibrary(cards, game, source, true); return true; diff --git a/Mage.Sets/src/mage/sets/shardsofalara/AdNauseam.java b/Mage.Sets/src/mage/sets/shardsofalara/AdNauseam.java index 80ee8b645bf..23fd96ae723 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/AdNauseam.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/AdNauseam.java @@ -50,7 +50,6 @@ public class AdNauseam extends CardImpl { super(ownerId, 63, "Ad Nauseam", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{B}{B}"); this.expansionSetCode = "ALA"; - // Reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost. You may repeat this process any number of times. this.getSpellAbility().addEffect(new AdNauseamEffect()); } @@ -92,12 +91,12 @@ class AdNauseamEffect extends OneShotEffect { while (controller.chooseUse(outcome, message, source, game) && controller.getLibrary().size() > 0) { Card card = controller.getLibrary().removeFromTop(game); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); int cmc = card.getManaCost().convertedManaCost(); if (cmc > 0) { controller.loseLife(cmc, game); } - controller.revealCards(new StringBuilder(sourceCard.getName()).append(" put into hand").toString(), new CardsImpl(card), game); + controller.revealCards(sourceCard.getIdName() + " put into hand", new CardsImpl(card), game); } } return true; diff --git a/Mage.Sets/src/mage/sets/shardsofalara/CruelUltimatum.java b/Mage.Sets/src/mage/sets/shardsofalara/CruelUltimatum.java index 0e4a703fca4..6e853e8797b 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/CruelUltimatum.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/CruelUltimatum.java @@ -58,7 +58,6 @@ public class CruelUltimatum extends CardImpl { super(ownerId, 164, "Cruel Ultimatum", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{U}{U}{B}{B}{B}{R}{R}"); this.expansionSetCode = "ALA"; - // Target opponent sacrifices a creature, discards three cards, then loses 5 life. // You return a creature card from your graveyard to your hand, draw three cards, then gain 5 life. this.getSpellAbility().addTarget(new TargetOpponent()); @@ -99,17 +98,17 @@ class CruelUltimatumEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard")); - if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && player.choose(Outcome.ReturnToHand, target, source.getSourceId(), game)) { + if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && controller.choose(Outcome.ReturnToHand, target, source.getSourceId(), game)) { Card card = game.getCard(target.getFirstTarget()); if (card == null) { return false; } - return player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + controller.moveCards(card, null, Zone.HAND, source, game); } return true; } diff --git a/Mage.Sets/src/mage/sets/shardsofalara/TidehollowSculler.java b/Mage.Sets/src/mage/sets/shardsofalara/TidehollowSculler.java index f0a2e2f5bd3..e667e1d7cd6 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/TidehollowSculler.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/TidehollowSculler.java @@ -69,9 +69,8 @@ public class TidehollowSculler extends CardImpl { ability.addTarget(new TargetOpponent()); this.addAbility(ability); - // When Tidehollow Sculler leaves the battlefield, return the exiled card to its owner's hand. - this.addAbility(new LeavesBattlefieldTriggeredAbility(new TidehollowScullerLeaveEffect(), false )); + this.addAbility(new LeavesBattlefieldTriggeredAbility(new TidehollowScullerLeaveEffect(), false)); } public TidehollowSculler(final TidehollowSculler card) { @@ -124,7 +123,6 @@ class TidehollowScullerExileEffect extends OneShotEffect { return false; } - } class TidehollowScullerLeaveEffect extends OneShotEffect { @@ -148,17 +146,13 @@ class TidehollowScullerLeaveEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null) { - int zoneChangeCounter = (sourceObject instanceof PermanentToken) ? source.getSourceObjectZoneChangeCounter() : source.getSourceObjectZoneChangeCounter() -1; + int zoneChangeCounter = (sourceObject instanceof PermanentToken) ? source.getSourceObjectZoneChangeCounter() : source.getSourceObjectZoneChangeCounter() - 1; ExileZone exZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source.getSourceId(), zoneChangeCounter)); if (exZone != null) { - for (Card card : exZone.getCards(game)) { - if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.EXILED); - } - } - } + controller.moveCards(exZone, null, Zone.HAND, source, game); + } return true; } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/tenthedition/Abundance.java b/Mage.Sets/src/mage/sets/tenthedition/Abundance.java index 767dceb20f1..09bc7c058bf 100644 --- a/Mage.Sets/src/mage/sets/tenthedition/Abundance.java +++ b/Mage.Sets/src/mage/sets/tenthedition/Abundance.java @@ -28,6 +28,7 @@ package mage.sets.tenthedition; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; @@ -94,35 +95,35 @@ class AbundanceReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Player player = game.getPlayer(event.getPlayerId()); - if (player != null) { + Player controller = game.getPlayer(event.getPlayerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { FilterCard filter = new FilterCard(); - if (player.chooseUse(Outcome.Benefit, "Choose land? (No = nonland)", source, game)) { + if (controller.chooseUse(Outcome.Benefit, "Choose land? (No = nonland)", source, game)) { filter.add(new CardTypePredicate(CardType.LAND)); - } - else { + } else { filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); } Cards cards = new CardsImpl(); - while (player.getLibrary().size() > 0) { - Card card = player.getLibrary().removeFromTop(game); + while (controller.getLibrary().size() > 0) { + Card card = controller.getLibrary().removeFromTop(game); if (filter.match(card, source.getSourceId(), source.getControllerId(), game)) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + controller.moveCards(card, null, Zone.HAND, source, game); break; } cards.add(card); } - player.revealCards("Abundance", cards, game); - player.putCardsOnBottomOfLibrary(cards, game, source, true); + controller.revealCards(sourceObject.getIdName(), cards, game); + controller.putCardsOnBottomOfLibrary(cards, game, source, true); } return true; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.DRAW_CARD; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { if (event.getPlayerId().equals(source.getControllerId())) { @@ -133,4 +134,4 @@ class AbundanceReplacementEffect extends ReplacementEffectImpl { } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/torment/MesmericFiend.java b/Mage.Sets/src/mage/sets/torment/MesmericFiend.java index e04a248377b..b1d4d738348 100644 --- a/Mage.Sets/src/mage/sets/torment/MesmericFiend.java +++ b/Mage.Sets/src/mage/sets/torment/MesmericFiend.java @@ -71,7 +71,7 @@ public class MesmericFiend extends CardImpl { this.addAbility(ability); // When Mesmeric Fiend leaves the battlefield, return the exiled card to its owner's hand. - this.addAbility(new LeavesBattlefieldTriggeredAbility(new MesmericFiendLeaveEffect(), false )); + this.addAbility(new LeavesBattlefieldTriggeredAbility(new MesmericFiendLeaveEffect(), false)); } public MesmericFiend(final MesmericFiend card) { @@ -83,6 +83,7 @@ public class MesmericFiend extends CardImpl { return new MesmericFiend(this); } } + class MesmericFiendExileEffect extends OneShotEffect { public MesmericFiendExileEffect() { @@ -120,7 +121,6 @@ class MesmericFiendExileEffect extends OneShotEffect { return false; } - } class MesmericFiendLeaveEffect extends OneShotEffect { @@ -143,18 +143,13 @@ class MesmericFiendLeaveEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject !=null) { - int zoneChangeCounter = (sourceObject instanceof PermanentToken) ? source.getSourceObjectZoneChangeCounter() : source.getSourceObjectZoneChangeCounter() -1; + if (controller != null && sourceObject != null) { + int zoneChangeCounter = (sourceObject instanceof PermanentToken) ? source.getSourceObjectZoneChangeCounter() : source.getSourceObjectZoneChangeCounter() - 1; ExileZone exZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source.getSourceId(), zoneChangeCounter)); if (exZone != null) { - for (Card card : exZone.getCards(game)) { - if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.EXILED); - } - } - return true; + return controller.moveCards(exZone, null, Zone.HAND, source, game); } } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/IllGottenGains.java b/Mage.Sets/src/mage/sets/urzassaga/IllGottenGains.java index e4899307daa..f731566dde4 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/IllGottenGains.java +++ b/Mage.Sets/src/mage/sets/urzassaga/IllGottenGains.java @@ -32,8 +32,8 @@ import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileSpellEffect; import mage.abilities.effects.common.discard.DiscardHandAllEffect; -import mage.cards.Card; import mage.cards.CardImpl; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; @@ -54,13 +54,12 @@ public class IllGottenGains extends CardImpl { super(ownerId, 138, "Ill-Gotten Gains", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{B}{B}"); this.expansionSetCode = "USG"; - // Exile Ill-Gotten Gains. this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); - + // Each player discards his or her hand, this.getSpellAbility().addEffect(new DiscardHandAllEffect()); - + //then returns up to three cards from his or her graveyard to his or her hand. this.getSpellAbility().addEffect(new IllGottenGainsEffect()); } @@ -76,34 +75,31 @@ public class IllGottenGains extends CardImpl { } class IllGottenGainsEffect extends OneShotEffect { - + IllGottenGainsEffect() { super(Outcome.ReturnToHand); this.staticText = ", then returns up to three cards from his or her graveyard to his or her hand."; } - + IllGottenGainsEffect(final IllGottenGainsEffect effect) { super(effect); } - + @Override public IllGottenGainsEffect copy() { return new IllGottenGainsEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - for (UUID playerId : controller.getInRange()){ + for (UUID playerId : controller.getInRange()) { Player player = game.getPlayer(playerId); if (player != null) { Target target = new TargetCardInYourGraveyard(0, 3, new FilterCard()); if (target.choose(Outcome.ReturnToHand, player.getId(), source.getSourceId(), game)) { - for (UUID targetId : target.getTargets()) { - Card card = game.getCard(targetId); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); - } + controller.moveCards(new CardsImpl(target.getTargets()), null, Zone.HAND, source, game); } } } diff --git a/Mage.Sets/src/mage/sets/urzassaga/NoRestForTheWicked.java b/Mage.Sets/src/mage/sets/urzassaga/NoRestForTheWicked.java index 4fc753a2123..8d3b3c4a02d 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/NoRestForTheWicked.java +++ b/Mage.Sets/src/mage/sets/urzassaga/NoRestForTheWicked.java @@ -35,6 +35,8 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.effects.OneShotEffect; 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; @@ -86,22 +88,20 @@ class NoRestForTheWickedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { NoRestForTheWickedWatcher watcher = (NoRestForTheWickedWatcher) game.getState().getWatchers().get("NoRestForTheWickedWatcher"); - if (watcher != null) { + Player controller = game.getPlayer(source.getControllerId()); + if (watcher != null && controller != null) { + Cards cardsToHand = new CardsImpl(); for (UUID cardId : watcher.cards) { Card c = game.getCard(cardId); if (c != null) { if (game.getState().getZone(cardId) == Zone.GRAVEYARD && c.getCardType().contains(CardType.CREATURE) && c.getOwnerId().equals(source.getControllerId())) { - //400.3 - Player p = game.getPlayer(source.getControllerId()); - if (p != null) { - p.moveCardToHandWithInfo(c, source.getSourceId(), game, Zone.GRAVEYARD); - } - return false; + cardsToHand.add(c); } } } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/zendikar/GoblinGuide.java b/Mage.Sets/src/mage/sets/zendikar/GoblinGuide.java index 8f07a34ec05..d21d96e185d 100644 --- a/Mage.Sets/src/mage/sets/zendikar/GoblinGuide.java +++ b/Mage.Sets/src/mage/sets/zendikar/GoblinGuide.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.zendikar; import java.util.UUID; @@ -108,10 +107,10 @@ class GoblinGuideTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getSourceId().equals(this.getSourceId()) ) { + if (event.getSourceId().equals(this.getSourceId())) { UUID defenderId = game.getCombat().getDefendingPlayerId(getSourceId(), game); if (defenderId != null) { - for (Effect effect :this.getEffects()) { + for (Effect effect : this.getEffects()) { // set here because attacking creature can be removed until effect resolves effect.setTargetPointer(new FixedTarget(defenderId)); } @@ -134,8 +133,8 @@ class GoblinGuideTriggeredAbility extends TriggeredAbilityImpl { return new GoblinGuideTriggeredAbility(this); } - } + class GoblinGuideEffect extends OneShotEffect { public GoblinGuideEffect() { @@ -153,7 +152,7 @@ class GoblinGuideEffect extends OneShotEffect { } @Override - public boolean apply(Game game, Ability source) { + public boolean apply(Game game, Ability source) { Player defender = game.getPlayer(getTargetPointer().getFirst(game, source)); MageObject sourceObject = game.getObject(source.getSourceId()); if (sourceObject != null && defender != null) { @@ -163,7 +162,7 @@ class GoblinGuideEffect extends OneShotEffect { cards.add(card); defender.revealCards(sourceObject.getName(), cards, game); if (card.getCardType().contains(CardType.LAND)) { - defender.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + defender.moveCards(card, null, Zone.HAND, source, game); } } return true; @@ -171,4 +170,4 @@ class GoblinGuideEffect extends OneShotEffect { return false; } -} \ No newline at end of file +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/combat/damage/GravebladeMarauderTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/combat/damage/GravebladeMarauderTest.java new file mode 100644 index 00000000000..bab7f3ca404 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/combat/damage/GravebladeMarauderTest.java @@ -0,0 +1,58 @@ +/* + * 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 org.mage.test.cards.triggers.combat.damage; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class GravebladeMarauderTest extends CardTestPlayerBase { + + @Test + public void testTwoAttackers() { + addCard(Zone.GRAVEYARD, playerB, "Silvercoat Lion", 3); + + // Whenever Graveblade Marauder deals combat damage to a player, that player loses life equal to the number of creature cards in your graveyard. + addCard(Zone.BATTLEFIELD, playerB, "Graveblade Marauder", 2);// 1/4 + + attack(2, playerB, "Graveblade Marauder"); + attack(2, playerB, "Graveblade Marauder"); + + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertLife(playerA, 12); // 1 + 3 + 1 + 3 = 8 + assertLife(playerB, 20); + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 79a7367c1c0..eac8d92bc10 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1693,13 +1693,13 @@ public class TestPlayer implements Player { } @Override - public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, Zone fromZone) { - return computerPlayer.moveCardToHandWithInfo(card, sourceId, game, fromZone); + public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game) { + return computerPlayer.moveCardToHandWithInfo(card, sourceId, game); } @Override - public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, Zone fromZone, boolean withName) { - return computerPlayer.moveCardToHandWithInfo(card, sourceId, game, fromZone, withName); + public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, boolean withName) { + return computerPlayer.moveCardToHandWithInfo(card, sourceId, game, withName); } @Override diff --git a/Mage/src/mage/abilities/costs/common/ReturnToHandFromGraveyardCost.java b/Mage/src/mage/abilities/costs/common/ReturnToHandFromGraveyardCost.java index 91b85072c9a..48dc5dcdadb 100644 --- a/Mage/src/mage/abilities/costs/common/ReturnToHandFromGraveyardCost.java +++ b/Mage/src/mage/abilities/costs/common/ReturnToHandFromGraveyardCost.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,22 +20,19 @@ * 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.abilities.costs.common; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.CostImpl; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; import mage.players.Player; -import mage.target.TargetCard; import mage.target.common.TargetCardInYourGraveyard; /** @@ -52,6 +49,7 @@ public class ReturnToHandFromGraveyardCost extends CostImpl { this.text = new StringBuilder("return ").append(target.getTargetName()).append(" from graveyard to it's owner's hand").toString(); } } + public ReturnToHandFromGraveyardCost(ReturnToHandFromGraveyardCost cost) { super(cost); } @@ -61,12 +59,12 @@ public class ReturnToHandFromGraveyardCost extends CostImpl { Player controller = game.getPlayer(controllerId); if (controller != null) { if (targets.choose(Outcome.ReturnToHand, controllerId, sourceId, game)) { - for (UUID targetId: targets.get(0).getTargets()) { + for (UUID targetId : targets.get(0).getTargets()) { mage.cards.Card targetCard = game.getCard(targetId); if (targetCard == null) { return false; } - paid |= controller.moveCardToHandWithInfo(targetCard, sourceId, game, Zone.HAND); + paid |= controller.moveCardToHandWithInfo(targetCard, sourceId, game); } } } diff --git a/Mage/src/mage/abilities/costs/common/ReturnToHandTargetPermanentCost.java b/Mage/src/mage/abilities/costs/common/ReturnToHandTargetPermanentCost.java index 4506854c705..6a0e383c83f 100644 --- a/Mage/src/mage/abilities/costs/common/ReturnToHandTargetPermanentCost.java +++ b/Mage/src/mage/abilities/costs/common/ReturnToHandTargetPermanentCost.java @@ -25,14 +25,12 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.costs.common; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.CostImpl; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -62,12 +60,12 @@ public class ReturnToHandTargetPermanentCost extends CostImpl { Player controller = game.getPlayer(controllerId); if (controller != null) { if (targets.choose(Outcome.ReturnToHand, controllerId, sourceId, game)) { - for (UUID targetId: targets.get(0).getTargets()) { + for (UUID targetId : targets.get(0).getTargets()) { Permanent permanent = game.getPermanent(targetId); if (permanent == null) { return false; } - paid |= controller.moveCardToHandWithInfo(permanent, sourceId, game, Zone.HAND); + paid |= controller.moveCardToHandWithInfo(permanent, sourceId, game); } } } @@ -84,5 +82,4 @@ public class ReturnToHandTargetPermanentCost extends CostImpl { return new ReturnToHandTargetPermanentCost(this); } - } diff --git a/Mage/src/mage/abilities/effects/common/ClashWinReturnToHandSpellEffect.java b/Mage/src/mage/abilities/effects/common/ClashWinReturnToHandSpellEffect.java index 98bc04994d1..0ee9f0ac298 100644 --- a/Mage/src/mage/abilities/effects/common/ClashWinReturnToHandSpellEffect.java +++ b/Mage/src/mage/abilities/effects/common/ClashWinReturnToHandSpellEffect.java @@ -60,7 +60,7 @@ public class ClashWinReturnToHandSpellEffect extends OneShotEffect implements Ma if (ClashEffect.getInstance().apply(game, source)) { Card spellCard = game.getStack().getSpell(source.getSourceId()).getCard(); if (spellCard != null) { - controller.moveCardToHandWithInfo(spellCard, source.getSourceId(), game, Zone.STACK); + controller.moveCards(spellCard, null, Zone.HAND, source, game); } } return true; diff --git a/Mage/src/mage/abilities/effects/common/EnvoyEffect.java b/Mage/src/mage/abilities/effects/common/EnvoyEffect.java index e0f4c22e8b2..d9e584f607e 100644 --- a/Mage/src/mage/abilities/effects/common/EnvoyEffect.java +++ b/Mage/src/mage/abilities/effects/common/EnvoyEffect.java @@ -71,18 +71,20 @@ public class EnvoyEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - if(controller == null || sourceObject == null) { + if (controller == null || sourceObject == null) { return false; } Cards cards = new CardsImpl(); cards.addAll(controller.getLibrary().getTopCards(game, numCards)); - controller.revealCards(sourceObject.getName(), cards, game); - for(Card card: cards.getCards(game)) { - if(filter.match(card, game)) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - cards.remove(card); + controller.revealCards(sourceObject.getIdName(), cards, game); + Cards cardsToHand = new CardsImpl(); + for (Card card : cards.getCards(game)) { + if (filter.match(card, game)) { + cardsToHand.add(card); } } + cards.removeAll(cardsToHand); + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); controller.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } @@ -94,6 +96,6 @@ public class EnvoyEffect extends OneShotEffect { } return "Reveal the top " + CardUtil.numberToText(numCards) + " cards of your library. Put all " - + filter.getMessage() + " revealed this way into your hand and the rest on the bottom of your library in any order."; + + filter.getMessage() + " revealed this way into your hand and the rest on the bottom of your library in any order."; } } diff --git a/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToHandTargetEffect.java b/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToHandTargetEffect.java index fda55a0478a..7e086481be5 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToHandTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToHandTargetEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,19 +20,17 @@ * 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.abilities.effects.common; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.cards.CardsImpl; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; @@ -61,16 +59,11 @@ public class ReturnFromGraveyardToHandTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - for (UUID cardId: getTargetPointer().getTargets(game, source)) { - Card card = game.getCard(cardId); - if (card != null && game.getState().getZone(cardId).equals(Zone.GRAVEYARD)) { - Player player = game.getPlayer(card.getOwnerId()); - if (player != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); - } - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return controller.moveCards(new CardsImpl(getTargetPointer().getTargets(game, source)), null, Zone.HAND, source, game); } - return true; + return false; } @Override @@ -79,14 +72,14 @@ public class ReturnFromGraveyardToHandTargetEffect extends OneShotEffect { return staticText; } StringBuilder sb = new StringBuilder(); - Target target = mode.getTargets().get(0); + Target target = mode.getTargets().get(0); sb.append("return "); if (target.getMaxNumberOfTargets() > 1) { if (target.getMaxNumberOfTargets() != target.getNumberOfTargets()) { sb.append("up to "); } sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(" "); - } + } if (!mode.getTargets().get(0).getTargetName().startsWith("another")) { sb.append("target "); } diff --git a/Mage/src/mage/abilities/effects/common/ReturnSourceFromGraveyardToHandEffect.java b/Mage/src/mage/abilities/effects/common/ReturnSourceFromGraveyardToHandEffect.java index 7dccfd5a674..e669693c00a 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnSourceFromGraveyardToHandEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnSourceFromGraveyardToHandEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.abilities.effects.common; import mage.abilities.Ability; @@ -61,7 +60,7 @@ public class ReturnSourceFromGraveyardToHandEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Card card = controller.getGraveyard().get(source.getSourceId(), game); if (card != null) { - return controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + return controller.moveCards(card, null, Zone.HAND, source, game); } return false; } diff --git a/Mage/src/mage/abilities/effects/common/ReturnToHandFromBattlefieldAllEffect.java b/Mage/src/mage/abilities/effects/common/ReturnToHandFromBattlefieldAllEffect.java index aeddab66962..2b0a53aba5f 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnToHandFromBattlefieldAllEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnToHandFromBattlefieldAllEffect.java @@ -25,11 +25,12 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterPermanent; @@ -41,12 +42,10 @@ import mage.players.Player; * * @author Plopman */ - - public class ReturnToHandFromBattlefieldAllEffect extends OneShotEffect { private final FilterPermanent filter; - + public ReturnToHandFromBattlefieldAllEffect(FilterPermanent filter) { super(Outcome.ReturnToHand); this.filter = filter; @@ -62,9 +61,11 @@ public class ReturnToHandFromBattlefieldAllEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { + Cards cardsToHand = new CardsImpl(); for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { - controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + cardsToHand.add(permanent); } + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); return true; } return false; diff --git a/Mage/src/mage/abilities/effects/common/ReturnToHandSourceEffect.java b/Mage/src/mage/abilities/effects/common/ReturnToHandSourceEffect.java index 624fcf86de6..10893c286b6 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnToHandSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnToHandSourceEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -45,20 +45,23 @@ import mage.players.Player; public class ReturnToHandSourceEffect extends OneShotEffect { boolean fromBattlefieldOnly; - boolean returnFromNextZone ; - + boolean returnFromNextZone; + public ReturnToHandSourceEffect() { this(false); } - + public ReturnToHandSourceEffect(boolean fromBattlefieldOnly) { this(fromBattlefieldOnly, false); } /** - * - * @param fromBattlefieldOnly the object is only returned if it's on the battlefield as the effect resolves - * @param returnFromNextZone the object is only returned, if it has changed the zone one time after the source ability triggered or was activated (e.g. Angelic Destiny) + * + * @param fromBattlefieldOnly the object is only returned if it's on the + * battlefield as the effect resolves + * @param returnFromNextZone the object is only returned, if it has changed + * the zone one time after the source ability triggered or was activated + * (e.g. Angelic Destiny) */ public ReturnToHandSourceEffect(boolean fromBattlefieldOnly, boolean returnFromNextZone) { super(Outcome.ReturnToHand); @@ -83,8 +86,8 @@ public class ReturnToHandSourceEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { MageObject mageObject; - if (returnFromNextZone && - game.getState().getZoneChangeCounter(source.getSourceId()) == source.getSourceObjectZoneChangeCounter() + 1) { + if (returnFromNextZone + && game.getState().getZoneChangeCounter(source.getSourceId()) == source.getSourceObjectZoneChangeCounter() + 1) { mageObject = game.getObject(source.getSourceId()); } else { mageObject = source.getSourceObjectIfItStillExists(game); @@ -94,13 +97,13 @@ public class ReturnToHandSourceEffect extends OneShotEffect { case BATTLEFIELD: Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - return controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + return controller.moveCards(permanent, null, Zone.HAND, source, game); } break; case GRAVEYARD: Card card = (Card) mageObject; if (!fromBattlefieldOnly) { - return controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD); + return controller.moveCards(card, null, Zone.HAND, source, game); } } } diff --git a/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java b/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java index ab34bb72add..c7f138bd302 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java @@ -31,7 +31,7 @@ public class ReturnToHandSpellEffect extends OneShotEffect implements MageSingle Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Card spellCard = game.getStack().getSpell(source.getSourceId()).getCard(); - controller.moveCardToHandWithInfo(spellCard, source.getSourceId(), game, Zone.STACK); + controller.moveCards(spellCard, null, Zone.HAND, source, game); return true; } return false; diff --git a/Mage/src/mage/abilities/effects/common/RevealLibraryPutIntoHandEffect.java b/Mage/src/mage/abilities/effects/common/RevealLibraryPutIntoHandEffect.java index 78cf2a7424e..0d3335958e6 100644 --- a/Mage/src/mage/abilities/effects/common/RevealLibraryPutIntoHandEffect.java +++ b/Mage/src/mage/abilities/effects/common/RevealLibraryPutIntoHandEffect.java @@ -28,11 +28,13 @@ package mage.abilities.effects.common; import java.util.Set; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; +import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.Outcome; import mage.constants.Zone; @@ -45,7 +47,6 @@ import mage.util.CardUtil; * * @author LevelX */ - public class RevealLibraryPutIntoHandEffect extends OneShotEffect { private DynamicValue amountCards; @@ -78,27 +79,26 @@ public class RevealLibraryPutIntoHandEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller == null || sourceObject == null) { return false; } CardsImpl cards = new CardsImpl(); - int amount = Math.min(amountCards.calculate(game, source, this), player.getLibrary().size()); - for (int i = 0; i < amount; i++) { - cards.add(player.getLibrary().removeFromTop(game)); - } - player.revealCards(new StringBuilder("Put ").append(filter.getMessage()).append(" into hand").toString(), cards, game); + cards.addAll(controller.getLibrary().getTopCards(game, amountCards.calculate(game, source, this))); + controller.revealCards(sourceObject.getIdName(), cards, game); Set cardsList = cards.getCards(game); + Cards cardsToHand = new CardsImpl(); for (Card card : cardsList) { if (filter.match(card, game)) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + cardsToHand.add(card); cards.remove(card); } } - - player.putCardsOnBottomOfLibrary(cards, game, source, anyOrder); + controller.moveCards(cardsToHand, null, Zone.HAND, source, game); + controller.putCardsOnBottomOfLibrary(cards, game, source, anyOrder); return true; } diff --git a/Mage/src/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java b/Mage/src/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java index 76462b5b011..d77f5ca6a46 100644 --- a/Mage/src/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java @@ -134,7 +134,7 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect { Cards revealedCards = new CardsImpl(Zone.HAND); numberToReveal = Math.min(player.getHand().size(), numberToReveal); if (player.getHand().size() > numberToReveal) { - TargetCardInHand chosenCards = new TargetCardInHand(numberToReveal, numberToReveal, new FilterCard("card in "+ player.getLogName() +"'s hand")); + TargetCardInHand chosenCards = new TargetCardInHand(numberToReveal, numberToReveal, new FilterCard("card in " + player.getLogName() + "'s hand")); chosenCards.setNotTarget(true); if (chosenCards.canChoose(player.getId(), game) && player.chooseTarget(Outcome.Discard, player.getHand(), chosenCards, source, game)) { if (!chosenCards.getTargets().isEmpty()) { @@ -151,7 +151,7 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect { revealedCards.addAll(player.getHand()); } - player.revealCards(sourceCard != null ? sourceCard.getName() :"Discard", revealedCards, game); + player.revealCards(sourceCard != null ? sourceCard.getIdName() + " (" + sourceCard.getZoneChangeCounter(game) + ")" : "Discard", revealedCards, game); boolean result = true; int filteredCardsCount = revealedCards.count(filter, source.getSourceId(), source.getControllerId(), game); @@ -183,7 +183,7 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect { private String setText() { StringBuilder sb = new StringBuilder("Target "); - switch(targetController) { + switch (targetController) { case OPPONENT: sb.append("opponent"); break; diff --git a/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInHandEffect.java b/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInHandEffect.java index 8c6c4e35228..694e8bf70eb 100644 --- a/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInHandEffect.java +++ b/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInHandEffect.java @@ -93,14 +93,12 @@ public class SearchLibraryPutInHandEffect extends SearchEffect { if (target.getTargets().size() > 0) { Cards cards = new CardsImpl(); for (UUID cardId : target.getTargets()) { - Card card = controller.getLibrary().remove(cardId, game); + Card card = game.getCard(cardId); if (card != null) { - controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, revealCards); - if (revealCards) { - cards.add(card); - } + cards.add(card); } } + controller.moveCards(cards, null, Zone.HAND, source, game); if (revealCards) { String name = "Reveal"; Card sourceCard = game.getCard(source.getSourceId()); diff --git a/Mage/src/mage/abilities/effects/keyword/SweepEffect.java b/Mage/src/mage/abilities/effects/keyword/SweepEffect.java index 01b10693559..5e3fc1f3d48 100644 --- a/Mage/src/mage/abilities/effects/keyword/SweepEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/SweepEffect.java @@ -27,16 +27,15 @@ */ package mage.abilities.effects.keyword; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; +import mage.cards.CardsImpl; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; @@ -53,7 +52,7 @@ public class SweepEffect extends OneShotEffect { public SweepEffect(String sweepSubtype) { super(Outcome.Benefit); this.sweepSubtype = sweepSubtype; - this.staticText = "Sweep - Return any number of "+ sweepSubtype + (sweepSubtype.endsWith("s") ? "":"s") + " you control to their owner's hand"; + this.staticText = "Sweep - Return any number of " + sweepSubtype + (sweepSubtype.endsWith("s") ? "" : "s") + " you control to their owner's hand"; } public SweepEffect(final SweepEffect effect) { @@ -75,10 +74,7 @@ public class SweepEffect extends OneShotEffect { Target target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true); if (controller.chooseTarget(outcome, target, source, game)) { game.getState().setValue(CardUtil.getCardZoneString("sweep", source.getSourceId(), game), target.getTargets().size()); - for (UUID uuid : target.getTargets()) { - Permanent land = game.getPermanent(uuid); - controller.moveCardToHandWithInfo(land, source.getSourceId(), game, Zone.HAND); - } + controller.moveCards(new CardsImpl(target.getTargets()), null, Zone.HAND, source, game); } return true; } diff --git a/Mage/src/mage/abilities/keyword/AuraSwapAbility.java b/Mage/src/mage/abilities/keyword/AuraSwapAbility.java index d4590bec685..ea4ddd1a6aa 100644 --- a/Mage/src/mage/abilities/keyword/AuraSwapAbility.java +++ b/Mage/src/mage/abilities/keyword/AuraSwapAbility.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.keyword; import mage.abilities.Ability; @@ -48,21 +47,21 @@ import mage.target.common.TargetCardInHand; * @author Mael */ public class AuraSwapAbility extends ActivatedAbilityImpl { - + public AuraSwapAbility(ManaCost manaCost) { super(Zone.BATTLEFIELD, new AuraSwapEffect(), manaCost); - + } - + public AuraSwapAbility(final AuraSwapAbility ability) { super(ability); } - + @Override public AuraSwapAbility copy() { return new AuraSwapAbility(this); } - + @Override public String getRule() { return new StringBuilder("Aura swap ").append(getManaCostsToPay().getText()).append(" (") @@ -72,42 +71,42 @@ public class AuraSwapAbility extends ActivatedAbilityImpl { } class AuraSwapEffect extends OneShotEffect { - + private static final FilterCard filter = new FilterCard(); - + static { filter.add(new SubtypePredicate("Aura")); } - + AuraSwapEffect() { super(Outcome.PutCardInPlay); this.staticText = "Exchange this Aura with an Aura card in your hand."; } - + AuraSwapEffect(final AuraSwapEffect effect) { super(effect); } - + @Override public AuraSwapEffect copy() { return new AuraSwapEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { Permanent auraPermanent = game.getPermanent(source.getSourceId()); if (auraPermanent != null && auraPermanent.getSubtype().contains("Aura") && auraPermanent.getOwnerId().equals(source.getControllerId())) { Permanent enchantedPermanent = game.getPermanent(auraPermanent.getAttachedTo()); filter.add(new AuraCardCanAttachToPermanentId(enchantedPermanent.getId())); TargetCardInHand target = new TargetCardInHand(0, 1, filter); - if (player.choose(Outcome.PutCardInPlay, target, source.getSourceId(), game)) { + if (controller.choose(Outcome.PutCardInPlay, target, source.getSourceId(), game)) { Card auraInHand = game.getCard(target.getFirstTarget()); if (auraInHand != null) { - player.putOntoBattlefieldWithInfo(auraInHand, game, Zone.HAND, source.getSourceId()); + controller.putOntoBattlefieldWithInfo(auraInHand, game, Zone.HAND, source.getSourceId()); enchantedPermanent.addAttachment(auraInHand.getId(), game); - player.moveCardToHandWithInfo(auraPermanent, source.getSourceId(), game, Zone.BATTLEFIELD); + controller.moveCards(auraPermanent, null, Zone.HAND, source, game); return true; } } diff --git a/Mage/src/mage/abilities/keyword/TransmuteAbility.java b/Mage/src/mage/abilities/keyword/TransmuteAbility.java index 156a9dc8848..f4b095ea41a 100644 --- a/Mage/src/mage/abilities/keyword/TransmuteAbility.java +++ b/Mage/src/mage/abilities/keyword/TransmuteAbility.java @@ -5,7 +5,6 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.DiscardSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.Outcome; @@ -17,25 +16,29 @@ import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; -import java.util.UUID; +import mage.MageObject; import mage.constants.TimingRule; /** * - * 702.52. Transmute + * 702.52. Transmute * - * 702.52a Transmute is an activated ability that functions only while the card with transmute is - * in a player’s hand. “Transmute [cost]” means “[Cost], Discard this card: Search your library for - * a card with the same converted mana cost as the discarded card, reveal that card, and put it into - * your hand. Then shuffle your library. Play this ability only any time you could play a sorcery.” + * 702.52a Transmute is an activated ability that functions only while the card + * with transmute is in a player’s hand. “Transmute [cost]” means “[Cost], + * Discard this card: Search your library for a card with the same converted + * mana cost as the discarded card, reveal that card, and put it into your hand. + * Then shuffle your library. Play this ability only any time you could play a + * sorcery.” * - * 702.52b Although the transmute ability is playable only if the card is in a player’s hand, it - * continues to exist while the object is in play and in all other zones. Therefore objects with - * transmute will be affected by effects that depend on objects having one or more activated abilities. + * 702.52b Although the transmute ability is playable only if the card is in a + * player’s hand, it continues to exist while the object is in play and in all + * other zones. Therefore objects with transmute will be affected by effects + * that depend on objects having one or more activated abilities. * * @author Loki */ public class TransmuteAbility extends SimpleActivatedAbility { + public TransmuteAbility(String manaCost) { super(Zone.HAND, new TransmuteEffect(), new ManaCostsImpl(manaCost)); this.setTiming(TimingRule.SORCERY); @@ -60,6 +63,7 @@ public class TransmuteAbility extends SimpleActivatedAbility { } class TransmuteEffect extends OneShotEffect { + TransmuteEffect() { super(Outcome.Benefit); staticText = "Transmute"; @@ -71,27 +75,20 @@ class TransmuteEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Card sourceCard = game.getCard(source.getSourceId()); - - if (sourceCard != null && player != null) { - FilterCard filter = new FilterCard("card with converted mana cost " + sourceCard.getManaCost().convertedManaCost()); - filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.Equal, sourceCard.getManaCost().convertedManaCost())); + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (sourceObject != null && controller != null) { + FilterCard filter = new FilterCard("card with converted mana cost " + sourceObject.getManaCost().convertedManaCost()); + filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.Equal, sourceObject.getManaCost().convertedManaCost())); TargetCardInLibrary target = new TargetCardInLibrary(1, filter); - if (player.searchLibrary(target, game)) { + if (controller.searchLibrary(target, game)) { if (target.getTargets().size() > 0) { - Cards revealed = new CardsImpl(); - for (UUID cardId : target.getTargets()) { - Card card = player.getLibrary().remove(cardId, game); - if (card != null) { - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - revealed.add(card); - } - } - player.revealCards("Search", revealed, game); + Cards revealed = new CardsImpl(target.getTargets()); + controller.revealCards(sourceObject.getIdName(), revealed, game); + controller.moveCards(revealed, null, Zone.HAND, source, game); } } - player.shuffleLibrary(game); + controller.shuffleLibrary(game); return true; } diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 023d63e04ca..cf94a946082 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -640,18 +640,17 @@ public interface Player extends MageItem, Copyable { * @param fromZone if null, this info isn't postet * @return */ - boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, Zone fromZone); + boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game); /** * @param card * @param sourceId * @param game * @param withName show the card name in the log - * @param fromZone * @return * */ - boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, Zone fromZone, boolean withName); + boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, boolean withName); /** * Uses card.moveToExile and posts a inform message about moving the card to @@ -662,7 +661,6 @@ public interface Player extends MageItem, Copyable { * @param exileName name of exile zone (optional) * @param sourceId * @param game - * @param fromZone if null, this info isn't postet * @param withName * @return */ diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index fc0e8c1a280..cbe259f9655 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2881,6 +2881,9 @@ public abstract class PlayerImpl implements Player, Serializable { public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { ArrayList cardList = new ArrayList<>(); for (UUID cardId : cards) { + if (fromZone == null) { + fromZone = game.getState().getZone(cardId); + } if (fromZone.equals(Zone.BATTLEFIELD)) { Permanent permanent = game.getPermanent(cardId); if (permanent != null) { @@ -2925,6 +2928,7 @@ public abstract class PlayerImpl implements Player, Serializable { case EXILED: boolean result = false; for (Card card : cards) { + fromZone = game.getState().getZone(card.getId()); result |= moveCardToExileWithInfo(card, null, "", source == null ? null : source.getSourceId(), game, fromZone, withName); } return result; @@ -2933,18 +2937,21 @@ public abstract class PlayerImpl implements Player, Serializable { case HAND: result = false; for (Card card : cards) { - result |= moveCardToHandWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, withName); + fromZone = game.getState().getZone(card.getId()); + result |= moveCardToHandWithInfo(card, source == null ? null : source.getSourceId(), game, withName); } return result; case BATTLEFIELD: result = false; for (Card card : cards) { + fromZone = game.getState().getZone(card.getId()); result |= putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId(), false, !withName); } return result; case LIBRARY: result = false; for (Card card : cards) { + fromZone = game.getState().getZone(card.getId()); result |= moveCardToLibraryWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, true, withName); } return result; @@ -2954,13 +2961,14 @@ public abstract class PlayerImpl implements Player, Serializable { } @Override - public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, Zone fromZone) { - return this.moveCardToHandWithInfo(card, sourceId, game, fromZone, true); + public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game) { + return this.moveCardToHandWithInfo(card, sourceId, game, true); } @Override - public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, Zone fromZone, boolean withName) { + public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, boolean withName) { boolean result = false; + Zone fromZone = game.getState().getZone(card.getId()); if (card.moveToZone(Zone.HAND, sourceId, game, false)) { if (card instanceof PermanentCard) { card = game.getCard(card.getId()); @@ -3025,6 +3033,7 @@ public abstract class PlayerImpl implements Player, Serializable { Card card = cards.get(targetObjectId, game); cards.remove(targetObjectId); if (card != null) { + fromZone = game.getState().getZone(card.getId()); result &= choosingPlayer.moveCardToGraveyardWithInfo(card, sourceId, game, fromZone); } target.clearChosen(); @@ -3045,6 +3054,7 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean moveCardToGraveyardWithInfo(Card card, UUID sourceId, Game game, Zone fromZone) { boolean result = false; + // Zone fromZone = game.getState().getZone(card.getId()); if (card.moveToZone(Zone.GRAVEYARD, sourceId, game, fromZone != null ? fromZone.equals(Zone.BATTLEFIELD) : false)) { if (!game.isSimulation()) { if (card instanceof PermanentCard) { @@ -3052,7 +3062,7 @@ public abstract class PlayerImpl implements Player, Serializable { } StringBuilder sb = new StringBuilder(this.getLogName()) .append(" puts ").append(card.getLogName()).append(" ") - .append(fromZone != null ? new StringBuilder("from ").append(fromZone.toString().toLowerCase(Locale.ENGLISH)).append(" ") : ""); + .append(fromZone != null ? "from " + fromZone.toString().toLowerCase(Locale.ENGLISH) + " " : ""); if (card.getOwnerId().equals(getId())) { sb.append("into his or her graveyard"); } else { From 9dc0bf97fb9031267e56bf2034e8f9563acda38b Mon Sep 17 00:00:00 2001 From: klayhamn Date: Fri, 31 Jul 2015 01:32:59 +0300 Subject: [PATCH 269/375] Add missing trample ability to foriysian --- Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java b/Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java index b8a107eac5b..f5c35e200ed 100644 --- a/Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java +++ b/Mage.Sets/src/mage/sets/timespiral/ForiysianTotem.java @@ -30,17 +30,19 @@ package mage.sets.timespiral; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.common.SourceIsCreatureCondition; +import mage.abilities.condition.common.SourceMatchesFilterCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.keyword.TrampleAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; import mage.game.permanent.token.Token; import java.util.UUID; @@ -51,7 +53,7 @@ import java.util.UUID; */ public class ForiysianTotem extends CardImpl { - private final static String ruleText = "As long as Foriysian Totem is a creature, it can block an additional creature."; + private final static String ruleText = "As long as {this} is a creature, it can block an additional creature."; public ForiysianTotem(UUID ownerId) { super(ownerId, 254, "Foriysian Totem", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}"); @@ -64,7 +66,7 @@ public class ForiysianTotem extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ForiysianTotemToken(), "", Duration.EndOfTurn), new ManaCostsImpl<>("{4}{R}"))); // As long as Foriysian Totem is a creature, it can block an additional creature. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new CanBlockAdditionalCreatureEffect(1), SourceIsCreatureCondition.getInstance() , ruleText))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new CanBlockAdditionalCreatureEffect(1), new SourceMatchesFilterCondition(new FilterCreaturePermanent()), ruleText))); } public ForiysianTotem(final ForiysianTotem card) { @@ -88,5 +90,6 @@ class ForiysianTotemToken extends Token { color.setRed(true); power = new MageInt(4); toughness = new MageInt(4); + this.addAbility(TrampleAbility.getInstance()); } } \ No newline at end of file From 5444b2a53beca160db2dfdda0fad50e03a7f5b12 Mon Sep 17 00:00:00 2001 From: klayhamn Date: Tue, 4 Aug 2015 23:25:16 +0300 Subject: [PATCH 270/375] removing the no-longer-necessary SourceIsCreature condition --- .../common/SourceIsCreatureCondition.java | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java diff --git a/Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java b/Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java deleted file mode 100644 index 0a877da1621..00000000000 --- a/Mage/src/mage/abilities/condition/common/SourceIsCreatureCondition.java +++ /dev/null @@ -1,25 +0,0 @@ -package mage.abilities.condition.common; - -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.condition.Condition; -import mage.constants.CardType; -import mage.game.Game; - -/** - * @author klayhamn - */ -public class SourceIsCreatureCondition implements Condition { - - private static final SourceIsCreatureCondition fInstance = new SourceIsCreatureCondition(); - - public static Condition getInstance() { - return fInstance; - } - - @Override - public boolean apply(Game game, Ability source) { - MageObject object = game.getObject(source.getSourceId()); - return object != null && object.getCardType().contains(CardType.CREATURE); - } -} From e5433599b679b6541da89f5ebaa66895e63c761a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Aug 2015 23:09:11 +0200 Subject: [PATCH 271/375] * Costal Piracy - Fixed some code problems. --- .../mage/sets/mercadianmasques/CoastalPiracy.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java b/Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java index 3f82bc4f48e..775da107107 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/CoastalPiracy.java @@ -35,22 +35,21 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.DamagedEvent; +import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; /** -* -* @author Xavierv3131 -*/ + * + * @author Xavierv3131 + */ public class CoastalPiracy extends CardImpl { public CoastalPiracy(UUID ownerId) { super(ownerId, 68, "Coastal Piracy", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); this.expansionSetCode = "MMQ"; - // Whenever a creature you control deals combat damage to an opponent, you may draw a card. this.addAbility(new CoastalPiracyTriggeredAbility()); } @@ -88,8 +87,8 @@ class CoastalPiracyTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (((DamagedPlayerEvent) event).isCombatDamage()) && - game.getOpponents(this.controllerId).contains(((DamagedPlayerEvent) event).getPlayerId())) { + if (((DamagedPlayerEvent) event).isCombatDamage() + && game.getOpponents(this.controllerId).contains(((DamagedPlayerEvent) event).getPlayerId())) { Permanent creature = game.getPermanent(event.getSourceId()); if (creature != null && creature.getControllerId().equals(controllerId)) { return true; @@ -103,4 +102,4 @@ class CoastalPiracyTriggeredAbility extends TriggeredAbilityImpl { return "Whenever a creature you control deals combat damage to an opponent, you may draw a card."; } -} \ No newline at end of file +} From 7ff4087bc7096518c74efc437f381ad623112035 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Aug 2015 23:20:38 +0200 Subject: [PATCH 272/375] * Kicker - Fixed that canceled multikicker activations were not reseted on recast. --- Mage/src/mage/abilities/keyword/KickerAbility.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Mage/src/mage/abilities/keyword/KickerAbility.java b/Mage/src/mage/abilities/keyword/KickerAbility.java index 9318c39e039..3753632b553 100644 --- a/Mage/src/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/mage/abilities/keyword/KickerAbility.java @@ -143,6 +143,13 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo for (OptionalAdditionalCost cost : kickerCosts) { cost.reset(); } + String key = getActivationKey(source, "", game); + for (String activationKey : activations.keySet()) { + if (activationKey.startsWith(key) && activations.get(activationKey) > 0) { + activations.put(key, 0); + } + } + } public int getXManaValue() { From 796a8d15d6678fcef19b0392eef05c2ad8796278 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Aug 2015 23:23:51 +0200 Subject: [PATCH 273/375] * Petalmane Baku - Fixed wrong activation cost. --- .../src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java index d7ee3a8fd78..0e0eca1d7e4 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java @@ -34,7 +34,7 @@ import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; -import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; import mage.abilities.effects.common.ManaEffect; @@ -72,7 +72,7 @@ public class PetalmaneBaku extends CardImpl { Ability ability = new DynamicManaAbility( new Mana(0, 0, 0, 0, 0, 0, 1), new RemovedCountersForCostValue(), - new TapSourceCost(), + new ManaCostsImpl<>("{1}"), "Add X mana of any one color to your mana pool", true, new CountersCount(CounterType.KI)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), From 36cacff5375e8fcd4126362635b511f8ed70a285 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Aug 2015 23:31:55 +0200 Subject: [PATCH 274/375] * Historical Standard - Fixed the missing Scourge expansion data. --- .../src/mage/deck/HistoricalStandard.java | 87 +++++++----------- .../src/mage/deck/SuperStandard.java | 91 ++++++++----------- 2 files changed, 73 insertions(+), 105 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java index ceb699b1247..9fef3463b57 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java @@ -1,25 +1,24 @@ package mage.deck; -import mage.cards.ExpansionSet; -import mage.cards.Sets; -import mage.cards.decks.Constructed; -import mage.cards.decks.Deck; -import mage.constants.SetType; - import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Map; +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.cards.decks.Constructed; +import mage.cards.decks.Deck; +import mage.constants.SetType; /** * This class represents a deck from any past standard. - * + * * This class was originally made to work with the historical standard ruleset. - * Data taken from http://thattournament.website/historic-tournament.php - * (site changed, originally http://mtgt.nfshost.com/historic-tournament.php) - * + * Data taken from http://thattournament.website/historic-tournament.php (site + * changed, originally http://mtgt.nfshost.com/historic-tournament.php) + * * If there are any questions or corrections, feel free to contact me. * * @author Marthinwurer (at gmail.com) @@ -27,77 +26,56 @@ import java.util.Map; public class HistoricalStandard extends Constructed { /* - * This array stores the set codes of each standard up to + * This array stores the set codes of each standard up to * Kamigawa/Ravnica standard, where rotation stabilized. */ protected static final String[][] standards = { - // 1st standard: The Dark, Fallen Empires, and 4th. - { "DRK", "FEM", "4ED" }, - + {"DRK", "FEM", "4ED"}, // 2nd standard: 4th, Fallen Empires, Ice Age, Chronicles, Homelands, // Alliances, and Mirage. {"FEM", "4ED", "ICE", "HML", "ALL", "MIR"}, - // 3rd standard: 4th, Chronicles, Alliances, Mirage, Visions. {"4ED", "ALL", "MIR", "VIS"}, - // 4th Standard: Ice Age, Homelands, Alliances, Mirage, Visions, 5th, // and Weatherlight. {"ICE", "HML", "ALL", "MIR", "VIS", "5ED", "WTH"}, - // 5th Standard: Mirage, Visions, 5th, Weatherlight, Tempest, // Stronghold, and Exodus. {"MIR", "VIS", "5ED", "WTH", "TMP", "STH", "EXO"}, - // 6th Standard: 5th, Tempest, Stronghold, Exodus, Urza's Saga, Urza's // Legacy, Urza's Destiny. {"5ED", "TMP", "STH", "EXO", "USG", "ULG"}, - // 7th Standard: Tempest, Stronghold, Exodus, Urza's Saga, Urza's // Legacy, 6th, Urza's Destiny. {"TMP", "STH", "EXO", "USG", "ULG", "6ED", "UDS"}, - // 8th Standard: Urza's Saga, Urza's Legacy, 6th, Urza's Destiny, // Mercadian Masques, Nemesis, Prophecy. {"USG", "ULG", "6ED", "UDS", "MMQ", "NMS", "PCY"}, - // 9th Standard {"6ED", "MMQ", "NMS", "PCY", "INV", "PLS"}, - // 10th Standard {"7ED", "MMQ", "NMS", "PCY", "INV", "PLS", "APC"}, - // 11th Standard {"7ED", "INV", "APC", "PLS", "ODY", "TOR", "JUD"}, - // 12th Standard - {"7ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, - + {"7ED", "ODY", "TOR", "JUD", "ONS", "LGN", "SCG"}, // 13th Standard - {"8ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, - + {"8ED", "ODY", "TOR", "JUD", "ONS", "LGN", "SCG"}, // 14th Standard - {"8ED", "ONS", "LGN", "LGN", "MRD", "DST", "5DN"}, - + {"8ED", "ONS", "LGN", "SCG", "MRD", "DST", "5DN"}, // 15th Standard {"8ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, - // 16th Standard {"9ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, - // 17th Standard {"9ED", "CHK", "BOK", "SOK", "RAV", "GPT", "DIS", "CSP"}, - // 18th Standard {"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, - // 19th Standard {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"}, - // 20th Standard {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, - // 21st Standard {"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"} }; @@ -108,7 +86,7 @@ public class HistoricalStandard extends Constructed { */ public HistoricalStandard() { super("Constructed - Historical Standard"); - + // banned cards banned.add("Balance"); banned.add("Memory Jar"); @@ -122,23 +100,24 @@ public class HistoricalStandard extends Constructed { /** * Overridden validate function. Changes the standard sets, then uses the * regular validation function to test validity. + * * @param deck - the deck to validate. - * @return + * @return */ @Override public boolean validate(Deck deck) { Map leastInvalid = null; - + boolean valid = false; - + // first, check whether misty and batterskull are in the same deck. Map counts = new HashMap<>(); countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - if( counts.containsKey("Stoneforge Mystic") - && counts.containsKey("Batterskull")){ - + if (counts.containsKey("Stoneforge Mystic") + && counts.containsKey("Batterskull")) { + // if both, then skip all following tests by returning return false; } @@ -159,7 +138,7 @@ public class HistoricalStandard extends Constructed { break; } - // if the map holding the invalid cards is empty, set it to a + // if the map holding the invalid cards is empty, set it to a // copy of the current invalid list. if (leastInvalid == null) { leastInvalid = new HashMap<>(this.getInvalid()); @@ -182,7 +161,7 @@ public class HistoricalStandard extends Constructed { Calendar.SEPTEMBER, 1); GregorianCalendar current = new GregorianCalendar(); - // use the method for determining regular standard legality, but change + // use the method for determining regular standard legality, but change // the date for each standard. while (end.before(current) && !valid) { @@ -190,11 +169,11 @@ public class HistoricalStandard extends Constructed { setCodes.clear(); invalid.clear(); - // increment the start and end dates. + // increment the start and end dates. start.set(Calendar.YEAR, start.get(Calendar.YEAR) + 1); end.set(Calendar.YEAR, start.get(Calendar.YEAR) + 2); - // Get the sets in that time period. + // Get the sets in that time period. // (code taken from standard.java) for (ExpansionSet set : Sets.getInstance().values()) { if (set.getReleaseDate().after(start.getTime()) @@ -203,7 +182,7 @@ public class HistoricalStandard extends Constructed { setCodes.add(set.getCode()); } } - + // validate it. If it validates, clear the invalid cards and break. if (super.validate(deck)) { invalid.clear(); @@ -214,20 +193,20 @@ public class HistoricalStandard extends Constructed { // see how many invalid cards there are. if there are less invalid // cards than the stored invalid list, assign the current invalid // to leastInvalid. - if (leastInvalid == null){ + if (leastInvalid == null) { leastInvalid = new HashMap<>(this.getInvalid()); - - }else if (leastInvalid.size() > this.getInvalid().size()) { + + } else if (leastInvalid.size() > this.getInvalid().size()) { leastInvalid = new HashMap<>(this.getInvalid()); } } - // if no standard environment is valid, set the invalid to the + // if no standard environment is valid, set the invalid to the // invalid that had the least errors. - if( !valid ){ + if (!valid) { this.invalid = new HashMap<>(leastInvalid); } - + // return the validity. return valid; } diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java index 9b6a91dba0f..1f30667570f 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java @@ -1,26 +1,25 @@ package mage.deck; -import mage.cards.ExpansionSet; -import mage.cards.Sets; -import mage.cards.decks.Constructed; -import mage.cards.decks.Deck; -import mage.constants.SetType; - import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Map; +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.cards.decks.Constructed; +import mage.cards.decks.Deck; +import mage.constants.SetType; /** - * This class represents a deck conforming to the rules contained in the - subreddit /r/SuperStandard. - * + * This class represents a deck conforming to the rules contained in the + * subreddit /r/SuperStandard. + * * This class was originally made to work with the historical standard ruleset. - * Data taken from http://thattournament.website/historic-tournament.php - * (site changed, originally thtp://mtgt.nfshost.com/historic-tournament.php) - * + * Data taken from http://thattournament.website/historic-tournament.php (site + * changed, originally thtp://mtgt.nfshost.com/historic-tournament.php) + * * If there are any questions or corrections, feel free to contact me. * * @author Marthinwurer (at gmail.com) @@ -28,42 +27,31 @@ import java.util.Map; public class SuperStandard extends Constructed { /* - * This array stores the set codes of each standard up to + * This array stores the set codes of each standard up to * Kamigawa/Ravnica standard, where rotation stabilized. * Data taken from http://thattournament.website/historic-tournament.php */ protected static final String[][] standards = { - // 11th Standard {"7ED", "INV", "APC", "PLS", "ODY", "TOR", "JUD"}, - // 12th Standard - {"7ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, - + {"7ED", "ODY", "TOR", "JUD", "ONS", "LGN", "SCG"}, // 13th Standard - {"8ED", "ODY", "TOR", "JUD", "ONS", "LGN", "LGN"}, - + {"8ED", "ODY", "TOR", "JUD", "ONS", "LGN", "SCG"}, // 14th Standard - {"8ED", "ONS", "LGN", "LGN", "MRD", "DST", "5DN"}, - + {"8ED", "ONS", "LGN", "SCG", "MRD", "DST", "5DN"}, // 15th Standard {"8ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, - // 16th Standard {"9ED", "MRD", "DST", "5DN", "CHK", "BOK", "SOK"}, - // 17th Standard {"9ED", "CHK", "BOK", "SOK", "RAV", "GPT", "DIS", "CSP"}, - // 18th Standard {"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, - // 19th Standard {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"}, - // 20th Standard {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, - // 21st Standard {"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"} }; @@ -87,23 +75,24 @@ public class SuperStandard extends Constructed { /** * Overridden validate function. Changes the standard sets, then uses the * regular validation function to test validity. + * * @param deck - the deck to validate. - * @return + * @return */ @Override public boolean validate(Deck deck) { Map leastInvalid = null; - + boolean valid = false; - + // first, check whether misty and batterskull are in the same deck. Map counts = new HashMap<>(); countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - if( counts.containsKey("Stoneforge Mystic") - && counts.containsKey("Batterskull")){ - + if (counts.containsKey("Stoneforge Mystic") + && counts.containsKey("Batterskull")) { + // if both, then skip all following tests by returning return false; } @@ -117,12 +106,12 @@ public class SuperStandard extends Constructed { // add the sets to the setCodes. setCodes = new ArrayList<>(Arrays.asList(sets)); - - // if either of the mirrodin blocks are in the time period, ban + + // if either of the mirrodin blocks are in the time period, ban // misty and darksteel citadel - if( setCodes.contains("MRD") || setCodes.contains("SOM")){ + if (setCodes.contains("MRD") || setCodes.contains("SOM")) { banned.add("Darksteel Citadel"); - }else{ + } else { banned.remove("Darksteel Citadel"); } @@ -132,7 +121,7 @@ public class SuperStandard extends Constructed { break; } - // if the map holding the invalid cards is empty, set it to a + // if the map holding the invalid cards is empty, set it to a // copy of the current invalid list. if (leastInvalid == null) { leastInvalid = new HashMap<>(this.getInvalid()); @@ -155,7 +144,7 @@ public class SuperStandard extends Constructed { Calendar.SEPTEMBER, 1); GregorianCalendar current = new GregorianCalendar(); - // use the method for determining regular standard legality, but change + // use the method for determining regular standard legality, but change // the date for each standard. while (end.before(current) && !valid) { @@ -163,11 +152,11 @@ public class SuperStandard extends Constructed { setCodes.clear(); invalid.clear(); - // increment the start and end dates. + // increment the start and end dates. start.set(Calendar.YEAR, start.get(Calendar.YEAR) + 1); end.set(Calendar.YEAR, start.get(Calendar.YEAR) + 2); - // Get the sets in that time period. + // Get the sets in that time period. // (code taken from standard.java) for (ExpansionSet set : Sets.getInstance().values()) { if (set.getReleaseDate().after(start.getTime()) @@ -176,12 +165,12 @@ public class SuperStandard extends Constructed { setCodes.add(set.getCode()); } } - - // if either of the mirrodin blocks are in the time period, ban + + // if either of the mirrodin blocks are in the time period, ban // misty and darksteel citadel - if( setCodes.contains("MRD") || setCodes.contains("SOM")){ + if (setCodes.contains("MRD") || setCodes.contains("SOM")) { banned.add("Darksteel Citadel"); - }else{ + } else { banned.remove("Darksteel Citadel"); } @@ -195,20 +184,20 @@ public class SuperStandard extends Constructed { // see how many invalid cards there are. if there are less invalid // cards than the stored invalid list, assign the current invalid // to leastInvalid. - if (leastInvalid == null){ + if (leastInvalid == null) { leastInvalid = new HashMap<>(this.getInvalid()); - - }else if (leastInvalid.size() > this.getInvalid().size()) { + + } else if (leastInvalid.size() > this.getInvalid().size()) { leastInvalid = new HashMap<>(this.getInvalid()); } } - // if no standard environment is valid, set the invalid to the + // if no standard environment is valid, set the invalid to the // invalid that had the least errors. - if( !valid ){ + if (!valid) { this.invalid = new HashMap<>(leastInvalid); } - + // return the validity. return valid; } From cbbc70d26b06f8ae15ddf8a5b620f49fe48a8de2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Aug 2015 00:07:53 +0200 Subject: [PATCH 275/375] * Made table filter more accurate and moved Historical and Super Standard format to Other filter. --- .../java/mage/client/table/TablesPanel.java | 349 +++++++++--------- 1 file changed, 172 insertions(+), 177 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java index a92e06a60f0..1a56c2873dc 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java @@ -1,37 +1,36 @@ /* -* 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. -*/ + * 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. + */ /* * TablesPanel.java * * Created on 15-Dec-2009, 10:54:01 PM */ - package mage.client.table; import java.awt.Color; @@ -117,14 +116,16 @@ public class TablesPanel extends javax.swing.JPanel { private List messages; private int currentMessage; private MageTableRowSorter activeTablesSorter; - + JToggleButton[] filterButtons; - + private static final int[] defaultColumnsWidth = {35, 150, 120, 180, 80, 120, 80, 60, 60}; - - /** Creates new form TablesPanel */ + + /** + * Creates new form TablesPanel + */ public TablesPanel() { - + tableModel = new TableTableModel(); matchesModel = new MatchesTableModel(); gameChooser = new GameChooser(); @@ -133,49 +134,46 @@ public class TablesPanel extends javax.swing.JPanel { tableModel.setSession(session); tableTables.createDefaultColumnsFromModel(); - + activeTablesSorter = new MageTableRowSorter(tableModel); tableTables.setRowSorter(activeTablesSorter); - - TableUtil.setColumnWidthAndOrder(tableTables, defaultColumnsWidth, + + TableUtil.setColumnWidthAndOrder(tableTables, defaultColumnsWidth, PreferencesDialog.KEY_TABLES_COLUMNS_WIDTH, PreferencesDialog.KEY_TABLES_COLUMNS_ORDER); - + tableCompleted.setRowSorter(new MageTableRowSorter(matchesModel)); chatPanel.useExtendedView(ChatPanel.VIEW_MODE.NONE); chatPanel.setBorder(null); chatPanel.setChatType(ChatPanel.ChatType.TABLES); - filterButtons = new JToggleButton[] - {btnStateWaiting, btnStateActive, btnStateFinished, - btnTypeMatch, btnTypeTourneyConstructed, btnTypeTourneyLimited, - btnFormatBlock, btnFormatStandard, btnFormatModern, btnFormatLegacy, btnFormatVintage, btnFormatCommander, btnFormatTinyLeader, btnFormatLimited, btnFormatOther, - btnSkillBeginner, btnSkillCasual, btnSkillSerious }; - - JComponent[] components = new JComponent[] {chatPanel, jSplitPane1, jScrollPane1, jScrollPane2, topPanel, jPanel3}; + filterButtons = new JToggleButton[]{btnStateWaiting, btnStateActive, btnStateFinished, + btnTypeMatch, btnTypeTourneyConstructed, btnTypeTourneyLimited, + btnFormatBlock, btnFormatStandard, btnFormatModern, btnFormatLegacy, btnFormatVintage, btnFormatCommander, btnFormatTinyLeader, btnFormatLimited, btnFormatOther, + btnSkillBeginner, btnSkillCasual, btnSkillSerious}; + + JComponent[] components = new JComponent[]{chatPanel, jSplitPane1, jScrollPane1, jScrollPane2, topPanel, jPanel3}; for (JComponent component : components) { component.setOpaque(false); } - jScrollPane1.getViewport().setBackground(new Color(255,255,255,50)); - jScrollPane2.getViewport().setBackground(new Color(255,255,255,50)); - + jScrollPane1.getViewport().setBackground(new Color(255, 255, 255, 50)); + jScrollPane2.getViewport().setBackground(new Color(255, 255, 255, 50)); + restoreSettings(); - + Action openTableAction; - openTableAction = new AbstractAction() - { + openTableAction = new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) - { - int modelRow = Integer.valueOf( e.getActionCommand() ); - UUID tableId = (UUID)tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 3); - UUID gameId = (UUID)tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 2); - String action = (String)tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN); - String deckType = (String)tableModel.getValueAt(modelRow, TableTableModel.COLUMN_DECK_TYPE); - String status = (String)tableModel.getValueAt(modelRow, TableTableModel.COLUMN_STATUS); - boolean isTournament = (Boolean)tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 1); - String owner = (String)tableModel.getValueAt(modelRow, TableTableModel.COLUMN_OWNER); + public void actionPerformed(ActionEvent e) { + int modelRow = Integer.valueOf(e.getActionCommand()); + UUID tableId = (UUID) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 3); + UUID gameId = (UUID) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 2); + String action = (String) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN); + String deckType = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_DECK_TYPE); + String status = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_STATUS); + boolean isTournament = (Boolean) tableModel.getValueAt(modelRow, TableTableModel.ACTION_COLUMN + 1); + String owner = (String) tableModel.getValueAt(modelRow, TableTableModel.COLUMN_OWNER); switch (action) { case "Join": if (owner.equals(session.getUserName()) || owner.startsWith(session.getUserName() + ",")) { @@ -213,49 +211,46 @@ public class TablesPanel extends javax.swing.JPanel { } else { logger.info("Joining table " + tableId); joinTableDialog.showDialog(roomId, tableId, false, false); - } + } break; case "Remove": if (JOptionPane.showConfirmDialog(null, "Are you sure you want to remove table?", "Removing table", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { session.removeTable(roomId, tableId); - } + } break; case "Show": if (isTournament) { logger.info("Showing tournament table " + tableId); session.watchTable(roomId, tableId); - } + } break; case "Watch": if (!isTournament) { logger.info("Watching table " + tableId); session.watchTable(roomId, tableId); - } + } break; case "Replay": logger.info("Replaying game " + gameId); session.replayGame(gameId); break; } - } - }; + } + }; - Action closedTableAction; - closedTableAction = new AbstractAction() - { + Action closedTableAction; + closedTableAction = new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) - { - int modelRow = Integer.valueOf( e.getActionCommand() ); - String action = (String)matchesModel.getValueAt(modelRow, MatchesTableModel.ACTION_COLUMN); + public void actionPerformed(ActionEvent e) { + int modelRow = Integer.valueOf(e.getActionCommand()); + String action = (String) matchesModel.getValueAt(modelRow, MatchesTableModel.ACTION_COLUMN); switch (action) { - case "Replay": - List gameList = matchesModel.getListofGames(modelRow); + case "Replay": + List gameList = matchesModel.getListofGames(modelRow); if (gameList != null && gameList.size() > 0) { if (gameList.size() == 1) { session.replayGame(gameList.get(0)); - } - else { + } else { gameChooser.show(gameList, MageFrame.getDesktop().getMousePosition()); } } @@ -265,18 +260,18 @@ public class TablesPanel extends javax.swing.JPanel { if (matchesModel.isTournament(modelRow)) { logger.info("Showing tournament table " + matchesModel.getTableId(modelRow)); session.watchTable(roomId, matchesModel.getTableId(modelRow)); - } + } break; } } }; - + // !!!! adds action buttons to the table panel (don't delete this) new ButtonColumn(tableTables, openTableAction, tableTables.convertColumnIndexToView(TableTableModel.ACTION_COLUMN)); new ButtonColumn(tableCompleted, closedTableAction, tableCompleted.convertColumnIndexToView(MatchesTableModel.ACTION_COLUMN)); // !!!! } - + public void cleanUp() { saveSettings(); chatPanel.cleanUp(); @@ -291,30 +286,30 @@ public class TablesPanel extends javax.swing.JPanel { PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_2, Integer.toString(this.jSplitPane2.getDividerLocation())); PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_3, Integer.toString(chatPanel.getSplitDividerLocation())); } - + private void restoreSettings() { // filter settings String formatSettings = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_FILTER_SETTINGS, ""); int i = 0; for (JToggleButton component : filterButtons) { if (formatSettings.length() > i) { - component.setSelected(formatSettings.substring(i,i+1).equals("x")); + component.setSelected(formatSettings.substring(i, i + 1).equals("x")); } else { component.setSelected(true); } i++; - } + } setTableFilter(); } - + private void saveSettings() { // Filters StringBuilder formatSettings = new StringBuilder(); for (JToggleButton component : filterButtons) { - formatSettings.append(component.isSelected() ? "x":"-"); + formatSettings.append(component.isSelected() ? "x" : "-"); } PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_FILTER_SETTINGS, formatSettings.toString()); - + TableUtil.saveColumnWidthAndOrderToPrefs(tableTables, KEY_TABLES_COLUMNS_WIDTH, KEY_TABLES_COLUMNS_ORDER); } @@ -331,13 +326,12 @@ public class TablesPanel extends javax.swing.JPanel { } if (this.btnStateFinished.isSelected()) { this.jSplitPane2.setDividerLocation(-1); - } - else { + } else { location = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_2, null); if (location != null && jSplitPane2 != null) { jSplitPane2.setDividerLocation(Integer.parseInt(location)); } - } + } location = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_3, null); if (location != null && chatPanel != null) { chatPanel.setSplitDividerLocation(Integer.parseInt(location)); @@ -345,7 +339,7 @@ public class TablesPanel extends javax.swing.JPanel { } } } - + public Map getUIComponents() { Map components = new HashMap<>(); @@ -390,11 +384,10 @@ public class TablesPanel extends javax.swing.JPanel { updateMatchesTask = new UpdateMatchesTask(session, roomId, this); updateMatchesTask.execute(); } - } - else { - if (updateMatchesTask != null) { - updateMatchesTask.cancel(true); - } + } else { + if (updateMatchesTask != null) { + updateMatchesTask.cancel(true); + } } } } @@ -445,15 +438,15 @@ public class TablesPanel extends javax.swing.JPanel { reloadMessages(); MageFrame.getUI().addButton(MageComponents.NEW_GAME_BUTTON, btnNewTable); - + // divider locations have to be set with delay else values set are overwritten with system defaults Executors.newSingleThreadScheduledExecutor().schedule(new Runnable() { @Override public void run() { restoreDividerLocations(); } - }, 300, TimeUnit.MILLISECONDS); - + }, 300, TimeUnit.MILLISECONDS); + } protected void reloadMessages() { @@ -476,7 +469,7 @@ public class TablesPanel extends javax.swing.JPanel { this.saveDividerLocations(); for (Component component : MageFrame.getDesktop().getComponents()) { if (component instanceof TableWaitingDialog) { - ((TableWaitingDialog)component).closeDialog(); + ((TableWaitingDialog) component).closeDialog(); } } stopTasks(); @@ -487,7 +480,7 @@ public class TablesPanel extends javax.swing.JPanel { c = c.getParent(); } if (c != null) { - ((TablesPane)c).hideFrame(); + ((TablesPane) c).hideFrame(); } } @@ -520,31 +513,31 @@ public class TablesPanel extends javax.swing.JPanel { // format List> formatFilterList = new ArrayList<>(); if (btnFormatBlock.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Block", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Constructed.*Block", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatStandard.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Standard", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Constructed - Standard", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatModern.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Modern", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Constructed - Modern", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatLegacy.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Legacy", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Constructed - Legacy", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatVintage.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Vintage", TableTableModel.COLUMN_DECK_TYPE)); - } + formatFilterList.add(RowFilter.regexFilter("^Constructed - Vintage", TableTableModel.COLUMN_DECK_TYPE)); + } if (btnFormatCommander.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Commander", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Commander|^Duel Commander", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatTinyLeader.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Tiny", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Tiny", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatLimited.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Limited", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Limited", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatOther.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("Pauper|Extended", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Constructed - Pauper|^Constructed - Extended|^Constructed - Historical|^Constructed - Super", TableTableModel.COLUMN_DECK_TYPE)); } List> skillFilterList = new ArrayList<>(); @@ -557,7 +550,7 @@ public class TablesPanel extends javax.swing.JPanel { if (btnSkillSerious.isSelected()) { skillFilterList.add(RowFilter.regexFilter(SkillLevel.SERIOUS.toString(), TableTableModel.COLUMN_SKILL)); } - + if (stateFilterList.isEmpty() || typeFilterList.isEmpty() || formatFilterList.isEmpty() || skillFilterList.isEmpty()) { // no selection activeTablesSorter.setRowFilter(RowFilter.regexFilter("Nothing", TableTableModel.COLUMN_SKILL)); } else { @@ -568,7 +561,7 @@ public class TablesPanel extends javax.swing.JPanel { } else if (stateFilterList.size() == 1) { filterList.addAll(stateFilterList); } - + if (typeFilterList.size() > 1) { filterList.add(RowFilter.orFilter(typeFilterList)); } else if (typeFilterList.size() == 1) { @@ -586,7 +579,7 @@ public class TablesPanel extends javax.swing.JPanel { } else if (skillFilterList.size() == 1) { filterList.addAll(skillFilterList); } - + if (filterList.size() == 1) { activeTablesSorter.setRowFilter(filterList.get(0)); } else { @@ -594,11 +587,11 @@ public class TablesPanel extends javax.swing.JPanel { } } } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents @@ -1124,37 +1117,37 @@ public class TablesPanel extends javax.swing.JPanel { }// //GEN-END:initComponents private void btnNewTournamentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTournamentActionPerformed - newTournamentDialog.showDialog(roomId); + newTournamentDialog.showDialog(roomId); }//GEN-LAST:event_btnNewTournamentActionPerformed private void btnQuickStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuickStartActionPerformed - TableView table; - try { - File f = new File("test.dck"); - if (!f.exists()) { - JOptionPane.showMessageDialog(null, "Couldn't find test.dck file for quick game start", "Error", JOptionPane.ERROR_MESSAGE); - return; - } - - MatchOptions options = new MatchOptions("1", "Two Player Duel"); - options.getPlayerTypes().add("Human"); - options.getPlayerTypes().add("Computer - mad"); - options.setDeckType("Limited"); - options.setAttackOption(MultiplayerAttackOption.LEFT); - options.setRange(RangeOfInfluence.ALL); - options.setWinsNeeded(1); - options.setMatchTimeLimit(MatchTimeLimit.NONE); - options.setFreeMulligans(2); - options.setSkillLevel(SkillLevel.CASUAL); - options.setRollbackTurnsAllowed(true); - table = session.createTable(roomId, options); - - session.joinTable(roomId, table.getTableId(), "Human", "Human", 1, DeckImporterUtil.importDeck("test.dck"),""); - session.joinTable(roomId, table.getTableId(), "Computer", "Computer - mad", 5, DeckImporterUtil.importDeck("test.dck"),""); - session.startMatch(roomId, table.getTableId()); - } catch (HeadlessException ex) { - handleError(ex); + TableView table; + try { + File f = new File("test.dck"); + if (!f.exists()) { + JOptionPane.showMessageDialog(null, "Couldn't find test.dck file for quick game start", "Error", JOptionPane.ERROR_MESSAGE); + return; } + + MatchOptions options = new MatchOptions("1", "Two Player Duel"); + options.getPlayerTypes().add("Human"); + options.getPlayerTypes().add("Computer - mad"); + options.setDeckType("Limited"); + options.setAttackOption(MultiplayerAttackOption.LEFT); + options.setRange(RangeOfInfluence.ALL); + options.setWinsNeeded(1); + options.setMatchTimeLimit(MatchTimeLimit.NONE); + options.setFreeMulligans(2); + options.setSkillLevel(SkillLevel.CASUAL); + options.setRollbackTurnsAllowed(true); + table = session.createTable(roomId, options); + + session.joinTable(roomId, table.getTableId(), "Human", "Human", 1, DeckImporterUtil.importDeck("test.dck"), ""); + session.joinTable(roomId, table.getTableId(), "Computer", "Computer - mad", 5, DeckImporterUtil.importDeck("test.dck"), ""); + session.startMatch(roomId, table.getTableId()); + } catch (HeadlessException ex) { + handleError(ex); + } }//GEN-LAST:event_btnQuickStartActionPerformed private void btnNewTableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTableActionPerformed @@ -1180,8 +1173,7 @@ public class TablesPanel extends javax.swing.JPanel { private void btnStateFinishedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStateFinishedActionPerformed if (this.btnStateFinished.isSelected()) { this.jSplitPane2.setDividerLocation(-1); - } - else { + } else { this.jSplitPane2.setDividerLocation(this.jPanel3.getHeight()); } this.startTasks(); @@ -1192,7 +1184,6 @@ public class TablesPanel extends javax.swing.JPanel { JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error loading deck.", "Error", JOptionPane.ERROR_MESSAGE); } - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JToggleButton btnFormatBlock; private javax.swing.JToggleButton btnFormatCommander; @@ -1235,14 +1226,15 @@ public class TablesPanel extends javax.swing.JPanel { private javax.swing.JTable tableTables; private javax.swing.JPanel topPanel; // End of variables declaration//GEN-END:variables - + } class TableTableModel extends AbstractTableModel { + ImageIcon tourneyIcon = new javax.swing.ImageIcon(getClass().getResource("/tables/tourney_icon.png")); ImageIcon matchIcon = new javax.swing.ImageIcon(getClass().getResource("/tables/match_icon.png")); - - public static final int COLUMN_ICON = 0; + + public static final int COLUMN_ICON = 0; public static final int COLUMN_DECK_TYPE = 1; // column the deck type is located (starting with 0) Start string is used to check for Limited public static final int COLUMN_OWNER = 2; public static final int COLUMN_GAME_TYPE = 3; @@ -1251,18 +1243,19 @@ class TableTableModel extends AbstractTableModel { public static final int COLUMN_SKILL = 7; public static final int ACTION_COLUMN = 8; // column the action is located (starting with 0) - private final String[] columnNames = new String[]{"M/T","Deck Type", "Owner / Players", "Game Type", "Info", "Status", "Created / Started", "Skill Level", "Action"}; - + private final String[] columnNames = new String[]{"M/T", "Deck Type", "Owner / Players", "Game Type", "Info", "Status", "Created / Started", "Skill Level", "Action"}; + private TableView[] tables = new TableView[0]; - private static final DateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss");; + private static final DateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss"); + ; private Session session; - + public void loadData(Collection tables) throws MageRemoteException { this.tables = tables.toArray(new TableView[0]); this.fireTableDataChanged(); - } - + } + @Override public int getRowCount() { return tables.length; @@ -1281,7 +1274,7 @@ class TableTableModel extends AbstractTableModel { public Object getValueAt(int arg0, int arg1) { switch (arg1) { case 0: - return tables[arg0].isTournament() ? tourneyIcon:matchIcon; + return tables[arg0].isTournament() ? tourneyIcon : matchIcon; case 1: return tables[arg0].getDeckType(); case 2: @@ -1316,10 +1309,10 @@ class TableTableModel extends AbstractTableModel { } else { owner = tables[arg0].getControllerName(); if (session != null && owner.equals(session.getUserName())) { - return ""; + return ""; } return "Watch"; - } + } default: return ""; } @@ -1348,7 +1341,7 @@ class TableTableModel extends AbstractTableModel { } @Override - public Class getColumnClass(int columnIndex){ + public Class getColumnClass(int columnIndex) { switch (columnIndex) { case COLUMN_ICON: return Icon.class; @@ -1410,7 +1403,8 @@ class UpdateTablesTask extends SwingWorker> { get(); } catch (InterruptedException | ExecutionException ex) { logger.fatal("Update Tables Task error", ex); - } catch (CancellationException ex) {} + } catch (CancellationException ex) { + } } } @@ -1449,7 +1443,8 @@ class UpdatePlayersTask extends SwingWorker> { get(); } catch (InterruptedException | ExecutionException ex) { logger.fatal("Update Players Task error", ex); - } catch (CancellationException ex) {} + } catch (CancellationException ex) { + } } } @@ -1458,7 +1453,7 @@ class MatchesTableModel extends AbstractTableModel { public static final int ACTION_COLUMN = 6; // column the action is located (starting with 0) public static final int GAMES_LIST_COLUMN = 7; - private final String[] columnNames = new String[]{"Deck Type", "Players", "Game Type", "Result", "Start Time", "End Time","Action"}; + private final String[] columnNames = new String[]{"Deck Type", "Players", "Game Type", "Result", "Start Time", "End Time", "Action"}; private MatchView[] matches = new MatchView[0]; private static final DateFormat timeFormatter = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); @@ -1509,30 +1504,29 @@ class MatchesTableModel extends AbstractTableModel { } else { return "None"; } - } + } case 7: return matches[arg0].getGames(); } return ""; } - - public List getListofGames (int row) { - return matches[row].getGames(); + + public List getListofGames(int row) { + return matches[row].getGames(); } - + public boolean isTournament(int row) { - return matches[row].isTournament(); + return matches[row].isTournament(); } public UUID getMatchId(int row) { - return matches[row].getMatchId(); + return matches[row].getMatchId(); } - + public UUID getTableId(int row) { - return matches[row].getTableId(); + return matches[row].getTableId(); } - - + @Override public String getColumnName(int columnIndex) { String colName = ""; @@ -1545,7 +1539,7 @@ class MatchesTableModel extends AbstractTableModel { } @Override - public Class getColumnClass(int columnIndex){ + public Class getColumnClass(int columnIndex) { return String.class; } @@ -1593,7 +1587,8 @@ class UpdateMatchesTask extends SwingWorker> { get(); } catch (InterruptedException | ExecutionException ex) { logger.fatal("Update Matches Task error", ex); - } catch (CancellationException ex) {} + } catch (CancellationException ex) { + } } } @@ -1611,7 +1606,7 @@ class GameChooser extends JPopupMenu { return; } this.removeAll(); - for (UUID gameId: games) { + for (UUID gameId : games) { this.add(new GameChooserAction(gameId, gameId.toString())); } this.show(MageFrame.getDesktop(), p.x, p.y); From 17d6fc327f67bd71547406d1202c79e9484a3874 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 5 Aug 2015 07:34:29 +0300 Subject: [PATCH 276/375] Remove SetCardColorSourceEffect and use BecomesColorSourceEffect instead --- .../mage/sets/odyssey/RepentantVampire.java | 4 +- .../src/mage/sets/odyssey/WaywardAngel.java | 10 +- .../sets/timespiral/BlazingBladeAskari.java | 8 +- .../continuous/SetCardColorSourceEffect.java | 101 ------------------ 4 files changed, 11 insertions(+), 112 deletions(-) delete mode 100644 Mage/src/mage/abilities/effects/common/continuous/SetCardColorSourceEffect.java diff --git a/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java b/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java index 33480b005c4..c2062edc5ef 100644 --- a/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java +++ b/Mage.Sets/src/mage/sets/odyssey/RepentantVampire.java @@ -38,8 +38,8 @@ import mage.abilities.condition.common.CardsInControllerGraveCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.continuous.BecomesColorSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.effects.common.continuous.SetCardColorSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -77,7 +77,7 @@ public class RepentantVampire extends CardImpl { this.addAbility(new DiesAndDealtDamageThisTurnTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false)); // Threshold - As long as seven or more cards are in your graveyard, Repentant Vampire is white and has "{tap}: Destroy target black creature." Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( - new SetCardColorSourceEffect(ObjectColor.WHITE, Duration.WhileOnBattlefield), + new BecomesColorSourceEffect(ObjectColor.WHITE, Duration.WhileOnBattlefield), new CardsInControllerGraveCondition(7), "Threshold - As long as seven or more cards are in your graveyard, {this} is white")); Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new TapSourceCost()); diff --git a/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java b/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java index f73fe6f3e36..0c65b84ddad 100644 --- a/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java +++ b/Mage.Sets/src/mage/sets/odyssey/WaywardAngel.java @@ -36,9 +36,9 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.CardsInControllerGraveCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.SacrificeControllerEffect; +import mage.abilities.effects.common.continuous.BecomesColorSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.effects.common.continuous.SetCardColorSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.VigilanceAbility; @@ -75,21 +75,21 @@ public class WaywardAngel extends CardImpl { new CardsInControllerGraveCondition(7), "Threshold - As long as seven or more cards are in your graveyard, {this} gets +3/+3,")); ability.addEffect(new ConditionalContinuousEffect( - new SetCardColorSourceEffect(ObjectColor.BLACK, Duration.WhileOnBattlefield), + new BecomesColorSourceEffect(ObjectColor.BLACK, Duration.WhileOnBattlefield), new CardsInControllerGraveCondition(7), " is black,")); ability.addEffect(new ConditionalContinuousEffect( new GainAbilitySourceEffect(TrampleAbility.getInstance()), new CardsInControllerGraveCondition(7), " has trample,")); - + Ability gainedAbility = new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(new FilterControlledCreaturePermanent(), 1, ""), TargetController.YOU, false); - + ability.addEffect(new ConditionalContinuousEffect( new GainAbilitySourceEffect(gainedAbility), new CardsInControllerGraveCondition(7), " and has \"At the beginning of your upkeep, sacrifice a creature.\" ")); - + this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/timespiral/BlazingBladeAskari.java b/Mage.Sets/src/mage/sets/timespiral/BlazingBladeAskari.java index de158ab2596..d20676a6e54 100644 --- a/Mage.Sets/src/mage/sets/timespiral/BlazingBladeAskari.java +++ b/Mage.Sets/src/mage/sets/timespiral/BlazingBladeAskari.java @@ -29,16 +29,16 @@ package mage.sets.timespiral; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.ObjectColor; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.continuous.SetCardColorSourceEffect; +import mage.abilities.effects.common.continuous.BecomesColorSourceEffect; import mage.abilities.keyword.FlankingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Rarity; import mage.constants.Zone; /** @@ -59,7 +59,7 @@ public class BlazingBladeAskari extends CardImpl { // Flanking this.addAbility(new FlankingAbility()); // {2}: Blazing Blade Askari becomes colorless until end of turn. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new SetCardColorSourceEffect(new ObjectColor(""), Duration.EndOfTurn), new ManaCostsImpl("{2}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorSourceEffect(new ObjectColor(), Duration.EndOfTurn), new ManaCostsImpl("{2}"))); } public BlazingBladeAskari(final BlazingBladeAskari card) { diff --git a/Mage/src/mage/abilities/effects/common/continuous/SetCardColorSourceEffect.java b/Mage/src/mage/abilities/effects/common/continuous/SetCardColorSourceEffect.java deleted file mode 100644 index e45ed9f9a42..00000000000 --- a/Mage/src/mage/abilities/effects/common/continuous/SetCardColorSourceEffect.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * - * 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.abilities.effects.common.continuous; - -import mage.MageObject; -import mage.ObjectColor; -import mage.abilities.Ability; -import mage.abilities.Mode; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.stack.StackObject; - - -/** - * - * @author nicolas.perrenou - */ - - -public class SetCardColorSourceEffect extends ContinuousEffectImpl { - - private ObjectColor setColor; - - public SetCardColorSourceEffect(ObjectColor setColor, Duration duration, String text) { - super(duration, Layer.ColorChangingEffects_5, SubLayer.NA, Outcome.Benefit); - this.setColor = setColor; - staticText = text; - } - - public SetCardColorSourceEffect(ObjectColor setColor, Duration duration) { - super(duration, Layer.ColorChangingEffects_5, SubLayer.NA, Outcome.Benefit); - this.setColor = setColor; - } - - public SetCardColorSourceEffect(final SetCardColorSourceEffect effect) { - super(effect); - this.setColor = effect.setColor; - } - - @Override - public boolean apply(Game game, Ability source) { - MageObject o = game.getObject(source.getSourceId()); - if (o != null) { - if (o instanceof Permanent || o instanceof StackObject) { - o.getColor(game).setColor(setColor); - } - } - - return false; - } - - @Override - public SetCardColorSourceEffect copy() { - return new SetCardColorSourceEffect(this); - } - - @Override - public String getText(Mode mode) { - StringBuilder sb = new StringBuilder(); - sb.append("{this} "); - if (mode.getTargets().size() > 0) { - sb.append(mode.getTargets().get(0).getTargetName()); - } - sb.append(" becomes ").append(setColor.getDescription()); - sb.append(" ").append(duration.toString()); - return sb.toString(); - } -} From e9a72577031280733686cc715230fe3813c2ff5e Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 5 Aug 2015 07:51:23 +0300 Subject: [PATCH 277/375] Move DealsDamageToOpponentTriggeredAbility out of effects directory It is obviously an ability and not an effect... --- .../src/mage/sets/alarareborn/VedalkenHeretic.java | 4 ++-- Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java | 2 +- .../src/mage/sets/avacynrestored/TandemLookout.java | 2 +- Mage.Sets/src/mage/sets/commander/HydraOmnivore.java | 2 +- .../mage/sets/commander2013/LuXunScholarGeneral.java | 2 +- Mage.Sets/src/mage/sets/conflux/CharnelhoardWurm.java | 6 +++--- .../src/mage/sets/fatereforged/MindscourDragon.java | 4 ++-- Mage.Sets/src/mage/sets/legends/NicolBolas.java | 4 ++-- Mage.Sets/src/mage/sets/magic2010/HypnoticSpecter.java | 8 ++++---- .../src/mage/sets/ninthedition/ThievingMagpie.java | 6 +++--- .../src/mage/sets/riseoftheeldrazi/SnakeUmbra.java | 10 +++++----- .../src/mage/sets/shadowmoor/WitherscaleWurm.java | 2 +- Mage.Sets/src/mage/sets/timespiral/LooterIlKor.java | 6 +++--- .../common/DealsDamageToOpponentTriggeredAbility.java | 4 ++-- 14 files changed, 31 insertions(+), 31 deletions(-) rename Mage/src/mage/abilities/{effects => }/common/DealsDamageToOpponentTriggeredAbility.java (98%) diff --git a/Mage.Sets/src/mage/sets/alarareborn/VedalkenHeretic.java b/Mage.Sets/src/mage/sets/alarareborn/VedalkenHeretic.java index 5b8f0d526ab..0a1d61f2124 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/VedalkenHeretic.java +++ b/Mage.Sets/src/mage/sets/alarareborn/VedalkenHeretic.java @@ -29,7 +29,7 @@ package mage.sets.alarareborn; import java.util.UUID; import mage.MageInt; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -54,7 +54,7 @@ public class VedalkenHeretic extends CardImpl { // Whenever Vedalken Heretic deals damage to an opponent, you may draw a card. this.addAbility(new DealsDamageToOpponentTriggeredAbility(new DrawCardSourceControllerEffect(1), true)); - + } public VedalkenHeretic(final VedalkenHeretic card) { diff --git a/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java b/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java index e8f9d48bd5d..385de243c2c 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java +++ b/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java @@ -30,8 +30,8 @@ package mage.sets.apocalypse; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.abilities.keyword.TrampleAbility; diff --git a/Mage.Sets/src/mage/sets/avacynrestored/TandemLookout.java b/Mage.Sets/src/mage/sets/avacynrestored/TandemLookout.java index 255339d3844..a2cec673f68 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/TandemLookout.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/TandemLookout.java @@ -30,8 +30,8 @@ package mage.sets.avacynrestored; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.GainAbilityPairedEffect; import mage.abilities.keyword.SoulbondAbility; diff --git a/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java b/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java index dd8d6c6eb69..fea88abc3d2 100644 --- a/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java +++ b/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java @@ -31,8 +31,8 @@ import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; diff --git a/Mage.Sets/src/mage/sets/commander2013/LuXunScholarGeneral.java b/Mage.Sets/src/mage/sets/commander2013/LuXunScholarGeneral.java index 32ea1712b71..e8e4489d913 100644 --- a/Mage.Sets/src/mage/sets/commander2013/LuXunScholarGeneral.java +++ b/Mage.Sets/src/mage/sets/commander2013/LuXunScholarGeneral.java @@ -29,7 +29,7 @@ package mage.sets.commander2013; import java.util.UUID; import mage.MageInt; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.HorsemanshipAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/sets/conflux/CharnelhoardWurm.java b/Mage.Sets/src/mage/sets/conflux/CharnelhoardWurm.java index 983fccfc748..7356e7d86ab 100644 --- a/Mage.Sets/src/mage/sets/conflux/CharnelhoardWurm.java +++ b/Mage.Sets/src/mage/sets/conflux/CharnelhoardWurm.java @@ -28,14 +28,14 @@ package mage.sets.conflux; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.target.common.TargetCardInYourGraveyard; /** diff --git a/Mage.Sets/src/mage/sets/fatereforged/MindscourDragon.java b/Mage.Sets/src/mage/sets/fatereforged/MindscourDragon.java index 6e4002d8703..919fef0d1c8 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/MindscourDragon.java +++ b/Mage.Sets/src/mage/sets/fatereforged/MindscourDragon.java @@ -30,7 +30,7 @@ package mage.sets.fatereforged; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -53,7 +53,7 @@ public class MindscourDragon extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // Whenever Mindscour Dragon deals combat damage to an opponent, target player puts the top four cards of his or her library into his or her graveyard. Ability ability = new DealsDamageToOpponentTriggeredAbility(new PutLibraryIntoGraveTargetEffect(4), false, true); ability.addTarget(new TargetPlayer()); diff --git a/Mage.Sets/src/mage/sets/legends/NicolBolas.java b/Mage.Sets/src/mage/sets/legends/NicolBolas.java index 55a7c2b4ab2..8bf534631e0 100644 --- a/Mage.Sets/src/mage/sets/legends/NicolBolas.java +++ b/Mage.Sets/src/mage/sets/legends/NicolBolas.java @@ -30,8 +30,8 @@ package mage.sets.legends; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.effects.common.discard.DiscardHandTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -60,7 +60,7 @@ public class NicolBolas extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // At the beginning of your upkeep, sacrifice Nicol Bolas unless you pay {U}{B}{R}. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{U}{B}{R}")), TargetController.YOU, false)); - + // Whenever Nicol Bolas deals damage to an opponent, that player discards his or her hand. this.addAbility(new DealsDamageToOpponentTriggeredAbility(new DiscardHandTargetEffect("that player"), false)); } diff --git a/Mage.Sets/src/mage/sets/magic2010/HypnoticSpecter.java b/Mage.Sets/src/mage/sets/magic2010/HypnoticSpecter.java index c72c755c858..e120011e380 100644 --- a/Mage.Sets/src/mage/sets/magic2010/HypnoticSpecter.java +++ b/Mage.Sets/src/mage/sets/magic2010/HypnoticSpecter.java @@ -27,13 +27,13 @@ */ package mage.sets.magic2010; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import java.util.UUID; @@ -65,4 +65,4 @@ public class HypnoticSpecter extends CardImpl { public HypnoticSpecter copy() { return new HypnoticSpecter(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/ThievingMagpie.java b/Mage.Sets/src/mage/sets/ninthedition/ThievingMagpie.java index e77fb511118..7f6ac26f06c 100644 --- a/Mage.Sets/src/mage/sets/ninthedition/ThievingMagpie.java +++ b/Mage.Sets/src/mage/sets/ninthedition/ThievingMagpie.java @@ -28,13 +28,13 @@ package mage.sets.ninthedition; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; /** * diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SnakeUmbra.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SnakeUmbra.java index 5daad05f235..2c50e5be6e6 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SnakeUmbra.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SnakeUmbra.java @@ -29,18 +29,18 @@ package mage.sets.riseoftheeldrazi; import java.util.UUID; -import mage.constants.*; import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.TotemArmorAbility; import mage.cards.CardImpl; +import mage.constants.*; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -61,17 +61,17 @@ public class SnakeUmbra extends CardImpl { this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - + // Enchanted creature gets +1/+1 ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)); - + // and has "Whenever this creature deals damage to an opponent, you may draw a card." Ability gainedAbility = new DealsDamageToOpponentTriggeredAbility(new DrawCardSourceControllerEffect(1), true); Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA); effect.setText("and has \"Whenever this creature deals damage to an opponent, you may draw a card.\""); ability.addEffect(effect); this.addAbility(ability); - + // Totem armor this.addAbility(new TotemArmorAbility()); } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/WitherscaleWurm.java b/Mage.Sets/src/mage/sets/shadowmoor/WitherscaleWurm.java index 505fab69390..bc3e1f3d06c 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/WitherscaleWurm.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/WitherscaleWurm.java @@ -31,9 +31,9 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BlocksOrBecomesBlockedByCreatureTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.WitherAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/sets/timespiral/LooterIlKor.java b/Mage.Sets/src/mage/sets/timespiral/LooterIlKor.java index 50d92657baf..967e8f78d3f 100644 --- a/Mage.Sets/src/mage/sets/timespiral/LooterIlKor.java +++ b/Mage.Sets/src/mage/sets/timespiral/LooterIlKor.java @@ -28,13 +28,13 @@ package mage.sets.timespiral; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; -import mage.abilities.effects.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.DrawDiscardControllerEffect; import mage.abilities.keyword.ShadowAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; /** * diff --git a/Mage/src/mage/abilities/effects/common/DealsDamageToOpponentTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToOpponentTriggeredAbility.java similarity index 98% rename from Mage/src/mage/abilities/effects/common/DealsDamageToOpponentTriggeredAbility.java rename to Mage/src/mage/abilities/common/DealsDamageToOpponentTriggeredAbility.java index aa25f2b6e83..2641d757ed9 100644 --- a/Mage/src/mage/abilities/effects/common/DealsDamageToOpponentTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToOpponentTriggeredAbility.java @@ -25,7 +25,7 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.abilities.effects.common; +package mage.abilities.common; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; @@ -46,7 +46,7 @@ public class DealsDamageToOpponentTriggeredAbility extends TriggeredAbilityImpl public DealsDamageToOpponentTriggeredAbility(Effect effect) { this(effect, false, false); } - + public DealsDamageToOpponentTriggeredAbility(Effect effect, boolean optional) { this(effect, optional, false); } From 3991ce08e52d3a62b2d2e6350f7a7e58b489f329 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 5 Aug 2015 09:03:38 +0300 Subject: [PATCH 278/375] Generalize PutCreatureOnBattlefieldEffect -> PutPermanentOnBattlefieldEffect --- .../src/mage/sets/apocalypse/DragonArch.java | 4 +- .../src/mage/sets/magic2010/ElvishPiper.java | 15 ++-- .../sets/magic2012/QuicksilverAmulet.java | 5 +- .../src/mage/sets/nemesis/BelbesPortal.java | 72 +++---------------- ...a => PutPermanentOnBattlefieldEffect.java} | 23 +++--- 5 files changed, 35 insertions(+), 84 deletions(-) rename Mage/src/mage/abilities/effects/common/{PutCreatureOnBattlefieldEffect.java => PutPermanentOnBattlefieldEffect.java} (67%) diff --git a/Mage.Sets/src/mage/sets/apocalypse/DragonArch.java b/Mage.Sets/src/mage/sets/apocalypse/DragonArch.java index ebf26f8065c..60fe65ac0ee 100644 --- a/Mage.Sets/src/mage/sets/apocalypse/DragonArch.java +++ b/Mage.Sets/src/mage/sets/apocalypse/DragonArch.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.PutCreatureOnBattlefieldEffect; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; @@ -58,7 +58,7 @@ public class DragonArch extends CardImpl { this.expansionSetCode = "APC"; // {2}, {T}: You may put a multicolored creature card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutCreatureOnBattlefieldEffect(filter), + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/magic2010/ElvishPiper.java b/Mage.Sets/src/mage/sets/magic2010/ElvishPiper.java index c29ae7ffdd7..2ce8555a73b 100644 --- a/Mage.Sets/src/mage/sets/magic2010/ElvishPiper.java +++ b/Mage.Sets/src/mage/sets/magic2010/ElvishPiper.java @@ -27,17 +27,18 @@ */ package mage.sets.magic2010; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; + +import java.util.UUID; import mage.MageInt; -import mage.abilities.effects.common.PutCreatureOnBattlefieldEffect; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.cards.CardImpl; - -import java.util.UUID; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; /** * @@ -56,7 +57,7 @@ public class ElvishPiper extends CardImpl { // {G}, {tap}: You may put a creature card from your hand onto the battlefield. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutCreatureOnBattlefieldEffect(), + new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), new ManaCostsImpl("{G}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java b/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java index c220e08f282..5789dcd3403 100644 --- a/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java +++ b/Mage.Sets/src/mage/sets/magic2012/QuicksilverAmulet.java @@ -30,11 +30,12 @@ package mage.sets.magic2012; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; -import mage.abilities.effects.common.PutCreatureOnBattlefieldEffect; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.cards.CardImpl; +import mage.filter.common.FilterCreatureCard; import java.util.UUID; @@ -50,7 +51,7 @@ public class QuicksilverAmulet extends CardImpl { // {4}, {tap}: You may put a creature card from your hand onto the battlefield. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new PutCreatureOnBattlefieldEffect(), + new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), new ManaCostsImpl("{4}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/nemesis/BelbesPortal.java b/Mage.Sets/src/mage/sets/nemesis/BelbesPortal.java index 5b3e8c7cb73..8a6bd9a80f4 100644 --- a/Mage.Sets/src/mage/sets/nemesis/BelbesPortal.java +++ b/Mage.Sets/src/mage/sets/nemesis/BelbesPortal.java @@ -34,24 +34,15 @@ import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ChooseCreatureTypeEffect; -import mage.abilities.effects.common.PutCreatureOnBattlefieldEffect; -import mage.cards.Card; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.cards.CardImpl; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInHand; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; /** * @@ -66,8 +57,10 @@ public class BelbesPortal extends CardImpl { // As Belbe's Portal enters the battlefield, choose a creature type. this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.PutCreatureInPlay))); // {3}, {tap}: You may put a creature card of the chosen type from your hand onto the battlefield. - SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new BelbesPortalPutCreatureOnBattlefieldEffect(), + FilterCreatureCard filter = new FilterCreatureCard("a creature card of the chosen type"); + filter.add(new ChosenSubtypePredicate(this.getId())); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PutPermanentOnBattlefieldEffect(filter), new ManaCostsImpl("{3}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); @@ -82,48 +75,3 @@ public class BelbesPortal extends CardImpl { return new BelbesPortal(this); } } - -class BelbesPortalPutCreatureOnBattlefieldEffect extends OneShotEffect { - BelbesPortalPutCreatureOnBattlefieldEffect() { - super(Outcome.PutCreatureInPlay); - staticText = "You may put a creature card of the chosen type from your hand onto the battlefield"; - } - - BelbesPortalPutCreatureOnBattlefieldEffect(final BelbesPortalPutCreatureOnBattlefieldEffect effect) { - super(effect); - } - - @Override - public BelbesPortalPutCreatureOnBattlefieldEffect copy() { - return new BelbesPortalPutCreatureOnBattlefieldEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); - if (subtype != null) { - Player player = game.getPlayer(source.getControllerId()); - String choiceText = "Put a " + subtype.toLowerCase() + " creature card from your hand onto the battlefield?"; - - if (player != null) { - if (player.chooseUse(Outcome.PutCreatureInPlay, choiceText, source, game)) { - FilterCreatureCard creatureTypeFilter = new FilterCreatureCard(); - creatureTypeFilter.add(new SubtypePredicate(subtype)); - - TargetCardInHand target = new TargetCardInHand(creatureTypeFilter); - if (player.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId()); - } - } - } - return true; - } - } - } - return false; - } -} \ No newline at end of file diff --git a/Mage/src/mage/abilities/effects/common/PutCreatureOnBattlefieldEffect.java b/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java similarity index 67% rename from Mage/src/mage/abilities/effects/common/PutCreatureOnBattlefieldEffect.java rename to Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java index 822c21199bb..254566a4cd9 100644 --- a/Mage/src/mage/abilities/effects/common/PutCreatureOnBattlefieldEffect.java +++ b/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java @@ -6,7 +6,8 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; +import mage.filter.FilterCard; +import mage.filter.common.FilterPermanentCard; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInHand; @@ -14,34 +15,34 @@ import mage.target.common.TargetCardInHand; /** * @author magenoxx_at_gmail.com */ -public class PutCreatureOnBattlefieldEffect extends OneShotEffect { +public class PutPermanentOnBattlefieldEffect extends OneShotEffect { - private final FilterCreatureCard filter; + private final FilterCard filter; - public PutCreatureOnBattlefieldEffect() { - this(new FilterCreatureCard("a creature card")); + public PutPermanentOnBattlefieldEffect() { + this(new FilterPermanentCard("a permanent card")); } - public PutCreatureOnBattlefieldEffect(FilterCreatureCard filter) { - super(Outcome.PutCreatureInPlay); + public PutPermanentOnBattlefieldEffect(FilterCard filter) { + super(Outcome.PutCardInPlay); this.filter = filter; } - public PutCreatureOnBattlefieldEffect(final PutCreatureOnBattlefieldEffect effect) { + public PutPermanentOnBattlefieldEffect(final PutPermanentOnBattlefieldEffect effect) { super(effect); this.filter = effect.filter.copy(); } @Override - public PutCreatureOnBattlefieldEffect copy() { - return new PutCreatureOnBattlefieldEffect(this); + public PutPermanentOnBattlefieldEffect copy() { + return new PutPermanentOnBattlefieldEffect(this); } @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); String choiceText = "Put " + filter.getMessage() + " from your hand onto the battlefield?"; - if (player == null || !player.chooseUse(Outcome.PutCreatureInPlay, choiceText, source, game)) { + if (player == null || !player.chooseUse(Outcome.PutCardInPlay, choiceText, source, game)) { return false; } From bb8b030592c479da524acbf72c8ae9ebdac2db55 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 5 Aug 2015 09:58:11 +0300 Subject: [PATCH 279/375] Implement cards: Anaba Ancestor, Anaba Spirit Crafter, and Didgeridoo --- .../mage/sets/homelands/AnabaAncestor.java | 81 +++++++++++++++++++ .../sets/homelands/AnabaSpiritCrafter.java | 74 +++++++++++++++++ .../src/mage/sets/homelands/Didgeridoo.java | 69 ++++++++++++++++ .../sets/masterseditioniii/AnabaAncestor.java | 54 +++++++++++++ .../masterseditioniii/AnabaSpiritCrafter.java | 54 +++++++++++++ .../sets/masterseditioniii/Didgeridoo.java | 54 +++++++++++++ 6 files changed, 386 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/homelands/AnabaAncestor.java create mode 100644 Mage.Sets/src/mage/sets/homelands/AnabaSpiritCrafter.java create mode 100644 Mage.Sets/src/mage/sets/homelands/Didgeridoo.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/AnabaAncestor.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/AnabaSpiritCrafter.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/Didgeridoo.java diff --git a/Mage.Sets/src/mage/sets/homelands/AnabaAncestor.java b/Mage.Sets/src/mage/sets/homelands/AnabaAncestor.java new file mode 100644 index 00000000000..5074961e95d --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/AnabaAncestor.java @@ -0,0 +1,81 @@ +/* + * 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.homelands; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class AnabaAncestor extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Another target Minotaur creature"); + + static { + filter.add(new SubtypePredicate("Minotaur")); + filter.add(new AnotherPredicate()); + } + + public AnabaAncestor(UUID ownerId) { + super(ownerId, 81, "Anaba Ancestor", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "HML"; + this.subtype.add("Minotaur"); + this.subtype.add("Spirit"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {T}: Another target Minotaur creature gets +1/+1 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 1, Duration.EndOfTurn), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public AnabaAncestor(final AnabaAncestor card) { + super(card); + } + + @Override + public AnabaAncestor copy() { + return new AnabaAncestor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/AnabaSpiritCrafter.java b/Mage.Sets/src/mage/sets/homelands/AnabaSpiritCrafter.java new file mode 100644 index 00000000000..53536b05900 --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/AnabaSpiritCrafter.java @@ -0,0 +1,74 @@ +/* + * 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.homelands; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author LoneFox + */ +public class AnabaSpiritCrafter extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Minotaur creatures"); + + static { + filter.add(new SubtypePredicate("Minotaur")); + } + + public AnabaSpiritCrafter(UUID ownerId) { + super(ownerId, 86, "Anaba Spirit Crafter", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + this.expansionSetCode = "HML"; + this.subtype.add("Minotaur"); + this.subtype.add("Shaman"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Minotaur creatures get +1/+0. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 0, Duration.WhileOnBattlefield, filter, false))); + } + + public AnabaSpiritCrafter(final AnabaSpiritCrafter card) { + super(card); + } + + @Override + public AnabaSpiritCrafter copy() { + return new AnabaSpiritCrafter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/Didgeridoo.java b/Mage.Sets/src/mage/sets/homelands/Didgeridoo.java new file mode 100644 index 00000000000..96609bf2e04 --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/Didgeridoo.java @@ -0,0 +1,69 @@ +/* + * 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.homelands; + +import java.util.UUID; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterPermanentCard; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author LoneFox + */ +public class Didgeridoo extends CardImpl { + + private static final FilterPermanentCard filter = new FilterPermanentCard("a Minotaur permanent card"); + + static { + filter.add(new SubtypePredicate("Minotaur")); + } + + public Didgeridoo(UUID ownerId) { + super(ownerId, 130, "Didgeridoo", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "HML"; + + // {3}: You may put a Minotaur permanent card from your hand onto the battlefield. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter), new ManaCostsImpl("{3}"))); + } + + public Didgeridoo(final Didgeridoo card) { + super(card); + } + + @Override + public Didgeridoo copy() { + return new Didgeridoo(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/AnabaAncestor.java b/Mage.Sets/src/mage/sets/masterseditioniii/AnabaAncestor.java new file mode 100644 index 00000000000..be8739bea49 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/AnabaAncestor.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.masterseditioniii; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class AnabaAncestor extends mage.sets.homelands.AnabaAncestor { + + public AnabaAncestor(UUID ownerId) { + super(ownerId); + this.cardNumber = 86; + this.expansionSetCode = "ME3"; + this.rarity = Rarity.COMMON; + } + + public AnabaAncestor(final AnabaAncestor card) { + super(card); + } + + @Override + public AnabaAncestor copy() { + return new AnabaAncestor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/AnabaSpiritCrafter.java b/Mage.Sets/src/mage/sets/masterseditioniii/AnabaSpiritCrafter.java new file mode 100644 index 00000000000..c4168cb5a36 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/AnabaSpiritCrafter.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.masterseditioniii; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class AnabaSpiritCrafter extends mage.sets.homelands.AnabaSpiritCrafter { + + public AnabaSpiritCrafter(UUID ownerId) { + super(ownerId); + this.cardNumber = 87; + this.expansionSetCode = "ME3"; + this.rarity = Rarity.COMMON; + } + + public AnabaSpiritCrafter(final AnabaSpiritCrafter card) { + super(card); + } + + @Override + public AnabaSpiritCrafter copy() { + return new AnabaSpiritCrafter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/Didgeridoo.java b/Mage.Sets/src/mage/sets/masterseditioniii/Didgeridoo.java new file mode 100644 index 00000000000..21531411cb9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/Didgeridoo.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.masterseditioniii; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class Didgeridoo extends mage.sets.homelands.Didgeridoo { + + public Didgeridoo(UUID ownerId) { + super(ownerId); + this.cardNumber = 194; + this.expansionSetCode = "ME3"; + this.rarity = Rarity.UNCOMMON; + } + + public Didgeridoo(final Didgeridoo card) { + super(card); + } + + @Override + public Didgeridoo copy() { + return new Didgeridoo(this); + } +} From 5fdc56352e9930c381347ef557bf954f52fbb17f Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 5 Aug 2015 11:03:18 +0300 Subject: [PATCH 280/375] Refactor a few cards to use PutPermanentOnBattlefieldEffect instead of custom effects --- .../mage/sets/conflux/MasterTransmuter.java | 51 ++--------- .../mage/sets/eventide/MindwrackLiege.java | 66 ++------------ .../src/mage/sets/urzassaga/GoblinLackey.java | 90 ++----------------- .../mage/sets/worldwake/StoneforgeMystic.java | 66 ++------------ 4 files changed, 29 insertions(+), 244 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java b/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java index 98fb20c1ff8..fcae2dcac52 100644 --- a/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java +++ b/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java @@ -28,25 +28,19 @@ package mage.sets.conflux; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterArtifactCard; import mage.filter.common.FilterControlledArtifactPermanent; -import mage.game.Game; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetControlledPermanent; /** @@ -65,7 +59,7 @@ public class MasterTransmuter extends CardImpl { this.toughness = new MageInt(2); // {U}, {tap}, Return an artifact you control to its owner's hand: You may put an artifact card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MasterTransmuterEffect(), new ManaCostsImpl("{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(new FilterArtifactCard("an artifact card")), new ManaCostsImpl("{U}")); ability.addCost(new TapSourceCost()); ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact")))); this.addAbility(ability); @@ -81,38 +75,3 @@ public class MasterTransmuter extends CardImpl { return new MasterTransmuter(this); } } - -class MasterTransmuterEffect extends OneShotEffect { - - public MasterTransmuterEffect() { - super(Outcome.Benefit); - this.staticText = "You may put an artifact card from your hand onto the battlefield"; - } - - public MasterTransmuterEffect(final MasterTransmuterEffect effect) { - super(effect); - } - - @Override - public MasterTransmuterEffect copy() { - return new MasterTransmuterEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCardInHand(new FilterArtifactCard("an artifact card from your hand")); - if (target.canChoose(source.getSourceId(), source.getControllerId(), game) - && controller.chooseUse(outcome, "Put an artifact from your hand to battlefield?", source, game) - && controller.chooseTarget(outcome, target, source, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId()); - } - } - } - - return false; - } -} diff --git a/Mage.Sets/src/mage/sets/eventide/MindwrackLiege.java b/Mage.Sets/src/mage/sets/eventide/MindwrackLiege.java index eda9db62341..f0d5714b775 100644 --- a/Mage.Sets/src/mage/sets/eventide/MindwrackLiege.java +++ b/Mage.Sets/src/mage/sets/eventide/MindwrackLiege.java @@ -30,17 +30,14 @@ package mage.sets.eventide; import java.util.UUID; import mage.MageInt; import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; @@ -49,9 +46,6 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.common.TargetCardInHand; /** * @@ -59,15 +53,17 @@ import mage.target.common.TargetCardInHand; */ public class MindwrackLiege extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blue creatures you control"); private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("red creatures you control"); + private static final FilterCreatureCard filter3 = new FilterCreatureCard("a blue or red creature card"); + static { filter.add(new ColorPredicate(ObjectColor.BLUE)); filter.add(new ControllerPredicate(TargetController.YOU)); - filter2.add(new ColorPredicate(ObjectColor.RED)); filter2.add(new ControllerPredicate(TargetController.YOU)); + filter3.add(Predicates.or(new ColorPredicate(ObjectColor.BLUE), new ColorPredicate(ObjectColor.RED))); } public MindwrackLiege(UUID ownerId) { @@ -80,13 +76,12 @@ public class MindwrackLiege extends CardImpl { // Other blue creatures you control get +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, true))); - + // Other red creatures you control get +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter2, true))); - + // {UR}{UR}{UR}{UR}: You may put a blue or red creature card from your hand onto the battlefield. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new MindwrackLiegeEffect(), new ManaCostsImpl("{U/R}{U/R}{U/R}{U/R}"))); - + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter3), new ManaCostsImpl("{U/R}{U/R}{U/R}{U/R}"))); } public MindwrackLiege(final MindwrackLiege card) { @@ -98,48 +93,3 @@ public class MindwrackLiege extends CardImpl { return new MindwrackLiege(this); } } - -class MindwrackLiegeEffect extends OneShotEffect { - - private static final String choiceText = "Put a blue or red creature card from your hand onto the battlefield?"; - - private static final FilterCreatureCard filter = new FilterCreatureCard("a blue or red creature card"); - - static { - filter.add(Predicates.or( - new ColorPredicate(ObjectColor.BLUE), - new ColorPredicate(ObjectColor.RED))); - } - - public MindwrackLiegeEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "You may put a blue or red creature card from your hand onto the battlefield"; - } - - public MindwrackLiegeEffect(final MindwrackLiegeEffect effect) { - super(effect); - } - - @Override - public MindwrackLiegeEffect copy() { - return new MindwrackLiegeEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null || !player.chooseUse(Outcome.PutCreatureInPlay, choiceText, source, game)) { - return false; - } - - TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - return true; - } - } - return false; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzassaga/GoblinLackey.java b/Mage.Sets/src/mage/sets/urzassaga/GoblinLackey.java index f4f44011f6f..282a8788916 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/GoblinLackey.java +++ b/Mage.Sets/src/mage/sets/urzassaga/GoblinLackey.java @@ -29,22 +29,13 @@ package mage.sets.urzassaga; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.players.Player; -import mage.target.common.TargetCardInHand; /** * @@ -52,6 +43,12 @@ import mage.target.common.TargetCardInHand; */ public class GoblinLackey extends CardImpl { + private static final FilterPermanentCard filter = new FilterPermanentCard("a Goblin permanent card"); + + static { + filter.add(new SubtypePredicate("Goblin")); + } + public GoblinLackey(UUID ownerId) { super(ownerId, 190, "Goblin Lackey", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}"); this.expansionSetCode = "USG"; @@ -61,7 +58,7 @@ public class GoblinLackey extends CardImpl { this.toughness = new MageInt(1); // Whenever Goblin Lackey deals damage to a player, you may put a Goblin permanent card from your hand onto the battlefield. - this.addAbility(new GoblinLackeyTriggeredAbility()); + this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new PutPermanentOnBattlefieldEffect(filter), false)); } public GoblinLackey(final GoblinLackey card) { @@ -73,72 +70,3 @@ public class GoblinLackey extends CardImpl { return new GoblinLackey(this); } } - -class GoblinLackeyTriggeredAbility extends TriggeredAbilityImpl { - - public GoblinLackeyTriggeredAbility() { - super(Zone.BATTLEFIELD, new GoblinLackeyEffect(), true); - } - - public GoblinLackeyTriggeredAbility(final GoblinLackeyTriggeredAbility ability) { - super(ability); - } - - @Override - public GoblinLackeyTriggeredAbility copy() { - return new GoblinLackeyTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getSourceId().equals(this.sourceId) - && game.getOpponents(this.getControllerId()).contains(event.getTargetId()); - } - - @Override - public String getRule() { - return "Whenever {this} deals damage to an opponent, you may put a Goblin permanent card from your hand onto the battlefield."; - } -} - -class GoblinLackeyEffect extends OneShotEffect { - - public GoblinLackeyEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "you may put a Goblin permanent card from your hand onto the battlefield"; - } - - public GoblinLackeyEffect(final GoblinLackeyEffect effect) { - super(effect); - } - - @Override - public GoblinLackeyEffect copy() { - return new GoblinLackeyEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { - return false; - } - FilterPermanentCard filter = new FilterPermanentCard("Goblin permanent card from your hand"); - filter.add(new SubtypePredicate("Goblin")); - TargetCardInHand target = new TargetCardInHand(filter); - if (controller.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId()); - } else { - return false; - } - } - return true; - } -} diff --git a/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java b/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java index 6d1f9a9bae8..3a87eb36ce0 100644 --- a/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java +++ b/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -35,26 +35,16 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.common.FilterArtifactCard; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetCardInLibrary; - - /** * * @author BetaSteward_at_googlemail.com @@ -64,7 +54,6 @@ public class StoneforgeMystic extends CardImpl { private static final FilterCard filter = new FilterCard("an Equipment card"); static { - filter.add(new CardTypePredicate(CardType.ARTIFACT)); filter.add(new SubtypePredicate("Equipment")); } @@ -82,7 +71,7 @@ public class StoneforgeMystic extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(target, true, true), true)); // {1}{W}, {T}: You may put an Equipment card from your hand onto the battlefield. - SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new StoneforgeMysticEffect(), new ManaCostsImpl("{1}{W}")); + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(filter), new ManaCostsImpl("{1}{W}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); } @@ -97,44 +86,3 @@ public class StoneforgeMystic extends CardImpl { } } - -class StoneforgeMysticEffect extends OneShotEffect { - - private static final FilterArtifactCard filter = new FilterArtifactCard("an Equipment card from your hand"); - - static { - filter.add(new SubtypePredicate("Equipment")); - } - - public StoneforgeMysticEffect() { - super(Outcome.Benefit); - this.staticText = "You may put an Equipment card from your hand onto the battlefield"; - } - - public StoneforgeMysticEffect(final StoneforgeMysticEffect effect) { - super(effect); - } - - @Override - public StoneforgeMysticEffect copy() { - return new StoneforgeMysticEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCardInHand(filter); - if (target.canChoose(source.getSourceId(), source.getControllerId(), game) - && controller.chooseUse(outcome, "Put an Equipment from your hand to battlefield?", source, game) - && controller.chooseTarget(outcome, target, source, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId()); - } - } - return true; - } - return false; - } -} From 94b9790bb014c5c3056f3ce905b41d673d5fb42a Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 5 Aug 2015 11:10:34 +0300 Subject: [PATCH 281/375] Fix capitalization --- .../effects/common/PutPermanentOnBattlefieldEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java b/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java index 254566a4cd9..09a89be1956 100644 --- a/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java +++ b/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java @@ -63,6 +63,6 @@ public class PutPermanentOnBattlefieldEffect extends OneShotEffect { return staticText; } - return "You may put " + filter.getMessage() + " from your hand onto the battlefield"; + return "you may put " + filter.getMessage() + " from your hand onto the battlefield"; } } From 56ee85e11f5e9a77d715cf1369ef7241018b6c26 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 5 Aug 2015 11:51:56 +0300 Subject: [PATCH 282/375] Replace more custom effects with PutPermanentOnBattlefieldEffect --- .../sets/magic2014/GarrukCallerOfBeasts.java | 58 +----------- .../sets/shadowmoor/DramaticEntrance.java | 63 ++----------- .../mage/sets/zendikar/WarrenInstigator.java | 92 +++---------------- 3 files changed, 24 insertions(+), 189 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2014/GarrukCallerOfBeasts.java b/Mage.Sets/src/mage/sets/magic2014/GarrukCallerOfBeasts.java index a4fc59d7c98..6cf8ee79c45 100644 --- a/Mage.Sets/src/mage/sets/magic2014/GarrukCallerOfBeasts.java +++ b/Mage.Sets/src/mage/sets/magic2014/GarrukCallerOfBeasts.java @@ -34,12 +34,11 @@ import mage.abilities.LoyaltyAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GetEmblemEffect; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; @@ -50,11 +49,7 @@ import mage.filter.FilterSpell; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; import mage.game.command.Emblem; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetCardInLibrary; /** @@ -63,7 +58,8 @@ import mage.target.common.TargetCardInLibrary; */ public class GarrukCallerOfBeasts extends CardImpl { - private static final FilterCreatureCard filterGreenCreature = new FilterCreatureCard("a green creature card from your hand"); + private static final FilterCreatureCard filterGreenCreature = new FilterCreatureCard("a green creature card"); + static { filterGreenCreature.add(new ColorPredicate(ObjectColor.GREEN)); } @@ -80,7 +76,7 @@ public class GarrukCallerOfBeasts extends CardImpl { this.addAbility(new LoyaltyAbility(new RevealLibraryPutIntoHandEffect(5, new FilterCreatureCard("all creature cards"),true), 1)); // -3: You may put a green creature card from your hand onto the battlefield. - this.addAbility(new LoyaltyAbility(new GarrukCallerOfBeastsPutOntoBattlefieldEffect(), -3)); + this.addAbility(new LoyaltyAbility(new PutPermanentOnBattlefieldEffect(filterGreenCreature), -3)); // -7: You get an emblem with "Whenever you cast a creature spell, you may search your library for a creature card, put it onto the battlefield, then shuffle your library."); this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new GarrukCallerOfBeastsEmblem()), -7)); @@ -96,6 +92,7 @@ public class GarrukCallerOfBeasts extends CardImpl { return new GarrukCallerOfBeasts(this); } } + /** * Emblem: "Whenever you cast a creature spell, you may search your library for a creature card, put it onto the battlefield, then shuffle your library." */ @@ -113,48 +110,3 @@ class GarrukCallerOfBeastsEmblem extends Emblem { this.getAbilities().add(ability); } } - -class GarrukCallerOfBeastsPutOntoBattlefieldEffect extends OneShotEffect { - - private static final FilterCreatureCard filterGreenCreature = new FilterCreatureCard("a green creature card from your hand"); - - static { - filterGreenCreature.add(new ColorPredicate(ObjectColor.GREEN)); - } - - public GarrukCallerOfBeastsPutOntoBattlefieldEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "You may put a green creature card from your hand onto the battlefield"; - } - - public GarrukCallerOfBeastsPutOntoBattlefieldEffect(final GarrukCallerOfBeastsPutOntoBattlefieldEffect effect) { - super(effect); - } - - @Override - public GarrukCallerOfBeastsPutOntoBattlefieldEffect copy() { - return new GarrukCallerOfBeastsPutOntoBattlefieldEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - if (controller.getHand().count(filterGreenCreature, game) > 0) { - - if (controller.chooseUse(Outcome.PutCreatureInPlay, - "Put a green creature card onto the battlefield?", source, game)) { - Target target = new TargetCardInHand(filterGreenCreature); - if (controller.chooseTarget(outcome, target, source, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId()); - } - } - } - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/sets/shadowmoor/DramaticEntrance.java b/Mage.Sets/src/mage/sets/shadowmoor/DramaticEntrance.java index c3c0846ab5d..cf1822e48df 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/DramaticEntrance.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/DramaticEntrance.java @@ -29,20 +29,12 @@ package mage.sets.shadowmoor; import java.util.UUID; import mage.ObjectColor; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; /** * @@ -50,13 +42,18 @@ import mage.target.common.TargetCardInHand; */ public class DramaticEntrance extends CardImpl { + private static final FilterCreatureCard filter = new FilterCreatureCard("a green creature card"); + + static { + filter.add(new ColorPredicate(ObjectColor.GREEN)); + } + public DramaticEntrance(UUID ownerId) { super(ownerId, 111, "Dramatic Entrance", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{G}{G}"); this.expansionSetCode = "SHM"; - // You may put a green creature card from your hand onto the battlefield. - this.getSpellAbility().addEffect(new DramaticEntranceEffect()); + this.getSpellAbility().addEffect(new PutPermanentOnBattlefieldEffect(filter)); } @@ -69,47 +66,3 @@ public class DramaticEntrance extends CardImpl { return new DramaticEntrance(this); } } - -class DramaticEntranceEffect extends OneShotEffect { - - private static final FilterCreatureCard filter = new FilterCreatureCard("a green creature card from your hand"); - - static { - filter.add(new ColorPredicate(ObjectColor.GREEN)); - } - - public DramaticEntranceEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "You may put a green creature card from your hand onto the battlefield"; - } - - public DramaticEntranceEffect(final DramaticEntranceEffect effect) { - super(effect); - } - - @Override - public DramaticEntranceEffect copy() { - return new DramaticEntranceEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - if (controller.getHand().count(filter, game) > 0) { - if (controller.chooseUse(Outcome.PutCreatureInPlay, - "Put a green creature card onto the battlefield?", source, game)) { - Target target = new TargetCardInHand(filter); - if (controller.chooseTarget(outcome, target, source, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId()); - } - } - } - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/sets/zendikar/WarrenInstigator.java b/Mage.Sets/src/mage/sets/zendikar/WarrenInstigator.java index 8179345ad2d..7cbe2539675 100644 --- a/Mage.Sets/src/mage/sets/zendikar/WarrenInstigator.java +++ b/Mage.Sets/src/mage/sets/zendikar/WarrenInstigator.java @@ -29,23 +29,14 @@ package mage.sets.zendikar; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.abilities.keyword.DoubleStrikeAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.players.Player; -import mage.target.common.TargetCardInHand; /** * @@ -53,6 +44,12 @@ import mage.target.common.TargetCardInHand; */ public class WarrenInstigator extends CardImpl { + private static final FilterCreatureCard filter = new FilterCreatureCard("a Goblin creature card"); + + static { + filter.add(new SubtypePredicate("Goblin")); + } + public WarrenInstigator(UUID ownerId) { super(ownerId, 154, "Warren Instigator", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{R}{R}"); this.expansionSetCode = "ZEN"; @@ -63,7 +60,9 @@ public class WarrenInstigator extends CardImpl { this.toughness = new MageInt(1); this.addAbility(DoubleStrikeAbility.getInstance()); - this.addAbility(new WarrenInstigatorTriggeredAbility()); + + // Whenever Warren Instigator deals damage to an opponent, you may put a Goblin creature card from your hand onto the battlefield. + this.addAbility(new DealsDamageToOpponentTriggeredAbility(new PutPermanentOnBattlefieldEffect(filter), false)); } public WarrenInstigator(final WarrenInstigator card) { @@ -75,72 +74,3 @@ public class WarrenInstigator extends CardImpl { return new WarrenInstigator(this); } } - -class WarrenInstigatorTriggeredAbility extends TriggeredAbilityImpl { - - public WarrenInstigatorTriggeredAbility() { - super(Zone.BATTLEFIELD, new WarrenInstigatorEffect(), true); - } - - public WarrenInstigatorTriggeredAbility(final WarrenInstigatorTriggeredAbility ability) { - super(ability); - } - - @Override - public WarrenInstigatorTriggeredAbility copy() { - return new WarrenInstigatorTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getSourceId().equals(this.sourceId) - && game.getOpponents(this.getControllerId()).contains(event.getTargetId()); - } - - @Override - public String getRule() { - return "Whenever {this} deals damage to an opponent, you may put a Goblin creature card from your hand onto the battlefield."; - } -} - -class WarrenInstigatorEffect extends OneShotEffect { - - public WarrenInstigatorEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "you may put a Goblin creature card from your hand onto the battlefield"; - } - - public WarrenInstigatorEffect(final WarrenInstigatorEffect effect) { - super(effect); - } - - @Override - public WarrenInstigatorEffect copy() { - return new WarrenInstigatorEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { - return false; - } - - FilterCreatureCard filter = new FilterCreatureCard("Goblin creature card from your hand"); - filter.add(new SubtypePredicate("Goblin")); - TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - return true; - } - } - return false; - } -} From 0c9e67377f649712f8769f7c2c2aabe35e1cc3aa Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Aug 2015 11:47:09 +0200 Subject: [PATCH 283/375] * Petalmane Baku - Fixed wrong CounterType (caused by copy & paste). --- Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java index 0e0eca1d7e4..d31abe9b9c1 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PetalmaneBaku.java @@ -75,7 +75,7 @@ public class PetalmaneBaku extends CardImpl { new ManaCostsImpl<>("{1}"), "Add X mana of any one color to your mana pool", true, new CountersCount(CounterType.KI)); - ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance(), + ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI.createInstance(), "Remove X ki counters from {this}")); this.addAbility(ability); } From ef1a487dd5d7ede6a5a7d64f99f15966c3fca5b1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Aug 2015 15:35:17 +0200 Subject: [PATCH 284/375] * Melek, Izzet Paragon - Fixed that it also triggered for spells cast from other libraries. --- Mage.Sets/src/mage/sets/dragonsmaze/MelekIzzetParagon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/MelekIzzetParagon.java b/Mage.Sets/src/mage/sets/dragonsmaze/MelekIzzetParagon.java index f174c83e2f2..f58645d1781 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/MelekIzzetParagon.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/MelekIzzetParagon.java @@ -117,7 +117,7 @@ class MelekIzzetParagonTriggeredAbility extends TriggeredAbilityImpl { if (event.getZone() == Zone.LIBRARY) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null - && spell.getControllerId().equals(super.getControllerId()) + && spell.getOwnerId().equals(super.getControllerId()) && (spell.getCardType().contains(CardType.INSTANT) || spell.getCardType().contains(CardType.SORCERY))) { for (Effect effect : this.getEffects()) { From 662ee7ca107a3f6c862e0aff4a430e6d3452bcea Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Aug 2015 17:45:45 +0200 Subject: [PATCH 285/375] * Fixed handling of face down card selection (e.g. for Scroll Rack). --- Mage.Common/src/mage/view/CardView.java | 162 +++++++++++------- Mage.Common/src/mage/view/CardsView.java | 6 + .../src/mage/player/human/HumanPlayer.java | 1 + .../java/mage/server/game/GameController.java | 4 +- .../common/MayTapOrUntapTargetEffect.java | 5 +- Mage/src/mage/game/Exile.java | 66 ++++--- 6 files changed, 142 insertions(+), 102 deletions(-) diff --git a/Mage.Common/src/mage/view/CardView.java b/Mage.Common/src/mage/view/CardView.java index d0845cd7ae6..6c90e5a66b4 100644 --- a/Mage.Common/src/mage/view/CardView.java +++ b/Mage.Common/src/mage/view/CardView.java @@ -1,33 +1,35 @@ /* -* 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. -*/ - + * 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.view; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import mage.MageObject; import mage.ObjectColor; import mage.abilities.Modes; @@ -35,9 +37,14 @@ import mage.abilities.SpellAbility; import mage.abilities.costs.mana.ManaCosts; import mage.cards.Card; import mage.cards.SplitCard; -import mage.constants.*; +import mage.constants.AbilityType; +import mage.constants.CardType; +import mage.constants.MageObjectType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.counters.Counter; import mage.counters.CounterType; +import mage.game.Game; import mage.game.command.Emblem; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; @@ -47,15 +54,11 @@ import mage.game.stack.StackAbility; import mage.target.Target; import mage.target.Targets; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import mage.game.Game; - /** * @author BetaSteward_at_googlemail.com */ public class CardView extends SimpleCardView { + private static final long serialVersionUID = 1L; protected UUID parentId; @@ -88,7 +91,7 @@ public class CardView extends SimpleCardView { protected boolean flipCard; protected boolean faceDown; - + protected String alternateName; protected String originalName; @@ -114,7 +117,7 @@ public class CardView extends SimpleCardView { protected boolean isPlayable; protected boolean isChoosable; protected boolean selected; - protected boolean canAttack; + protected boolean canAttack; public CardView(Card card) { this(card, null, false); @@ -134,13 +137,42 @@ public class CardView extends SimpleCardView { * * @param card * @param game - * @param controlled is the card view created for the card controller - used for morph / face down cards to know which player may see information for the card + * @param controlled is the card view created for the card controller - used + * for morph / face down cards to know which player may see information for + * the card */ public CardView(Card card, Game game, boolean controlled) { + this(card, game, controlled, false); + } + + /** + * + * @param card + * @param game + * @param controlled is the card view created for the card controller - used + * for morph / face down cards to know which player may see information for + * the card + * @param showFaceDownCard if true and the card is not on the battelfield, + * also a face dwon card is shown in the view dwon cards will be shown + */ + public CardView(Card card, Game game, boolean controlled, boolean showFaceDownCard) { super(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.getTokenSetCode(), game != null); // no information available for face down cards as long it's not a controlled face down morph card - // TODO: Better handle this in Framework (but currently I'm not sure how to do it there) LevelX2 - if (game != null && card.isFaceDown(game)) { + // TODO: Better handle this in Framework (but currently I'm not sure how to do it there) LevelX2 + boolean showFaceUp = true; + if (game != null) { + if (card.isFaceDown(game)) { + showFaceUp = false; + if (!Zone.BATTLEFIELD.equals(game.getState().getZone(card.getId()))) { + if (showFaceDownCard) { + showFaceUp = true; + } + } + } + } + // boolean showFaceUp = game == null || !card.isFaceDown(game) || (!game.getState().getZone(card.getId()).equals(Zone.BATTLEFIELD) && showFaceDownCard); + + if (!showFaceUp) { this.fillEmpty(card, controlled); if (card instanceof Spell) { // special handling for casting of Morph cards @@ -151,10 +183,10 @@ public class CardView extends SimpleCardView { } this.power = "2"; this.toughness = "2"; - this.rules.add("You may cast this card as a 2/2 face-down creature, with no text," + - " no name, no subtypes, and no mana cost by paying {3} rather than paying its mana cost."); + this.rules.add("You may cast this card as a 2/2 face-down creature, with no text," + + " no name, no subtypes, and no mana cost by paying {3} rather than paying its mana cost."); return; - } else { + } else { if (card instanceof Permanent) { this.power = Integer.toString(card.getPower().getValue()); this.toughness = Integer.toString(card.getToughness().getValue()); @@ -172,7 +204,7 @@ public class CardView extends SimpleCardView { rotate = true; } else { if (card instanceof Spell) { - switch(((Spell) card).getSpellAbility().getSpellAbilityType()) { + switch (((Spell) card).getSpellAbility().getSpellAbilityType()) { case SPLIT_FUSED: splitCard = (SplitCard) ((Spell) card).getCard(); rotate = true; @@ -206,7 +238,7 @@ public class CardView extends SimpleCardView { if (card instanceof Permanent) { this.mageObjectType = MageObjectType.PERMANENT; - Permanent permanent = (Permanent)card; + Permanent permanent = (Permanent) card; this.loyalty = Integer.toString(permanent.getCounters().getCount(CounterType.LOYALTY)); this.pairedCard = permanent.getPairedCard(); if (!permanent.getControllerId().equals(permanent.getOwnerId())) { @@ -214,7 +246,7 @@ public class CardView extends SimpleCardView { } if (game != null && permanent.getCounters() != null && !permanent.getCounters().isEmpty()) { counters = new ArrayList<>(); - for (Counter counter: permanent.getCounters().values()) { + for (Counter counter : permanent.getCounters().values()) { counters.add(new CounterView(counter)); } } @@ -227,7 +259,7 @@ public class CardView extends SimpleCardView { this.loyalty = ""; if (game != null && card.getCounters(game) != null && !card.getCounters(game).isEmpty()) { counters = new ArrayList<>(); - for (Counter counter: card.getCounters(game).values()) { + for (Counter counter : card.getCounters(game).values()) { counters.add(new CounterView(counter)); } } @@ -240,8 +272,8 @@ public class CardView extends SimpleCardView { this.color = card.getColor(game); this.canTransform = card.canTransform(); this.flipCard = card.isFlipCard(); - this.faceDown = game != null ? card.isFaceDown(game) : false; - + this.faceDown = !showFaceUp; + if (card instanceof PermanentToken) { this.isToken = true; this.mageObjectType = MageObjectType.TOKEN; @@ -257,7 +289,7 @@ public class CardView extends SimpleCardView { // // set code und card number for token copies to get the image this.rules = ((PermanentToken) card).getRules(game); - this.type = ((PermanentToken)card).getToken().getTokenType(); + this.type = ((PermanentToken) card).getToken().getTokenType(); } else { this.rarity = card.getRarity(); this.isToken = false; @@ -269,7 +301,7 @@ public class CardView extends SimpleCardView { this.originalName = card.getName(); } this.flipCard = card.isFlipCard(); - if (card.isFlipCard() && card.getFlipCardName() != null) { + if (card.isFlipCard() && card.getFlipCardName() != null) { this.alternateName = card.getFlipCardName(); this.originalName = card.getName(); } @@ -277,8 +309,8 @@ public class CardView extends SimpleCardView { if (card instanceof Spell) { this.mageObjectType = MageObjectType.SPELL; Spell spell = (Spell) card; - for (SpellAbility spellAbility: spell.getSpellAbilities()) { - for(UUID modeId : spellAbility.getModes().getSelectedModes()) { + for (SpellAbility spellAbility : spell.getSpellAbilities()) { + for (UUID modeId : spellAbility.getModes().getSelectedModes()) { spellAbility.getModes().setActiveMode(modeId); if (spellAbility.getTargets().size() > 0) { setTargets(spellAbility.getTargets()); @@ -288,12 +320,12 @@ public class CardView extends SimpleCardView { // show for modal spell, which mode was choosen if (spell.getSpellAbility().isModal()) { Modes modes = spell.getSpellAbility().getModes(); - for(UUID modeId : modes.getSelectedModes()) { + for (UUID modeId : modes.getSelectedModes()) { modes.setActiveMode(modeId); - this.rules.add("Chosen mode: " + spell.getSpellAbility().getEffects().getText(modes.get(modeId))+""); + this.rules.add("Chosen mode: " + spell.getSpellAbility().getEffects().getText(modes.get(modeId)) + ""); } } - } + } } public CardView(MageObject object) { @@ -330,7 +362,7 @@ public class CardView extends SimpleCardView { this.rules = emblem.getAbilities().getRules(emblem.getName()); } if (this.rarity == null && object instanceof StackAbility) { - StackAbility stackAbility = (StackAbility)object; + StackAbility stackAbility = (StackAbility) object; this.rarity = Rarity.NA; this.rules = new ArrayList<>(); this.rules.add(stackAbility.getRule()); @@ -343,7 +375,7 @@ public class CardView extends SimpleCardView { protected CardView() { super(null, "", 0, false, "", true); } - + public CardView(EmblemView emblem) { this(true); this.gameObject = true; @@ -397,7 +429,7 @@ public class CardView extends SimpleCardView { } else { this.mageObjectType = MageObjectType.CARD; } - } + } if (card instanceof PermanentToken) { this.mageObjectType = MageObjectType.TOKEN; } @@ -410,7 +442,7 @@ public class CardView extends SimpleCardView { CardView(Token token) { super(token.getId(), "", 0, false, ""); - this.isToken = true; + this.isToken = true; this.id = token.getId(); this.name = token.getName(); this.displayName = token.getName(); @@ -517,11 +549,11 @@ public class CardView extends SimpleCardView { public String getExpansionSetCode() { return expansionSetCode; } - + public void setExpansionSetCode(String expansionSetCode) { this.expansionSetCode = expansionSetCode; } - + @Override public UUID getId() { return id; @@ -533,8 +565,7 @@ public class CardView extends SimpleCardView { } /** - * Returns UUIDs for targets. - * Can be null if there is no target selected. + * Returns UUIDs for targets. Can be null if there is no target selected. * * @return */ @@ -595,7 +626,8 @@ public class CardView extends SimpleCardView { } /** - * Stores the name of the original name, to provide it for a flipped or transformed or copying card + * Stores the name of the original name, to provide it for a flipped or + * transformed or copying card * * @return */ @@ -706,7 +738,7 @@ public class CardView extends SimpleCardView { public boolean isChoosable() { return isChoosable; } - + public void setChoosable(boolean isChoosable) { this.isChoosable = isChoosable; } @@ -726,5 +758,5 @@ public class CardView extends SimpleCardView { public void setCanAttack(boolean canAttack) { this.canAttack = canAttack; } - + } diff --git a/Mage.Common/src/mage/view/CardsView.java b/Mage.Common/src/mage/view/CardsView.java index 0107ee0ee03..2b72e78a1c2 100644 --- a/Mage.Common/src/mage/view/CardsView.java +++ b/Mage.Common/src/mage/view/CardsView.java @@ -72,6 +72,12 @@ public class CardsView extends LinkedHashMap { } } + public CardsView(Game game, Collection cards, boolean showFaceDown) { + for (Card card : cards) { + this.put(card.getId(), new CardView(card, game, false, showFaceDown)); + } + } + public CardsView(Collection abilities, Game game) { for (Ability ability : abilities) { MageObject sourceObject = null; diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index c4015dd9b95..2ed5be13a9f 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -431,6 +431,7 @@ public class HumanPlayer extends PlayerImpl { if (!choosable.isEmpty()) { options.put("choosable", (Serializable) choosable); } + game.fireSelectTargetEvent(playerId, target.getMessage(), cards, required, options); waitForResponse(game); if (response.getUUID() != null) { diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index 49f8ae0e28b..30fbe4fcd17 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -825,7 +825,9 @@ public class GameController implements GameCallback { @Override public void execute(UUID playerId) { if (cards != null) { - getGameSession(playerId).target(question, new CardsView(game, cards.getCards(game)), targets, required, options); + Zone targetZone = (Zone) options.get("targetZone"); + boolean showFaceDown = targetZone != null && targetZone.equals(Zone.PICK); + getGameSession(playerId).target(question, new CardsView(game, cards.getCards(game), showFaceDown), targets, required, options); } else if (perms != null) { CardsView permsView = new CardsView(); for (Permanent perm : perms) { diff --git a/Mage/src/mage/abilities/effects/common/MayTapOrUntapTargetEffect.java b/Mage/src/mage/abilities/effects/common/MayTapOrUntapTargetEffect.java index 9e2c9523a66..f107f2e0a1c 100644 --- a/Mage/src/mage/abilities/effects/common/MayTapOrUntapTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/MayTapOrUntapTargetEffect.java @@ -12,6 +12,7 @@ import mage.players.Player; * @author Loki */ public class MayTapOrUntapTargetEffect extends OneShotEffect { + public MayTapOrUntapTargetEffect() { super(Outcome.Benefit); } @@ -47,9 +48,9 @@ public class MayTapOrUntapTargetEffect extends OneShotEffect { @Override public String getText(Mode mode) { if (mode.getTargets().isEmpty()) { - return "You may tap or untap it"; + return "you may tap or untap it"; } else { - return "You may tap or untap target " + mode.getTargets().get(0).getTargetName(); + return "you may tap or untap target " + mode.getTargets().get(0).getTargetName(); } } } diff --git a/Mage/src/mage/game/Exile.java b/Mage/src/mage/game/Exile.java index 821afc8d9a0..688a2727586 100644 --- a/Mage/src/mage/game/Exile.java +++ b/Mage/src/mage/game/Exile.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.game; import java.io.Serializable; @@ -39,7 +38,6 @@ import java.util.UUID; import mage.cards.Card; import mage.util.Copyable; - /** * * @author BetaSteward_at_googlemail.com @@ -48,14 +46,14 @@ public class Exile implements Serializable, Copyable { private static final UUID PERMANENT = UUID.randomUUID(); - private Map exileZones = new HashMap(); + private Map exileZones = new HashMap<>(); public Exile() { createZone(PERMANENT, "Permanent"); } public Exile(final Exile exile) { - for (Entry entry: exile.exileZones.entrySet()) { + for (Entry entry : exile.exileZones.entrySet()) { exileZones.put(entry.getKey(), entry.getValue().copy()); } } @@ -93,7 +91,7 @@ public class Exile implements Serializable, Copyable { } public Card getCard(UUID cardId, Game game) { - for (ExileZone exile: exileZones.values()) { + for (ExileZone exile : exileZones.values()) { if (exile.contains(cardId)) { return game.getCard(cardId); } @@ -103,14 +101,14 @@ public class Exile implements Serializable, Copyable { public List getAllCards(Game game) { List cards = new ArrayList(); - for (ExileZone exile: exileZones.values()) { + for (ExileZone exile : exileZones.values()) { cards.addAll(exile.getCards(game)); } return cards; } public void removeCard(Card card, Game game) { - for (ExileZone exile: exileZones.values()) { + for (ExileZone exile : exileZones.values()) { if (exile.contains(card.getId())) { exile.remove(card); } @@ -123,7 +121,7 @@ public class Exile implements Serializable, Copyable { } public void clear() { - for (ExileZone exile: exileZones.values()) { + for (ExileZone exile : exileZones.values()) { exile.clear(); } } From 78ff4e58e74d4d4e9c50947dac7dfbf62b35c933 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Aug 2015 17:46:26 +0200 Subject: [PATCH 286/375] * Fixed handling of face down card selection (e.g. for Scroll Rack). --- .../src/mage/sets/tempest/ScrollRack.java | 51 +++++-------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/Mage.Sets/src/mage/sets/tempest/ScrollRack.java b/Mage.Sets/src/mage/sets/tempest/ScrollRack.java index c675affb015..4d5ece41394 100644 --- a/Mage.Sets/src/mage/sets/tempest/ScrollRack.java +++ b/Mage.Sets/src/mage/sets/tempest/ScrollRack.java @@ -27,7 +27,6 @@ */ package mage.sets.tempest; -import java.util.List; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; @@ -37,15 +36,14 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.game.ExileZone; import mage.game.Game; import mage.players.Player; -import mage.target.common.TargetCardInExile; import mage.target.common.TargetCardInHand; /** @@ -91,54 +89,31 @@ class ScrollRackEffect extends OneShotEffect { MageObject sourceObject = game.getObject(source.getSourceId()); if (controller != null && sourceObject != null) { FilterCard filter = new FilterCard("card in your hand to exile"); - FilterCard filter2 = new FilterCard("(move the window) card exiled by " + sourceObject.getLogName() + " to put on top of library"); +// FilterCard filter2 = new FilterCard("(move the window) card exiled by " + sourceObject.getIdName() + " to put on top of library"); TargetCardInHand target = new TargetCardInHand(0, controller.getHand().size(), filter); target.setRequired(false); int amountExiled = 0; if (target.canChoose(source.getControllerId(), game) && target.choose(Outcome.Neutral, source.getControllerId(), source.getSourceId(), game)) { if (!target.getTargets().isEmpty()) { - List targets = target.getTargets(); - for (UUID targetId : targets) { + for (UUID targetId : target.getTargets()) { Card card = game.getCard(targetId); if (card != null) { - if (card.moveToExile(source.getSourceId(), sourceObject.getName(), source.getSourceId(), game)) { - card.setFaceDown(true, game); - amountExiled++; - } + card.setFaceDown(true, game); + amountExiled++; } } + controller.moveCardsToExile(new CardsImpl(target.getTargets()).getCards(game), source, game, false, source.getSourceId(), sourceObject.getIdName()); + for (Card card : game.getExile().getExileZone(source.getSourceId()).getCards(game)) { + card.setFaceDown(true, game); + } } } - game.informPlayers(controller.getLogName() + " exiles " + amountExiled + " card" + (amountExiled == 1 ? " ":"s ") + "face down from his or her hand"); + // Put that many cards from the top of your library into your hand. if (amountExiled > 0) { - int count = Math.min(controller.getLibrary().size(), amountExiled); - for (int i = 0; i < count; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - } - } - } - game.informPlayers(controller.getLogName() + " moves " + amountExiled + " card" + (amountExiled == 1 ? " ":"s ") + "from library to hand"); - - TargetCardInExile target2 = new TargetCardInExile(filter2, source.getSourceId()); - ExileZone scrollRackExileZone = game.getExile().getExileZone(source.getSourceId()); - if (scrollRackExileZone != null) { - while (controller.canRespond() && scrollRackExileZone.count(filter, game) > 1) { - controller.lookAtCards("exiled cards with " + sourceObject.getName(), scrollRackExileZone, game); - controller.choose(Outcome.Neutral, scrollRackExileZone, target2, game); - Card card = game.getCard(target2.getFirstTarget()); - if (card != null) { - game.getExile().removeCard(card, game); - controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.EXILED, true, false); - } - target2.clearChosen(); - } - if (scrollRackExileZone.count(filter, game) == 1) { - Card card = scrollRackExileZone.get(scrollRackExileZone.iterator().next(), game); - controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.EXILED, true, false); - } + controller.moveCards(controller.getLibrary().getTopCards(game, amountExiled), null, Zone.HAND, source, game, false); } + // Then look at the exiled cards and put them on top of your library in any order + controller.putCardsOnTopOfLibrary(game.getExile().getExileZone(source.getSourceId()), game, source, true); return true; } return false; From 55fe68d718600abc45e03ac727ed881048cdafac Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Aug 2015 17:46:56 +0200 Subject: [PATCH 287/375] * Some more rework of card mobement handling. --- .../sets/dragonsoftarkir/CommuneWithLava.java | 15 ++- .../mage/sets/eventide/SanityGrinding.java | 20 ++-- .../sets/innistrad/HereticsPunishment.java | 19 ++-- .../NarsetEnlightenedMaster.java | 21 ++--- .../mage/sets/magic2014/JacesMindseeker.java | 20 ++-- .../mage/sets/magic2015/HushwingGryff.java | 13 +-- .../magicorigins/TalentOfTheTelepath.java | 4 +- .../sets/shadowmoor/AdviceFromTheFae.java | 16 +--- .../java/org/mage/test/player/TestPlayer.java | 11 ++- .../effects/keyword/ManifestEffect.java | 10 +- .../keyword/ManifestTargetPlayerEffect.java | 17 ++-- Mage/src/mage/cards/Cards.java | 68 ++++++++------ Mage/src/mage/cards/CardsImpl.java | 94 ++++++++++--------- .../game/events/ZoneChangeGroupEvent.java | 66 ++++++------- Mage/src/mage/players/Library.java | 88 +++++++++-------- Mage/src/mage/players/Player.java | 9 +- Mage/src/mage/players/PlayerImpl.java | 32 +++++-- .../target/common/TargetCardInLibrary.java | 59 ++++++------ 18 files changed, 298 insertions(+), 284 deletions(-) diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/CommuneWithLava.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/CommuneWithLava.java index 4487794cdf5..89fe50de8f2 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/CommuneWithLava.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/CommuneWithLava.java @@ -27,7 +27,7 @@ */ package mage.sets.dragonsoftarkir; -import java.util.List; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.AsThoughEffectImpl; @@ -94,14 +94,13 @@ class CommuneWithLavaEffect extends OneShotEffect { Card sourceCard = game.getCard(source.getSourceId()); if (controller != null) { int amount = source.getManaCostsToPay().getX(); - List cards = controller.getLibrary().getTopCards(game, amount); + Set cards = controller.getLibrary().getTopCards(game, amount); + controller.moveCardsToExile(cards, source, game, true, CardUtil.getCardExileZoneId(game, source), sourceCard.getIdName()); + for (Card card : cards) { - if (card != null) { - controller.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourceCard.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); - ContinuousEffect effect = new CommuneWithLavaMayPlayEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); - } + ContinuousEffect effect = new CommuneWithLavaMayPlayEffect(); + effect.setTargetPointer(new FixedTarget(card.getId())); + game.addEffect(effect, source); } return true; diff --git a/Mage.Sets/src/mage/sets/eventide/SanityGrinding.java b/Mage.Sets/src/mage/sets/eventide/SanityGrinding.java index 063228b681a..3ee98ec4d43 100644 --- a/Mage.Sets/src/mage/sets/eventide/SanityGrinding.java +++ b/Mage.Sets/src/mage/sets/eventide/SanityGrinding.java @@ -27,6 +27,8 @@ */ package mage.sets.eventide; +import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; @@ -43,8 +45,6 @@ import mage.game.Game; import mage.players.Player; import mage.target.common.TargetOpponent; -import java.util.UUID; - /** * * @author jeffwadsworth @@ -56,7 +56,6 @@ public class SanityGrinding extends CardImpl { super(ownerId, 29, "Sanity Grinding", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{U}{U}{U}"); this.expansionSetCode = "EVE"; - // Chroma - Reveal the top ten cards of your library. For each blue mana symbol in the mana costs of the revealed cards, target opponent puts the top card of his or her library into his or her graveyard. Then put the cards you revealed this way on the bottom of your library in any order. this.getSpellAbility().addEffect(new SanityGrindingEffect()); this.getSpellAbility().addTarget(new TargetOpponent()); @@ -86,18 +85,15 @@ class SanityGrindingEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player targetOpponent = game.getPlayer(source.getFirstTarget()); Player controller = game.getPlayer(source.getControllerId()); - Cards revealed = new CardsImpl(); - int amount; - if (controller == null) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller == null || sourceObject == null) { return false; } - amount = (Math.min(10, controller.getLibrary().size())); - for (int i = 0; i < amount; i++) { - revealed.add(controller.getLibrary().removeFromTop(game)); - } - controller.revealCards("Sanity Grinding", revealed, game); + Cards revealed = new CardsImpl(); + revealed.addAll(controller.getLibrary().getTopCards(game, 10)); + controller.revealCards(sourceObject.getIdName(), revealed, game); + Player targetOpponent = game.getPlayer(source.getFirstTarget()); if (targetOpponent != null) { targetOpponent.moveCards(targetOpponent.getLibrary().getTopCards(game, new ChromaSanityGrindingCount(revealed).calculate(game, source, this)), Zone.LIBRARY, Zone.GRAVEYARD, source, game); diff --git a/Mage.Sets/src/mage/sets/innistrad/HereticsPunishment.java b/Mage.Sets/src/mage/sets/innistrad/HereticsPunishment.java index bfd17fe119d..770680727cc 100644 --- a/Mage.Sets/src/mage/sets/innistrad/HereticsPunishment.java +++ b/Mage.Sets/src/mage/sets/innistrad/HereticsPunishment.java @@ -27,18 +27,18 @@ */ package mage.sets.innistrad; -import java.util.List; +import java.util.Set; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -54,7 +54,6 @@ public class HereticsPunishment extends CardImpl { super(ownerId, 147, "Heretic's Punishment", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); this.expansionSetCode = "ISD"; - // {3}{R}: Choose target creature or player, then put the top three cards of your library into your graveyard. Heretic's Punishment deals damage to that creature or player equal to the highest converted mana cost among those cards. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new HereticsPunishmentEffect(), new ManaCostsImpl("{3}{R}")); ability.addTarget(new TargetCreatureOrPlayer()); @@ -87,12 +86,12 @@ class HereticsPunishmentEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { int maxCost = 0; - List cardList = controller.getLibrary().getTopCards(game, 3); - for (Card card: cardList) { + Set cardList = controller.getLibrary().getTopCards(game, 3); + for (Card card : cardList) { int test = card.getManaCost().convertedManaCost(); if (test > maxCost) { maxCost = test; - } + } } controller.moveCards(cardList, Zone.LIBRARY, Zone.GRAVEYARD, source, game); Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); @@ -114,4 +113,4 @@ class HereticsPunishmentEffect extends OneShotEffect { return new HereticsPunishmentEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/NarsetEnlightenedMaster.java b/Mage.Sets/src/mage/sets/khansoftarkir/NarsetEnlightenedMaster.java index 70d9517368d..a5093dcec42 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/NarsetEnlightenedMaster.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/NarsetEnlightenedMaster.java @@ -27,7 +27,7 @@ */ package mage.sets.khansoftarkir; -import java.util.List; +import java.util.Set; import java.util.UUID; import mage.MageInt; import mage.MageObject; @@ -49,7 +49,6 @@ import mage.constants.Zone; import mage.game.Game; import mage.players.Player; import mage.target.targetpointer.FixedTarget; -import mage.util.CardUtil; /** * @@ -89,12 +88,12 @@ public class NarsetEnlightenedMaster extends CardImpl { class NarsetEnlightenedMasterExileEffect extends OneShotEffect { public NarsetEnlightenedMasterExileEffect() { - super(Outcome.Discard); - staticText = "exile the top four cards of your library. Until end of turn, you may cast noncreature cards exiled with {this} this turn without paying their mana costs"; + super(Outcome.Discard); + staticText = "exile the top four cards of your library. Until end of turn, you may cast noncreature cards exiled with {this} this turn without paying their mana costs"; } public NarsetEnlightenedMasterExileEffect(final NarsetEnlightenedMasterExileEffect effect) { - super(effect); + super(effect); } @Override @@ -102,16 +101,16 @@ class NarsetEnlightenedMasterExileEffect extends OneShotEffect { Player player = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (player != null && sourceObject != null) { - List cards = player.getLibrary().getTopCards(game, 4); + Set cards = player.getLibrary().getTopCards(game, 4); player.moveCards(cards, Zone.LIBRARY, Zone.EXILED, source, game); for (Card card : cards) { - if (game.getState().getZone(card.getId()) == Zone.EXILED && - !card.getCardType().contains(CardType.CREATURE) && - !card.getCardType().contains(CardType.LAND)) { + if (game.getState().getZone(card.getId()) == Zone.EXILED + && !card.getCardType().contains(CardType.CREATURE) + && !card.getCardType().contains(CardType.LAND)) { ContinuousEffect effect = new NarsetEnlightenedMasterCastFromExileEffect(); effect.setTargetPointer(new FixedTarget(card.getId())); game.addEffect(effect, source); - } + } } return true; } @@ -120,7 +119,7 @@ class NarsetEnlightenedMasterExileEffect extends OneShotEffect { @Override public NarsetEnlightenedMasterExileEffect copy() { - return new NarsetEnlightenedMasterExileEffect(this); + return new NarsetEnlightenedMasterExileEffect(this); } } diff --git a/Mage.Sets/src/mage/sets/magic2014/JacesMindseeker.java b/Mage.Sets/src/mage/sets/magic2014/JacesMindseeker.java index bf8354a2869..9877bd2dfbc 100644 --- a/Mage.Sets/src/mage/sets/magic2014/JacesMindseeker.java +++ b/Mage.Sets/src/mage/sets/magic2014/JacesMindseeker.java @@ -27,7 +27,7 @@ */ package mage.sets.magic2014; -import java.util.List; +import java.util.Set; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -66,7 +66,7 @@ public class JacesMindseeker extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // When Jace's Mindseeker enters the battlefield, target opponent puts the top five cards of his or her library into his or her graveyard. + // When Jace's Mindseeker enters the battlefield, target opponent puts the top five cards of his or her library into his or her graveyard. // You may cast an instant or sorcery card from among them without paying its mana cost. Ability ability = new EntersBattlefieldTriggeredAbility(new JaceMindseekerEffect()); ability.addTarget(new TargetOpponent()); @@ -106,17 +106,17 @@ class JaceMindseekerEffect extends OneShotEffect { Cards cardsToCast = new CardsImpl(); Player targetOpponent = game.getPlayer(targetPointer.getFirst(game, source)); if (targetOpponent != null) { - List allCards = targetOpponent.getLibrary().getTopCards(game, 5); + Set allCards = targetOpponent.getLibrary().getTopCards(game, 5); targetOpponent.moveCards(allCards, Zone.LIBRARY, Zone.GRAVEYARD, source, game); - for(Card card : allCards) { + for (Card card : allCards) { if (filter.match(card, game)) { Zone zone = game.getState().getZone(card.getId()); - // If the five cards are put into a public zone such as exile instead of a graveyard (perhaps due to the ability of Rest in Peace), - // you can cast one of those instant or sorcery cards from that zone. - if (zone.equals(Zone.GRAVEYARD) || zone.equals(Zone.EXILED)) { + // If the five cards are put into a public zone such as exile instead of a graveyard (perhaps due to the ability of Rest in Peace), + // you can cast one of those instant or sorcery cards from that zone. + if (zone.equals(Zone.GRAVEYARD) || zone.equals(Zone.EXILED)) { cardsToCast.add(card); } - } + } } } @@ -127,14 +127,14 @@ class JaceMindseekerEffect extends OneShotEffect { TargetCard target = new TargetCard(Zone.GRAVEYARD, filter); // zone should be ignored here target.setNotTarget(true); if (controller.chooseUse(outcome, "Cast an instant or sorcery card from among them for free?", source, game) - && controller.choose(outcome, cardsToCast, target, game)) { + && controller.choose(outcome, cardsToCast, target, game)) { Card card = cardsToCast.get(target.getFirstTarget(), game); if (card != null) { controller.cast(card.getSpellAbility(), game, true); } } } - + } return false; diff --git a/Mage.Sets/src/mage/sets/magic2015/HushwingGryff.java b/Mage.Sets/src/mage/sets/magic2015/HushwingGryff.java index 3cbc4aba1c6..c644c080918 100644 --- a/Mage.Sets/src/mage/sets/magic2015/HushwingGryff.java +++ b/Mage.Sets/src/mage/sets/magic2015/HushwingGryff.java @@ -98,28 +98,23 @@ class HushwingGryffEffect extends ContinuousRuleModifyingEffectImpl { } return null; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; } - @Override + @Override public boolean applies(GameEvent event, Ability source, Game game) { Ability ability = (Ability) getValue("targetAbility"); if (ability != null && AbilityType.TRIGGERED.equals(ability.getAbilityType())) { - Permanent p = game.getPermanent(event.getTargetId()); - if (p != null && p.getCardType().contains(CardType.CREATURE)) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) { return true; } } return false; } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } @Override public HushwingGryffEffect copy() { diff --git a/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java b/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java index 3614a8974e2..3ece67c3790 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java +++ b/Mage.Sets/src/mage/sets/magicorigins/TalentOfTheTelepath.java @@ -27,7 +27,7 @@ */ package mage.sets.magicorigins; -import java.util.List; +import java.util.Set; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; @@ -100,7 +100,7 @@ class TalentOfTheTelepathEffect extends OneShotEffect { Player targetOpponent = game.getPlayer(targetPointer.getFirst(game, source)); MageObject sourceObject = source.getSourceObject(game); if (targetOpponent != null && sourceObject != null) { - List allCards = targetOpponent.getLibrary().getTopCards(game, 7); + Set allCards = targetOpponent.getLibrary().getTopCards(game, 7); Cards cards = new CardsImpl(Zone.LIBRARY, allCards); targetOpponent.revealCards(sourceObject.getIdName() + " - " + targetOpponent.getName() + "'s top library cards", cards, game); for (Card card : allCards) { diff --git a/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java b/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java index 99251d9485a..bf1ed806de7 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/AdviceFromTheFae.java @@ -27,12 +27,10 @@ */ package mage.sets.shadowmoor; -import java.util.List; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.Cards; import mage.cards.CardsImpl; @@ -95,12 +93,8 @@ class AdviceFromTheFaeEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject mageObject = game.getObject(source.getSourceId()); if (controller != null) { - List cardsFromTopLibrary = controller.getLibrary().getTopCards(game, 5); - Cards cards = new CardsImpl(Zone.LIBRARY); - for (Card card : cardsFromTopLibrary) { - cards.add(card); - } - controller.lookAtCards(mageObject.getIdName(), cards, game); + Cards cardsFromLibrary = new CardsImpl(Zone.LIBRARY, controller.getLibrary().getTopCards(game, 5)); + controller.lookAtCards(mageObject.getIdName(), cardsFromLibrary, game); int max = 0; for (UUID playerId : controller.getInRange()) { FilterCreaturePermanent filter = new FilterCreaturePermanent(); @@ -113,11 +107,11 @@ class AdviceFromTheFaeEffect extends OneShotEffect { } boolean moreCreatures = game.getBattlefield().countAll(new FilterControlledCreaturePermanent(), controller.getId(), game) > max; TargetCard target = new TargetCard(moreCreatures ? 2 : 1, Zone.LIBRARY, new FilterCard()); - if (controller.choose(Outcome.DrawCard, cards, target, game)) { - cards.removeAll(target.getTargets()); + if (controller.choose(Outcome.DrawCard, cardsFromLibrary, target, game)) { + cardsFromLibrary.removeAll(target.getTargets()); controller.moveCards(new CardsImpl(target.getTargets()), null, Zone.HAND, source, game); } - controller.putCardsOnBottomOfLibrary(cards, game, source, true); + controller.putCardsOnBottomOfLibrary(cardsFromLibrary, game, source, true); return true; } return false; diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index eac8d92bc10..e76f6cc21ea 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1673,7 +1673,7 @@ public class TestPlayer implements Player { } @Override - public boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game) { + public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game) { return computerPlayer.moveCards(cards, fromZone, toZone, source, game); } @@ -1688,7 +1688,7 @@ public class TestPlayer implements Player { } @Override - public boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { + public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { return computerPlayer.moveCards(cards, fromZone, toZone, source, game); } @@ -1703,7 +1703,12 @@ public class TestPlayer implements Player { } @Override - public boolean moveCardsToGraveyardWithInfo(List allCards, Ability source, Game game, Zone fromZone) { + public boolean moveCardsToExile(Set cards, Ability source, Game game, boolean withName, UUID exileId, String exileZoneName) { + return computerPlayer.moveCardsToExile(cards, source, game, withName, exileId, exileZoneName); + } + + @Override + public boolean moveCardsToGraveyardWithInfo(Set allCards, Ability source, Game game, Zone fromZone) { return computerPlayer.moveCardsToGraveyardWithInfo(allCards, source, game, fromZone); } diff --git a/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java b/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java index 7fbb96ce7cd..71e6293628d 100644 --- a/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java @@ -27,7 +27,7 @@ */ package mage.abilities.effects.keyword; -import java.util.List; +import java.util.Set; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCosts; @@ -53,7 +53,7 @@ public class ManifestEffect extends OneShotEffect { private final int amount; - public ManifestEffect(int amount) { + public ManifestEffect(int amount) { super(Outcome.PutCreatureInPlay); this.amount = amount; this.staticText = setText(); @@ -75,8 +75,8 @@ public class ManifestEffect extends OneShotEffect { if (controller != null) { Ability newSource = source.copy(); newSource.setWorksFaceDown(true); - List cards = controller.getLibrary().getTopCards(game, amount); - for (Card card: cards) { + Set cards = controller.getLibrary().getTopCards(game, amount); + for (Card card : cards) { ManaCosts manaCosts = null; if (card.getCardType().contains(CardType.CREATURE)) { manaCosts = card.getSpellAbility().getManaCosts(); @@ -84,7 +84,7 @@ public class ManifestEffect extends OneShotEffect { manaCosts = new ManaCostsImpl("{0}"); } } - MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter(game) +1, game); + MageObjectReference objectReference = new MageObjectReference(card.getId(), card.getZoneChangeCounter(game) + 1, game); game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource); controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, newSource.getSourceId(), false, true); Permanent permanent = game.getPermanent(card.getId()); diff --git a/Mage/src/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java b/Mage/src/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java index f860993f4a4..897ff83f235 100644 --- a/Mage/src/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/ManifestTargetPlayerEffect.java @@ -27,12 +27,11 @@ */ package mage.abilities.effects.keyword; -import java.util.List; +import java.util.Set; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect.FaceDownType; @@ -44,20 +43,18 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; /** * * @author LevelX2 */ - public class ManifestTargetPlayerEffect extends OneShotEffect { private final int amount; private final String prefix; - public ManifestTargetPlayerEffect(int amount, String prefix) { + public ManifestTargetPlayerEffect(int amount, String prefix) { super(Outcome.PutCreatureInPlay); this.amount = amount; this.prefix = prefix; @@ -81,8 +78,8 @@ public class ManifestTargetPlayerEffect extends OneShotEffect { if (targetPlayer != null) { Ability newSource = source.copy(); newSource.setWorksFaceDown(true); - List cards = targetPlayer.getLibrary().getTopCards(game, amount); - for (Card card: cards) { + Set cards = targetPlayer.getLibrary().getTopCards(game, amount); + for (Card card : cards) { ManaCosts manaCosts = null; if (card.getCardType().contains(CardType.CREATURE)) { manaCosts = card.getSpellAbility().getManaCosts(); @@ -90,13 +87,13 @@ public class ManifestTargetPlayerEffect extends OneShotEffect { manaCosts = new ManaCostsImpl("{0}"); } } - MageObjectReference objectReference= new MageObjectReference(card.getId(), card.getZoneChangeCounter(game) +1, game); - game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource); + MageObjectReference objectReference = new MageObjectReference(card.getId(), card.getZoneChangeCounter(game) + 1, game); + game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource); targetPlayer.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, newSource.getSourceId(), false, true); Permanent permanent = game.getPermanent(card.getId()); if (permanent != null) { permanent.setManifested(true); - } + } } return true; } diff --git a/Mage/src/mage/cards/Cards.java b/Mage/src/mage/cards/Cards.java index fffc342824a..313f183d6ad 100644 --- a/Mage/src/mage/cards/Cards.java +++ b/Mage/src/mage/cards/Cards.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.cards; import java.io.Serializable; @@ -39,18 +38,33 @@ import mage.game.Game; public interface Cards extends Set, Serializable { void add(Card card); + Card get(UUID cardId, Game game); + void remove(Card card); + void setOwner(UUID ownerId, Game game); + void addAll(List createCards); + + void addAll(Set createCards); + Set getCards(Game game); + Set getCards(FilterCard filter, Game game); + Set getCards(FilterCard filter, UUID sourceId, UUID playerId, Game game); + String getValue(Game game); + Collection getUniqueCards(Game game); + Card getRandom(Game game); + int count(FilterCard filter, Game game); + int count(FilterCard filter, UUID playerId, Game game); + int count(FilterCard filter, UUID sourceId, UUID playerId, Game game); Cards copy(); diff --git a/Mage/src/mage/cards/CardsImpl.java b/Mage/src/mage/cards/CardsImpl.java index c06e6db5f9a..d7799289e23 100644 --- a/Mage/src/mage/cards/CardsImpl.java +++ b/Mage/src/mage/cards/CardsImpl.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.cards; import java.io.Serializable; @@ -44,20 +43,20 @@ import mage.filter.FilterCard; import mage.game.Game; import mage.util.ThreadLocalStringBuilder; - /** * * @author BetaSteward_at_googlemail.com */ public class CardsImpl extends LinkedHashSet implements Cards, Serializable { - + private static final transient ThreadLocalStringBuilder threadLocalBuilder = new ThreadLocalStringBuilder(200); private static Random rnd = new Random(); private UUID ownerId; private Zone zone; - public CardsImpl() { } + public CardsImpl() { + } public CardsImpl(Card card) { if (card != null) { @@ -74,10 +73,10 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl public CardsImpl(Zone zone) { this.zone = zone; } - + public CardsImpl(Zone zone, Collection cards) { this(zone); - for (Card card: cards) { + for (Card card : cards) { this.add(card.getId()); } } @@ -117,7 +116,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public void setOwner(UUID ownerId, Game game) { this.ownerId = ownerId; - for (UUID card: this) { + for (UUID card : this) { game.getCard(card).setOwnerId(ownerId); } } @@ -134,7 +133,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public int count(FilterCard filter, Game game) { int result = 0; - for (UUID cardId: this) { + for (UUID cardId : this) { if (filter.match(game.getCard(cardId), game)) { result++; } @@ -145,7 +144,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public int count(FilterCard filter, UUID playerId, Game game) { int result = 0; - for (UUID card: this) { + for (UUID card : this) { if (filter.match(game.getCard(card), playerId, game)) { result++; } @@ -159,7 +158,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl return count(filter, playerId, game); } int result = 0; - for (UUID card: this) { + for (UUID card : this) { if (filter.match(game.getCard(card), sourceId, playerId, game)) { result++; } @@ -170,7 +169,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public Set getCards(FilterCard filter, UUID sourceId, UUID playerId, Game game) { Set cards = new LinkedHashSet<>(); - for (UUID card: this) { + for (UUID card : this) { boolean match = filter.match(game.getCard(card), sourceId, playerId, game); if (match) { cards.add(game.getCard(card)); @@ -182,7 +181,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public Set getCards(FilterCard filter, Game game) { Set cards = new LinkedHashSet<>(); - for (UUID card: this) { + for (UUID card : this) { boolean match = filter.match(game.getCard(card), game); if (match) { cards.add(game.getCard(card)); @@ -194,11 +193,11 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public Set getCards(Game game) { Set cards = new LinkedHashSet<>(); - for (UUID cardId: this) { + for (UUID cardId : this) { Card card = game.getCard(cardId); if (card != null) { // this can happen during the cancelation (player concedes) of a game cards.add(card); - } + } } return cards; } @@ -207,12 +206,12 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl public String getValue(Game game) { StringBuilder sb = threadLocalBuilder.get(); List cards = new ArrayList<>(); - for (UUID cardId: this) { + for (UUID cardId : this) { Card card = game.getCard(cardId); cards.add(card.getName()); } Collections.sort(cards); - for (String name: cards) { + for (String name : cards) { sb.append(name).append(":"); } return sb.toString(); @@ -220,7 +219,14 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public void addAll(List cards) { - for (Card card: cards) { + for (Card card : cards) { + add(card.getId()); + } + } + + @Override + public void addAll(Set cards) { + for (Card card : cards) { add(card.getId()); } } @@ -228,7 +234,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public Collection getUniqueCards(Game game) { Map cards = new HashMap<>(); - for(UUID cardId: this) { + for (UUID cardId : this) { Card card = game.getCard(cardId); if (!cards.containsKey(card.getName())) { cards.put(card.getName(), card); diff --git a/Mage/src/mage/game/events/ZoneChangeGroupEvent.java b/Mage/src/mage/game/events/ZoneChangeGroupEvent.java index adb3e8cbc4b..fa36abb663e 100644 --- a/Mage/src/mage/game/events/ZoneChangeGroupEvent.java +++ b/Mage/src/mage/game/events/ZoneChangeGroupEvent.java @@ -1,33 +1,33 @@ /* -* 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. -*/ + * 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.game.events; -import java.util.List; +import java.util.Set; import java.util.UUID; import mage.cards.Card; import mage.constants.Zone; @@ -37,18 +37,18 @@ import mage.constants.Zone; * @author LevelX2 */ public class ZoneChangeGroupEvent extends GameEvent { - + private final Zone fromZone; private final Zone toZone; - private final List cards; + private final Set cards; - public ZoneChangeGroupEvent(List cards, UUID sourceId, UUID playerId, Zone fromZone, Zone toZone) { + public ZoneChangeGroupEvent(Set cards, UUID sourceId, UUID playerId, Zone fromZone, Zone toZone) { super(EventType.ZONE_CHANGE_GROUP, null, sourceId, playerId); this.fromZone = fromZone; this.toZone = toZone; this.cards = cards; - } - + } + public Zone getFromZone() { return fromZone; } @@ -57,7 +57,7 @@ public class ZoneChangeGroupEvent extends GameEvent { return toZone; } - public List getCards() { + public Set getCards() { return cards; } diff --git a/Mage/src/mage/players/Library.java b/Mage/src/mage/players/Library.java index 190d01782d8..ec7cfc1942a 100644 --- a/Mage/src/mage/players/Library.java +++ b/Mage/src/mage/players/Library.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.players; import java.io.Serializable; @@ -35,6 +34,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Deque; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -65,14 +65,13 @@ public class Library implements Serializable { public Library(final Library lib) { this.emptyDraw = lib.emptyDraw; this.playerId = lib.playerId; - for (UUID id: lib.library) { + for (UUID id : lib.library) { this.library.addLast(id); } } /** - * Don't use this directly. - * Use instead. + * Don't use this directly. Use instead. */ public void shuffle() { UUID[] shuffled = library.toArray(new UUID[0]); @@ -88,7 +87,7 @@ public class Library implements Serializable { /** * Removes the top card of the Library and returns it - * + * * @param game * @return Card * @see Card @@ -133,8 +132,7 @@ public class Library implements Serializable { if (card.getOwnerId().equals(playerId)) { card.setZone(Zone.LIBRARY, game); library.addFirst(card.getId()); - } - else { + } else { game.getPlayer(card.getOwnerId()).getLibrary().putOnTop(card, game); } } @@ -146,8 +144,7 @@ public class Library implements Serializable { library.remove(card.getId()); } library.add(card.getId()); - } - else { + } else { game.getPlayer(card.getOwnerId()).getLibrary().putOnBottom(card, game); } } @@ -166,7 +163,7 @@ public class Library implements Serializable { public void set(Library newLibrary) { library.clear(); - for (UUID card: newLibrary.getCardList()) { + for (UUID card : newLibrary.getCardList()) { library.add(card); } } @@ -177,17 +174,17 @@ public class Library implements Serializable { public List getCards(Game game) { List cards = new ArrayList<>(); - for (UUID cardId: library) { + for (UUID cardId : library) { cards.add(game.getCard(cardId)); } return cards; } - public List getTopCards(Game game, int amount) { - List cards = new ArrayList<>(); + public Set getTopCards(Game game, int amount) { + Set cards = new HashSet<>(); Iterator it = library.iterator(); int count = 0; - while(it.hasNext() && count < amount) { + while (it.hasNext() && count < amount) { UUID cardId = it.next(); Card card = game.getCard(cardId); if (card != null) { @@ -200,7 +197,7 @@ public class Library implements Serializable { public Collection getUniqueCards(Game game) { Map cards = new HashMap<>(); - for (UUID cardId: library) { + for (UUID cardId : library) { Card card = game.getCard(cardId); if (!cards.containsKey(card.getName())) { cards.put(card.getName(), card); @@ -211,7 +208,7 @@ public class Library implements Serializable { public int count(FilterCard filter, Game game) { int result = 0; - for (UUID card: library) { + for (UUID card : library) { if (filter.match(game.getCard(card), game)) { result++; } @@ -219,20 +216,19 @@ public class Library implements Serializable { return result; } - public boolean isEmptyDraw() { return emptyDraw; } public void addAll(Set cards, Game game) { - for (Card card: cards) { + for (Card card : cards) { card.setZone(Zone.LIBRARY, game); library.add(card.getId()); } } public Card getCard(UUID cardId, Game game) { - for (UUID card: library) { + for (UUID card : library) { if (card.equals(cardId)) { return game.getCard(card); } @@ -242,7 +238,7 @@ public class Library implements Serializable { public Card remove(UUID cardId, Game game) { Iterator it = library.iterator(); - while(it.hasNext()) { + while (it.hasNext()) { UUID card = it.next(); if (card.equals(cardId)) { it.remove(); diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index cf94a946082..88aa373b59c 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -626,9 +626,11 @@ public interface Player extends MageItem, Copyable { boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); - boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game); + boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game); - boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); + boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); + + boolean moveCardsToExile(Set cards, Ability source, Game game, boolean withName, UUID exileId, String exileZoneName); /** * Uses card.moveToZone and posts a inform message about moving the card @@ -637,7 +639,6 @@ public interface Player extends MageItem, Copyable { * @param card * @param sourceId * @param game - * @param fromZone if null, this info isn't postet * @return */ boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game); @@ -687,7 +688,7 @@ public interface Player extends MageItem, Copyable { * @param fromZone if null, this info isn't postet * @return */ - boolean moveCardsToGraveyardWithInfo(List cards, Ability source, Game game, Zone fromZone); + boolean moveCardsToGraveyardWithInfo(Set cards, Ability source, Game game, Zone fromZone); /** * Uses card.moveToZone and posts a inform message about moving the card to diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index cbe259f9655..b5b2029a92e 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -859,14 +859,16 @@ public abstract class PlayerImpl implements Player, Serializable { /** * Can be cards or permanents that go to library * - * @param cards + * @param cardsToLibrary * @param game * @param source * @param anyOrder * @return */ @Override - public boolean putCardsOnTopOfLibrary(Cards cards, Game game, Ability source, boolean anyOrder) { + public boolean putCardsOnTopOfLibrary(Cards cardsToLibrary, Game game, Ability source, boolean anyOrder) { + Cards cards = new CardsImpl(cardsToLibrary); // prevent possible ConcurrentModificationException + cards.addAll(cardsToLibrary); if (cards.size() != 0) { if (!anyOrder) { for (UUID cardId : cards) { @@ -2879,7 +2881,7 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { - ArrayList cardList = new ArrayList<>(); + Set cardList = new HashSet<>(); for (UUID cardId : cards) { if (fromZone == null) { fromZone = game.getState().getZone(cardId); @@ -2906,7 +2908,7 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { - ArrayList cardList = new ArrayList<>(); + Set cardList = new HashSet<>(); if (card != null) { cardList.add(card); } @@ -2914,12 +2916,12 @@ public abstract class PlayerImpl implements Player, Serializable { } @Override - public boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game) { + public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game) { return moveCards(cards, fromZone, toZone, source, game, true); } @Override - public boolean moveCards(List cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { + public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { if (cards.isEmpty()) { return true; } @@ -2960,6 +2962,20 @@ public abstract class PlayerImpl implements Player, Serializable { } } + @Override + public boolean moveCardsToExile(Set cards, Ability source, Game game, boolean withName, UUID exileId, String exileZoneName) { + if (cards.isEmpty()) { + return true; + } + game.fireEvent(new ZoneChangeGroupEvent(cards, source == null ? null : source.getSourceId(), this.getId(), null, Zone.EXILED)); + boolean result = false; + for (Card card : cards) { + Zone fromZone = game.getState().getZone(card.getId()); + result |= moveCardToExileWithInfo(card, exileId, exileZoneName, source == null ? null : source.getSourceId(), game, fromZone, withName); + } + return result; + } + @Override public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game) { return this.moveCardToHandWithInfo(card, sourceId, game, true); @@ -2974,7 +2990,7 @@ public abstract class PlayerImpl implements Player, Serializable { card = game.getCard(card.getId()); } if (!game.isSimulation()) { - StringBuilder sb = new StringBuilder(this.getLogName()).append(" puts ").append(withName ? card.getLogName() : "a face down card"); + StringBuilder sb = new StringBuilder(this.getLogName()).append(" puts ").append(withName ? card.getLogName() : (card.isFaceDown(game) ? "a face down card" : "a card")); switch (fromZone) { case EXILED: sb.append(" from exile zone "); @@ -2992,7 +3008,7 @@ public abstract class PlayerImpl implements Player, Serializable { } @Override - public boolean moveCardsToGraveyardWithInfo(List allCards, Ability source, Game game, Zone fromZone) { + public boolean moveCardsToGraveyardWithInfo(Set allCards, Ability source, Game game, Zone fromZone) { boolean result = true; UUID sourceId = source == null ? null : source.getSourceId(); while (!allCards.isEmpty()) { diff --git a/Mage/src/mage/target/common/TargetCardInLibrary.java b/Mage/src/mage/target/common/TargetCardInLibrary.java index 69221dc3d8e..5d6205e80d3 100644 --- a/Mage/src/mage/target/common/TargetCardInLibrary.java +++ b/Mage/src/mage/target/common/TargetCardInLibrary.java @@ -1,33 +1,33 @@ /* -* 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. -*/ - + * 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.target.common; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -42,7 +42,6 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; - /** * * @author BetaSteward_at_googlemail.com @@ -86,8 +85,7 @@ public class TargetCardInLibrary extends TargetCard { if (librarySearchLimit == Integer.MAX_VALUE) { cards = targetPlayer.getLibrary().getCards(game); } else { - int maxCards = Math.min(librarySearchLimit, targetPlayer.getLibrary().size()); - cards = targetPlayer.getLibrary().getTopCards(game, maxCards); + cards = new ArrayList<>(targetPlayer.getLibrary().getTopCards(game, librarySearchLimit)); } Collections.sort(cards, new CardNameComparator()); while (!isChosen() && !doneChosing()) { @@ -124,7 +122,6 @@ public class TargetCardInLibrary extends TargetCard { this.librarySearchLimit = librarySearchLimit; } - } class CardNameComparator implements Comparator { From 48195629c9715e678980197eea22917f1b36c60c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Aug 2015 17:50:47 +0200 Subject: [PATCH 288/375] * Some more rework of card mobement handling. --- Mage.Sets/src/mage/sets/tempest/Lobotomy.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/Mage.Sets/src/mage/sets/tempest/Lobotomy.java b/Mage.Sets/src/mage/sets/tempest/Lobotomy.java index 38c80b50163..f96e3c8b7bb 100644 --- a/Mage.Sets/src/mage/sets/tempest/Lobotomy.java +++ b/Mage.Sets/src/mage/sets/tempest/Lobotomy.java @@ -33,6 +33,8 @@ import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; 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; @@ -96,10 +98,10 @@ class LobotomyEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (targetPlayer != null && sourceObject != null && controller != null) { - - // reveal hand of target player + + // reveal hand of target player targetPlayer.revealCards(sourceObject.getName(), targetPlayer.getHand(), game); - + // You choose card other than a basic land card TargetCardInHand target = new TargetCardInHand(filter); target.setNotTarget(true); @@ -107,51 +109,53 @@ class LobotomyEffect extends OneShotEffect { if (controller.choose(Outcome.Benefit, targetPlayer.getHand(), target, game)) { chosenCard = game.getCard(target.getFirstTarget()); } - - + // Exile all cards with the same name // Building a card filter with the name FilterCard filterNamedCards = new FilterCard(); if (chosenCard != null) { - filterNamedCards.add(new NamePredicate(chosenCard.getName())); + filterNamedCards.add(new NamePredicate(chosenCard.getName())); } else { filterNamedCards.add(new NamePredicate("----")); // so no card matches } - + Cards cardsToExile = new CardsImpl(); // The cards you're searching for must be found and exiled if they're in the graveyard because it's a public zone. // Finding those cards in the hand and library is optional, because those zones are hidden (even if the hand is temporarily revealed). // search cards in graveyard if (chosenCard != null) { for (Card checkCard : targetPlayer.getGraveyard().getCards(game)) { if (checkCard.getName().equals(chosenCard.getName())) { - controller.moveCardToExileWithInfo(checkCard, null, "", source.getSourceId(), game, Zone.GRAVEYARD, true); + cardsToExile.add(checkCard); } } - // search cards in hand TargetCardInHand targetCardsHand = new TargetCardInHand(0, Integer.MAX_VALUE, filterNamedCards); controller.chooseTarget(outcome, targetPlayer.getGraveyard(), targetCardsHand, source, game); - for(UUID cardId: targetCardsHand.getTargets()) { + for (UUID cardId : targetCardsHand.getTargets()) { Card card = game.getCard(cardId); if (card != null) { - controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.HAND, true); + cardsToExile.add(card); } } - } + } // search cards in Library // If the player has no nonland cards in his or her hand, you can still search that player's library and have him or her shuffle it. if (chosenCard != null || controller.chooseUse(outcome, "Search library anyway?", source, game)) { TargetCardInLibrary targetCardsLibrary = new TargetCardInLibrary(0, Integer.MAX_VALUE, filterNamedCards); controller.searchLibrary(targetCardsLibrary, game, targetPlayer.getId()); - for(UUID cardId: targetCardsLibrary.getTargets()) { + for (UUID cardId : targetCardsLibrary.getTargets()) { Card card = game.getCard(cardId); if (card != null) { - controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); + cardsToExile.add(card); } } - targetPlayer.shuffleLibrary(game); + } + if (!cardsToExile.isEmpty()) { + controller.moveCards(cardsToExile, null, Zone.EXILED, source, game, true); + } + targetPlayer.shuffleLibrary(game); return true; } return false; From 7a90db7995de71905003751786858b7681a88f3e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 00:31:50 +0200 Subject: [PATCH 289/375] * Fixed sluggishness of player selection. Reworked flag display in avatar image. --- .../mage/client/components/HoverButton.java | 21 +++++++-- .../java/mage/client/game/PlayerPanelExt.java | 46 ++++++++++--------- .../mage/sets/newphyrexia/GitaxianProbe.java | 21 +++++---- 3 files changed, 52 insertions(+), 36 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/components/HoverButton.java b/Mage.Client/src/main/java/mage/client/components/HoverButton.java index d7998fe5041..f9baab84a83 100644 --- a/Mage.Client/src/main/java/mage/client/components/HoverButton.java +++ b/Mage.Client/src/main/java/mage/client/components/HoverButton.java @@ -20,6 +20,8 @@ import mage.client.util.Command; */ public class HoverButton extends JPanel implements MouseListener { + static final int TOP_TEXT_IMAGE_GAP = 3; + private Image image; private Image hoverImage; private Image disabledImage; @@ -36,6 +38,7 @@ public class HoverButton extends JPanel implements MouseListener { private Dimension overlayImageSize; private String topText; + private Image topTextImage; private boolean isHovered = false; private boolean isSelected = false; @@ -45,7 +48,7 @@ public class HoverButton extends JPanel implements MouseListener { private Command observer = null; private Command onHover = null; private Color textColor = Color.white; - private Color textBGColor = Color.black; + private final Color textBGColor = Color.black; static final Font textFont = new Font("Arial", Font.PLAIN, 12); static final Font textFontMini = new Font("Arial", Font.PLAIN, 11); @@ -120,9 +123,12 @@ public class HoverButton extends JPanel implements MouseListener { } topTextOffsetX = calculateOffsetForTop(g2d, topText); g2d.setColor(textBGColor); - g2d.drawString(topText, topTextOffsetX + 1, 13); + g2d.drawString(topText, topTextOffsetX + 1, 14); g2d.setColor(textColor); - g2d.drawString(topText, topTextOffsetX, 12); + g2d.drawString(topText, topTextOffsetX, 13); + } + if (topTextImage != null) { + g.drawImage(topTextImage, 4, 3, this); } if (overlayImage != null) { g.drawImage(overlayImage, (imageSize.width - overlayImageSize.width) / 2, 10, this); @@ -168,7 +174,9 @@ public class HoverButton extends JPanel implements MouseListener { if (topTextOffsetX == -1) { // calculate once FontRenderContext frc = g2d.getFontRenderContext(); int textWidth = (int) textFont.getStringBounds(text, frc).getWidth(); - topTextOffsetX = (imageSize.width - textWidth) / 2; + int neededImageWidth = (topTextImage == null ? 0 : topTextImage.getWidth(this)); + int availableXWidth = imageSize.width - neededImageWidth; + topTextOffsetX = (availableXWidth - textWidth) / 2 + neededImageWidth; } return topTextOffsetX; } @@ -284,6 +292,11 @@ public class HoverButton extends JPanel implements MouseListener { this.topText = topText; } + public void setTopTextImage(Image topTextImage) { + this.topTextImage = topTextImage; + this.textOffsetX = -1; // rest for new clculation + } + public void setTextAlwaysVisible(boolean textAlwaysVisible) { this.textAlwaysVisible = textAlwaysVisible; } diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java index 11a79b265b9..01ffad75880 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -36,7 +36,6 @@ package mage.client.game; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; -import java.awt.GridLayout; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.ActionEvent; @@ -105,7 +104,7 @@ public class PlayerPanelExt extends javax.swing.JPanel { private static final Border emptyBorder = BorderFactory.createEmptyBorder(0, 0, 0, 0); private int avatarId = -1; - private String flagName = ""; + private String flagName; private PriorityTimer timer; @@ -124,7 +123,7 @@ public class PlayerPanelExt extends javax.swing.JPanel { session = MageFrame.getSession(); cheat.setVisible(session.isTestMode()); cheat.setFocusable(false); - + flagName = null; if (priorityTime > 0) { long delay = 1000L; @@ -157,6 +156,25 @@ public class PlayerPanelExt extends javax.swing.JPanel { public void update(PlayerView player) { this.player = player; + if (flagName == null) { // do only once + avatar.setText(this.player.getName()); + if (!player.getUserData().getFlagName().equals(flagName)) { + flagName = player.getUserData().getFlagName(); + this.avatar.setTopTextImage(CountryUtil.getCountryFlagIcon(flagName).getImage()); + } + // TODO: Add the wins to the tooltiptext of the avatar + String countryname = CountryUtil.getCountryName(flagName); + if (countryname == null) { + countryname = "Unknown"; + } + String tooltip = "Name: " + player.getName() + "
Country: " + countryname; + avatar.setToolTipText(tooltip); + avatar.repaint(); + + // used if avatar image can't be used + this.btnPlayer.setText(player.getName()); + this.btnPlayer.setToolTipText(tooltip); + } int playerLife = player.getLife(); if (playerLife > 99) { Font font = lifeLabel.getFont(); @@ -235,16 +253,9 @@ public class PlayerPanelExt extends javax.swing.JPanel { Image image = ImageHelper.getImageFromResources(path); Rectangle r = new Rectangle(80, 80); BufferedImage resized = ImageHelper.getResizedImage(BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r); - this.avatar.update("player", resized, resized, resized, resized, r); - } - if (!player.getUserData().getFlagName().equals(flagName)) { - flagName = player.getUserData().getFlagName(); - this.avatarFlag.setIcon(CountryUtil.getCountryFlagIcon(flagName)); - this.avatarFlag.setToolTipText(CountryUtil.getCountryName(flagName)); - avatar.repaint(); + this.avatar.update(this.player.getName(), resized, resized, resized, resized, r); } } - this.avatar.setText(player.getName()); if (this.timer != null) { if (player.getPriorityTimeLeft() != Integer.MAX_VALUE) { String priorityTimeValue = getPriorityTimeLeftString(player); @@ -259,8 +270,6 @@ public class PlayerPanelExt extends javax.swing.JPanel { } } - this.btnPlayer.setText(player.getName()); - this.btnPlayer.setToolTipText("Life: " + player.getLife()); if (player.isActive()) { this.avatar.setBorder(greenBorder); this.btnPlayer.setBorder(greenBorder); @@ -324,15 +333,8 @@ public class PlayerPanelExt extends javax.swing.JPanel { Image image = ImageHelper.getImageFromResources(DEFAULT_AVATAR_PATH); BufferedImage resized = ImageHelper.getResizedImage(BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r); - avatar = new HoverButton("player", resized, resized, resized, r); - avatar.setLayout(new GridLayout(4, 1, 0, 0)); - avatar.add(new JLabel()); - avatar.add(new JLabel()); - avatar.add(avatarFlag); - avatar.setAlignTextLeft(true); - avatarFlag.setHorizontalAlignment(JLabel.LEFT); - avatarFlag.setVerticalAlignment(JLabel.BOTTOM); - avatar.add(new JLabel()); + avatar = new HoverButton("", resized, resized, resized, r); + String showPlayerNamePermanently = MageFrame.getPreferences().get(PreferencesDialog.KEY_SHOW_PLAYER_NAMES_PERMANENTLY, "true"); if (showPlayerNamePermanently.equals("true")) { avatar.setTextAlwaysVisible(true); diff --git a/Mage.Sets/src/mage/sets/newphyrexia/GitaxianProbe.java b/Mage.Sets/src/mage/sets/newphyrexia/GitaxianProbe.java index 1dd4bfe1c4f..bf3054706e8 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/GitaxianProbe.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/GitaxianProbe.java @@ -25,17 +25,17 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.newphyrexia; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; @@ -46,20 +46,19 @@ import mage.target.TargetPlayer; */ public class GitaxianProbe extends CardImpl { - public GitaxianProbe (UUID ownerId) { + public GitaxianProbe(UUID ownerId) { super(ownerId, 35, "Gitaxian Probe", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{UP}"); this.expansionSetCode = "NPH"; - // Look at target player's hand. this.getSpellAbility().addEffect(new GitaxianProbeEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); - + } - public GitaxianProbe (final GitaxianProbe card) { + public GitaxianProbe(final GitaxianProbe card) { super(card); } @@ -71,6 +70,7 @@ public class GitaxianProbe extends CardImpl { } class GitaxianProbeEffect extends OneShotEffect { + GitaxianProbeEffect() { super(Outcome.DrawCard); staticText = "Look at target player's hand"; @@ -84,8 +84,9 @@ class GitaxianProbeEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(targetPointer.getFirst(game, source)); - if (player != null && controller != null) { - controller.lookAtCards("Gitaxian Probe", player.getHand(), game); + MageObject sourceObject = source.getSourceObject(game); + if (player != null && controller != null && sourceObject != null) { + controller.lookAtCards(sourceObject.getIdName() + " (" + player.getName() + ")", player.getHand(), game); } return true; } From 9565b06c67b5e4f68cfe3229757c77087aa1e008 Mon Sep 17 00:00:00 2001 From: benjamin Date: Wed, 5 Aug 2015 19:35:28 -0400 Subject: [PATCH 290/375] Changed names of Historical and Super standard for consistency. --- .../Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java | 2 +- .../Mage.Deck.Constructed/src/mage/deck/SuperStandard.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java index 9fef3463b57..38c577f35ad 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java @@ -85,7 +85,7 @@ public class HistoricalStandard extends Constructed { * done in the overridden validate function. */ public HistoricalStandard() { - super("Constructed - Historical Standard"); + super("Variant Magic - Historical Standard"); // banned cards banned.add("Balance"); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java index 1f30667570f..f1fa0b0fa50 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java @@ -61,7 +61,7 @@ public class SuperStandard extends Constructed { * done in the overridden validate function. */ public SuperStandard() { - super("Constructed - All Standards"); + super("Variant Magic - Super Standard"); banned.add("Ancient Den"); banned.add("Disciple of the Vault"); From 2ee8fc62a36480c66c2d26d4ab05ed245fede8c3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 10:26:34 +0200 Subject: [PATCH 291/375] * Added Override. --- .../src/mage/sets/mirrodin/Override.java | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mirrodin/Override.java diff --git a/Mage.Sets/src/mage/sets/mirrodin/Override.java b/Mage.Sets/src/mage/sets/mirrodin/Override.java new file mode 100644 index 00000000000..396e4e59ae6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/Override.java @@ -0,0 +1,113 @@ +/* + * 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.mirrodin; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterArtifactPermanent; +import mage.game.Game; +import mage.game.stack.StackObject; +import mage.players.Player; +import mage.target.TargetSpell; + +/** + * + * @author LevelX2 + */ +public class Override extends CardImpl { + + public Override(UUID ownerId) { + super(ownerId, 45, "Override", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{U}"); + this.expansionSetCode = "MRD"; + + // Counter target spell unless its controller pays {1} for each artifact you control. + this.getSpellAbility().addEffect(new OverrideEffect()); + this.getSpellAbility().addTarget(new TargetSpell()); + } + + public Override(final Override card) { + super(card); + } + + @java.lang.Override + public Override copy() { + return new Override(this); + } +} + +class OverrideEffect extends OneShotEffect { + + public OverrideEffect() { + super(Outcome.Benefit); + } + + public OverrideEffect(final OverrideEffect effect) { + super(effect); + } + + @java.lang.Override + public OverrideEffect copy() { + return new OverrideEffect(this); + } + + @java.lang.Override + public boolean apply(Game game, Ability source) { + StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source)); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (sourceObject != null && spell != null) { + Player player = game.getPlayer(spell.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); + if (player != null && controller != null) { + int amount = game.getBattlefield().countAll(new FilterArtifactPermanent(), source.getControllerId(), game); + if (amount > 0) { + GenericManaCost cost = new GenericManaCost(amount); + if (!cost.pay(source, game, spell.getControllerId(), spell.getControllerId(), false)) { + game.informPlayers(sourceObject.getLogName() + ": cost wasn't payed - countering target spell."); + return game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game); + } + } + return true; + } + } + return false; + } + + @java.lang.Override + public String getText(Mode mode) { + return "Counter target spell unless its controller pays {1} for each artifact you control"; + } + +} From f6075b32cf39500be20b781878b3dd3fc18cde92 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 15:29:50 +0200 Subject: [PATCH 292/375] * Cube Draft/Sealed - Fixed that cards where taken from promo/special sets if they also did exist in Core or Expansion sets. --- .../mage/cards/repository/CardRepository.java | 22 +++++++++++++++++++ Mage/src/mage/game/draft/DraftCube.java | 11 +++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 997e68430ac..2f108bed587 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -44,7 +44,10 @@ import java.util.Random; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.Callable; +import mage.cards.ExpansionSet; +import mage.cards.Sets; import mage.constants.CardType; +import mage.constants.SetType; import org.apache.log4j.Logger; /** @@ -297,6 +300,25 @@ public enum CardRepository { return null; } + public CardInfo findPreferedCoreExpansionCard(String name) { + List cards = findCards(name); + if (!cards.isEmpty()) { + CardInfo cardInfo = cards.get(random.nextInt(cards.size())); + ExpansionSet set = Sets.getInstance().get(cardInfo.getSetCode()); + if (set.getSetType().equals(SetType.EXPANSION) || set.getSetType().equals(SetType.CORE)) { + return cardInfo; + } + for (CardInfo cardInfoToCheck : cards) { + set = Sets.getInstance().get(cardInfoToCheck.getSetCode()); + if (set.getSetType().equals(SetType.CORE) || set.getSetType().equals(SetType.EXPANSION)) { + return cardInfoToCheck; + } + } + return cardInfo; + } + return null; + } + public List findCards(String name) { try { QueryBuilder queryBuilder = cardDao.queryBuilder(); diff --git a/Mage/src/mage/game/draft/DraftCube.java b/Mage/src/mage/game/draft/DraftCube.java index 40f69ffcbbb..cb17656cca8 100644 --- a/Mage/src/mage/game/draft/DraftCube.java +++ b/Mage/src/mage/game/draft/DraftCube.java @@ -43,6 +43,7 @@ import org.apache.log4j.Logger; public abstract class DraftCube { public class CardIdentity { + private String name; private String extension; @@ -69,7 +70,7 @@ public abstract class DraftCube { } private static final Logger logger = Logger.getLogger(DraftCube.class); - + private static final Random rnd = new Random(); private final String name; private final int boosterSize = 15; @@ -88,13 +89,13 @@ public abstract class DraftCube { public List getCubeCards() { return cubeCards; } - + public List createBooster() { List booster = new ArrayList<>(); if (leftCubeCards.isEmpty()) { leftCubeCards.addAll(cubeCards); } - + for (int i = 0; i < boosterSize; i++) { boolean done = false; int notValid = 0; @@ -111,9 +112,9 @@ public abstract class DraftCube { cardInfo = cardList.get(0); } } else { - cardInfo = CardRepository.instance.findCard(cardId.getName()); + cardInfo = CardRepository.instance.findPreferedCoreExpansionCard(cardId.getName()); } - + if (cardInfo != null) { booster.add(cardInfo.getCard()); done = true; From aa67721804e1424b4d85363398a7b951d8d617b8 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 15:35:14 +0200 Subject: [PATCH 293/375] Changed config.xml according Historical/Super Standard Format. --- Mage.Server/config/config.xml | 48 +++++++++++++-------------- Mage.Server/release/config/config.xml | 4 +-- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index e28563936ef..41ae2e3bfff 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -1,16 +1,16 @@ - - + - + @@ -71,8 +71,8 @@ - - + + @@ -84,12 +84,12 @@ - + + + - - - + @@ -97,7 +97,7 @@ - + diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml index 93ccc1a86a3..a7e5eaa0a4d 100644 --- a/Mage.Server/release/config/config.xml +++ b/Mage.Server/release/config/config.xml @@ -64,11 +64,11 @@ + + - - From 0a341ea1eb64960450ad4e147769e1767f475cff Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 16:04:49 +0200 Subject: [PATCH 294/375] * Persecute - Fixed that the target player instead of the controller was able to choose the color. --- Mage.Sets/src/mage/sets/urzassaga/Persecute.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/urzassaga/Persecute.java b/Mage.Sets/src/mage/sets/urzassaga/Persecute.java index 6f24e8c027e..f5526bad35e 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Persecute.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Persecute.java @@ -87,7 +87,7 @@ class PersecuteEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getFirstTarget()); + Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (controller != null && sourceObject != null) { ChoiceColor choice = new ChoiceColor(); From b14c5d059b265afbb30dba8132f29a94a1e7fea4 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 16:21:42 +0200 Subject: [PATCH 295/375] * AnnihilatorAbility - Fixed that the sacrifice effect was handled targeted. --- .../abilities/keyword/AnnihilatorAbility.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java index ae721fa50cf..7a43a5711c8 100644 --- a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java +++ b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -79,7 +79,7 @@ public class AnnihilatorAbility extends TriggeredAbilityImpl { UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(sourceId, game); if (defendingPlayerId != null) { // the id has to be set here because the source can be leave battlefield - for(Effect effect : getEffects()) { + for (Effect effect : getEffects()) { effect.setValue("defendingPlayerId", defendingPlayerId); } return true; @@ -90,8 +90,8 @@ public class AnnihilatorAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Annihilator " + count + "(Whenever this creature attacks, defending player sacrifices " + - (count == 1 ? "a permanent": CardUtil.numberToText(count) + " permanents") + ".)"; + return "Annihilator " + count + "(Whenever this creature attacks, defending player sacrifices " + + (count == 1 ? "a permanent" : CardUtil.numberToText(count) + " permanents") + ".)"; } @Override @@ -121,17 +121,17 @@ class AnnihilatorEffect extends OneShotEffect { UUID defendingPlayerId = (UUID) getValue("defendingPlayerId"); Player player = null; if (defendingPlayerId != null) { - player= game.getPlayer(defendingPlayerId); + player = game.getPlayer(defendingPlayerId); } if (player != null) { int amount = Math.min(count, game.getBattlefield().countAll(filter, player.getId(), game)); - Target target = new TargetControlledPermanent(amount, amount, filter, false); + Target target = new TargetControlledPermanent(amount, amount, filter, true); if (target.canChoose(player.getId(), game)) { while (!target.isChosen() && target.canChoose(player.getId(), game) && player.canRespond()) { player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); } for (int idx = 0; idx < target.getTargets().size(); idx++) { - Permanent permanent = game.getPermanent((UUID) target.getTargets().get(idx)); + Permanent permanent = game.getPermanent(target.getTargets().get(idx)); if (permanent != null) { permanent.sacrifice(source.getSourceId(), game); } From e7ecdefce20531294ece126300c70f915b4d0382 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 16:22:52 +0200 Subject: [PATCH 296/375] Added example decks. --- ...4c Solar Flare TDtB ST Dec 2011.mwDeck.dck | 36 ++++++++++++++ .../Abzan Control TDtB ST Mar 2015.mwDeck.dck | 31 ++++++++++++ ...Abzan Midrange TDtB ST Apr 2015.mwDeck.dck | 29 +++++++++++ ...Abzan Midrange TDtB ST Dec 2014.mwDeck.dck | 44 +++++++++++++++++ ...Abzan Midrange TDtB ST Feb 2015.mwDeck.dck | 31 ++++++++++++ ...Abzan Midrange TDtB ST Jan 2015.mwDeck.dck | 27 +++++++++++ ...Abzan Midrange TDtB ST May 2015.mwDeck.dck | 27 +++++++++++ ...Abzan Midrange TDtB ST Nov 2014.mwDeck.dck | 39 +++++++++++++++ ...Abzan Midrange TDtB ST Oct 2014.mwDeck.dck | 33 +++++++++++++ .../Aristocrats TDtB ST Apr 2013.mwDeck.dck | 25 ++++++++++ .../Aristocrats TDtB ST Jun 2013.mwDeck.dck | 28 +++++++++++ .../Aristocrats TDtB ST May 2013.mwDeck.dck | 28 +++++++++++ ...Azorius Heroic TDtB ST Dec 2014.mwDeck.dck | 31 ++++++++++++ ...Azorius Heroic TDtB ST Feb 2015.mwDeck.dck | 25 ++++++++++ ...Azorius Heroic TDtB ST Jan 2015.mwDeck.dck | 24 ++++++++++ .../Azorius Human TDtB ST Oct 2012.mwDeck.dck | 26 ++++++++++ .../BR Vampires TDtB ST May 2011.mwDeck.dck | 28 +++++++++++ .../BR Zombies TDtB ST Aug 2012.mwDeck.dck | 25 ++++++++++ .../BR Zombies TDtB ST Dec 2012.mwDeck.dck | 22 +++++++++ .../BUG Control TDtB ST Feb 2011.mwDeck.dck | 27 +++++++++++ .../BW Tokens TDtB ST Feb 2012.mwDeck.dck | 24 ++++++++++ .../BWR Control TDtB ST Nov 2013.mwDeck.dck | 32 +++++++++++++ .../BWR Control TDtB ST Oct 2013.mwDeck.dck | 34 +++++++++++++ .../Bant Control TDtB ST Dec 2012.mwDeck.dck | 33 +++++++++++++ .../Bant Control TDtB ST Jan 2013.mwDeck.dck | 28 +++++++++++ .../Bant Control TDtB ST Nov 2012.mwDeck.dck | 28 +++++++++++ .../Bant Control TDtB ST Oct 2012.mwDeck.dck | 28 +++++++++++ .../Bant Hexproof TDtB ST Aug 2013.mwDeck.dck | 24 ++++++++++ .../Bant Hexproof TDtB ST Jan 2013.mwDeck.dck | 26 ++++++++++ .../Bant Hexproof TDtB ST Jul 2013.mwDeck.dck | 26 ++++++++++ .../Bant Hexproof TDtB ST Jun 2013.mwDeck.dck | 23 +++++++++ .../Bant Hexproof TDtB ST May 2013.mwDeck.dck | 23 +++++++++ ...Bant Megamorph TDtB ST May 2015.mwDeck.dck | 31 ++++++++++++ .../Bant Pod TDtB ST Nov 2011.mwDeck.dck | 36 ++++++++++++++ .../Bant Pod TDtB ST Oct 2011.mwDeck.dck | 40 ++++++++++++++++ .../Bg Zombie TDtB ST Oct 2012.mwDeck.dck | 23 +++++++++ .../Birthing Pod TDtB ST Dec 2011.mwDeck.dck | 31 ++++++++++++ .../Black Kessig TDtB ST Feb 2012.mwDeck.dck | 32 +++++++++++++ ...Bolt Caw-Blade TDtB ST Mar 2011.mwDeck.dck | 31 ++++++++++++ .../Boros Aggro TDtB ST Feb 2015.mwDeck.dck | 27 +++++++++++ .../Boros Aggro TDtB ST Jan 2014.mwDeck.dck | 24 ++++++++++ .../Boros Aggro TDtB ST Jul 2014.mwDeck.dck | 23 +++++++++ .../Boros Aggro TDtB ST Mar 2014.mwDeck.dck | 22 +++++++++ .../Boros Aggro TDtB ST Mar 2015.mwDeck.dck | 29 +++++++++++ .../Boros Burn TDtB ST Apr 2014.mwDeck.dck | 22 +++++++++ .../Boros Burn TDtB ST Dec 2013.mwDeck.dck | 21 ++++++++ .../Boros Burn TDtB ST Jun 2014.mwDeck.dck | 25 ++++++++++ .../Boros Burn TDtB ST May 2014.mwDeck.dck | 22 +++++++++ ...Boros Landfall TDtB ST Apr 2011.mwDeck.dck | 28 +++++++++++ ...Boros Landfall TDtB ST Feb 2011.mwDeck.dck | 28 +++++++++++ ...Boros Landfall TDtB ST Jun 2011.mwDeck.dck | 22 +++++++++ ...Boros Landfall TDtB ST Mar 2011.mwDeck.dck | 29 +++++++++++ ...Boros Midrange TDtB ST Jan 2015.mwDeck.dck | 24 ++++++++++ .../Br Vampires TDtB ST Dec 2010.mwDeck.dck | 22 +++++++++ .../Br Vampires TDtB ST Feb 2011.mwDeck.dck | 25 ++++++++++ .../Br Vampires TDtB ST Jul 2011.mwDeck.dck | 26 ++++++++++ .../Br Vampires TDtB ST Jun 2011.mwDeck.dck | 22 +++++++++ .../Br Vampires TDtB ST Mar 2011.mwDeck.dck | 24 ++++++++++ .../Br Vampires TDtB ST Sep 2011.mwDeck.dck | 30 ++++++++++++ .../Caw-Blade TDtB ST Apr 2011.mwDeck.dck | 32 +++++++++++++ .../Caw-Blade TDtB ST Aug 2011.mwDeck.dck | 29 +++++++++++ .../Caw-Blade TDtB ST Feb 2011.mwDeck.dck | 26 ++++++++++ .../Caw-Blade TDtB ST Jul 2011.mwDeck.dck | 28 +++++++++++ .../Caw-Blade TDtB ST Jun 2011.mwDeck.dck | 31 ++++++++++++ .../Caw-Blade TDtB ST Mar 2011.mwDeck.dck | 27 +++++++++++ .../Caw-Blade TDtB ST May 2011.mwDeck.dck | 25 ++++++++++ .../Caw-Blade TDtB ST Sep 2011.mwDeck.dck | 29 +++++++++++ ...ess UW Control TDtB ST Feb 2011.mwDeck.dck | 29 +++++++++++ .../Charmed TDtB ST Feb 2013.mwDeck.dck | 30 ++++++++++++ .../Cobra Valakut TDtB ST Apr 2011.mwDeck.dck | 22 +++++++++ .../Darkblade TDtB ST Jun 2011.mwDeck.dck | 31 ++++++++++++ .../Delver Blade TDtB ST Jan 2012.mwDeck.dck | 27 +++++++++++ ...otion to Black TDtB ST Apr 2014.mwDeck.dck | 21 ++++++++ ...otion to Black TDtB ST Dec 2013.mwDeck.dck | 21 ++++++++ ...otion to Black TDtB ST Feb 2014.mwDeck.dck | 19 ++++++++ ...otion to Black TDtB ST Jan 2014.mwDeck.dck | 20 ++++++++ ...otion to Black TDtB ST Jul 2014.mwDeck.dck | 23 +++++++++ ...otion to Black TDtB ST Jun 2014.mwDeck.dck | 19 ++++++++ ...otion to Black TDtB ST Nov 2013.mwDeck.dck | 17 +++++++ ...otion to Black TDtB ST Oct 2013.mwDeck.dck | 21 ++++++++ ...votion to Blue TDtB ST Apr 2014.mwDeck.dck | 23 +++++++++ ...votion to Blue TDtB ST Aug 2014.mwDeck.dck | 23 +++++++++ ...votion to Blue TDtB ST Dec 2013.mwDeck.dck | 23 +++++++++ ...votion to Blue TDtB ST Feb 2014.mwDeck.dck | 24 ++++++++++ ...votion to Blue TDtB ST Jan 2014.mwDeck.dck | 25 ++++++++++ ...votion to Blue TDtB ST Jul 2014.mwDeck.dck | 25 ++++++++++ ...votion to Blue TDtB ST Jun 2014.mwDeck.dck | 25 ++++++++++ ...votion to Blue TDtB ST Mar 2014.mwDeck.dck | 20 ++++++++ ...votion to Blue TDtB ST May 2014.mwDeck.dck | 25 ++++++++++ ...votion to Blue TDtB ST Nov 2013.mwDeck.dck | 25 ++++++++++ ...votion to Blue TDtB ST Oct 2013.mwDeck.dck | 22 +++++++++ ...otion to Boros TDtB ST Jan 2014.mwDeck.dck | 23 +++++++++ ...otion to Dimir TDtB ST Mar 2014.mwDeck.dck | 20 ++++++++ ...ion to Golgari TDtB ST Aug 2014.mwDeck.dck | 25 ++++++++++ ...ion to Golgari TDtB ST May 2014.mwDeck.dck | 25 ++++++++++ ...ion to Golgari TDtB ST Nov 2014.mwDeck.dck | 24 ++++++++++ ...otion to Green TDtB ST Aug 2014.mwDeck.dck | 22 +++++++++ ...otion to Green TDtB ST Feb 2015.mwDeck.dck | 23 +++++++++ ...otion to Green TDtB ST Oct 2013.mwDeck.dck | 25 ++++++++++ ...otion to Gruul TDtB ST Nov 2013.mwDeck.dck | 22 +++++++++ ...otion to Gruul TDtB ST Oct 2013.mwDeck.dck | 22 +++++++++ ...otion to Gruul TDtB ST Oct 2014.mwDeck.dck | 25 ++++++++++ ...on to Gruul(1) TDtB ST Dec 2013.mwDeck.dck | 22 +++++++++ ...on to Gruul(2) TDtB ST Dec 2013.mwDeck.dck | 22 +++++++++ ...evotion to Red TDtB ST Feb 2014.mwDeck.dck | 22 +++++++++ ...on to Selesnya TDtB ST Apr 2015.mwDeck.dck | 25 ++++++++++ ...on to Selesnya TDtB ST Mar 2015.mwDeck.dck | 27 +++++++++++ ...on to Selesnya TDtB ST May 2015.mwDeck.dck | 23 +++++++++ .../Domri Naya TDtB ST Aug 2013.mwDeck.dck | 31 ++++++++++++ ...zi Green-Black TDtB ST Dec 2010.mwDeck.dck | 25 ++++++++++ .../Elves TDtB ST Dec 2010.mwDeck.dck | 20 ++++++++ .../Elves TDtB ST Jul 2011.mwDeck.dck | 20 ++++++++ .../Esper Control TDtB ST Apr 2012.mwDeck.dck | 31 ++++++++++++ .../Esper Control TDtB ST Apr 2013.mwDeck.dck | 33 +++++++++++++ .../Esper Control TDtB ST Apr 2014.mwDeck.dck | 29 +++++++++++ .../Esper Control TDtB ST Dec 2012.mwDeck.dck | 37 ++++++++++++++ .../Esper Control TDtB ST Dec 2013.mwDeck.dck | 30 ++++++++++++ .../Esper Control TDtB ST Feb 2013.mwDeck.dck | 30 ++++++++++++ .../Esper Control TDtB ST Mar 2013.mwDeck.dck | 30 ++++++++++++ .../Esper Control TDtB ST Mar 2014.mwDeck.dck | 30 ++++++++++++ .../Esper Control TDtB ST May 2014.mwDeck.dck | 32 +++++++++++++ .../Esper Control TDtB ST May 2015.mwDeck.dck | 32 +++++++++++++ .../Esper Control TDtB ST Nov 2013.mwDeck.dck | 27 +++++++++++ .../Esper Control TDtB ST Oct 2013.mwDeck.dck | 27 +++++++++++ .../Esper Dragon TDtB ST Apr 2015.mwDeck.dck | 30 ++++++++++++ ...Esper Midrange TDtB ST Feb 2014.mwDeck.dck | 26 ++++++++++ ...Esper Midrange TDtB ST Jul 2012.mwDeck.dck | 32 +++++++++++++ .../FRites TDtB ST Feb 2012.mwDeck.dck | 26 ++++++++++ .../FRites TDtB ST Oct 2012.mwDeck.dck | 29 +++++++++++ .../Fauna Quest TDtB ST Feb 2011.mwDeck.dck | 26 ++++++++++ .../Fauna Quest TDtB ST Mar 2011.mwDeck.dck | 27 +++++++++++ .../GW Aggro TDtB ST Dec 2011.mwDeck.dck | 28 +++++++++++ .../GW Aggro TDtB ST Jan 2012.mwDeck.dck | 23 +++++++++ .../GW Aggro TDtB ST Nov 2011.mwDeck.dck | 24 ++++++++++ .../GW Token TDtB ST Oct 2011.mwDeck.dck | 22 +++++++++ .../GWb Tokens TDtB ST Oct 2012.mwDeck.dck | 31 ++++++++++++ ...lins Deck Wins TDtB ST Apr 2011.mwDeck.dck | 46 ++++++++++++++++++ ... Constellation TDtB ST Dec 2014.mwDeck.dck | 28 +++++++++++ ...olgari Control TDtB ST Aug 2013.mwDeck.dck | 32 +++++++++++++ .../Gr Aggro TDtB ST Apr 2012.mwDeck.dck | 29 +++++++++++ .../Gr Aggro TDtB ST Aug 2012.mwDeck.dck | 27 +++++++++++ .../Gr Aggro TDtB ST Feb 2012.mwDeck.dck | 25 ++++++++++ .../Gr Aggro TDtB ST Jul 2012.mwDeck.dck | 28 +++++++++++ .../Gr Aggro TDtB ST May 2012.mwDeck.dck | 28 +++++++++++ ...Grixis Control TDtB ST Jan 2012.mwDeck.dck | 33 +++++++++++++ ...rixis Tezzeret TDtB ST Feb 2011.mwDeck.dck | 31 ++++++++++++ ...is Twin Exarch TDtB ST May 2011.mwDeck.dck | 25 ++++++++++ .../Gruul Aggro TDtB ST Apr 2013.mwDeck.dck | 22 +++++++++ .../Gruul Aggro TDtB ST Feb 2013.mwDeck.dck | 20 ++++++++ .../Gruul Aggro TDtB ST Jul 2013.mwDeck.dck | 19 ++++++++ .../Gruul Aggro TDtB ST Jun 2013.mwDeck.dck | 23 +++++++++ .../Gruul Aggro TDtB ST Mar 2013.mwDeck.dck | 20 ++++++++ .../Gruul Aggro TDtB ST May 2013.mwDeck.dck | 18 +++++++ ...ruul Deck Wins TDtB ST Apr 2015.mwDeck.dck | 25 ++++++++++ ...ruul Deck Wins TDtB ST May 2015.mwDeck.dck | 25 ++++++++++ .../Gruul Dragons TDtB ST Apr 2015.mwDeck.dck | 25 ++++++++++ ...Gruul Midrange TDtB ST Aug 2013.mwDeck.dck | 21 ++++++++ ...Gruul Monsters TDtB ST Mar 2014.mwDeck.dck | 26 ++++++++++ .../Gruul Team TDtB ST Nov 2013.mwDeck.dck | 21 ++++++++ ...of there it is TDtB ST Nov 2012.mwDeck.dck | 22 +++++++++ ...man Reanimator TDtB ST Feb 2013.mwDeck.dck | 26 ++++++++++ ...man Reanimator TDtB ST Mar 2013.mwDeck.dck | 26 ++++++++++ .../Illusions TDtB ST Dec 2011.mwDeck.dck | 25 ++++++++++ .../Illusions TDtB ST Jan 2012.mwDeck.dck | 26 ++++++++++ .../Illusions TDtB ST Nov 2011.mwDeck.dck | 25 ++++++++++ ...kai Ascendancy TDtB ST Oct 2014.mwDeck.dck | 29 +++++++++++ ...eskai Midrange TDtB ST Feb 2015.mwDeck.dck | 29 +++++++++++ ...eskai Midrange TDtB ST Mar 2015.mwDeck.dck | 32 +++++++++++++ .../Jeskai Tempo TDtB ST Dec 2014.mwDeck.dck | 26 ++++++++++ .../Jeskai Tempo TDtB ST Nov 2014.mwDeck.dck | 29 +++++++++++ .../Jeskai Tempo TDtB ST Oct 2014.mwDeck.dck | 25 ++++++++++ .../Jeskai Token TDtB ST Jan 2015.mwDeck.dck | 28 +++++++++++ .../Jeskai Tokens TDtB ST Apr 2015.mwDeck.dck | 29 +++++++++++ .../Jund Aggro TDtB ST Apr 2014.mwDeck.dck | 28 +++++++++++ .../Jund Aggro TDtB ST Mar 2013.mwDeck.dck | 27 +++++++++++ .../Jund Control TDtB ST Apr 2013.mwDeck.dck | 35 ++++++++++++++ .../Jund Control TDtB ST Dec 2012.mwDeck.dck | 24 ++++++++++ .../Jund Control TDtB ST Feb 2013.mwDeck.dck | 32 +++++++++++++ .../Jund Control TDtB ST Jan 2013.mwDeck.dck | 29 +++++++++++ .../Jund Control TDtB ST Jul 2013.mwDeck.dck | 31 ++++++++++++ .../Jund Control TDtB ST May 2013.mwDeck.dck | 34 +++++++++++++ .../Jund Control TDtB ST Nov 2012.mwDeck.dck | 31 ++++++++++++ .../Jund Midrange TDtB ST Aug 2013.mwDeck.dck | 33 +++++++++++++ .../Jund Midrange TDtB ST Jun 2013.mwDeck.dck | 33 +++++++++++++ .../Jund Midrange TDtB ST Jun 2014.mwDeck.dck | 29 +++++++++++ .../Jund Midrange TDtB ST Mar 2013.mwDeck.dck | 32 +++++++++++++ .../Jund TDtB ST Aug 2014.mwDeck.dck | 26 ++++++++++ .../Jund TDtB ST Jul 2014.mwDeck.dck | 27 +++++++++++ .../Jund TDtB ST Mar 2014.mwDeck.dck | 29 +++++++++++ ...unk Reanimator TDtB ST Apr 2013.mwDeck.dck | 29 +++++++++++ ...unk Reanimator TDtB ST Jul 2013.mwDeck.dck | 30 ++++++++++++ ...unk Reanimator TDtB ST Jun 2013.mwDeck.dck | 27 +++++++++++ ...unk Reanimator TDtB ST Mar 2013.mwDeck.dck | 25 ++++++++++ ...unk Reanimator TDtB ST May 2013.mwDeck.dck | 29 +++++++++++ .../Junk TDtB ST Jul 2013.mwDeck.dck | 25 ++++++++++ .../Kessig Bant TDtB ST Feb 2013.mwDeck.dck | 31 ++++++++++++ .../Kessig Titan TDtB ST Apr 2012.mwDeck.dck | 28 +++++++++++ .../Kessig Titan TDtB ST Dec 2011.mwDeck.dck | 26 ++++++++++ .../Kessig Titan TDtB ST Feb 2012.mwDeck.dck | 28 +++++++++++ .../Kessig Titan TDtB ST Jan 2012.mwDeck.dck | 27 +++++++++++ .../Kessig Titan TDtB ST Jul 2012.mwDeck.dck | 28 +++++++++++ .../Kessig Titan TDtB ST May 2012.mwDeck.dck | 28 +++++++++++ .../Kessig Titan TDtB ST Nov 2011.mwDeck.dck | 26 ++++++++++ .../Kessig Titan TDtB ST Oct 2011.mwDeck.dck | 25 ++++++++++ .../Kessig U TDtB ST Aug 2012.mwDeck.dck | 28 +++++++++++ ...ilek Caw-Blade TDtB ST May 2011.mwDeck.dck | 28 +++++++++++ .../Kuldotha Red TDtB ST Feb 2011.mwDeck.dck | 20 ++++++++ .../Mardu Control TDtB ST Dec 2014.mwDeck.dck | 48 +++++++++++++++++++ .../Mardu Control TDtB ST Nov 2014.mwDeck.dck | 26 ++++++++++ ...Mardu Midrange TDtB ST Jan 2015.mwDeck.dck | 29 +++++++++++ ...Mardu Midrange TDtB ST Oct 2014.mwDeck.dck | 32 +++++++++++++ ...no Black Aggro TDtB ST Mar 2014.mwDeck.dck | 20 ++++++++ ... Black Control TDtB ST Aug 2012.mwDeck.dck | 26 ++++++++++ ... Black Control TDtB ST Jul 2011.mwDeck.dck | 18 +++++++ ...o Black Infect TDtB ST Oct 2011.mwDeck.dck | 24 ++++++++++ ...o Green Infect TDtB ST Aug 2012.mwDeck.dck | 22 +++++++++ .../Naya Aggro TDtB ST Apr 2014.mwDeck.dck | 23 +++++++++ .../Naya Aggro TDtB ST Dec 2012.mwDeck.dck | 23 +++++++++ .../Naya Aggro TDtB ST Oct 2013.mwDeck.dck | 33 +++++++++++++ .../Naya Aura TDtB ST Mar 2014.mwDeck.dck | 25 ++++++++++ .../Naya Aura TDtB ST May 2014.mwDeck.dck | 24 ++++++++++ .../Naya Blitz TDtB ST Mar 2013.mwDeck.dck | 24 ++++++++++ .../Naya Human TDtB ST Jun 2013.mwDeck.dck | 24 ++++++++++ .../Naya Human TDtB ST May 2013.mwDeck.dck | 25 ++++++++++ .../Naya Humans TDtB ST Jul 2012.mwDeck.dck | 26 ++++++++++ .../Naya Midrange TDtB ST Jul 2013.mwDeck.dck | 24 ++++++++++ .../Naya Pod TDtB ST Apr 2012.mwDeck.dck | 34 +++++++++++++ .../Naya Pod TDtB ST Aug 2012.mwDeck.dck | 34 +++++++++++++ .../Naya Pod TDtB ST Feb 2012.mwDeck.dck | 36 ++++++++++++++ .../Naya Pod TDtB ST May 2012.mwDeck.dck | 32 +++++++++++++ .../Naya Podlight TDtB ST Jul 2012.mwDeck.dck | 37 ++++++++++++++ .../Naya TDtB ST Jan 2013.mwDeck.dck | 28 +++++++++++ ...Orzhov Control TDtB ST Aug 2014.mwDeck.dck | 28 +++++++++++ ...Orzhov Control TDtB ST Feb 2014.mwDeck.dck | 24 ++++++++++ ...Orzhov Control TDtB ST Jan 2014.mwDeck.dck | 27 +++++++++++ ...Orzhov Control TDtB ST Jul 2014.mwDeck.dck | 30 ++++++++++++ ...Orzhov Control TDtB ST Mar 2014.mwDeck.dck | 27 +++++++++++ ...Orzhov Control TDtB ST May 2014.mwDeck.dck | 25 ++++++++++ ...rzhov Midrange TDtB ST Jan 2014.mwDeck.dck | 26 ++++++++++ ...rzhov Midrange TDtB ST Oct 2013.mwDeck.dck | 29 +++++++++++ ...triot Midrange TDtB ST May 2013.mwDeck.dck | 32 +++++++++++++ ...e Speaker Bant TDtB ST May 2013.mwDeck.dck | 32 +++++++++++++ .../Quest WW TDtB ST Dec 2010.mwDeck.dck | 18 +++++++ .../RUG Control TDtB ST Apr 2011.mwDeck.dck | 25 ++++++++++ .../RUG Control TDtB ST Dec 2010.mwDeck.dck | 24 ++++++++++ .../RUG Control TDtB ST Feb 2011.mwDeck.dck | 23 +++++++++ .../RUG Control TDtB ST Mar 2011.mwDeck.dck | 23 +++++++++ .../RUG Control TDtB ST Oct 2011.mwDeck.dck | 28 +++++++++++ ...UG Twin Exarch TDtB ST May 2011.mwDeck.dck | 24 ++++++++++ .../RUG Twin Pod TDtB ST Aug 2011.mwDeck.dck | 33 +++++++++++++ .../RUG Twin Pod TDtB ST Jul 2011.mwDeck.dck | 32 +++++++++++++ .../Rakdos Aggro TDtB ST Dec 2012.mwDeck.dck | 22 +++++++++ .../Rakdos Aggro TDtB ST Jan 2013.mwDeck.dck | 26 ++++++++++ .../Rakdos Aggro TDtB ST Nov 2012.mwDeck.dck | 24 ++++++++++ .../Reanimator TDtB ST Dec 2012.mwDeck.dck | 25 ++++++++++ .../Reanimator TDtB ST Jan 2013.mwDeck.dck | 28 +++++++++++ .../Red Deck Wins TDtB ST Apr 2014.mwDeck.dck | 19 ++++++++ .../Red Deck Wins TDtB ST Aug 2011.mwDeck.dck | 24 ++++++++++ .../Red Deck Wins TDtB ST Aug 2014.mwDeck.dck | 23 +++++++++ .../Red Deck Wins TDtB ST Dec 2010.mwDeck.dck | 20 ++++++++ .../Red Deck Wins TDtB ST Dec 2011.mwDeck.dck | 20 ++++++++ .../Red Deck Wins TDtB ST Dec 2013.mwDeck.dck | 16 +++++++ .../Red Deck Wins TDtB ST Dec 2014.mwDeck.dck | 19 ++++++++ .../Red Deck Wins TDtB ST Feb 2011.mwDeck.dck | 20 ++++++++ .../Red Deck Wins TDtB ST Feb 2013.mwDeck.dck | 16 +++++++ .../Red Deck Wins TDtB ST Jan 2012.mwDeck.dck | 20 ++++++++ .../Red Deck Wins TDtB ST Jan 2013.mwDeck.dck | 20 ++++++++ .../Red Deck Wins TDtB ST Jul 2011.mwDeck.dck | 20 ++++++++ .../Red Deck Wins TDtB ST Jun 2011.mwDeck.dck | 18 +++++++ .../Red Deck Wins TDtB ST Jun 2014.mwDeck.dck | 19 ++++++++ .../Red Deck Wins TDtB ST Mar 2015.mwDeck.dck | 18 +++++++ .../Red Deck Wins TDtB ST May 2011.mwDeck.dck | 20 ++++++++ .../Red Deck Wins TDtB ST Nov 2011.mwDeck.dck | 19 ++++++++ .../Red Deck Wins TDtB ST Nov 2012.mwDeck.dck | 21 ++++++++ .../Red Deck Wins TDtB ST Nov 2013.mwDeck.dck | 18 +++++++ .../Red Deck Wins TDtB ST Nov 2014.mwDeck.dck | 17 +++++++ .../Red Deck Wins TDtB ST Oct 2011.mwDeck.dck | 18 +++++++ .../Red Deck Wins TDtB ST Sep 2011.mwDeck.dck | 21 ++++++++ .../Saint WW TDtB ST Jan 2012.mwDeck.dck | 43 +++++++++++++++++ .../Saint WW TDtB ST Oct 2011.mwDeck.dck | 21 ++++++++ ... WW with Leaks TDtB ST Dec 2011.mwDeck.dck | 30 ++++++++++++ ... WW with Leaks TDtB ST Nov 2011.mwDeck.dck | 27 +++++++++++ .../Saito Naya TDtB ST Feb 2013.mwDeck.dck | 25 ++++++++++ ...Selesnya Aggro TDtB ST Aug 2014.mwDeck.dck | 22 +++++++++ ...Selesnya Aggro TDtB ST Jul 2014.mwDeck.dck | 25 ++++++++++ ...Selesnya Aggro TDtB ST May 2015.mwDeck.dck | 27 +++++++++++ ...Selesnya Aggro TDtB ST Nov 2012.mwDeck.dck | 27 +++++++++++ ...Selesnya Aggro TDtB ST Nov 2013.mwDeck.dck | 20 ++++++++ ...Selesnya Aggro TDtB ST Oct 2012.mwDeck.dck | 27 +++++++++++ ...Selesnya Aggro TDtB ST Oct 2013.mwDeck.dck | 22 +++++++++ .../Solar Flare TDtB ST Aug 2012.mwDeck.dck | 35 ++++++++++++++ .../Solar Flare TDtB ST May 2012.mwDeck.dck | 30 ++++++++++++ .../Solar Flare TDtB ST Nov 2011.mwDeck.dck | 30 ++++++++++++ .../Solar Flare TDtB ST Oct 2011.mwDeck.dck | 31 ++++++++++++ .../Spirit Delver TDtB ST Feb 2012.mwDeck.dck | 33 +++++++++++++ .../Sultai Whip TDtB ST Apr 2015.mwDeck.dck | 36 ++++++++++++++ .../Sultai Whip TDtB ST Dec 2014.mwDeck.dck | 30 ++++++++++++ .../Sultai Whip TDtB ST Feb 2015.mwDeck.dck | 30 ++++++++++++ .../Sultai Whip TDtB ST Jan 2015.mwDeck.dck | 35 ++++++++++++++ ...Tempered Steel TDtB ST Aug 2011.mwDeck.dck | 20 ++++++++ ...Tempered Steel TDtB ST Dec 2011.mwDeck.dck | 23 +++++++++ ...Tempered Steel TDtB ST Jan 2012.mwDeck.dck | 23 +++++++++ ...Tempered Steel TDtB ST Jul 2011.mwDeck.dck | 19 ++++++++ ...Tempered Steel TDtB ST May 2011.mwDeck.dck | 19 ++++++++ ...Tempered Steel TDtB ST Nov 2011.mwDeck.dck | 22 +++++++++ ...Tempered Steel TDtB ST Oct 2011.mwDeck.dck | 21 ++++++++ ...Tempered Steel TDtB ST Sep 2011.mwDeck.dck | 19 ++++++++ .../Temur Aggro TDtB ST Dec 2014.mwDeck.dck | 31 ++++++++++++ .../Temur Aggro TDtB ST Nov 2014.mwDeck.dck | 29 +++++++++++ .../Thalia WW TDtB ST Feb 2012.mwDeck.dck | 28 +++++++++++ ...he Aristocrats TDtB ST Feb 2013.mwDeck.dck | 28 +++++++++++ ...he Aristocrats TDtB ST Mar 2013.mwDeck.dck | 28 +++++++++++ .../Tokens TDtB ST Nov 2012.mwDeck.dck | 33 +++++++++++++ .../Torpor Tezz TDtB ST Jun 2011.mwDeck.dck | 30 ++++++++++++ ...ket UB Control TDtB ST Dec 2010.mwDeck.dck | 32 +++++++++++++ .../UB Control TDtB ST Apr 2011.mwDeck.dck | 32 +++++++++++++ .../UB Control TDtB ST Aug 2011.mwDeck.dck | 34 +++++++++++++ .../UB Control TDtB ST Feb 2011.mwDeck.dck | 32 +++++++++++++ .../UB Control TDtB ST Feb 2015.mwDeck.dck | 29 +++++++++++ .../UB Control TDtB ST Mar 2015.mwDeck.dck | 31 ++++++++++++ .../UB Control TDtB ST Oct 2011.mwDeck.dck | 27 +++++++++++ .../UB Control TDtB ST Sep 2011.mwDeck.dck | 30 ++++++++++++ .../UB Infect TDtB ST Apr 2011.mwDeck.dck | 25 ++++++++++ .../UB Zombi TDtB ST Feb 2012.mwDeck.dck | 18 +++++++ .../UG Fauna TDtB ST Dec 2010.mwDeck.dck | 24 ++++++++++ ...UR Exarch Twin TDtB ST Aug 2011.mwDeck.dck | 26 ++++++++++ .../UR ExarchTwin TDtB ST Jul 2011.mwDeck.dck | 24 ++++++++++ .../UR ExarchTwin TDtB ST Jun 2011.mwDeck.dck | 28 +++++++++++ .../UR ExarchTwin TDtB ST Sep 2011.mwDeck.dck | 24 ++++++++++ .../UR Snap-Burn TDtB ST Dec 2011.mwDeck.dck | 24 ++++++++++ .../UW Blade TDtB ST Oct 2011.mwDeck.dck | 28 +++++++++++ .../UW Control TDtB ST Aug 2014.mwDeck.dck | 32 +++++++++++++ .../UW Control TDtB ST Dec 2010.mwDeck.dck | 23 +++++++++ .../UW Control TDtB ST Dec 2013.mwDeck.dck | 25 ++++++++++ .../UW Control TDtB ST Feb 2014.mwDeck.dck | 22 +++++++++ .../UW Control TDtB ST Jan 2014.mwDeck.dck | 27 +++++++++++ .../UW Control TDtB ST Jul 2011.mwDeck.dck | 30 ++++++++++++ .../UW Control TDtB ST Jul 2014.mwDeck.dck | 27 +++++++++++ .../UW Control TDtB ST Jun 2014.mwDeck.dck | 27 +++++++++++ .../UW Control TDtB ST May 2014.mwDeck.dck | 30 ++++++++++++ .../UW Delver TDtB ST Apr 2012.mwDeck.dck | 29 +++++++++++ .../UW Delver TDtB ST Aug 2012.mwDeck.dck | 25 ++++++++++ .../UW Delver TDtB ST Feb 2012.mwDeck.dck | 28 +++++++++++ .../UW Delver TDtB ST Jul 2012.mwDeck.dck | 27 +++++++++++ .../UW Delver TDtB ST May 2012.mwDeck.dck | 30 ++++++++++++ .../UW Flash TDtB ST Jul 2013.mwDeck.dck | 29 +++++++++++ .../UW Human TDtB ST Apr 2012.mwDeck.dck | 20 ++++++++ .../UWR Midrange TDtB ST Nov 2012.mwDeck.dck | 30 ++++++++++++ .../UWr Control TDtB ST Oct 2012.mwDeck.dck | 26 ++++++++++ .../UWr Midrange TDtB ST Apr 2013.mwDeck.dck | 31 ++++++++++++ .../UWr Midrange TDtB ST Jan 2013.mwDeck.dck | 33 +++++++++++++ .../UWr Midrange TDtB ST Jun 2013.mwDeck.dck | 31 ++++++++++++ .../UWr Midrange TDtB ST Mar 2013.mwDeck.dck | 32 +++++++++++++ .../UWx Midrange TDtB ST Aug 2013.mwDeck.dck | 29 +++++++++++ .../UWx Midrange TDtB ST Dec 2012.mwDeck.dck | 22 +++++++++ .../Unsolar Flare TDtB ST Jan 2012.mwDeck.dck | 38 +++++++++++++++ .../Valakut Ramp TDtB ST Aug 2011.mwDeck.dck | 25 ++++++++++ .../Valakut Ramp TDtB ST Dec 2010.mwDeck.dck | 21 ++++++++ .../Valakut Ramp TDtB ST Feb 2011.mwDeck.dck | 21 ++++++++ .../Valakut Ramp TDtB ST Jul 2011.mwDeck.dck | 28 +++++++++++ .../Valakut Ramp TDtB ST Mar 2011.mwDeck.dck | 24 ++++++++++ .../Valakut Ramp TDtB ST May 2011.mwDeck.dck | 22 +++++++++ .../Valakut Ramp TDtB ST Sep 2011.mwDeck.dck | 24 ++++++++++ .../Vampires Br TDtB ST Aug 2011.mwDeck.dck | 26 ++++++++++ .../WR Humans TDtB ST May 2012.mwDeck.dck | 23 +++++++++ .../Weenie White TDtB ST Dec 2012.mwDeck.dck | 23 +++++++++ .../Zombie Pod TDtB ST Jul 2012.mwDeck.dck | 27 +++++++++++ .../Zombies G TDtB ST Nov 2012.mwDeck.dck | 21 ++++++++ .../Zombies TDtB ST Apr 2012.mwDeck.dck | 22 +++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 30 ++++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 31 ++++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 33 +++++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 28 +++++++++++ ...ionship 2004 (San Francisco) ST 9-5-04.dck | 37 ++++++++++++++ ...ionship 2004 (San Francisco) ST 9-5-04.dck | 37 ++++++++++++++ ...ionship 2004 (San Francisco) ST 9-5-04.dck | 27 +++++++++++ ...ionship 2004 (San Francisco) ST 9-5-04.dck | 31 ++++++++++++ .../BGW Angels 58 PT San Diego ST 2-21-10.dck | 31 ++++++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 31 ++++++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 32 +++++++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 25 ++++++++++ .../Boros Landfall 2 PT Paris ST 2-13-11.dck | 28 +++++++++++ .../Boros Landfall 34 PT Paris ST 2-13-11.dck | 27 +++++++++++ .../Boss Naya 34 PT San Diego ST 2-21-10.dck | 37 ++++++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 22 +++++++++ ...hampionship 2005 (Yokohama) ST 12-4-05.dck | 26 ++++++++++ ...hampionship 2005 (Yokohama) ST 12-4-05.dck | 24 ++++++++++ .../Dark Exalted 34 PT Kyoto ST 3-1-09.dck | 32 +++++++++++++ ...lack 58 PT Theros (Dublin) ST 10-13-13.dck | 21 ++++++++ ... Blue 1 PT Theros (Dublin) ST 10-13-13.dck | 22 +++++++++ ... Blue 2 PT Theros (Dublin) ST 10-13-13.dck | 22 +++++++++ ...Blue 34 PT Theros (Dublin) ST 10-13-13.dck | 21 ++++++++ ...reen 34 PT Theros (Dublin) ST 10-13-13.dck | 25 ++++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 21 ++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 25 ++++++++++ ... Red 58 PT Theros (Dublin) ST 10-13-13.dck | 21 ++++++++ .../Doran 58 PT Hollywood ST 5-25-08.dck | 28 +++++++++++ ...hampionship 2007 (New York) ST 12-6-07.dck | 32 +++++++++++++ ...d Championship 2006 (Paris) ST 12-3-06.dck | 28 +++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 24 ++++++++++ ...hampionship 2007 (New York) ST 12-6-07.dck | 30 ++++++++++++ ...hampionship 2007 (New York) ST 12-6-07.dck | 28 +++++++++++ ...hampionship 2005 (Yokohama) ST 12-4-05.dck | 29 +++++++++++ ... 34 PT Gatecrash (Montreal) ST 2-17-13.dck | 30 ++++++++++++ ...trol 58 PT Theros (Dublin) ST 10-13-13.dck | 27 +++++++++++ .../Faeries 58 PT Hollywood ST 5-25-08.dck | 23 +++++++++ .../Fauna Quest 58 PT Paris ST 2-13-11.dck | 26 ++++++++++ .../GB Elves 34 PT Hollywood ST 5-25-08.dck | 24 ++++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 24 ++++++++++ ...hampionship 2005 (Yokohama) ST 12-4-05.dck | 42 ++++++++++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 25 ++++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 25 ++++++++++ .../Heartbeat 58 PT Honolulu ST 3-5-06.dck | 27 +++++++++++ .../Izzetron 58 PT Honolulu ST 3-5-06.dck | 34 +++++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 29 +++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 28 +++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 25 ++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 25 ++++++++++ .../Jund 1 PT San Diego ST 2-21-10.dck | 25 ++++++++++ .../Jund 2 PT San Diego ST 2-21-10.dck | 27 +++++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 26 ++++++++++ ... 34 PT Magic 2015 (Portland) ST 8-3-14.dck | 32 +++++++++++++ ... 58 PT Magic 2015 (Portland) ST 8-3-14.dck | 32 +++++++++++++ .../Jund 58 PT San Diego ST 2-21-10.dck | 23 +++++++++ ... 58 PT Gatecrash (Montreal) ST 2-17-13.dck | 32 +++++++++++++ ... 58 PT Gatecrash (Montreal) ST 2-17-13.dck | 30 ++++++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 24 ++++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 25 ++++++++++ ... 58 PT Gatecrash (Montreal) ST 2-17-13.dck | 31 ++++++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 28 +++++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 26 ++++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 28 +++++++++++ ...hampionship 2008 (Memphis) ST 12-14-08.dck | 21 ++++++++ ...o Red Aggro 58 PT San Diego ST 2-21-10.dck | 22 +++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 23 +++++++++ .../Mystic Caw Go 1 PT Paris ST 2-13-11.dck | 26 ++++++++++ .../Mystic Caw Go 34 PT Paris ST 2-13-11.dck | 30 ++++++++++++ ...ystic Caw Go(1) 58 PT Paris ST 2-13-11.dck | 26 ++++++++++ ...ystic Caw Go(2) 58 PT Paris ST 2-13-11.dck | 27 +++++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 28 +++++++++++ ... 58 PT Magic 2015 (Portland) ST 8-3-14.dck | 25 ++++++++++ ...d Championship 2009 (Rome) ST 11-19-09.dck | 23 +++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 36 ++++++++++++++ ...en Filigree 58 PT San Diego ST 2-21-10.dck | 30 ++++++++++++ ... 34 PT Magic 2015 (Portland) ST 8-3-14.dck | 28 +++++++++++ ... 58 PT Magic 2015 (Portland) ST 8-3-14.dck | 28 +++++++++++ ...ange 58 PT Theros (Dublin) ST 10-13-13.dck | 29 +++++++++++ .../Owling Mine 34 PT Honolulu ST 3-5-06.dck | 25 ++++++++++ ...hampionship 2008 (Memphis) ST 12-14-08.dck | 32 +++++++++++++ ...hampionship 2008 (Memphis) ST 12-14-08.dck | 21 ++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 19 ++++++++ ...hampionship 2007 (New York) ST 12-6-07.dck | 31 ++++++++++++ ...hampionship 2007 (New York) ST 12-6-07.dck | 32 +++++++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 27 +++++++++++ ... 34 PT Gatecrash (Montreal) ST 2-17-13.dck | 25 ++++++++++ ...o 2 PT Magic 2015 (Portland) ST 8-3-14.dck | 20 ++++++++ ...w Mana Ramp 58 PT Hollywood ST 5-25-08.dck | 27 +++++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 22 +++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 22 +++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 22 +++++++++ ...nship 2011 (San Francisco) ST 11-20-11.dck | 22 +++++++++ ...ezzeret Control 58 PT Paris ST 2-13-11.dck | 31 ++++++++++++ ...s 1 PT Gatecrash (Montreal) ST 2-17-13.dck | 28 +++++++++++ ...Championship 2000 (Brussels) ST 8-6-00.dck | 27 +++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 29 +++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 31 ++++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 32 +++++++++++++ ...Khans of Tarkir (Honolulu) ST 10-12-14.dck | 30 ++++++++++++ ...hampionship 2005 (Yokohama) ST 12-4-05.dck | 29 +++++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 32 +++++++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 37 ++++++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 27 +++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 27 +++++++++++ ...ragons of Tarkir (Brussels) ST 4-12-15.dck | 35 ++++++++++++++ ...l 1 PT Magic 2015 (Portland) ST 8-3-14.dck | 27 +++++++++++ ... Championship 2010 (Chiba) ST 12-12-10.dck | 26 ++++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 28 +++++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 30 ++++++++++++ ...e 2 PT Gatecrash (Montreal) ST 2-17-13.dck | 30 ++++++++++++ ... 58 PT Gatecrash (Montreal) ST 2-17-13.dck | 31 ++++++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 33 +++++++++++++ ...T Dark Ascension (Honolulu) ST 2-12-12.dck | 33 +++++++++++++ ...d Championship 2006 (Paris) ST 12-3-06.dck | 30 ++++++++++++ .../WB Tokens 58 PT Kyoto ST 3-1-09.dck | 25 ++++++++++ .../WR Kithkins 58 PT Kyoto ST 3-1-09.dck | 21 ++++++++ .../WR Vengeant 34 PT Kyoto ST 3-1-09.dck | 26 ++++++++++ .../WR Vengeant 58 PT Kyoto ST 3-1-09.dck | 23 +++++++++ ...hite Weenie 34 PT San Diego ST 2-21-10.dck | 23 +++++++++ 488 files changed, 13042 insertions(+) create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/4c Solar Flare TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Control TDtB ST Mar 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Apr 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Feb 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Jan 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST May 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Nov 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Oct 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Apr 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Jun 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Feb 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Jan 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Azorius Human TDtB ST Oct 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/BR Vampires TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/BUG Control TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/BW Tokens TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Oct 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Aug 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jul 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jun 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Megamorph TDtB ST May 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bg Zombie TDtB ST Oct 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Birthing Pod TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Black Kessig TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Bolt Caw-Blade TDtB ST Mar 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Feb 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jan 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jul 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Apr 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Jun 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST May 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Apr 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Jun 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Mar 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Boros Midrange TDtB ST Jan 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jun 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Mar 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Sep 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Apr 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jun 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Mar 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Sep 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Cawless UW Control TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Charmed TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Cobra Valakut TDtB ST Apr 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Darkblade TDtB ST Jun 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Delver Blade TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Apr 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Feb 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jan 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jul 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jun 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Apr 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Feb 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jan 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jul 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jun 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST May 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Boros TDtB ST Jan 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Dimir TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST May 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Nov 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Feb 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(1) TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(2) TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Red TDtB ST Feb 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Apr 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Mar 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST May 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Domri Naya TDtB ST Aug 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Eldrazi Green-Black TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Dragon TDtB ST Apr 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Feb 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Jul 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Oct 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Mar 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/GW Token TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/GWb Tokens TDtB ST Oct 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Goblins Deck Wins TDtB ST Apr 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Golgari Constellation TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Golgari Control TDtB ST Aug 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Apr 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Jul 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST May 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Grixis Control TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Grixis Tezzeret TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Grixis Twin Exarch TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Apr 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jul 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jun 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST Apr 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST May 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Dragons TDtB ST Apr 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Midrange TDtB ST Aug 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Monsters TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Gruul Team TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Hoof there it is TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Ascendancy TDtB ST Oct 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Feb 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Mar 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Nov 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Oct 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Token TDtB ST Jan 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tokens TDtB ST Apr 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Apr 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Apr 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jul 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Aug 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Jul 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Apr 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jul 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jun 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Junk TDtB ST Jul 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Bant TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Apr 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jul 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST May 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kessig U TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kozilek Caw-Blade TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Kuldotha Red TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Nov 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Jan 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Oct 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mono Black Aggro TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mono Black Infect TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Mono Green Infect TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Apr 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST May 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Blitz TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST Jun 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Humans TDtB ST Jul 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Midrange TDtB ST Jul 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Apr 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST May 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya Podlight TDtB ST Jul 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Naya TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Feb 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jan 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jul 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Mar 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST May 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Jan 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Patriot Midrange TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Prime Speaker Bant TDtB ST May 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Quest WW TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Apr 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Mar 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Exarch TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Apr 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Mar 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Sep 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Saito Naya TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Jul 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST May 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST May 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Spirit Delver TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Apr 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Feb 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Jan 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Nov 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Sep 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Dec 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Nov 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Thalia WW TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Feb 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Tokens TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Torpor Tezz TDtB ST Jun 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Trinket UB Control TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Apr 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Mar 2015.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Sep 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Infect TDtB ST Apr 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UB Zombi TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UG Fauna TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UR Exarch Twin TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jun 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Sep 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UR Snap-Burn TDtB ST Dec 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Blade TDtB ST Oct 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Aug 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Feb 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jan 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jun 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST May 2014.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Apr 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Aug 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Feb 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Jul 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST May 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Flash TDtB ST Jul 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UW Human TDtB ST Apr 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWR Midrange TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWr Control TDtB ST Oct 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Apr 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jan 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jun 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Mar 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Aug 2013.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Unsolar Flare TDtB ST Jan 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Dec 2010.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Feb 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Jul 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Mar 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST May 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Sep 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Vampires Br TDtB ST Aug 2011.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/WR Humans TDtB ST May 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Weenie White TDtB ST Dec 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Zombie Pod TDtB ST Jul 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Zombies G TDtB ST Nov 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Decks to Beat/Zombies TDtB ST Apr 2012.mwDeck.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Control 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange 1 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(1) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(2) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(1) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(2) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 1 World Championship 2004 (San Francisco) ST 9-5-04.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 58 World Championship 2004 (San Francisco) ST 9-5-04.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/BGW Angels 58 PT San Diego ST 2-21-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bant 58 World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Black Kessig 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros 34 World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 2 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 34 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boss Naya 34 PT San Diego ST 2-21-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Br Vampires 58 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bug Critical 58 World Championship 2005 (Yokohama) ST 12-4-05.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Critical Mass 58 World Championship 2005 (Yokohama) ST 12-4-05.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dark Exalted 34 PT Kyoto ST 3-1-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Black 58 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 1 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 2 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 34 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Green 34 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Red 58 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran 58 PT Hollywood ST 5-25-08.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran Rock 1 World Championship 2007 (New York) ST 12-6-07.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dragonstorm 1 World Championship 2006 (Paris) ST 12-3-06.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Eldrazi Green 34 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(1) 58 World Championship 2007 (New York) ST 12-6-07.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(2) 58 World Championship 2007 (New York) ST 12-6-07.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Enduring Ideal 34 World Championship 2005 (Yokohama) ST 12-4-05.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 34 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 58 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Faeries 58 PT Hollywood ST 5-25-08.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Fauna Quest 58 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GB Elves 34 PT Hollywood ST 5-25-08.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GW Aggro 2 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Greater Gift 2 World Championship 2005 (Yokohama) ST 12-4-05.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Deck Wins 1 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Dragons 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Heartbeat 58 PT Honolulu ST 3-5-06.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Izzetron 58 PT Honolulu ST 3-5-06.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Ascendancy 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo 2 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(1) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(2) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 1 PT San Diego ST 2-21-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 PT San Diego ST 2-21-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 34 PT Magic 2015 (Portland) ST 8-3-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT Magic 2015 (Portland) ST 8-3-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT San Diego ST 2-21-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(1) 58 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(2) 58 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(1) 58 World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(2) 58 World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Bant 58 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 2 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kithkins 34 World Championship 2008 (Memphis) ST 12-14-08.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono Red Aggro 58 PT San Diego ST 2-21-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono W Tokens World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 1 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 34 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(1) 58 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(2) 58 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya 34 World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Aggro 58 PT Magic 2015 (Portland) ST 8-3-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Lightsaber 1 World Championship 2009 (Rome) ST 11-19-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Pod 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Open Filigree 58 PT San Diego ST 2-21-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 34 PT Magic 2015 (Portland) ST 8-3-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 58 PT Magic 2015 (Portland) ST 8-3-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Midrange 58 PT Theros (Dublin) ST 10-13-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Owling Mine 34 PT Honolulu ST 3-5-06.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Quick n Toast 2 World Championship 2008 (Memphis) ST 12-14-08.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/RB Sauce 34 World Championship 2008 (Memphis) ST 12-14-08.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Red Deck Wins 34 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(1) 58 World Championship 2007 (New York) ST 12-6-07.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(2) 58 World Championship 2007 (New York) ST 12-6-07.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saint WW with Leaks 58 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saito Naya 34 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Selesnya Aggro 2 PT Magic 2015 (Portland) ST 8-3-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Snow Mana Ramp 58 PT Hollywood ST 5-25-08.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel 34 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(1) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(2) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(3) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tezzeret Control 58 PT Paris ST 2-13-11.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/The Aristocrats 1 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Trinity 34 World Championship 2000 (Brussels) ST 8-6-00.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 1 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 2 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 34 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 World Championship 2005 (Yokohama) ST 12-4-05.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragon 2 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragonless 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(1) 58 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(2) 58 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UBw Control Dragon 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 1 PT Magic 2015 (Portland) ST 8-3-14.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 58 World Championship 2010 (Chiba) ST 12-12-10.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Human Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 2 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 58 PT Gatecrash (Montreal) ST 2-17-13.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWr Control 58 World Championship 2006 (Paris) ST 12-3-06.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WB Tokens 58 PT Kyoto ST 3-1-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Kithkins 58 PT Kyoto ST 3-1-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 34 PT Kyoto ST 3-1-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 58 PT Kyoto ST 3-1-09.dck create mode 100644 Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/White Weenie 34 PT San Diego ST 2-21-10.dck diff --git a/Mage.Client/release/sample-decks/Decks to Beat/4c Solar Flare TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/4c Solar Flare TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..2387cf5b127 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/4c Solar Flare TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,36 @@ +1 [M15:51] Dissipate +1 [UNH:138] Swamp +4 [UNH:137] Island +2 [UNH:136] Plains +2 [M12:73] Ponder +2 [M12:72] Phantasmal Image +4 [ISD:55] Forbidden Alchemy +1 [UNH:139] Mountain +3 [NPH:86] Gut Shot +4 [ISD:139] Desperate Ravings +3 [C14:91] Sun Titan +3 [M13:22] Oblivion Ring +1 [C14:298] Ghost Quarter +3 [M14:229] Shimmering Grotto +4 [ISD:248] Sulfur Falls +1 [ISD:122] Unburial Rites +4 [M12:63] Mana Leak +1 [NPH:9] Elesh Norn, Grand Cenobite +4 [SOM:229] Seachrome Coast +1 [M14:215] Ratchet Bomb +4 [M13:225] Glacial Fortress +3 [C14:264] Pristine Talisman +1 [M14:25] Pacifism +1 [SOM:224] Blackcleave Cliffs +1 [C13:32] Blue Sun's Zenith +1 [M12:12] Day of Judgment +SB: 2 [M12:40] Timely Reinforcements +SB: 1 [M15:51] Dissipate +SB: 2 [C13:249] Nihil Spellbomb +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [M12:72] Phantasmal Image +SB: 2 [ISD:127] Ancient Grudge +SB: 1 [C14:298] Ghost Quarter +SB: 1 [M12:12] Day of Judgment +SB: 1 [C13:32] Blue Sun's Zenith +SB: 3 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Control TDtB ST Mar 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Control TDtB ST Mar 2015.mwDeck.dck new file mode 100644 index 00000000000..f249e97c249 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Control TDtB ST Mar 2015.mwDeck.dck @@ -0,0 +1,31 @@ +4 [KTK:248] Windswept Heath +2 [M15:241] Caves of Koilos +3 [BNG:61] Bile Blight +1 [FRF:87] Tasigur, the Golden Fang +2 [UNH:136] Plains +4 [JOU:165] Temple of Malady +4 [KTK:161] Abzan Charm +4 [KTK:200] Siege Rhino +1 [M15:103] Liliana Vess +2 [C14:158] Read the Bones +4 [THS:107] Thoughtseize +4 [KTK:241] Sandsteppe Citadel +2 [KTK:8] End Hostilities +3 [THS:90] Hero's Downfall +1 [KTK:81] Murderous Cut +1 [M15:248] Urborg, Tomb of Yawgmoth +3 [THS:9] Elspeth, Sun's Champion +1 [FRF:1] Ugin, the Spirit Dragon +1 [KTK:210] Utter End +2 [UNH:140] Forest +3 [M15:244] Llanowar Wastes +4 [BNG:119] Courser of Kruphix +4 [THS:227] Temple of Silence +SB: 4 [THS:193] Fleecemane Lion +SB: 1 [FRF:87] Tasigur, the Golden Fang +SB: 1 [C14:158] Read the Bones +SB: 1 [KTK:9] Erase +SB: 2 [THS:15] Glare of Heresy +SB: 1 [M15:210] Garruk, Apex Predator +SB: 2 [KTK:202] Sorin, Solemn Visitor +SB: 3 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Apr 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Apr 2015.mwDeck.dck new file mode 100644 index 00000000000..31c07138b14 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Apr 2015.mwDeck.dck @@ -0,0 +1,29 @@ +4 [KTK:248] Windswept Heath +2 [M15:241] Caves of Koilos +2 [BNG:61] Bile Blight +2 [FRF:87] Tasigur, the Golden Fang +2 [UNH:136] Plains +4 [JOU:165] Temple of Malady +1 [DTK:221] Dromoka's Command +4 [KTK:161] Abzan Charm +4 [KTK:200] Siege Rhino +1 [KTK:202] Sorin, Solemn Visitor +4 [THS:193] Fleecemane Lion +1 [DTK:124] Ultimate Price +4 [THS:107] Thoughtseize +4 [KTK:241] Sandsteppe Citadel +4 [THS:90] Hero's Downfall +1 [M15:248] Urborg, Tomb of Yawgmoth +3 [THS:9] Elspeth, Sun's Champion +2 [UNH:140] Forest +3 [M15:244] Llanowar Wastes +4 [BNG:119] Courser of Kruphix +4 [THS:227] Temple of Silence +SB: 2 [C14:158] Read the Bones +SB: 1 [M15:187] Nissa, Worldwaker +SB: 1 [DTK:221] Dromoka's Command +SB: 2 [KTK:8] End Hostilities +SB: 1 [FRF:1] Ugin, the Spirit Dragon +SB: 3 [DTK:98] Duress +SB: 1 [KTK:202] Sorin, Solemn Visitor +SB: 4 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..0115fc7ca68 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,44 @@ +4 [KTK:248] Windswept Heath +1 [TPR:267] Forest +2 [JOU:165] Temple of Malady +1 [PLC:165] Urborg, Tomb of Yawgmoth +1 [JOU:5] Banishing Light +4 [KTK:200] Siege Rhino +2 [M15:34] Soul of Theros +2 [C14:191] Elvish Mystic +1 [FNMP:172] Banishing Light +1 [M11:233] Plains +1 [LRW:299] Forest +4 [KTK:241] Sandsteppe Citadel +1 [10E:355] Llanowar Wastes +1 [M15:178] Hornet Queen +1 [UNH:140] Forest +1 [APC:140] Caves of Koilos +1 [M15:173] Elvish Mystic +2 [BNG:136] Satyr Wayfinder +4 [BNG:119] Courser of Kruphix +1 [RAV:287] Plains +2 [THS:227] Temple of Silence +1 [APC:141] Llanowar Wastes +4 [KTK:31] Wingmate Roc +2 [M15:198] Satyr Wayfinder +2 [THS:155] Commune with the Gods +2 [THS:180] Sylvan Caryatid +1 [MBP:77] Sylvan Caryatid +2 [THS:110] Whip of Erebos +1 [FNMP:165] Elvish Mystic +3 [KTK:81] Murderous Cut +2 [CMD:159] Hornet Queen +2 [M15:244] Llanowar Wastes +SB: 1 [M15:194] Reclamation Sage +SB: 1 [PTC:80] Doomwake Giant +SB: 2 [LRW:145] Thoughtseize +SB: 1 [KTK:174] Duneblast +SB: 1 [M15:187] Nissa, Worldwaker +SB: 1 [THS:110] Whip of Erebos +SB: 2 [THS:15] Glare of Heresy +SB: 2 [KTK:8] End Hostilities +SB: 1 [JOU:66] Doomwake Giant +SB: 1 [C14:213] Reclamation Sage +SB: 1 [THS:101] Read the Bones +SB: 1 [MBP:103] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Feb 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Feb 2015.mwDeck.dck new file mode 100644 index 00000000000..06c3dfdfb0e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Feb 2015.mwDeck.dck @@ -0,0 +1,31 @@ +4 [KTK:248] Windswept Heath +3 [M15:241] Caves of Koilos +3 [BNG:61] Bile Blight +2 [FRF:87] Tasigur, the Golden Fang +4 [KTK:192] Rakshasa Deathdealer +2 [UNH:136] Plains +3 [JOU:165] Temple of Malady +1 [BNG:165] Temple of Plenty +3 [KTK:163] Anafenza, the Foremost +2 [KTK:161] Abzan Charm +4 [KTK:200] Siege Rhino +1 [KTK:202] Sorin, Solemn Visitor +4 [THS:193] Fleecemane Lion +2 [THS:107] Thoughtseize +4 [KTK:241] Sandsteppe Citadel +4 [THS:90] Hero's Downfall +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [UNH:140] Forest +3 [BNG:119] Courser of Kruphix +4 [M15:244] Llanowar Wastes +3 [KTK:31] Wingmate Roc +2 [THS:227] Temple of Silence +SB: 2 [FRF:143] Warden of the First Tree +SB: 1 [BNG:61] Bile Blight +SB: 1 [M15:187] Nissa, Worldwaker +SB: 1 [THS:107] Thoughtseize +SB: 3 [THS:15] Glare of Heresy +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 1 [BNG:119] Courser of Kruphix +SB: 4 [BNG:65] Drown in Sorrow +SB: 1 [KTK:202] Sorin, Solemn Visitor diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Jan 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Jan 2015.mwDeck.dck new file mode 100644 index 00000000000..92f4be60ebc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Jan 2015.mwDeck.dck @@ -0,0 +1,27 @@ +4 [KTK:248] Windswept Heath +2 [M15:241] Caves of Koilos +4 [BNG:61] Bile Blight +4 [KTK:192] Rakshasa Deathdealer +1 [JOU:163] Mana Confluence +1 [UNH:136] Plains +2 [JOU:165] Temple of Malady +4 [KTK:163] Anafenza, the Foremost +3 [KTK:161] Abzan Charm +4 [KTK:200] Siege Rhino +1 [KTK:202] Sorin, Solemn Visitor +4 [THS:193] Fleecemane Lion +4 [THS:107] Thoughtseize +4 [KTK:241] Sandsteppe Citadel +3 [THS:90] Hero's Downfall +2 [M15:248] Urborg, Tomb of Yawgmoth +2 [UNH:140] Forest +3 [M15:244] Llanowar Wastes +4 [KTK:31] Wingmate Roc +4 [THS:227] Temple of Silence +SB: 3 [M15:169] Back to Nature +SB: 3 [THS:15] Glare of Heresy +SB: 2 [JOU:145] Ajani, Mentor of Heroes +SB: 1 [KTK:81] Murderous Cut +SB: 2 [THS:9] Elspeth, Sun's Champion +SB: 3 [BNG:65] Drown in Sorrow +SB: 1 [KTK:202] Sorin, Solemn Visitor diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST May 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST May 2015.mwDeck.dck new file mode 100644 index 00000000000..d2096c453c4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST May 2015.mwDeck.dck @@ -0,0 +1,27 @@ +4 [KTK:248] Windswept Heath +3 [M15:241] Caves of Koilos +4 [KTK:192] Rakshasa Deathdealer +1 [JOU:163] Mana Confluence +2 [UNH:136] Plains +3 [JOU:165] Temple of Malady +3 [DTK:221] Dromoka's Command +4 [KTK:163] Anafenza, the Foremost +4 [KTK:161] Abzan Charm +4 [KTK:200] Siege Rhino +2 [KTK:202] Sorin, Solemn Visitor +2 [FRF:143] Warden of the First Tree +4 [THS:193] Fleecemane Lion +3 [THS:107] Thoughtseize +4 [KTK:241] Sandsteppe Citadel +2 [THS:90] Hero's Downfall +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [UNH:140] Forest +3 [M15:244] Llanowar Wastes +3 [THS:227] Temple of Silence +2 [KTK:31] Wingmate Roc +SB: 3 [DTK:124] Ultimate Price +SB: 1 [THS:107] Thoughtseize +SB: 3 [DTK:117] Self-Inflicted Wound +SB: 3 [DTK:181] Den Protector +SB: 2 [DTK:98] Duress +SB: 3 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Nov 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Nov 2014.mwDeck.dck new file mode 100644 index 00000000000..d21efee1f93 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Nov 2014.mwDeck.dck @@ -0,0 +1,39 @@ +2 [ONS:328] Windswept Heath +1 [KTK:248] Windswept Heath +2 [M15:241] Caves of Koilos +4 [JOU:165] Temple of Malady +1 [PLC:165] Urborg, Tomb of Yawgmoth +4 [KTK:161] Abzan Charm +4 [KTK:200] Siege Rhino +2 [KTK:202] Sorin, Solemn Visitor +2 [THS:107] Thoughtseize +1 [9ED:334] Plains +1 [ONS:347] Forest +1 [KTK:241] Sandsteppe Citadel +2 [KTK:8] End Hostilities +4 [THS:90] Hero's Downfall +2 [JOU:145] Ajani, Mentor of Heroes +3 [THS:9] Elspeth, Sun's Champion +1 [PTK:168] Plains +4 [BNG:119] Courser of Kruphix +3 [THS:227] Temple of Silence +1 [APC:141] Llanowar Wastes +2 [KTK:31] Wingmate Roc +1 [JR:46] Windswept Heath +1 [JOU:163] Mana Confluence +1 [BNG:165] Temple of Plenty +2 [LRW:145] Thoughtseize +1 [DDO:64] Forest +2 [9ED:322] Llanowar Wastes +4 [THS:180] Sylvan Caryatid +1 [ARC:150] Forest +SB: 1 [MBP:101] Liliana Vess +SB: 2 [M15:169] Back to Nature +SB: 1 [FNMP:171] Bile Blight +SB: 2 [BNG:61] Bile Blight +SB: 1 [C14:158] Read the Bones +SB: 1 [M15:187] Nissa, Worldwaker +SB: 1 [KTK:8] End Hostilities +SB: 2 [KTK:163] Anafenza, the Foremost +SB: 1 [MBP:103] Nissa, Worldwaker +SB: 3 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Oct 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Oct 2014.mwDeck.dck new file mode 100644 index 00000000000..a89c781067d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Abzan Midrange TDtB ST Oct 2014.mwDeck.dck @@ -0,0 +1,33 @@ +4 [KTK:248] Windswept Heath +2 [BNG:61] Bile Blight +1 [UNH:138] Swamp +1 [JOU:163] Mana Confluence +2 [UNH:136] Plains +1 [JOU:165] Temple of Malady +1 [BNG:165] Temple of Plenty +1 [KTK:163] Anafenza, the Foremost +3 [KTK:161] Abzan Charm +4 [KTK:200] Siege Rhino +1 [BNG:65] Drown in Sorrow +2 [KTK:202] Sorin, Solemn Visitor +4 [THS:180] Sylvan Caryatid +4 [THS:193] Fleecemane Lion +1 [THS:107] Thoughtseize +1 [THS:110] Whip of Erebos +4 [KTK:241] Sandsteppe Citadel +4 [THS:90] Hero's Downfall +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [UNH:140] Forest +4 [BNG:119] Courser of Kruphix +4 [M15:244] Llanowar Wastes +4 [KTK:31] Wingmate Roc +4 [THS:227] Temple of Silence +SB: 1 [M15:169] Back to Nature +SB: 3 [THS:107] Thoughtseize +SB: 1 [KTK:9] Erase +SB: 4 [KTK:8] End Hostilities +SB: 1 [KTK:163] Anafenza, the Foremost +SB: 2 [THS:9] Elspeth, Sun's Champion +SB: 1 [JOU:59] Agent of Erebos +SB: 1 [KTK:210] Utter End +SB: 1 [M15:117] Stain the Mind diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Apr 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Apr 2013.mwDeck.dck new file mode 100644 index 00000000000..8430324756a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Apr 2013.mwDeck.dck @@ -0,0 +1,25 @@ +4 [CNS:69] Doomed Traveler +2 [UNH:136] Plains +4 [RTR:238] Blood Crypt +4 [GTC:242] Godless Shrine +4 [GTC:150] Cartel Aristocrat +1 [ISD:238] Clifftop Retreat +4 [DKA:12] Lingering Souls +4 [ISD:242] Isolated Chapel +4 [GTC:245] Sacred Foundry +4 [C14:167] Tragic Slip +4 [M13:222] Dragonskull Summit +4 [C14:163] Skirsdag High Priest +4 [GTC:215] Boros Reckoner +3 [C14:172] Blasphemous Act +1 [DKA:142] Sorin, Lord of Innistrad +4 [DKA:138] Falkenrath Aristocrat +1 [C13:312] Orzhov Guildgate +4 [AVR:86] Blood Artist +SB: 3 [M14:97] Duress +SB: 1 [GTC:182] Obzedat, Ghost Council +SB: 1 [RTR:157] Dreadbore +SB: 3 [CNS:72] Intangible Virtue +SB: 1 [C14:172] Blasphemous Act +SB: 3 [DKA:142] Sorin, Lord of Innistrad +SB: 3 [C14:278] Tormod's Crypt diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Jun 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Jun 2013.mwDeck.dck new file mode 100644 index 00000000000..a0585c1f3fa --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST Jun 2013.mwDeck.dck @@ -0,0 +1,28 @@ +4 [CNS:69] Doomed Traveler +2 [UNH:136] Plains +4 [RTR:238] Blood Crypt +4 [GTC:242] Godless Shrine +4 [GTC:150] Cartel Aristocrat +1 [ISD:238] Clifftop Retreat +4 [DKA:12] Lingering Souls +4 [ISD:242] Isolated Chapel +4 [GTC:245] Sacred Foundry +4 [C14:167] Tragic Slip +4 [M13:222] Dragonskull Summit +2 [C14:163] Skirsdag High Priest +4 [GTC:215] Boros Reckoner +3 [C14:172] Blasphemous Act +2 [DKA:142] Sorin, Lord of Innistrad +4 [DKA:138] Falkenrath Aristocrat +1 [GTC:185] Orzhov Charm +1 [AVR:226] Cavern of Souls +4 [AVR:86] Blood Artist +SB: 2 [RTR:93] Electrickery +SB: 1 [M13:22] Oblivion Ring +SB: 2 [GTC:182] Obzedat, Ghost Council +SB: 1 [M14:97] Duress +SB: 2 [AVR:166] Zealous Conscripts +SB: 1 [C14:172] Blasphemous Act +SB: 3 [M13:141] Mark of Mutiny +SB: 2 [AVR:84] Appetite for Brains +SB: 1 [AVR:226] Cavern of Souls diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..3971eba7b95 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Aristocrats TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,28 @@ +4 [CNS:69] Doomed Traveler +2 [UNH:136] Plains +4 [RTR:238] Blood Crypt +4 [GTC:242] Godless Shrine +4 [GTC:150] Cartel Aristocrat +4 [DKA:12] Lingering Souls +4 [ISD:242] Isolated Chapel +4 [GTC:245] Sacred Foundry +4 [C14:167] Tragic Slip +4 [M13:222] Dragonskull Summit +3 [C14:163] Skirsdag High Priest +1 [DKA:158] Vault of the Archangel +4 [GTC:215] Boros Reckoner +3 [C14:172] Blasphemous Act +2 [DKA:142] Sorin, Lord of Innistrad +4 [DKA:138] Falkenrath Aristocrat +1 [AVR:226] Cavern of Souls +4 [AVR:86] Blood Artist +SB: 1 [GTC:142] Assemble the Legion +SB: 2 [RTR:93] Electrickery +SB: 1 [M14:97] Duress +SB: 2 [GTC:182] Obzedat, Ghost Council +SB: 1 [RTR:197] Slaughter Games +SB: 1 [AVR:166] Zealous Conscripts +SB: 3 [RTR:157] Dreadbore +SB: 1 [CNS:72] Intangible Virtue +SB: 1 [DKA:142] Sorin, Lord of Innistrad +SB: 2 [M13:141] Mark of Mutiny diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..685feb5db07 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,31 @@ +1 [THS:39] Aqueous Form +4 [THS:58] Ordeal of Thassa +1 [JOU:163] Mana Confluence +3 [UNH:137] Island +2 [KTK:246] Tranquil Cove +4 [KTK:233] Flooded Strand +8 [UNH:136] Plains +1 [KTK:56] Stubborn Denial +4 [THS:189] Battlewise Hoplite +1 [JOU:2] Ajani's Presence +4 [BNG:163] Temple of Enlightenment +4 [BNG:17] Hero of Iroas +2 [BNG:52] Stratus Walk +4 [M15:14] Heliod's Pilgrim +4 [KTK:7] Defiant Strike +1 [KTK:10] Feat of Resistance +1 [THS:25] Ordeal of Heliod +4 [THS:13] Favored Hoplite +4 [THS:16] Gods Willing +3 [KTK:22] Seeker of the Way +SB: 1 [THS:39] Aqueous Form +SB: 1 [JOU:17] Mortal Obstinacy +SB: 1 [KTK:59] Treasure Cruise +SB: 2 [JOU:14] Lagonna-Band Trailblazer +SB: 3 [KTK:56] Stubborn Denial +SB: 1 [KTK:9] Erase +SB: 2 [BNG:5] Brimaz, King of Oreskos +SB: 1 [THS:15] Glare of Heresy +SB: 1 [KTK:36] Dig Through Time +SB: 1 [THS:71] Triton Tactics +SB: 1 [JOU:2] Ajani's Presence diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Feb 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Feb 2015.mwDeck.dck new file mode 100644 index 00000000000..310e00fc7be --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Feb 2015.mwDeck.dck @@ -0,0 +1,25 @@ +2 [THS:39] Aqueous Form +4 [THS:58] Ordeal of Thassa +3 [UNH:137] Island +3 [JOU:163] Mana Confluence +4 [KTK:233] Flooded Strand +6 [UNH:136] Plains +4 [THS:189] Battlewise Hoplite +3 [JOU:2] Ajani's Presence +4 [BNG:163] Temple of Enlightenment +4 [BNG:17] Hero of Iroas +2 [BNG:52] Stratus Walk +2 [JOU:14] Lagonna-Band Trailblazer +4 [KTK:7] Defiant Strike +1 [KTK:10] Feat of Resistance +3 [THS:25] Ordeal of Heliod +1 [THS:71] Triton Tactics +4 [THS:13] Favored Hoplite +4 [THS:16] Gods Willing +2 [KTK:22] Seeker of the Way +SB: 2 [KTK:59] Treasure Cruise +SB: 3 [KTK:56] Stubborn Denial +SB: 1 [KTK:9] Erase +SB: 3 [KTK:37] Disdainful Stroke +SB: 4 [THS:15] Glare of Heresy +SB: 2 [KTK:22] Seeker of the Way diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Jan 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Jan 2015.mwDeck.dck new file mode 100644 index 00000000000..642aa77eb24 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Heroic TDtB ST Jan 2015.mwDeck.dck @@ -0,0 +1,24 @@ +2 [THS:39] Aqueous Form +4 [THS:58] Ordeal of Thassa +6 [UNH:137] Island +4 [KTK:246] Tranquil Cove +10 [UNH:136] Plains +1 [KTK:56] Stubborn Denial +4 [THS:189] Battlewise Hoplite +2 [BNG:163] Temple of Enlightenment +4 [BNG:17] Hero of Iroas +4 [M15:14] Heliod's Pilgrim +4 [KTK:7] Defiant Strike +2 [KTK:10] Feat of Resistance +2 [THS:25] Ordeal of Heliod +1 [THS:71] Triton Tactics +4 [THS:13] Favored Hoplite +4 [THS:16] Gods Willing +2 [KTK:22] Seeker of the Way +SB: 2 [KTK:59] Treasure Cruise +SB: 3 [KTK:56] Stubborn Denial +SB: 2 [KTK:9] Erase +SB: 3 [THS:15] Glare of Heresy +SB: 1 [THS:19] Hopeful Eidolon +SB: 2 [JOU:2] Ajani's Presence +SB: 2 [BNG:7] Eidolon of Countless Battles diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Azorius Human TDtB ST Oct 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Human TDtB ST Oct 2012.mwDeck.dck new file mode 100644 index 00000000000..5f605bde9fe --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Azorius Human TDtB ST Oct 2012.mwDeck.dck @@ -0,0 +1,26 @@ +2 [DKA:7] Faith's Shield +1 [UNH:137] Island +9 [UNH:136] Plains +4 [C14:88] Silverblade Paladin +4 [ISD:213] Geist of Saint Traft +4 [M13:36] Sublime Archangel +2 [RTR:179] Lyev Skyknight +4 [M13:38] War Falcon +3 [DKA:24] Thalia, Guardian of Thraben +4 [RTR:17] Precinct Captain +1 [M14:1] Ajani, Caller of the Pride +4 [ISD:6] Champion of the Parish +4 [M13:21] Knight of Glory +4 [M13:225] Glacial Fortress +1 [ISD:14] Feeling of Dread +1 [ISD:13] Elite Inquisitor +4 [AVR:226] Cavern of Souls +4 [RTR:241] Hallowed Fountain +SB: 3 [RTR:214] Dryad Militant +SB: 3 [M15:71] Negate +SB: 2 [RTR:155] Detention Sphere +SB: 2 [AVR:33] Riders of Gavony +SB: 1 [ISD:14] Feeling of Dread +SB: 2 [C13:11] Fiend Hunter +SB: 1 [DKA:24] Thalia, Guardian of Thraben +SB: 1 [M13:39] War Priest of Thune diff --git a/Mage.Client/release/sample-decks/Decks to Beat/BR Vampires TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/BR Vampires TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..1e5e302ef67 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/BR Vampires TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,28 @@ +2 [MBS:43] Go for the Throat +2 [MBS:66] Hero of Oxid Ridge +2 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +1 [M11:90] Dark Tutelage +2 [ZEN:229] Verdant Catacombs +2 [C14:168] Vampire Hexmage +1 [ZEN:119] Burst Lightning +3 [ZEN:219] Marsh Flats +4 [WWK:62] Pulse Tracker +4 [ZEN:115] Vampire Lacerator +1 [M14:96] Doom Blade +4 [SOM:224] Blackcleave Cliffs +2 [SOM:81] Arc Trail +4 [WWK:59] Kalastria Highborn +6 [UNH:138] Swamp +SB: 1 [M11:90] Dark Tutelage +SB: 2 [M12:151] Manic Vandal +SB: 3 [M13:141] Mark of Mutiny +SB: 1 [C14:168] Vampire Hexmage +SB: 3 [M11:92] Demon of Death's Gate +SB: 2 [SOM:78] Skinrender +SB: 1 [M14:96] Doom Blade +SB: 2 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..1e99a5d8faf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,25 @@ +2 [MBS:43] Go for the Throat +4 [AVR:86] Blood Artist +3 [CNS:138] Brimstone Volley +4 [M13:222] Dragonskull Summit +4 [ISD:97] Diregraf Ghoul +3 [C14:167] Tragic Slip +2 [NPH:42] Phyrexian Metamorph +3 [DKA:138] Falkenrath Aristocrat +3 [AVR:226] Cavern of Souls +4 [DKA:63] Geralf's Messenger +2 [SOM:63] Fume Spitter +4 [DKA:64] Gravecrawler +4 [C14:161] Sign in Blood +2 [MBS:115] Mortarpod +4 [SOM:224] Blackcleave Cliffs +12 [UNH:138] Swamp +SB: 2 [NPH:61] Geth's Verdict +SB: 2 [M14:156] Smelt +SB: 1 [NPH:74] Surgical Extraction +SB: 1 [NPH:42] Phyrexian Metamorph +SB: 2 [AVR:149] Pillar of Flame +SB: 2 [SOM:81] Arc Trail +SB: 2 [C13:249] Nihil Spellbomb +SB: 1 [M12:94] Distress +SB: 2 [KTK:69] Despise diff --git a/Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..0392fffa64d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/BR Zombies TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,22 @@ +4 [AVR:86] Blood Artist +3 [M13:147] Searing Spear +4 [M13:222] Dragonskull Summit +4 [C13:314] Rakdos Guildgate +2 [M13:141] Mark of Mutiny +4 [ISD:97] Diregraf Ghoul +4 [RTR:220] Rakdos Cackler +4 [RTR:238] Blood Crypt +4 [DKA:138] Falkenrath Aristocrat +1 [AVR:226] Cavern of Souls +4 [AVR:149] Pillar of Flame +4 [DKA:63] Geralf's Messenger +1 [M14:139] Flames of the Firebrand +4 [M13:96] Knight of Infamy +4 [DKA:64] Gravecrawler +9 [UNH:138] Swamp +SB: 1 [M13:141] Mark of Mutiny +SB: 3 [C13:97] Vampire Nighthawk +SB: 2 [M14:139] Flames of the Firebrand +SB: 3 [RTR:213] Deathrite Shaman +SB: 3 [M15:92] Crippling Blight +SB: 3 [RTR:184] Rakdos Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/BUG Control TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/BUG Control TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..8c38fc526f8 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/BUG Control TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,27 @@ +1 [MBS:43] Go for the Throat +1 [SOM:69] Memoricide +4 [WWK:134] Creeping Tar Pit +6 [UNH:140] Forest +2 [WWK:137] Halimar Depths +4 [ZEN:220] Misty Rainforest +3 [ZEN:172] Oracle of Mul Daya +1 [C13:135] Avenger of Zendikar +4 [ZEN:229] Verdant Catacombs +4 [M11:70] Preordain +2 [C14:112] Frost Titan +3 [C14:145] Grave Titan +4 [ZEN:168] Lotus Cobra +2 [ZEN:87] Disfigure +4 [WWK:99] Explore +3 [SOM:226] Darkslick Shores +4 [WWK:31] Jace, the Mind Sculptor +2 [UNH:137] Island +2 [UNH:138] Swamp +4 [M12:63] Mana Leak +SB: 1 [MBS:43] Go for the Throat +SB: 2 [C14:136] Black Sun's Zenith +SB: 3 [SOM:69] Memoricide +SB: 2 [SOM:194] Precursor Golem +SB: 2 [ZEN:87] Disfigure +SB: 3 [M14:116] Shrivel +SB: 2 [M11:188] Obstinate Baloth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/BW Tokens TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/BW Tokens TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..58171def5da --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/BW Tokens TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,24 @@ +1 [SOM:6] Elspeth Tirel +2 [NPH:161] Sword of War and Peace +3 [DKA:158] Vault of the Archangel +4 [ISD:242] Isolated Chapel +4 [CNS:72] Intangible Virtue +1 [M14:229] Shimmering Grotto +4 [C14:80] Midnight Haunting +4 [DKA:12] Lingering Souls +3 [M13:22] Oblivion Ring +4 [M12:23] Honor of the Pure +13 [UNH:136] Plains +2 [DKA:142] Sorin, Lord of Innistrad +4 [ISD:6] Champion of the Parish +4 [DKA:8] Gather the Townsfolk +3 [UNH:138] Swamp +4 [CNS:69] Doomed Traveler +SB: 1 [MBS:43] Go for the Throat +SB: 1 [MBS:5] Divine Offering +SB: 2 [NPH:74] Surgical Extraction +SB: 3 [M12:3] Angelic Destiny +SB: 2 [BNG:25] Revoke Existence +SB: 1 [M14:96] Doom Blade +SB: 4 [MBS:8] Hero of Bladehold +SB: 1 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..41690e95a55 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,32 @@ +2 [RTR:82] Ultimate Price +2 [THS:110] Whip of Erebos +2 [RTR:73] Pack Rat +2 [RTR:63] Desecration Demon +4 [GTC:215] Boros Reckoner +3 [THS:112] Anger of the Gods +4 [THS:227] Temple of Silence +4 [THS:228] Temple of Triumph +2 [THS:107] Thoughtseize +1 [UNH:139] Mountain +2 [RTR:157] Dreadbore +2 [RTR:101] Mizzium Mortars +1 [RTR:232] Rakdos Keyrune +1 [RTR:188] Rakdos's Return +2 [GTC:182] Obzedat, Ghost Council +4 [RTR:238] Blood Crypt +4 [THS:90] Hero's Downfall +1 [M14:96] Doom Blade +4 [GTC:245] Sacred Foundry +2 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +3 [UNH:138] Swamp +2 [GTC:142] Assemble the Legion +SB: 2 [RTR:157] Dreadbore +SB: 2 [THS:15] Glare of Heresy +SB: 2 [DGM:57] Blood Baron of Vizkopa +SB: 1 [RTR:231] Pithing Needle +SB: 1 [THS:112] Anger of the Gods +SB: 3 [M14:97] Duress +SB: 2 [DGM:135] Wear // Tear +SB: 2 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..9ffe3a9b39e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/BWR Control TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,34 @@ +1 [THS:110] Whip of Erebos +4 [GTC:215] Boros Reckoner +4 [RTR:63] Desecration Demon +3 [THS:112] Anger of the Gods +4 [THS:227] Temple of Silence +3 [THS:228] Temple of Triumph +2 [THS:107] Thoughtseize +1 [C13:314] Rakdos Guildgate +3 [UNH:139] Mountain +2 [RTR:157] Dreadbore +2 [C14:158] Read the Bones +2 [RTR:232] Rakdos Keyrune +2 [THS:4] Chained to the Rocks +2 [RTR:188] Rakdos's Return +2 [DGM:57] Blood Baron of Vizkopa +2 [GTC:182] Obzedat, Ghost Council +4 [RTR:238] Blood Crypt +2 [THS:90] Hero's Downfall +1 [M14:96] Doom Blade +3 [DGM:116] Warleader's Helix +4 [GTC:245] Sacred Foundry +4 [GTC:242] Godless Shrine +1 [THS:9] Elspeth, Sun's Champion +2 [UNH:138] Swamp +SB: 1 [M15:134] Chandra, Pyromaster +SB: 1 [RTR:101] Mizzium Mortars +SB: 3 [M14:155] Shock +SB: 2 [RTR:83] Underworld Connections +SB: 1 [RTR:188] Rakdos's Return +SB: 1 [THS:15] Glare of Heresy +SB: 1 [M14:101] Lifebane Zombie +SB: 1 [THS:112] Anger of the Gods +SB: 2 [THS:107] Thoughtseize +SB: 2 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..5c48e826754 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,33 @@ +3 [RTR:145] Azorius Charm +2 [ISD:245] Nephalia Drownyard +2 [RTR:243] Overgrown Tomb +4 [M15:51] Dissipate +1 [RTR:155] Detention Sphere +4 [M13:170] Farseek +2 [UNH:137] Island +3 [RTR:248] Temple Garden +1 [AVR:32] Restoration Angel +4 [M13:193] Thragtusk +1 [AVR:43] Amass the Components +4 [RTR:200] Sphinx's Revelation +3 [RTR:201] Supreme Verdict +4 [ISD:241] Hinterland Harbor +4 [ISD:83] Think Twice +1 [RTR:18] Rest in Peace +4 [M13:225] Glacial Fortress +1 [AVR:38] Terminus +3 [C13:30] Augur of Bolas +4 [M13:229] Sunpetal Grove +1 [AVR:225] Alchemist's Refuge +4 [RTR:241] Hallowed Fountain +SB: 1 [RTR:231] Pithing Needle +SB: 2 [M15:71] Negate +SB: 1 [RTR:145] Azorius Charm +SB: 1 [RTR:155] Detention Sphere +SB: 1 [AVR:32] Restoration Angel +SB: 2 [RTR:36] Dispel +SB: 2 [M13:29] Rhox Faithmender +SB: 2 [AVR:38] Terminus +SB: 1 [C14:214] Silklash Spider +SB: 1 [M14:60] Jace, Memory Adept +SB: 1 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..22c946ebd8c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,28 @@ +4 [RTR:145] Azorius Charm +2 [ISD:245] Nephalia Drownyard +2 [RTR:44] Jace, Architect of Thought +2 [RTR:243] Overgrown Tomb +3 [M15:51] Dissipate +2 [RTR:155] Detention Sphere +4 [M13:170] Farseek +2 [UNH:137] Island +4 [RTR:248] Temple Garden +1 [AVR:32] Restoration Angel +4 [M13:193] Thragtusk +3 [RTR:200] Sphinx's Revelation +4 [RTR:201] Supreme Verdict +4 [ISD:241] Hinterland Harbor +4 [ISD:83] Think Twice +4 [M13:225] Glacial Fortress +2 [C13:30] Augur of Bolas +1 [AVR:79] Tamiyo, the Moon Sage +3 [M13:229] Sunpetal Grove +1 [AVR:225] Alchemist's Refuge +4 [RTR:241] Hallowed Fountain +SB: 1 [RTR:231] Pithing Needle +SB: 3 [M15:71] Negate +SB: 1 [RTR:36] Dispel +SB: 3 [AVR:38] Terminus +SB: 3 [M13:29] Rhox Faithmender +SB: 2 [M14:60] Jace, Memory Adept +SB: 2 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..a65e81c9139 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,28 @@ +4 [RTR:145] Azorius Charm +3 [RTR:44] Jace, Architect of Thought +4 [M15:51] Dissipate +3 [RTR:155] Detention Sphere +4 [M13:170] Farseek +1 [UNH:137] Island +4 [RTR:248] Temple Garden +2 [UNH:136] Plains +4 [M13:193] Thragtusk +4 [RTR:200] Sphinx's Revelation +4 [RTR:201] Supreme Verdict +4 [ISD:241] Hinterland Harbor +4 [M13:225] Glacial Fortress +1 [AVR:38] Terminus +1 [M14:209] Elixir of Immortality +1 [M13:217] Staff of Nin +4 [M13:229] Sunpetal Grove +1 [UNH:140] Forest +1 [RTR:54] Syncopate +2 [AVR:226] Cavern of Souls +4 [RTR:241] Hallowed Fountain +SB: 2 [M15:71] Negate +SB: 1 [DKA:17] Ray of Revelation +SB: 3 [AVR:32] Restoration Angel +SB: 4 [RTR:148] Centaur Healer +SB: 2 [RTR:36] Dispel +SB: 2 [M13:176] Ground Seal +SB: 1 [AVR:79] Tamiyo, the Moon Sage diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Oct 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Oct 2012.mwDeck.dck new file mode 100644 index 00000000000..05033f59ce5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Control TDtB ST Oct 2012.mwDeck.dck @@ -0,0 +1,28 @@ +2 [RTR:1] Angel of Serenity +4 [RTR:145] Azorius Charm +3 [RTR:155] Detention Sphere +2 [UNH:137] Island +4 [RTR:248] Temple Garden +4 [AVR:32] Restoration Angel +4 [M13:193] Thragtusk +3 [UNH:136] Plains +4 [RTR:178] Loxodon Smiter +2 [C14:104] Cyclonic Rift +4 [ISD:241] Hinterland Harbor +1 [ISD:181] Garruk Relentless +1 [C13:236] Azorius Keyrune +3 [M13:225] Glacial Fortress +3 [AVR:38] Terminus +2 [AVR:79] Tamiyo, the Moon Sage +4 [M13:229] Sunpetal Grove +2 [C13:42] Dungeon Geists +1 [UNH:140] Forest +3 [RTR:54] Syncopate +4 [RTR:241] Hallowed Fountain +SB: 3 [M13:21] Knight of Glory +SB: 1 [RTR:206] Trostani, Selesnya's Voice +SB: 2 [RTR:44] Jace, Architect of Thought +SB: 2 [RTR:201] Supreme Verdict +SB: 4 [ISD:213] Geist of Saint Traft +SB: 1 [C13:42] Dungeon Geists +SB: 2 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Aug 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Aug 2013.mwDeck.dck new file mode 100644 index 00000000000..e4bb3c1bdf7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Aug 2013.mwDeck.dck @@ -0,0 +1,24 @@ +4 [ISD:79] Spectral Flight +4 [RTR:248] Temple Garden +4 [M13:185] Rancor +4 [RTR:9] Ethereal Armor +1 [C14:88] Silverblade Paladin +4 [ISD:213] Geist of Saint Traft +4 [GTC:240] Breeding Pool +4 [M14:176] Gladecover Scout +4 [ISD:60] Invisible Stalker +1 [C13:211] Selesnya Charm +4 [ISD:241] Hinterland Harbor +4 [ISD:170] Avacyn's Pilgrim +1 [DKA:120] Increasing Savagery +1 [GTC:195] Simic Charm +2 [M13:225] Glacial Fortress +4 [DGM:111] Unflinching Courage +4 [M13:229] Sunpetal Grove +2 [M14:18] Fiendslayer Paladin +4 [RTR:241] Hallowed Fountain +SB: 2 [DGM:44] Mending Touch +SB: 2 [M14:171] Fog +SB: 4 [DGM:114] Voice of Resurgence +SB: 4 [DGM:51] Advent of the Wurm +SB: 3 [GTC:52] Spell Rupture diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..e6a926ac049 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,26 @@ +4 [ISD:79] Spectral Flight +1 [UNH:137] Island +4 [RTR:248] Temple Garden +4 [M13:185] Rancor +4 [RTR:9] Ethereal Armor +3 [C14:88] Silverblade Paladin +4 [ISD:213] Geist of Saint Traft +4 [ISD:60] Invisible Stalker +4 [C13:211] Selesnya Charm +4 [ISD:241] Hinterland Harbor +4 [ISD:170] Avacyn's Pilgrim +2 [DKA:120] Increasing Savagery +4 [AVR:167] Abundant Growth +1 [M13:225] Glacial Fortress +2 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +3 [AVR:226] Cavern of Souls +4 [RTR:241] Hallowed Fountain +SB: 1 [M15:71] Negate +SB: 1 [RTR:19] Rootborn Defenses +SB: 3 [AVR:31] Nearheath Pilgrim +SB: 1 [ISD:3] Angelic Overseer +SB: 2 [RTR:178] Loxodon Smiter +SB: 2 [ISD:14] Feeling of Dread +SB: 2 [ISD:25] Nevermore +SB: 3 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jul 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jul 2013.mwDeck.dck new file mode 100644 index 00000000000..78a7517faec --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jul 2013.mwDeck.dck @@ -0,0 +1,26 @@ +4 [ISD:79] Spectral Flight +4 [RTR:248] Temple Garden +4 [M13:185] Rancor +4 [RTR:9] Ethereal Armor +4 [ISD:213] Geist of Saint Traft +4 [GTC:240] Breeding Pool +4 [RTR:178] Loxodon Smiter +4 [ISD:60] Invisible Stalker +2 [C13:211] Selesnya Charm +4 [ISD:241] Hinterland Harbor +4 [ISD:170] Avacyn's Pilgrim +4 [DGM:114] Voice of Resurgence +2 [M13:225] Glacial Fortress +4 [DGM:111] Unflinching Courage +3 [M13:229] Sunpetal Grove +1 [UNH:140] Forest +4 [RTR:241] Hallowed Fountain +SB: 1 [RTR:19] Rootborn Defenses +SB: 2 [AVR:31] Nearheath Pilgrim +SB: 2 [GTC:219] Gift of Orzhova +SB: 1 [AVR:32] Restoration Angel +SB: 2 [M13:29] Rhox Faithmender +SB: 2 [GTC:212] Beckon Apparition +SB: 2 [M14:25] Pacifism +SB: 1 [ISD:25] Nevermore +SB: 2 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jun 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jun 2013.mwDeck.dck new file mode 100644 index 00000000000..c94fac6cf39 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST Jun 2013.mwDeck.dck @@ -0,0 +1,23 @@ +4 [ISD:79] Spectral Flight +4 [RTR:248] Temple Garden +4 [M13:185] Rancor +4 [RTR:9] Ethereal Armor +4 [ISD:213] Geist of Saint Traft +4 [GTC:240] Breeding Pool +4 [ISD:60] Invisible Stalker +4 [C13:211] Selesnya Charm +4 [ISD:241] Hinterland Harbor +2 [M14:1] Ajani, Caller of the Pride +3 [ISD:170] Avacyn's Pilgrim +4 [DGM:114] Voice of Resurgence +4 [DGM:111] Unflinching Courage +4 [M13:229] Sunpetal Grove +1 [UNH:140] Forest +2 [DKA:127] Strangleroot Geist +4 [RTR:241] Hallowed Fountain +SB: 1 [RTR:145] Azorius Charm +SB: 3 [RTR:19] Rootborn Defenses +SB: 4 [RTR:148] Centaur Healer +SB: 4 [DGM:51] Advent of the Wurm +SB: 2 [AVR:210] Sigarda, Host of Herons +SB: 1 [UNH:140] Forest diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..febb10bcb40 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Hexproof TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,23 @@ +4 [ISD:79] Spectral Flight +4 [RTR:248] Temple Garden +4 [M13:185] Rancor +4 [RTR:9] Ethereal Armor +4 [RTR:11] Fencing Ace +4 [ISD:213] Geist of Saint Traft +4 [GTC:240] Breeding Pool +4 [ISD:60] Invisible Stalker +4 [ISD:241] Hinterland Harbor +4 [ISD:170] Avacyn's Pilgrim +4 [DGM:114] Voice of Resurgence +2 [GTC:195] Simic Charm +2 [M13:225] Glacial Fortress +4 [DGM:111] Unflinching Courage +4 [M13:229] Sunpetal Grove +4 [RTR:241] Hallowed Fountain +SB: 2 [M15:71] Negate +SB: 2 [M14:171] Fog +SB: 2 [AVR:31] Nearheath Pilgrim +SB: 2 [M13:176] Ground Seal +SB: 1 [ISD:14] Feeling of Dread +SB: 2 [ISD:25] Nevermore +SB: 4 [DKA:127] Strangleroot Geist diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Megamorph TDtB ST May 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Megamorph TDtB ST May 2015.mwDeck.dck new file mode 100644 index 00000000000..fd9481d5443 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Megamorph TDtB ST May 2015.mwDeck.dck @@ -0,0 +1,31 @@ +4 [KTK:248] Windswept Heath +2 [FRF:19] Mastery of the Unseen +3 [FRF:28] Valorous Stance +1 [UNH:137] Island +2 [JOU:163] Mana Confluence +2 [UNH:136] Plains +3 [KTK:233] Flooded Strand +2 [DTK:219] Dragonlord Ojutai +3 [DTK:221] Dromoka's Command +4 [BNG:165] Temple of Plenty +1 [DTK:23] Hidden Dragonslayer +2 [DTK:210] Surrak, the Hunt Caller +1 [THS:226] Temple of Mystery +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +4 [THS:193] Fleecemane Lion +1 [THS:172] Polukranos, World Eater +3 [M15:249] Yavimaya Coast +1 [DTK:181] Den Protector +4 [DTK:180] Deathmist Raptor +4 [UNH:140] Forest +3 [BNG:119] Courser of Kruphix +2 [FRF:145] Whisperwood Elemental +SB: 2 [DTK:54] Encase in Ice +SB: 2 [DTK:65] Negate +SB: 2 [M15:177] Hornet Nest +SB: 1 [THS:15] Glare of Heresy +SB: 3 [KTK:37] Disdainful Stroke +SB: 2 [DTK:80] Stratus Dancer +SB: 2 [THS:150] Arbor Colossus +SB: 1 [DTK:70] Profaner of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..20025d07b86 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,36 @@ +2 [UNH:137] Island +2 [UNH:136] Plains +1 [ISD:77] Skaab Ruinator +1 [M12:6] Archon of Justice +4 [MBS:95] Viridian Emissary +2 [M12:72] Phantasmal Image +1 [C14:112] Frost Titan +1 [SOM:135] Venser, the Sojourner +2 [M13:22] Oblivion Ring +1 [C14:91] Sun Titan +2 [C14:271] Solemn Simulacrum +6 [UNH:140] Forest +4 [NPH:104] Birthing Pod +4 [M12:165] Birds of Paradise +1 [NPH:9] Elesh Norn, Grand Cenobite +4 [ISD:241] Hinterland Harbor +2 [NPH:4] Blade Splicer +1 [C14:283] Wurmcoil Engine +3 [SOM:229] Seachrome Coast +2 [ISD:170] Avacyn's Pilgrim +4 [SOM:228] Razorverge Thicket +1 [C13:11] Fiend Hunter +3 [M13:229] Sunpetal Grove +2 [NPH:42] Phyrexian Metamorph +2 [SOM:175] Mimic Vat +2 [C13:134] Acidic Slime +SB: 1 [M12:64] Master Thief +SB: 2 [MBS:14] Mirran Crusader +SB: 3 [M12:40] Timely Reinforcements +SB: 1 [SOM:209] Sylvok Lifestaff +SB: 1 [ISD:188] Hollowhenge Scavenger +SB: 1 [SOM:48] Trinket Mage +SB: 2 [C13:249] Nihil Spellbomb +SB: 2 [MBS:78] Creeping Corrosion +SB: 1 [M12:6] Archon of Justice +SB: 1 [MBS:92] Thrun, the Last Troll diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..e0f57b47650 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bant Pod TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,40 @@ +2 [UNH:137] Island +2 [UNH:136] Plains +3 [MBS:95] Viridian Emissary +1 [M12:6] Archon of Justice +1 [ISD:77] Skaab Ruinator +2 [M12:72] Phantasmal Image +1 [C14:112] Frost Titan +2 [M13:22] Oblivion Ring +1 [C14:91] Sun Titan +1 [MBS:8] Hero of Bladehold +1 [C14:271] Solemn Simulacrum +6 [UNH:140] Forest +4 [NPH:104] Birthing Pod +4 [M12:165] Birds of Paradise +1 [C14:79] Mentor of the Meek +1 [NPH:9] Elesh Norn, Grand Cenobite +4 [ISD:241] Hinterland Harbor +1 [ISD:207] Tree of Redemption +1 [FNMP:147] Avacyn's Pilgrim +1 [ISD:193] Mayor of Avabruck +1 [NPH:4] Blade Splicer +1 [C14:283] Wurmcoil Engine +1 [ISD:170] Avacyn's Pilgrim +3 [SOM:229] Seachrome Coast +4 [SOM:228] Razorverge Thicket +2 [NPH:42] Phyrexian Metamorph +3 [M13:229] Sunpetal Grove +1 [C13:11] Fiend Hunter +2 [SOM:175] Mimic Vat +2 [C13:134] Acidic Slime +SB: 1 [M12:64] Master Thief +SB: 2 [MBS:14] Mirran Crusader +SB: 3 [M12:40] Timely Reinforcements +SB: 1 [SOM:209] Sylvok Lifestaff +SB: 1 [SOM:48] Trinket Mage +SB: 1 [ISD:188] Hollowhenge Scavenger +SB: 1 [MBS:8] Hero of Bladehold +SB: 2 [C13:249] Nihil Spellbomb +SB: 2 [MBS:78] Creeping Corrosion +SB: 1 [ISD:207] Tree of Redemption diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bg Zombie TDtB ST Oct 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bg Zombie TDtB ST Oct 2012.mwDeck.dck new file mode 100644 index 00000000000..7d393a4a789 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bg Zombie TDtB ST Oct 2012.mwDeck.dck @@ -0,0 +1,23 @@ +2 [UNH:140] Forest +2 [RTR:120] Deadbridge Goliath +2 [RTR:164] Golgari Charm +4 [M13:185] Rancor +4 [RTR:243] Overgrown Tomb +3 [RTR:221] Rakdos Shred-Freak +4 [RTR:177] Lotleth Troll +4 [ISD:97] Diregraf Ghoul +3 [C14:167] Tragic Slip +4 [AVR:226] Cavern of Souls +4 [DKA:63] Geralf's Messenger +4 [RTR:158] Dreg Mangler +4 [DKA:64] Gravecrawler +4 [ISD:249] Woodland Cemetery +3 [M15:92] Crippling Blight +9 [UNH:138] Swamp +SB: 1 [M13:193] Thragtusk +SB: 3 [C13:97] Vampire Nighthawk +SB: 3 [AVR:84] Appetite for Brains +SB: 2 [RTR:213] Deathrite Shaman +SB: 2 [ISD:115] Sever the Bloodline +SB: 2 [RTR:120] Deadbridge Goliath +SB: 2 [RTR:164] Golgari Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Birthing Pod TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Birthing Pod TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..51b66b4fa5e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Birthing Pod TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,31 @@ +4 [M13:229] Sunpetal Grove +1 [M13:228] Rootbound Crag +8 [UNH:140] Forest +4 [MBS:95] Viridian Emissary +1 [NPH:4] Blade Splicer +4 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +4 [M12:165] Birds of Paradise +2 [NPH:104] Birthing Pod +1 [UNH:139] Mountain +1 [C14:258] Palladium Myr +2 [C13:134] Acidic Slime +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +1 [NPH:9] Elesh Norn, Grand Cenobite +4 [SOM:228] Razorverge Thicket +2 [C14:283] Wurmcoil Engine +2 [MBS:145] Inkmoth Nexus +4 [C14:271] Solemn Simulacrum +2 [M12:12] Day of Judgment +3 [UNH:136] Plains +SB: 2 [NPH:86] Gut Shot +SB: 1 [C14:298] Ghost Quarter +SB: 1 [MBS:94] Viridian Corrupter +SB: 2 [M12:12] Day of Judgment +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 2 [NPH:103] Beast Within +SB: 2 [M12:40] Timely Reinforcements +SB: 2 [M12:164] Autumn's Veil +SB: 1 [M12:197] Stingerfling Spider +SB: 1 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Black Kessig TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Black Kessig TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..fd9a777682e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Black Kessig TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,32 @@ +1 [MBS:43] Go for the Throat +6 [UNH:140] Forest +1 [MBS:96] Glissa, the Traitor +2 [MBS:81] Green Sun's Zenith +1 [M13:222] Dragonskull Summit +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +1 [UNH:139] Mountain +3 [C14:136] Black Sun's Zenith +2 [C13:134] Acidic Slime +4 [C14:145] Grave Titan +1 [C14:298] Ghost Quarter +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +2 [M14:215] Ratchet Bomb +2 [C14:295] Evolving Wilds +4 [MBS:145] Inkmoth Nexus +4 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +3 [M14:96] Doom Blade +4 [ISD:249] Woodland Cemetery +4 [UNH:138] Swamp +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 1 [C14:136] Black Sun's Zenith +SB: 1 [MBS:94] Viridian Corrupter +SB: 2 [NPH:130] Batterskull +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 1 [ISD:207] Tree of Redemption +SB: 2 [C13:249] Nihil Spellbomb +SB: 2 [ISD:94] Curse of Death's Hold +SB: 1 [ISD:105] Liliana of the Veil +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Bolt Caw-Blade TDtB ST Mar 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Bolt Caw-Blade TDtB ST Mar 2011.mwDeck.dck new file mode 100644 index 00000000000..6fef8d58c9d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Bolt Caw-Blade TDtB ST Mar 2011.mwDeck.dck @@ -0,0 +1,31 @@ +3 [WWK:133] Celestial Colonnade +1 [WWK:122] Basilisk Collar +2 [M12:16] Gideon Jura +3 [M11:149] Lightning Bolt +1 [M13:225] Glacial Fortress +4 [ZEN:211] Arid Mesa +4 [UNH:139] Mountain +1 [C13:114] Inferno Titan +3 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +1 [MBS:138] Sword of Feast and Famine +1 [C14:295] Evolving Wilds +4 [SOM:229] Seachrome Coast +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +2 [SOM:81] Arc Trail +2 [UNH:136] Plains +3 [UNH:137] Island +3 [WWK:79] Cunning Sparkmage +2 [M12:63] Mana Leak +SB: 1 [C13:114] Inferno Titan +SB: 1 [MBS:5] Divine Offering +SB: 1 [ROE:59] Deprive +SB: 1 [SOM:208] Sword of Body and Mind +SB: 2 [SOM:50] Twisted Image +SB: 2 [M11:154] Pyroclasm +SB: 1 [WWK:79] Cunning Sparkmage +SB: 2 [M12:63] Mana Leak +SB: 4 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Feb 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Feb 2015.mwDeck.dck new file mode 100644 index 00000000000..6713536ffa1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Feb 2015.mwDeck.dck @@ -0,0 +1,27 @@ +2 [FRF:110] Outpost Siege +1 [FRF:175] Wind-Scarred Crag +2 [BNG:5] Brimaz, King of Oreskos +4 [THS:143] Stormbreath Dragon +2 [FRF:118] Wild Slash +4 [KTK:22] Seeker of the Way +4 [M15:240] Battlefield Forge +4 [THS:228] Temple of Triumph +4 [M15:164] Stoke the Flames +10 [UNH:139] Mountain +3 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +2 [M15:134] Chandra, Pyromaster +4 [KTK:111] Hordeling Outburst +4 [THS:4] Chained to the Rocks +1 [C14:295] Evolving Wilds +4 [UNH:136] Plains +1 [FRF:27] Soulfire Grand Master +SB: 2 [FRF:28] Valorous Stance +SB: 2 [M15:15] Hushwing Gryff +SB: 1 [M15:135] Circle of Flame +SB: 3 [THS:15] Glare of Heresy +SB: 1 [KTK:9] Erase +SB: 2 [KTK:97] Arc Lightning +SB: 1 [FRF:2] Abzan Advantage +SB: 1 [BNG:110] Scouring Sands +SB: 2 [KTK:119] Sarkhan, the Dragonspeaker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jan 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jan 2014.mwDeck.dck new file mode 100644 index 00000000000..ea58c669a62 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jan 2014.mwDeck.dck @@ -0,0 +1,24 @@ +4 [RTR:86] Ash Zealot +1 [THS:143] Stormbreath Dragon +4 [THS:122] Firedrinker Satyr +4 [THS:128] Magma Jet +4 [THS:228] Temple of Triumph +3 [M14:163] Young Pyromancer +11 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M15:134] Chandra, Pyromaster +3 [M14:155] Shock +1 [DGM:36] Pyrewild Shaman +4 [M14:134] Chandra's Phoenix +2 [THS:4] Chained to the Rocks +4 [RTR:220] Rakdos Cackler +1 [M14:139] Flames of the Firebrand +4 [M14:228] Mutavault +4 [GTC:245] Sacred Foundry +SB: 2 [RTR:101] Mizzium Mortars +SB: 2 [THS:4] Chained to the Rocks +SB: 1 [THS:143] Stormbreath Dragon +SB: 2 [THS:121] Fanatic of Mogis +SB: 4 [GTC:215] Boros Reckoner +SB: 3 [GTC:106] Skullcrack +SB: 1 [M14:217] Rod of Ruin diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jul 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jul 2014.mwDeck.dck new file mode 100644 index 00000000000..02bea981684 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Jul 2014.mwDeck.dck @@ -0,0 +1,23 @@ +4 [GTC:106] Skullcrack +4 [THS:128] Magma Jet +4 [THS:228] Temple of Triumph +4 [M14:163] Young Pyromancer +9 [UNH:139] Mountain +4 [M15:155] Lightning Strike +3 [M14:155] Shock +4 [C13:179] Boros Charm +4 [M14:134] Chandra's Phoenix +2 [THS:4] Chained to the Rocks +4 [M14:228] Mutavault +4 [DGM:116] Warleader's Helix +2 [C13:280] Boros Guildgate +4 [GTC:245] Sacred Foundry +4 [BNG:111] Searing Blood +SB: 2 [THS:124] Hammer of Purphoros +SB: 2 [JOU:18] Nyx-Fleece Ram +SB: 1 [RTR:101] Mizzium Mortars +SB: 2 [THS:4] Chained to the Rocks +SB: 4 [GTC:215] Boros Reckoner +SB: 2 [JOU:5] Banishing Light +SB: 1 [THS:112] Anger of the Gods +SB: 1 [THS:9] Elspeth, Sun's Champion diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..bc31e4cf728 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,22 @@ +4 [RTR:86] Ash Zealot +2 [THS:143] Stormbreath Dragon +4 [GTC:215] Boros Reckoner +4 [THS:128] Magma Jet +4 [THS:228] Temple of Triumph +11 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M15:134] Chandra, Pyromaster +4 [C13:179] Boros Charm +4 [M14:134] Chandra's Phoenix +3 [THS:4] Chained to the Rocks +3 [M14:228] Mutavault +2 [DGM:116] Warleader's Helix +2 [C13:280] Boros Guildgate +4 [GTC:245] Sacred Foundry +3 [BNG:111] Searing Blood +SB: 2 [BNG:94] Fated Conflagration +SB: 2 [RTR:101] Mizzium Mortars +SB: 1 [THS:4] Chained to the Rocks +SB: 4 [THS:122] Firedrinker Satyr +SB: 4 [GTC:106] Skullcrack +SB: 2 [GTC:199] Spark Trooper diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2015.mwDeck.dck new file mode 100644 index 00000000000..3537da50af4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Aggro TDtB ST Mar 2015.mwDeck.dck @@ -0,0 +1,29 @@ +4 [FRF:110] Outpost Siege +3 [FRF:118] Wild Slash +2 [KTK:237] Nomad Outpost +4 [KTK:22] Seeker of the Way +1 [KTK:202] Sorin, Solemn Visitor +3 [THS:228] Temple of Triumph +4 [M15:240] Battlefield Forge +4 [M15:164] Stoke the Flames +5 [UNH:139] Mountain +2 [M15:155] Lightning Strike +3 [M15:145] Goblin Rabblemaster +4 [KTK:111] Hordeling Outburst +4 [THS:4] Chained to the Rocks +4 [KTK:230] Bloodstained Mire +2 [DTK:248] Evolving Wilds +3 [KTK:171] Crackling Doom +3 [UNH:136] Plains +1 [UNH:138] Swamp +4 [FRF:27] Soulfire Grand Master +SB: 1 [FRF:28] Valorous Stance +SB: 1 [KTK:210] Utter End +SB: 2 [KTK:186] Mardu Charm +SB: 1 [KTK:9] Erase +SB: 3 [THS:143] Stormbreath Dragon +SB: 1 [KTK:171] Crackling Doom +SB: 2 [KTK:97] Arc Lightning +SB: 1 [KTK:119] Sarkhan, the Dragonspeaker +SB: 2 [KTK:99] Ashcloud Phoenix +SB: 1 [KTK:202] Sorin, Solemn Visitor diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Apr 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Apr 2014.mwDeck.dck new file mode 100644 index 00000000000..c83d2436096 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Apr 2014.mwDeck.dck @@ -0,0 +1,22 @@ +4 [GTC:106] Skullcrack +2 [THS:227] Temple of Silence +4 [THS:128] Magma Jet +4 [THS:228] Temple of Triumph +5 [UNH:139] Mountain +4 [M15:155] Lightning Strike +3 [M14:155] Shock +4 [C13:179] Boros Charm +4 [M14:134] Chandra's Phoenix +2 [THS:4] Chained to the Rocks +4 [DGM:133] Toil // Trouble +4 [RTR:238] Blood Crypt +4 [M14:228] Mutavault +4 [DGM:116] Warleader's Helix +4 [GTC:245] Sacred Foundry +4 [BNG:111] Searing Blood +SB: 2 [GTC:6] Blind Obedience +SB: 1 [M15:134] Chandra, Pyromaster +SB: 2 [THS:4] Chained to the Rocks +SB: 4 [BNG:108] Satyr Firedancer +SB: 4 [THS:122] Firedrinker Satyr +SB: 2 [M14:130] Burning Earth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..d8c572cbd7b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,21 @@ +1 [THS:224] Temple of Abandon +3 [THS:143] Stormbreath Dragon +4 [THS:112] Anger of the Gods +4 [THS:227] Temple of Silence +4 [THS:128] Magma Jet +4 [THS:228] Temple of Triumph +10 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M15:134] Chandra, Pyromaster +4 [C13:179] Boros Charm +4 [M14:155] Shock +2 [RTR:101] Mizzium Mortars +4 [M14:134] Chandra's Phoenix +4 [THS:4] Chained to the Rocks +3 [DGM:116] Warleader's Helix +4 [GTC:245] Sacred Foundry +SB: 1 [RTR:101] Mizzium Mortars +SB: 4 [DGM:133] Toil // Trouble +SB: 4 [GTC:215] Boros Reckoner +SB: 4 [GTC:106] Skullcrack +SB: 2 [GTC:142] Assemble the Legion diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Jun 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Jun 2014.mwDeck.dck new file mode 100644 index 00000000000..26d7627c38e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST Jun 2014.mwDeck.dck @@ -0,0 +1,25 @@ +4 [GTC:106] Skullcrack +1 [THS:227] Temple of Silence +4 [THS:128] Magma Jet +4 [THS:228] Temple of Triumph +4 [M14:163] Young Pyromancer +8 [UNH:139] Mountain +4 [M15:155] Lightning Strike +3 [M14:155] Shock +4 [C13:179] Boros Charm +4 [M14:134] Chandra's Phoenix +3 [THS:4] Chained to the Rocks +1 [BNG:164] Temple of Malice +3 [M14:228] Mutavault +2 [JOU:163] Mana Confluence +4 [DGM:116] Warleader's Helix +4 [GTC:245] Sacred Foundry +3 [BNG:111] Searing Blood +SB: 1 [BNG:94] Fated Conflagration +SB: 3 [RTR:101] Mizzium Mortars +SB: 1 [M15:134] Chandra, Pyromaster +SB: 1 [THS:4] Chained to the Rocks +SB: 2 [THS:15] Glare of Heresy +SB: 3 [DGM:133] Toil // Trouble +SB: 2 [JOU:5] Banishing Light +SB: 2 [JOU:94] Eidolon of the Great Revel diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST May 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST May 2014.mwDeck.dck new file mode 100644 index 00000000000..4367eed457f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Burn TDtB ST May 2014.mwDeck.dck @@ -0,0 +1,22 @@ +4 [GTC:106] Skullcrack +4 [THS:128] Magma Jet +2 [M14:161] Wild Guess +4 [THS:228] Temple of Triumph +9 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M14:155] Shock +4 [C13:179] Boros Charm +4 [M14:134] Chandra's Phoenix +2 [THS:4] Chained to the Rocks +4 [M14:228] Mutavault +2 [JOU:163] Mana Confluence +4 [DGM:116] Warleader's Helix +4 [GTC:245] Sacred Foundry +3 [BNG:111] Searing Blood +4 [JOU:94] Eidolon of the Great Revel +SB: 2 [THS:4] Chained to the Rocks +SB: 4 [BNG:108] Satyr Firedancer +SB: 4 [THS:122] Firedrinker Satyr +SB: 2 [KTK:95] Act of Treason +SB: 2 [DGM:135] Wear // Tear +SB: 1 [JOU:93] Dictate of the Twin Gods diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Apr 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Apr 2011.mwDeck.dck new file mode 100644 index 00000000000..dd67fb5626a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Apr 2011.mwDeck.dck @@ -0,0 +1,28 @@ +1 [MBS:66] Hero of Oxid Ridge +4 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +1 [C14:229] Bonehoard +2 [C14:315] Terramorphic Expanse +1 [ZEN:195] Adventuring Gear +4 [ZEN:141] Plated Geopede +5 [UNH:139] Mountain +4 [ZEN:36] Steppe Lynx +4 [ZEN:219] Marsh Flats +4 [ZEN:223] Scalding Tarn +2 [CMD:17] Journey to Nowhere +4 [ZEN:126] Goblin Guide +1 [SOM:208] Sword of Body and Mind +2 [ZEN:226] Teetering Peaks +4 [M11:33] Squadron Hawk +3 [SOM:94] Koth of the Hammer +2 [SOM:104] Spikeshot Elder +3 [WWK:20] Stoneforge Mystic +5 [UNH:136] Plains +SB: 2 [M13:141] Mark of Mutiny +SB: 1 [C13:114] Inferno Titan +SB: 1 [MBS:5] Divine Offering +SB: 1 [WWK:122] Basilisk Collar +SB: 2 [M12:16] Gideon Jura +SB: 4 [WWK:11] Kor Firewalker +SB: 1 [SOM:94] Koth of the Hammer +SB: 3 [WWK:79] Cunning Sparkmage diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..11d07714d3a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,28 @@ +2 [MBS:66] Hero of Oxid Ridge +3 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +2 [ZEN:195] Adventuring Gear +4 [ZEN:141] Plated Geopede +5 [UNH:139] Mountain +4 [ZEN:36] Steppe Lynx +4 [ZEN:219] Marsh Flats +4 [ZEN:223] Scalding Tarn +2 [CMD:17] Journey to Nowhere +1 [MBS:138] Sword of Feast and Famine +4 [ZEN:126] Goblin Guide +1 [SOM:208] Sword of Body and Mind +1 [ZEN:226] Teetering Peaks +3 [C14:295] Evolving Wilds +4 [M11:33] Squadron Hawk +1 [SOM:94] Koth of the Hammer +1 [SOM:104] Spikeshot Elder +3 [WWK:20] Stoneforge Mystic +5 [UNH:136] Plains +2 [MBS:14] Mirran Crusader +SB: 1 [M13:141] Mark of Mutiny +SB: 1 [WWK:122] Basilisk Collar +SB: 3 [WWK:11] Kor Firewalker +SB: 1 [SOM:94] Koth of the Hammer +SB: 4 [SOM:81] Arc Trail +SB: 1 [MBS:14] Mirran Crusader +SB: 4 [WWK:79] Cunning Sparkmage diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Jun 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Jun 2011.mwDeck.dck new file mode 100644 index 00000000000..f5d673e0fa2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Jun 2011.mwDeck.dck @@ -0,0 +1,22 @@ +3 [MBS:97] Tezzeret, Agent of Bolas +2 [M11:58] Jace Beleren +4 [WWK:134] Creeping Tar Pit +4 [NPH:162] Torpor Orb +4 [M13:223] Drowned Catacomb +3 [ROE:115] Inquisition of Kozilek +4 [C14:239] Everflowing Chalice +2 [KTK:69] Despise +1 [ROE:100] Consume the Meek +3 [C14:313] Tectonic Edge +1 [C14:136] Black Sun's Zenith +4 [M11:70] Preordain +2 [ZEN:87] Disfigure +3 [SOM:218] Tumble Magnet +1 [C14:283] Wurmcoil Engine +2 [MBS:145] Inkmoth Nexus +2 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +2 [WWK:31] Jace, the Mind Sculptor +4 [UNH:137] Island +3 [UNH:138] Swamp +2 [M12:63] Mana Leak diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Mar 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Mar 2011.mwDeck.dck new file mode 100644 index 00000000000..c89544ffeb7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Landfall TDtB ST Mar 2011.mwDeck.dck @@ -0,0 +1,29 @@ +2 [MBS:66] Hero of Oxid Ridge +4 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +1 [C14:229] Bonehoard +3 [C14:315] Terramorphic Expanse +2 [ZEN:195] Adventuring Gear +4 [ZEN:141] Plated Geopede +5 [UNH:139] Mountain +4 [ZEN:36] Steppe Lynx +4 [ZEN:219] Marsh Flats +4 [ZEN:223] Scalding Tarn +2 [CMD:17] Journey to Nowhere +4 [ZEN:126] Goblin Guide +1 [SOM:208] Sword of Body and Mind +1 [ZEN:226] Teetering Peaks +4 [M11:33] Squadron Hawk +1 [SOM:94] Koth of the Hammer +1 [SOM:104] Spikeshot Elder +3 [WWK:20] Stoneforge Mystic +5 [UNH:136] Plains +1 [MBS:14] Mirran Crusader +SB: 2 [M13:141] Mark of Mutiny +SB: 2 [MBS:5] Divine Offering +SB: 1 [M12:16] Gideon Jura +SB: 3 [WWK:11] Kor Firewalker +SB: 1 [M11:7] Baneslayer Angel +SB: 1 [SOM:94] Koth of the Hammer +SB: 4 [SOM:81] Arc Trail +SB: 1 [ROE:146] Forked Bolt diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Boros Midrange TDtB ST Jan 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Boros Midrange TDtB ST Jan 2015.mwDeck.dck new file mode 100644 index 00000000000..28564958291 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Boros Midrange TDtB ST Jan 2015.mwDeck.dck @@ -0,0 +1,24 @@ +1 [M15:15] Hushwing Gryff +3 [BNG:5] Brimaz, King of Oreskos +4 [THS:143] Stormbreath Dragon +1 [KTK:99] Ashcloud Phoenix +4 [KTK:22] Seeker of the Way +1 [THS:128] Magma Jet +4 [M15:240] Battlefield Forge +4 [THS:228] Temple of Triumph +4 [M15:164] Stoke the Flames +10 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +2 [M15:134] Chandra, Pyromaster +4 [KTK:111] Hordeling Outburst +4 [THS:4] Chained to the Rocks +1 [C14:295] Evolving Wilds +5 [UNH:136] Plains +SB: 3 [M15:15] Hushwing Gryff +SB: 1 [M15:134] Chandra, Pyromaster +SB: 3 [THS:15] Glare of Heresy +SB: 3 [KTK:9] Erase +SB: 1 [JOU:5] Banishing Light +SB: 2 [KTK:119] Sarkhan, the Dragonspeaker +SB: 2 [BNG:110] Scouring Sands diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..b7f33f4df0c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,22 @@ +4 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +2 [M11:90] Dark Tutelage +2 [M13:141] Mark of Mutiny +2 [ZEN:119] Burst Lightning +4 [WWK:62] Pulse Tracker +2 [ZEN:115] Vampire Lacerator +2 [SOM:208] Sword of Body and Mind +4 [SOM:224] Blackcleave Cliffs +2 [SOM:81] Arc Trail +4 [WWK:59] Kalastria Highborn +12 [UNH:138] Swamp +SB: 1 [M13:141] Mark of Mutiny +SB: 1 [M11:90] Dark Tutelage +SB: 3 [M12:151] Manic Vandal +SB: 4 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 2 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..3ee00a7f902 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,25 @@ +2 [MBS:43] Go for the Throat +3 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +2 [M11:90] Dark Tutelage +1 [C14:168] Vampire Hexmage +3 [ZEN:219] Marsh Flats +4 [WWK:62] Pulse Tracker +4 [ZEN:115] Vampire Lacerator +2 [M11:87] Captivating Vampire +4 [SOM:224] Blackcleave Cliffs +3 [SOM:81] Arc Trail +4 [WWK:59] Kalastria Highborn +8 [UNH:138] Swamp +SB: 1 [M11:90] Dark Tutelage +SB: 2 [M13:141] Mark of Mutiny +SB: 1 [C14:168] Vampire Hexmage +SB: 3 [M11:92] Demon of Death's Gate +SB: 2 [SOM:78] Skinrender +SB: 2 [C13:97] Vampire Nighthawk +SB: 2 [M14:97] Duress +SB: 2 [ROE:146] Forked Bolt diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..ee4774b5cd7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,26 @@ +1 [MBS:43] Go for the Throat +3 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +2 [M12:145] Grim Lavamancer +3 [ROE:115] Inquisition of Kozilek +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +3 [ZEN:229] Verdant Catacombs +2 [ZEN:219] Marsh Flats +3 [WWK:62] Pulse Tracker +4 [ZEN:115] Vampire Lacerator +3 [NPH:57] Dismember +2 [M14:96] Doom Blade +4 [SOM:224] Blackcleave Cliffs +4 [WWK:59] Kalastria Highborn +6 [UNH:138] Swamp +SB: 4 [M12:151] Manic Vandal +SB: 1 [MBS:43] Go for the Throat +SB: 3 [M11:92] Demon of Death's Gate +SB: 2 [NPH:78] Act of Aggression +SB: 1 [M14:97] Duress +SB: 1 [M12:145] Grim Lavamancer +SB: 1 [KTK:69] Despise +SB: 2 [M12:110] Sorin's Thirst diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jun 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jun 2011.mwDeck.dck new file mode 100644 index 00000000000..0edede07f74 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Jun 2011.mwDeck.dck @@ -0,0 +1,22 @@ +4 [MBS:43] Go for the Throat +3 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +3 [M12:151] Manic Vandal +4 [ZEN:89] Gatekeeper of Malakir +4 [ZEN:229] Verdant Catacombs +1 [ZEN:219] Marsh Flats +4 [WWK:62] Pulse Tracker +4 [ZEN:115] Vampire Lacerator +3 [NPH:57] Dismember +4 [SOM:224] Blackcleave Cliffs +4 [WWK:59] Kalastria Highborn +6 [UNH:138] Swamp +SB: 3 [M13:141] Mark of Mutiny +SB: 3 [M11:90] Dark Tutelage +SB: 2 [SOM:78] Skinrender +SB: 2 [MBS:61] Crush +SB: 1 [M14:96] Doom Blade +SB: 4 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Mar 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Mar 2011.mwDeck.dck new file mode 100644 index 00000000000..82dc53721dc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Mar 2011.mwDeck.dck @@ -0,0 +1,24 @@ +3 [MBS:43] Go for the Throat +3 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +4 [ZEN:229] Verdant Catacombs +4 [C14:168] Vampire Hexmage +1 [ZEN:219] Marsh Flats +3 [WWK:62] Pulse Tracker +4 [ZEN:115] Vampire Lacerator +4 [SOM:224] Blackcleave Cliffs +4 [SOM:81] Arc Trail +4 [WWK:59] Kalastria Highborn +6 [UNH:138] Swamp +SB: 2 [M11:90] Dark Tutelage +SB: 1 [M13:141] Mark of Mutiny +SB: 2 [M11:92] Demon of Death's Gate +SB: 3 [SOM:78] Skinrender +SB: 2 [MBS:61] Crush +SB: 1 [M14:96] Doom Blade +SB: 2 [M14:97] Duress +SB: 2 [ROE:115] Inquisition of Kozilek diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Sep 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Sep 2011.mwDeck.dck new file mode 100644 index 00000000000..043194e4554 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Br Vampires TDtB ST Sep 2011.mwDeck.dck @@ -0,0 +1,30 @@ +1 [MBS:43] Go for the Throat +4 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +4 [ROE:115] Inquisition of Kozilek +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +1 [M13:141] Mark of Mutiny +2 [ZEN:229] Verdant Catacombs +2 [C14:168] Vampire Hexmage +3 [ZEN:219] Marsh Flats +4 [ZEN:115] Vampire Lacerator +2 [NPH:78] Act of Aggression +1 [NPH:57] Dismember +4 [SOM:224] Blackcleave Cliffs +2 [SOM:81] Arc Trail +4 [WWK:59] Kalastria Highborn +1 [M13:83] Bloodthrone Vampire +5 [UNH:138] Swamp +SB: 1 [M13:141] Mark of Mutiny +SB: 2 [M11:90] Dark Tutelage +SB: 3 [M12:151] Manic Vandal +SB: 1 [MBS:43] Go for the Throat +SB: 2 [NPH:74] Surgical Extraction +SB: 1 [NPH:161] Sword of War and Peace +SB: 1 [NPH:78] Act of Aggression +SB: 2 [NPH:68] Phyrexian Obliterator +SB: 1 [SOM:81] Arc Trail +SB: 1 [KTK:69] Despise diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Apr 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Apr 2011.mwDeck.dck new file mode 100644 index 00000000000..3dccdaff9e1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Apr 2011.mwDeck.dck @@ -0,0 +1,32 @@ +4 [WWK:133] Celestial Colonnade +3 [M12:16] Gideon Jura +4 [M13:225] Glacial Fortress +2 [C14:69] Condemn +4 [C14:313] Tectonic Edge +1 [C14:115] Into the Roil +3 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +1 [ZEN:223] Scalding Tarn +1 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +2 [SOM:218] Tumble Magnet +1 [MBS:145] Inkmoth Nexus +4 [M11:33] Squadron Hawk +1 [MBS:115] Mortarpod +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +2 [M12:12] Day of Judgment +4 [UNH:136] Plains +4 [UNH:137] Island +3 [M12:63] Mana Leak +SB: 2 [MBS:5] Divine Offering +SB: 2 [CMD:17] Journey to Nowhere +SB: 1 [ROE:59] Deprive +SB: 1 [MBS:138] Sword of Feast and Famine +SB: 1 [SOM:209] Sylvok Lifestaff +SB: 1 [C14:91] Sun Titan +SB: 1 [M11:7] Baneslayer Angel +SB: 2 [SOM:53] Volition Reins +SB: 1 [M12:12] Day of Judgment +SB: 1 [C14:69] Condemn +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..16ca9516195 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,29 @@ +2 [MBS:21] Consecrated Sphinx +4 [WWK:133] Celestial Colonnade +1 [M11:58] Jace Beleren +3 [M12:16] Gideon Jura +3 [M13:225] Glacial Fortress +1 [ZEN:211] Arid Mesa +4 [C14:313] Tectonic Edge +2 [ZEN:67] Spell Pierce +3 [C14:115] Into the Roil +4 [M11:70] Preordain +2 [ZEN:223] Scalding Tarn +2 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +2 [ZEN:11] Emeria Angel +3 [NPH:57] Dismember +2 [MBS:145] Inkmoth Nexus +4 [M11:33] Squadron Hawk +2 [M12:12] Day of Judgment +3 [UNH:136] Plains +4 [UNH:137] Island +2 [M12:40] Timely Reinforcements +3 [M12:63] Mana Leak +SB: 2 [C14:98] Azure Mage +SB: 1 [M11:58] Jace Beleren +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [M12:12] Day of Judgment +SB: 3 [NPH:38] Mental Misstep +SB: 2 [M12:40] Timely Reinforcements +SB: 4 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..0d6129c72bb --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,26 @@ +4 [WWK:133] Celestial Colonnade +1 [ROE:59] Deprive +1 [SOM:46] Stoic Rebuttal +3 [M12:16] Gideon Jura +1 [ZEN:220] Misty Rainforest +4 [M13:225] Glacial Fortress +4 [C14:313] Tectonic Edge +4 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +1 [SOM:209] Sylvok Lifestaff +1 [SOM:208] Sword of Body and Mind +4 [SOM:229] Seachrome Coast +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:12] Day of Judgment +4 [UNH:136] Plains +5 [UNH:137] Island +3 [M12:63] Mana Leak +SB: 2 [MBS:5] Divine Offering +SB: 1 [SOM:208] Sword of Body and Mind +SB: 3 [M14:215] Ratchet Bomb +SB: 2 [M11:7] Baneslayer Angel +SB: 4 [ROE:40] Oust +SB: 2 [M12:52] Flashfreeze +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..b6daf16052c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,28 @@ +4 [WWK:133] Celestial Colonnade +2 [M12:16] Gideon Jura +4 [M13:225] Glacial Fortress +4 [NPH:4] Blade Splicer +4 [C14:313] Tectonic Edge +1 [C14:115] Into the Roil +3 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +3 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +2 [NPH:57] Dismember +3 [MBS:145] Inkmoth Nexus +1 [C14:91] Sun Titan +4 [M11:33] Squadron Hawk +1 [M13:22] Oblivion Ring +1 [M12:12] Day of Judgment +4 [UNH:136] Plains +4 [UNH:137] Island +3 [MBS:8] Hero of Bladehold +4 [M12:63] Mana Leak +SB: 1 [C14:115] Into the Roil +SB: 3 [M14:215] Ratchet Bomb +SB: 1 [WWK:11] Kor Firewalker +SB: 2 [M12:12] Day of Judgment +SB: 1 [M13:22] Oblivion Ring +SB: 2 [NPH:159] Spellskite +SB: 2 [M12:40] Timely Reinforcements +SB: 3 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jun 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jun 2011.mwDeck.dck new file mode 100644 index 00000000000..761ef03abb7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Jun 2011.mwDeck.dck @@ -0,0 +1,31 @@ +1 [MBS:21] Consecrated Sphinx +4 [WWK:133] Celestial Colonnade +1 [M11:58] Jace Beleren +1 [NPH:161] Sword of War and Peace +3 [M13:225] Glacial Fortress +1 [NPH:130] Batterskull +4 [C14:313] Tectonic Edge +2 [C14:115] Into the Roil +3 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +1 [MBS:5] Divine Offering +1 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +3 [NPH:57] Dismember +2 [MBS:145] Inkmoth Nexus +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +4 [UNH:136] Plains +5 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 2 [MBS:5] Divine Offering +SB: 1 [ROE:59] Deprive +SB: 1 [NPH:57] Dismember +SB: 1 [C14:91] Sun Titan +SB: 1 [NPH:130] Batterskull +SB: 1 [M12:11] Celestial Purge +SB: 1 [M12:12] Day of Judgment +SB: 3 [ROE:40] Oust +SB: 2 [C14:69] Condemn +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Mar 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Mar 2011.mwDeck.dck new file mode 100644 index 00000000000..fef58719256 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Mar 2011.mwDeck.dck @@ -0,0 +1,27 @@ +4 [WWK:133] Celestial Colonnade +1 [ROE:59] Deprive +3 [M12:16] Gideon Jura +1 [ZEN:220] Misty Rainforest +4 [M13:225] Glacial Fortress +4 [C14:313] Tectonic Edge +3 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +1 [MBS:138] Sword of Feast and Famine +1 [SOM:209] Sylvok Lifestaff +1 [SOM:208] Sword of Body and Mind +4 [SOM:229] Seachrome Coast +1 [C14:91] Sun Titan +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:12] Day of Judgment +4 [UNH:136] Plains +5 [UNH:137] Island +3 [M12:63] Mana Leak +SB: 3 [MBS:5] Divine Offering +SB: 1 [C14:91] Sun Titan +SB: 2 [M11:7] Baneslayer Angel +SB: 1 [MBS:115] Mortarpod +SB: 3 [ROE:40] Oust +SB: 2 [C14:69] Condemn +SB: 3 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..4f3c624f75d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,25 @@ +4 [WWK:133] Celestial Colonnade +2 [M11:58] Jace Beleren +1 [NPH:161] Sword of War and Peace +4 [M13:225] Glacial Fortress +1 [NPH:130] Batterskull +2 [C14:69] Condemn +4 [C14:313] Tectonic Edge +3 [C14:115] Into the Roil +4 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +1 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +2 [MBS:145] Inkmoth Nexus +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +3 [UNH:136] Plains +5 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 3 [MBS:5] Divine Offering +SB: 4 [M11:21] Leyline of Sanctity +SB: 2 [C14:91] Sun Titan +SB: 1 [MBS:115] Mortarpod +SB: 2 [M12:12] Day of Judgment +SB: 3 [ROE:40] Oust diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Sep 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Sep 2011.mwDeck.dck new file mode 100644 index 00000000000..bd01e2df5f4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Caw-Blade TDtB ST Sep 2011.mwDeck.dck @@ -0,0 +1,29 @@ +4 [WWK:133] Celestial Colonnade +2 [M12:16] Gideon Jura +4 [M13:225] Glacial Fortress +3 [NPH:4] Blade Splicer +1 [ZEN:211] Arid Mesa +4 [C14:313] Tectonic Edge +2 [C14:115] Into the Roil +3 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +1 [ZEN:223] Scalding Tarn +3 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +2 [ZEN:11] Emeria Angel +2 [NPH:57] Dismember +2 [MBS:145] Inkmoth Nexus +1 [C14:91] Sun Titan +4 [M11:33] Squadron Hawk +2 [M13:22] Oblivion Ring +3 [UNH:136] Plains +2 [M12:72] Phantasmal Image +3 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 1 [M11:58] Jace Beleren +SB: 1 [C14:91] Sun Titan +SB: 2 [NPH:38] Mental Misstep +SB: 1 [M12:72] Phantasmal Image +SB: 2 [C14:69] Condemn +SB: 4 [M12:40] Timely Reinforcements +SB: 4 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Cawless UW Control TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Cawless UW Control TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..ab90f6f0f40 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Cawless UW Control TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,29 @@ +4 [WWK:133] Celestial Colonnade +2 [M11:58] Jace Beleren +2 [SOM:46] Stoic Rebuttal +2 [M12:16] Gideon Jura +2 [ZEN:70] Spreading Seas +1 [ZEN:220] Misty Rainforest +4 [M13:225] Glacial Fortress +2 [M11:7] Baneslayer Angel +3 [CMD:37] Wall of Omens +2 [C14:69] Condemn +4 [C14:313] Tectonic Edge +3 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +2 [CMD:17] Journey to Nowhere +3 [SOM:229] Seachrome Coast +2 [C14:91] Sun Titan +3 [WWK:31] Jace, the Mind Sculptor +2 [M12:12] Day of Judgment +4 [UNH:136] Plains +5 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 4 [ZEN:25] Luminarch Ascension +SB: 1 [M11:58] Jace Beleren +SB: 2 [M14:215] Ratchet Bomb +SB: 2 [ZEN:70] Spreading Seas +SB: 1 [M11:7] Baneslayer Angel +SB: 1 [M12:12] Day of Judgment +SB: 2 [M12:52] Flashfreeze +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Charmed TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Charmed TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..ba172b550cf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Charmed TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,30 @@ +3 [AVR:32] Restoration Angel +4 [C13:30] Augur of Bolas +4 [GTC:215] Boros Reckoner +2 [M13:225] Glacial Fortress +3 [M13:147] Searing Spear +2 [RTR:241] Hallowed Fountain +2 [RTR:172] Izzet Charm +3 [ISD:78] Snapcaster Mage +1 [CNS:74] Moment of Heroism +3 [RTR:200] Sphinx's Revelation +4 [RTR:145] Azorius Charm +4 [C13:179] Boros Charm +2 [AVR:226] Cavern of Souls +2 [AVR:149] Pillar of Flame +4 [RTR:247] Steam Vents +1 [M13:75] Unsummon +2 [C14:172] Blasphemous Act +4 [GTC:245] Sacred Foundry +1 [UNH:136] Plains +1 [UNH:137] Island +4 [ISD:238] Clifftop Retreat +4 [ISD:248] Sulfur Falls +SB: 2 [RTR:201] Supreme Verdict +SB: 2 [M13:150] Thundermaw Hellkite +SB: 2 [C14:278] Tormod's Crypt +SB: 1 [AVR:149] Pillar of Flame +SB: 1 [RTR:47] Psychic Spiral +SB: 4 [ISD:213] Geist of Saint Traft +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Cobra Valakut TDtB ST Apr 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Cobra Valakut TDtB ST Apr 2011.mwDeck.dck new file mode 100644 index 00000000000..a506899b5de --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Cobra Valakut TDtB ST Apr 2011.mwDeck.dck @@ -0,0 +1,22 @@ +5 [UNH:140] Forest +3 [ZEN:220] Misty Rainforest +4 [ROE:203] Overgrown Battlement +3 [ZEN:167] Khalni Heart Expedition +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +3 [C14:315] Terramorphic Expanse +4 [ZEN:184] Summoning Trap +1 [C13:302] Khalni Garden +11 [UNH:139] Mountain +3 [C13:114] Inferno Titan +4 [ZEN:228] Valakut, the Molten Pinnacle +4 [ZEN:168] Lotus Cobra +4 [C14:199] Harrow +1 [C14:295] Evolving Wilds +4 [WWK:99] Explore +SB: 2 [C13:134] Acidic Slime +SB: 3 [CNS:171] Nature's Claim +SB: 2 [KTK:95] Act of Treason +SB: 3 [M11:188] Obstinate Baloth +SB: 1 [MBS:81] Green Sun's Zenith +SB: 4 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Darkblade TDtB ST Jun 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Darkblade TDtB ST Jun 2011.mwDeck.dck new file mode 100644 index 00000000000..b5c85577224 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Darkblade TDtB ST Jun 2011.mwDeck.dck @@ -0,0 +1,31 @@ +3 [MBS:43] Go for the Throat +1 [NPH:161] Sword of War and Peace +4 [WWK:134] Creeping Tar Pit +3 [M13:225] Glacial Fortress +1 [NPH:130] Batterskull +2 [ZEN:211] Arid Mesa +4 [ROE:115] Inquisition of Kozilek +1 [KTK:69] Despise +1 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [ZEN:219] Marsh Flats +1 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +2 [ZEN:11] Emeria Angel +4 [M11:33] Squadron Hawk +4 [SOM:226] Darkslick Shores +1 [M14:97] Duress +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +4 [UNH:136] Plains +2 [UNH:138] Swamp +2 [M12:63] Mana Leak +SB: 3 [MBS:5] Divine Offering +SB: 2 [NPH:74] Surgical Extraction +SB: 1 [C13:97] Vampire Nighthawk +SB: 1 [ZEN:11] Emeria Angel +SB: 1 [NPH:57] Dismember +SB: 1 [M14:97] Duress +SB: 1 [NPH:130] Batterskull +SB: 3 [NPH:159] Spellskite +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Delver Blade TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Delver Blade TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..6569d1f9c4a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Delver Blade TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,27 @@ +4 [NPH:161] Sword of War and Peace +4 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +2 [NPH:86] Gut Shot +2 [ISD:231] Runechanter's Pike +4 [SOM:229] Seachrome Coast +3 [NPH:35] Gitaxian Probe +2 [M12:65] Merfolk Looter +3 [ISD:213] Geist of Saint Traft +2 [C14:80] Midnight Haunting +4 [NPH:48] Vapor Snag +3 [ISD:244] Moorland Haunt +1 [UNH:136] Plains +4 [ISD:51] Delver of Secrets +9 [UNH:137] Island +4 [M12:73] Ponder +3 [ISD:60] Invisible Stalker +4 [M12:63] Mana Leak +SB: 2 [MBS:5] Divine Offering +SB: 1 [NPH:86] Gut Shot +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [M15:51] Dissipate +SB: 1 [M12:11] Celestial Purge +SB: 2 [M13:22] Oblivion Ring +SB: 2 [M12:72] Phantasmal Image +SB: 2 [M12:40] Timely Reinforcements +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Apr 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Apr 2014.mwDeck.dck new file mode 100644 index 00000000000..6688b64a1a5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Apr 2014.mwDeck.dck @@ -0,0 +1,21 @@ +1 [RTR:82] Ultimate Price +4 [RTR:83] Underworld Connections +1 [THS:225] Temple of Deceit +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +1 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +1 [BNG:61] Bile Blight +4 [C14:146] Gray Merchant of Asphodel +4 [M14:101] Lifebane Zombie +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +1 [M14:97] Duress +4 [GTC:63] Devour Flesh +19 [UNH:138] Swamp +SB: 4 [M15:232] Staff of the Death Magus +SB: 1 [BNG:61] Bile Blight +SB: 2 [C14:158] Read the Bones +SB: 3 [M14:96] Doom Blade +SB: 3 [M14:97] Duress +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..095418fea55 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,21 @@ +2 [RTR:82] Ultimate Price +4 [RTR:83] Underworld Connections +3 [THS:225] Temple of Deceit +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:107] Thoughtseize +4 [C14:146] Gray Merchant of Asphodel +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +1 [M14:96] Doom Blade +4 [GTC:222] Nightveil Specter +2 [GTC:63] Devour Flesh +1 [THS:85] Erebos, God of the Dead +19 [UNH:138] Swamp +SB: 3 [M14:101] Lifebane Zombie +SB: 2 [THS:100] Pharika's Cure +SB: 1 [M14:116] Shrivel +SB: 2 [M14:96] Doom Blade +SB: 3 [M14:97] Duress +SB: 3 [THS:83] Dark Betrayal +SB: 1 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Feb 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Feb 2014.mwDeck.dck new file mode 100644 index 00000000000..e9ddb6bebd6 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Feb 2014.mwDeck.dck @@ -0,0 +1,19 @@ +1 [RTR:82] Ultimate Price +4 [RTR:83] Underworld Connections +4 [THS:225] Temple of Deceit +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:107] Thoughtseize +3 [BNG:61] Bile Blight +4 [C14:146] Gray Merchant of Asphodel +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [GTC:222] Nightveil Specter +2 [GTC:63] Devour Flesh +18 [UNH:138] Swamp +SB: 3 [M14:101] Lifebane Zombie +SB: 2 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 2 [THS:83] Dark Betrayal +SB: 2 [BNG:65] Drown in Sorrow +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jan 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jan 2014.mwDeck.dck new file mode 100644 index 00000000000..2df4cd11510 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jan 2014.mwDeck.dck @@ -0,0 +1,20 @@ +1 [RTR:82] Ultimate Price +4 [RTR:83] Underworld Connections +3 [THS:225] Temple of Deceit +4 [RTR:73] Pack Rat +2 [THS:100] Pharika's Cure +4 [RTR:63] Desecration Demon +1 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +4 [C14:146] Gray Merchant of Asphodel +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [GTC:222] Nightveil Specter +3 [GTC:63] Devour Flesh +18 [UNH:138] Swamp +SB: 3 [M14:101] Lifebane Zombie +SB: 2 [THS:100] Pharika's Cure +SB: 2 [M14:96] Doom Blade +SB: 3 [M14:97] Duress +SB: 3 [THS:83] Dark Betrayal +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jul 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jul 2014.mwDeck.dck new file mode 100644 index 00000000000..62202237046 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jul 2014.mwDeck.dck @@ -0,0 +1,23 @@ +1 [RTR:82] Ultimate Price +3 [RTR:83] Underworld Connections +2 [THS:225] Temple of Deceit +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:107] Thoughtseize +3 [BNG:61] Bile Blight +4 [C14:146] Gray Merchant of Asphodel +1 [M15:248] Urborg, Tomb of Yawgmoth +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +2 [C14:161] Sign in Blood +4 [GTC:222] Nightveil Specter +2 [GTC:63] Devour Flesh +18 [UNH:138] Swamp +SB: 1 [RTR:82] Ultimate Price +SB: 1 [RTR:83] Underworld Connections +SB: 3 [M14:101] Lifebane Zombie +SB: 1 [M15:103] Liliana Vess +SB: 2 [THS:100] Pharika's Cure +SB: 2 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 1 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jun 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jun 2014.mwDeck.dck new file mode 100644 index 00000000000..f8114ec83b8 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Jun 2014.mwDeck.dck @@ -0,0 +1,19 @@ +1 [BNG:61] Bile Blight +1 [RTR:82] Ultimate Price +4 [RTR:83] Underworld Connections +4 [C14:146] Gray Merchant of Asphodel +4 [M14:101] Lifebane Zombie +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [GTC:63] Devour Flesh +4 [THS:107] Thoughtseize +22 [UNH:138] Swamp +SB: 1 [BNG:61] Bile Blight +SB: 1 [C14:158] Read the Bones +SB: 1 [RTR:231] Pithing Needle +SB: 4 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 2 [THS:83] Dark Betrayal +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..592d047014e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,17 @@ +4 [RTR:83] Underworld Connections +4 [C14:146] Gray Merchant of Asphodel +2 [THS:110] Whip of Erebos +3 [RTR:73] Pack Rat +4 [THS:100] Pharika's Cure +4 [RTR:63] Desecration Demon +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [GTC:222] Nightveil Specter +2 [THS:85] Erebos, God of the Dead +4 [THS:107] Thoughtseize +21 [UNH:138] Swamp +SB: 3 [RTR:82] Ultimate Price +SB: 4 [M14:215] Ratchet Bomb +SB: 1 [RTR:73] Pack Rat +SB: 3 [M14:97] Duress +SB: 4 [M14:98] Festering Newt diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..f2523f433eb --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Black TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,21 @@ +1 [THS:223] Nykthos, Shrine to Nyx +4 [RTR:83] Underworld Connections +2 [THS:110] Whip of Erebos +2 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +4 [C14:146] Gray Merchant of Asphodel +4 [M14:101] Lifebane Zombie +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [M14:96] Doom Blade +2 [GTC:63] Devour Flesh +1 [THS:85] Erebos, God of the Dead +16 [UNH:138] Swamp +SB: 4 [M14:123] Xathrid Necromancer +SB: 1 [RTR:231] Pithing Needle +SB: 4 [THS:100] Pharika's Cure +SB: 4 [M14:97] Duress +SB: 1 [GTC:63] Devour Flesh +SB: 1 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Apr 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Apr 2014.mwDeck.dck new file mode 100644 index 00000000000..5ffc130cefc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Apr 2014.mwDeck.dck @@ -0,0 +1,23 @@ +1 [THS:223] Nykthos, Shrine to Nyx +1 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +3 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +1 [M14:53] Domestication +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [C14:104] Cyclonic Rift +SB: 2 [THS:47] Dissolve +SB: 3 [THS:49] Gainsay +SB: 1 [GTC:44] Rapid Hybridization +SB: 2 [RTR:36] Dispel +SB: 1 [M14:53] Domestication +SB: 1 [RTR:44] Jace, Architect of Thought +SB: 2 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..5c4037a895c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,23 @@ +1 [THS:223] Nykthos, Shrine to Nyx +1 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +3 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +1 [JOU:162] Hall of Triumph +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [C14:104] Cyclonic Rift +SB: 2 [THS:47] Dissolve +SB: 3 [THS:49] Gainsay +SB: 1 [DGM:11] AEtherling +SB: 1 [RTR:36] Dispel +SB: 2 [M14:53] Domestication +SB: 2 [RTR:44] Jace, Architect of Thought +SB: 1 [M15:75] Polymorphist's Jest +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..3a8e3daf931 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,23 @@ +1 [THS:223] Nykthos, Shrine to Nyx +2 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +2 [RTR:44] Jace, Architect of Thought +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [C14:104] Cyclonic Rift +SB: 1 [THS:46] Curse of the Swine +SB: 4 [THS:49] Gainsay +SB: 1 [DGM:11] AEtherling +SB: 2 [GTC:44] Rapid Hybridization +SB: 1 [RTR:44] Jace, Architect of Thought +SB: 3 [M14:53] Domestication +SB: 1 [THS:42] Bident of Thassa +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Feb 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Feb 2014.mwDeck.dck new file mode 100644 index 00000000000..ebc2ac9a9e6 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Feb 2014.mwDeck.dck @@ -0,0 +1,24 @@ +1 [THS:223] Nykthos, Shrine to Nyx +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +2 [RTR:44] Jace, Architect of Thought +2 [M14:53] Domestication +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 2 [C14:104] Cyclonic Rift +SB: 1 [THS:47] Dissolve +SB: 3 [THS:49] Gainsay +SB: 1 [DGM:11] AEtherling +SB: 1 [GTC:44] Rapid Hybridization +SB: 1 [RTR:36] Dispel +SB: 2 [M14:53] Domestication +SB: 1 [THS:42] Bident of Thassa +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jan 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jan 2014.mwDeck.dck new file mode 100644 index 00000000000..4a725d14144 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jan 2014.mwDeck.dck @@ -0,0 +1,25 @@ +1 [THS:223] Nykthos, Shrine to Nyx +1 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +2 [RTR:44] Jace, Architect of Thought +1 [M14:53] Domestication +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [C14:104] Cyclonic Rift +SB: 1 [THS:46] Curse of the Swine +SB: 2 [THS:47] Dissolve +SB: 4 [THS:49] Gainsay +SB: 2 [GTC:44] Rapid Hybridization +SB: 1 [RTR:36] Dispel +SB: 1 [RTR:44] Jace, Architect of Thought +SB: 1 [M14:53] Domestication +SB: 1 [THS:42] Bident of Thassa +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jul 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jul 2014.mwDeck.dck new file mode 100644 index 00000000000..33d00defc04 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jul 2014.mwDeck.dck @@ -0,0 +1,25 @@ +1 [THS:223] Nykthos, Shrine to Nyx +1 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +2 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +2 [M14:53] Domestication +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 2 [THS:47] Dissolve +SB: 1 [THS:38] Annul +SB: 4 [THS:49] Gainsay +SB: 1 [DGM:11] AEtherling +SB: 1 [GTC:44] Rapid Hybridization +SB: 1 [RTR:36] Dispel +SB: 1 [M14:53] Domestication +SB: 1 [RTR:44] Jace, Architect of Thought +SB: 1 [RTR:45] Mizzium Skin +SB: 1 [M15:75] Polymorphist's Jest +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jun 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jun 2014.mwDeck.dck new file mode 100644 index 00000000000..3bb0b6321d7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Jun 2014.mwDeck.dck @@ -0,0 +1,25 @@ +1 [THS:223] Nykthos, Shrine to Nyx +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +1 [RTR:44] Jace, Architect of Thought +3 [JOU:162] Hall of Triumph +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 2 [C14:104] Cyclonic Rift +SB: 1 [THS:223] Nykthos, Shrine to Nyx +SB: 1 [THS:47] Dissolve +SB: 2 [THS:49] Gainsay +SB: 2 [DGM:11] AEtherling +SB: 1 [RTR:36] Dispel +SB: 1 [GTC:44] Rapid Hybridization +SB: 1 [M14:53] Domestication +SB: 2 [RTR:44] Jace, Architect of Thought +SB: 1 [THS:42] Bident of Thassa +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..87b9f501c30 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,20 @@ +1 [THS:223] Nykthos, Shrine to Nyx +2 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +3 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 3 [THS:47] Dissolve +SB: 3 [THS:49] Gainsay +SB: 1 [DGM:11] AEtherling +SB: 2 [M14:46] Claustrophobia +SB: 3 [M14:53] Domestication +SB: 2 [RTR:44] Jace, Architect of Thought +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST May 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST May 2014.mwDeck.dck new file mode 100644 index 00000000000..ae1cbf30491 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST May 2014.mwDeck.dck @@ -0,0 +1,25 @@ +1 [THS:223] Nykthos, Shrine to Nyx +1 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [JOU:42] Hypnotic Siren +1 [GTC:44] Rapid Hybridization +3 [RTR:218] Judge's Familiar +4 [GTC:32] Cloudfin Raptor +2 [JOU:162] Hall of Triumph +1 [M14:53] Domestication +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [C14:104] Cyclonic Rift +SB: 1 [THS:47] Dissolve +SB: 1 [RTR:231] Pithing Needle +SB: 2 [THS:49] Gainsay +SB: 2 [DGM:11] AEtherling +SB: 2 [GTC:44] Rapid Hybridization +SB: 2 [RTR:36] Dispel +SB: 2 [M14:53] Domestication +SB: 2 [M14:60] Jace, Memory Adept diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..e1179110f00 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,25 @@ +1 [THS:223] Nykthos, Shrine to Nyx +2 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +1 [RTR:44] Jace, Architect of Thought +1 [M14:53] Domestication +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [THS:46] Curse of the Swine +SB: 1 [C14:104] Cyclonic Rift +SB: 1 [THS:47] Dissolve +SB: 4 [THS:49] Gainsay +SB: 2 [GTC:44] Rapid Hybridization +SB: 1 [RTR:44] Jace, Architect of Thought +SB: 1 [M14:53] Domestication +SB: 1 [THS:42] Bident of Thassa +SB: 2 [M14:60] Jace, Memory Adept +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..3bf028754aa --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Blue TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,22 @@ +2 [THS:57] Omenspeaker +2 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +3 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [M14:51] Disperse +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +2 [RTR:44] Jace, Architect of Thought +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +1 [THS:42] Bident of Thassa +21 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [RTR:231] Pithing Needle +SB: 2 [DGM:11] AEtherling +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [M14:228] Mutavault +SB: 1 [THS:71] Triton Tactics +SB: 3 [M15:83] Wall of Frost +SB: 2 [RTR:44] Jace, Architect of Thought +SB: 3 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Boros TDtB ST Jan 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Boros TDtB ST Jan 2014.mwDeck.dck new file mode 100644 index 00000000000..ba49079ea00 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Boros TDtB ST Jan 2014.mwDeck.dck @@ -0,0 +1,23 @@ +4 [THS:223] Nykthos, Shrine to Nyx +3 [THS:124] Hammer of Purphoros +4 [RTR:86] Ash Zealot +4 [THS:121] Fanatic of Mogis +4 [THS:143] Stormbreath Dragon +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [THS:228] Temple of Triumph +12 [UNH:139] Mountain +2 [M15:134] Chandra, Pyromaster +3 [RTR:101] Mizzium Mortars +3 [THS:4] Chained to the Rocks +4 [RTR:215] Frostburn Weird +1 [C13:280] Boros Guildgate +4 [GTC:245] Sacred Foundry +SB: 1 [THS:135] Purphoros, God of the Forge +SB: 1 [RTR:101] Mizzium Mortars +SB: 3 [C13:179] Boros Charm +SB: 1 [THS:4] Chained to the Rocks +SB: 4 [THS:112] Anger of the Gods +SB: 2 [DGM:135] Wear // Tear +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 2 [GTC:142] Assemble the Legion diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Dimir TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Dimir TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..ceeca050b03 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Dimir TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,20 @@ +4 [RTR:83] Underworld Connections +4 [THS:225] Temple of Deceit +2 [GTC:249] Watery Grave +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:107] Thoughtseize +2 [BNG:61] Bile Blight +4 [C14:146] Gray Merchant of Asphodel +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [GTC:222] Nightveil Specter +4 [GTC:63] Devour Flesh +16 [UNH:138] Swamp +SB: 4 [M14:101] Lifebane Zombie +SB: 1 [DGM:88] Notion Thief +SB: 2 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 1 [THS:83] Dark Betrayal +SB: 1 [BNG:65] Drown in Sorrow +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..b64425f1a58 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,25 @@ +1 [RTR:82] Ultimate Price +3 [RTR:83] Underworld Connections +1 [UNH:140] Forest +4 [RTR:73] Pack Rat +4 [JOU:165] Temple of Malady +4 [RTR:63] Desecration Demon +3 [RTR:141] Abrupt Decay +4 [THS:107] Thoughtseize +2 [BNG:61] Bile Blight +4 [M15:244] Llanowar Wastes +4 [RTR:243] Overgrown Tomb +4 [C14:146] Gray Merchant of Asphodel +4 [M14:101] Lifebane Zombie +2 [M15:248] Urborg, Tomb of Yawgmoth +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +2 [C14:161] Sign in Blood +6 [UNH:138] Swamp +SB: 1 [RTR:83] Underworld Connections +SB: 2 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 2 [RTR:164] Golgari Charm +SB: 2 [BNG:65] Drown in Sorrow +SB: 3 [M14:195] Scavenging Ooze +SB: 1 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST May 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST May 2014.mwDeck.dck new file mode 100644 index 00000000000..33fb10e79a3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST May 2014.mwDeck.dck @@ -0,0 +1,25 @@ +3 [RTR:83] Underworld Connections +2 [THS:225] Temple of Deceit +4 [RTR:73] Pack Rat +4 [JOU:165] Temple of Malady +4 [RTR:63] Desecration Demon +2 [RTR:141] Abrupt Decay +4 [THS:107] Thoughtseize +2 [BNG:61] Bile Blight +4 [RTR:243] Overgrown Tomb +3 [M14:101] Lifebane Zombie +4 [C14:146] Gray Merchant of Asphodel +3 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +3 [GTC:222] Nightveil Specter +3 [GTC:63] Devour Flesh +11 [UNH:138] Swamp +SB: 1 [RTR:83] Underworld Connections +SB: 1 [M14:101] Lifebane Zombie +SB: 2 [THS:100] Pharika's Cure +SB: 1 [RTR:208] Vraska the Unseen +SB: 2 [M14:96] Doom Blade +SB: 3 [M14:97] Duress +SB: 1 [GTC:63] Devour Flesh +SB: 2 [RTR:164] Golgari Charm +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Nov 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Nov 2014.mwDeck.dck new file mode 100644 index 00000000000..f500aa60197 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Golgari TDtB ST Nov 2014.mwDeck.dck @@ -0,0 +1,24 @@ +4 [THS:223] Nykthos, Shrine to Nyx +1 [THS:110] Whip of Erebos +9 [UNH:140] Forest +1 [THS:166] Nylea, God of the Hunt +3 [JOU:122] Eidolon of Blossoms +4 [JOU:165] Temple of Malady +1 [JOU:154] Pharika, God of Affliction +4 [JOU:66] Doomwake Giant +4 [M15:176] Genesis Hydra +4 [M15:244] Llanowar Wastes +2 [M15:178] Hornet Queen +4 [BNG:119] Courser of Kruphix +1 [M15:248] Urborg, Tomb of Yawgmoth +4 [THS:182] Voyaging Satyr +1 [THS:150] Arbor Colossus +4 [THS:172] Polukranos, World Eater +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +1 [UNH:138] Swamp +SB: 1 [M15:210] Garruk, Apex Predator +SB: 4 [THS:167] Nylea's Disciple +SB: 3 [JOU:140] Setessan Tactics +SB: 3 [THS:162] Mistcutter Hydra +SB: 4 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..2bb1657d96d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,22 @@ +4 [THS:223] Nykthos, Shrine to Nyx +19 [UNH:140] Forest +1 [THS:166] Nylea, God of the Hunt +4 [GTC:216] Burning-Tree Emissary +4 [JOU:122] Eidolon of Blossoms +3 [M15:172] Chord of Calling +3 [M14:172] Garruk, Caller of Beasts +2 [M15:187] Nissa, Worldwaker +1 [M15:178] Hornet Queen +4 [BNG:119] Courser of Kruphix +1 [GTC:136] Sylvan Primordial +4 [THS:182] Voyaging Satyr +4 [THS:172] Polukranos, World Eater +4 [C14:191] Elvish Mystic +2 [THS:180] Sylvan Caryatid +SB: 1 [M15:178] Hornet Queen +SB: 3 [THS:167] Nylea's Disciple +SB: 1 [GTC:136] Sylvan Primordial +SB: 2 [THS:150] Arbor Colossus +SB: 3 [THS:162] Mistcutter Hydra +SB: 4 [JOU:140] Setessan Tactics +SB: 1 [M14:195] Scavenging Ooze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Feb 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Feb 2015.mwDeck.dck new file mode 100644 index 00000000000..0e0e10a7a33 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Feb 2015.mwDeck.dck @@ -0,0 +1,23 @@ +4 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +10 [UNH:140] Forest +4 [JOU:122] Eidolon of Blossoms +4 [KTK:249] Wooded Foothills +4 [KTK:106] Crater's Claws +2 [M15:176] Genesis Hydra +4 [FRF:145] Whisperwood Elemental +1 [UNH:139] Mountain +4 [BNG:119] Courser of Kruphix +2 [FRF:1] Ugin, the Spirit Dragon +4 [THS:182] Voyaging Satyr +4 [THS:172] Polukranos, World Eater +1 [THS:152] Boon Satyr +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 2 [C14:213] Reclamation Sage +SB: 3 [THS:167] Nylea's Disciple +SB: 2 [THS:150] Arbor Colossus +SB: 2 [JOU:140] Setessan Tactics +SB: 1 [BNG:156] Xenagos, God of Revels +SB: 2 [M15:176] Genesis Hydra +SB: 3 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..e25614f212c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Green TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,25 @@ +4 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +9 [UNH:140] Forest +2 [THS:166] Nylea, God of the Hunt +4 [GTC:216] Burning-Tree Emissary +2 [THS:209] Xenagos, the Reveler +4 [M14:172] Garruk, Caller of Beasts +3 [M14:195] Scavenging Ooze +2 [UNH:139] Mountain +4 [GTC:247] Stomping Ground +4 [THS:182] Voyaging Satyr +3 [THS:150] Arbor Colossus +4 [THS:172] Polukranos, World Eater +3 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 3 [RTR:101] Mizzium Mortars +SB: 2 [M15:134] Chandra, Pyromaster +SB: 2 [THS:167] Nylea's Disciple +SB: 2 [GTC:139] Wasteland Viper +SB: 1 [THS:209] Xenagos, the Reveler +SB: 1 [GTC:136] Sylvan Primordial +SB: 1 [THS:162] Mistcutter Hydra +SB: 2 [M14:130] Burning Earth +SB: 1 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..44f9b6e4faa --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,22 @@ +4 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +9 [UNH:140] Forest +1 [THS:166] Nylea, God of the Hunt +4 [GTC:216] Burning-Tree Emissary +2 [THS:209] Xenagos, the Reveler +4 [M14:172] Garruk, Caller of Beasts +2 [M14:195] Scavenging Ooze +2 [UNH:139] Mountain +1 [DGM:99] Ruric Thar, the Unbowed +4 [GTC:247] Stomping Ground +4 [THS:182] Voyaging Satyr +3 [THS:150] Arbor Colossus +4 [THS:172] Polukranos, World Eater +4 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 4 [THS:167] Nylea's Disciple +SB: 3 [GTC:139] Wasteland Viper +SB: 4 [THS:162] Mistcutter Hydra +SB: 3 [M14:130] Burning Earth +SB: 1 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..1ecf6e4e653 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,22 @@ +4 [THS:223] Nykthos, Shrine to Nyx +3 [THS:135] Purphoros, God of the Forge +2 [THS:124] Hammer of Purphoros +4 [THS:224] Temple of Abandon +4 [RTR:86] Ash Zealot +4 [THS:121] Fanatic of Mogis +4 [THS:143] Stormbreath Dragon +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +2 [THS:209] Xenagos, the Reveler +11 [UNH:139] Mountain +4 [RTR:215] Frostburn Weird +2 [C13:294] Gruul Guildgate +4 [GTC:247] Stomping Ground +4 [GTC:156] Domri Rade +SB: 2 [M15:134] Chandra, Pyromaster +SB: 4 [RTR:101] Mizzium Mortars +SB: 2 [M14:155] Shock +SB: 2 [THS:120] Ember Swallower +SB: 1 [M14:215] Ratchet Bomb +SB: 2 [THS:112] Anger of the Gods +SB: 2 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2014.mwDeck.dck new file mode 100644 index 00000000000..8c0689faa37 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul TDtB ST Oct 2014.mwDeck.dck @@ -0,0 +1,25 @@ +4 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +9 [UNH:140] Forest +2 [THS:166] Nylea, God of the Hunt +2 [THS:209] Xenagos, the Reveler +4 [KTK:249] Wooded Foothills +2 [M15:172] Chord of Calling +2 [KTK:106] Crater's Claws +4 [M15:176] Genesis Hydra +1 [M15:187] Nissa, Worldwaker +2 [UNH:139] Mountain +2 [M15:178] Hornet Queen +4 [KTK:144] Rattleclaw Mystic +4 [BNG:119] Courser of Kruphix +2 [THS:150] Arbor Colossus +3 [THS:172] Polukranos, World Eater +1 [THS:173] Reverent Hunter +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 1 [C14:213] Reclamation Sage +SB: 2 [THS:143] Stormbreath Dragon +SB: 3 [M15:229] Scuttling Doom Engine +SB: 2 [KTK:206] Surrak Dragonclaw +SB: 4 [THS:162] Mistcutter Hydra +SB: 3 [JOU:140] Setessan Tactics diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(1) TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(1) TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..464c3582227 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(1) TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,22 @@ +4 [THS:223] Nykthos, Shrine to Nyx +2 [THS:135] Purphoros, God of the Forge +4 [THS:224] Temple of Abandon +4 [RTR:86] Ash Zealot +4 [THS:121] Fanatic of Mogis +4 [THS:143] Stormbreath Dragon +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +1 [THS:228] Temple of Triumph +12 [UNH:139] Mountain +2 [M15:134] Chandra, Pyromaster +3 [RTR:101] Mizzium Mortars +4 [RTR:215] Frostburn Weird +4 [GTC:247] Stomping Ground +4 [GTC:156] Domri Rade +SB: 1 [RTR:101] Mizzium Mortars +SB: 2 [RTR:231] Pithing Needle +SB: 3 [THS:112] Anger of the Gods +SB: 2 [THS:209] Xenagos, the Reveler +SB: 2 [M15:192] Plummet +SB: 3 [THS:162] Mistcutter Hydra +SB: 2 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(2) TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(2) TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..3dd033549f4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Gruul(2) TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,22 @@ +4 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +9 [UNH:140] Forest +1 [THS:166] Nylea, God of the Hunt +4 [GTC:216] Burning-Tree Emissary +2 [THS:209] Xenagos, the Reveler +4 [M14:172] Garruk, Caller of Beasts +2 [M14:195] Scavenging Ooze +2 [UNH:139] Mountain +1 [DGM:99] Ruric Thar, the Unbowed +4 [GTC:247] Stomping Ground +4 [THS:182] Voyaging Satyr +3 [THS:150] Arbor Colossus +4 [THS:172] Polukranos, World Eater +4 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 3 [GTC:139] Wasteland Viper +SB: 4 [THS:167] Nylea's Disciple +SB: 4 [THS:162] Mistcutter Hydra +SB: 3 [M14:130] Burning Earth +SB: 1 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Red TDtB ST Feb 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Red TDtB ST Feb 2014.mwDeck.dck new file mode 100644 index 00000000000..b93a8a226f0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Red TDtB ST Feb 2014.mwDeck.dck @@ -0,0 +1,22 @@ +4 [THS:223] Nykthos, Shrine to Nyx +2 [THS:135] Purphoros, God of the Forge +3 [THS:124] Hammer of Purphoros +2 [THS:224] Temple of Abandon +4 [RTR:86] Ash Zealot +4 [THS:121] Fanatic of Mogis +4 [THS:143] Stormbreath Dragon +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [THS:228] Temple of Triumph +11 [UNH:139] Mountain +3 [RTR:101] Mizzium Mortars +3 [THS:4] Chained to the Rocks +4 [RTR:215] Frostburn Weird +4 [GTC:245] Sacred Foundry +SB: 1 [THS:135] Purphoros, God of the Forge +SB: 1 [RTR:101] Mizzium Mortars +SB: 4 [C13:179] Boros Charm +SB: 1 [THS:4] Chained to the Rocks +SB: 3 [THS:112] Anger of the Gods +SB: 2 [DGM:135] Wear // Tear +SB: 3 [GTC:142] Assemble the Legion diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Apr 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Apr 2015.mwDeck.dck new file mode 100644 index 00000000000..2df29717f04 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Apr 2015.mwDeck.dck @@ -0,0 +1,25 @@ +4 [THS:223] Nykthos, Shrine to Nyx +2 [DTK:180] Deathmist Raptor +4 [FRF:19] Mastery of the Unseen +1 [FRF:141] Temur Sabertooth +4 [UNH:140] Forest +4 [KTK:248] Windswept Heath +4 [KTK:249] Wooded Foothills +3 [M15:176] Genesis Hydra +4 [FRF:145] Whisperwood Elemental +1 [UNH:139] Mountain +4 [BNG:119] Courser of Kruphix +3 [THS:182] Voyaging Satyr +4 [BNG:165] Temple of Plenty +2 [THS:150] Arbor Colossus +4 [THS:172] Polukranos, World Eater +2 [DTK:221] Dromoka's Command +4 [C14:191] Elvish Mystic +2 [UNH:136] Plains +4 [THS:180] Sylvan Caryatid +SB: 3 [THS:167] Nylea's Disciple +SB: 4 [THS:193] Fleecemane Lion +SB: 3 [THS:209] Xenagos, the Reveler +SB: 2 [THS:150] Arbor Colossus +SB: 1 [DTK:221] Dromoka's Command +SB: 2 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Mar 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Mar 2015.mwDeck.dck new file mode 100644 index 00000000000..7744577cadc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST Mar 2015.mwDeck.dck @@ -0,0 +1,27 @@ +1 [FRF:166] Blossoming Sands +4 [THS:223] Nykthos, Shrine to Nyx +4 [FRF:19] Mastery of the Unseen +1 [FRF:141] Temur Sabertooth +9 [UNH:140] Forest +1 [JOU:5] Banishing Light +4 [KTK:248] Windswept Heath +4 [M15:176] Genesis Hydra +4 [FRF:145] Whisperwood Elemental +4 [BNG:119] Courser of Kruphix +2 [THS:193] Fleecemane Lion +4 [THS:182] Voyaging Satyr +4 [BNG:165] Temple of Plenty +4 [THS:172] Polukranos, World Eater +4 [C14:191] Elvish Mystic +2 [UNH:136] Plains +4 [THS:180] Sylvan Caryatid +SB: 2 [M15:177] Hornet Nest +SB: 1 [FRF:28] Valorous Stance +SB: 2 [C14:213] Reclamation Sage +SB: 1 [M15:178] Hornet Queen +SB: 2 [THS:159] Hunt the Hunter +SB: 1 [THS:15] Glare of Heresy +SB: 2 [THS:193] Fleecemane Lion +SB: 1 [JOU:140] Setessan Tactics +SB: 1 [THS:22] Last Breath +SB: 2 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST May 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST May 2015.mwDeck.dck new file mode 100644 index 00000000000..3f7f5b4d04d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Devotion to Selesnya TDtB ST May 2015.mwDeck.dck @@ -0,0 +1,23 @@ +1 [FRF:166] Blossoming Sands +4 [THS:223] Nykthos, Shrine to Nyx +4 [FRF:19] Mastery of the Unseen +1 [DTK:181] Den Protector +9 [UNH:140] Forest +4 [KTK:248] Windswept Heath +3 [M15:176] Genesis Hydra +4 [FRF:145] Whisperwood Elemental +2 [DTK:217] Dragonlord Dromoka +4 [BNG:119] Courser of Kruphix +2 [FRF:1] Ugin, the Spirit Dragon +4 [THS:182] Voyaging Satyr +4 [BNG:165] Temple of Plenty +4 [THS:172] Polukranos, World Eater +4 [C14:191] Elvish Mystic +2 [UNH:136] Plains +4 [THS:180] Sylvan Caryatid +SB: 3 [DTK:181] Den Protector +SB: 2 [JOU:145] Ajani, Mentor of Heroes +SB: 3 [THS:167] Nylea's Disciple +SB: 4 [THS:193] Fleecemane Lion +SB: 2 [THS:150] Arbor Colossus +SB: 1 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Domri Naya TDtB ST Aug 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Domri Naya TDtB ST Aug 2013.mwDeck.dck new file mode 100644 index 00000000000..4499cd2970e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Domri Naya TDtB ST Aug 2013.mwDeck.dck @@ -0,0 +1,31 @@ +3 [M13:229] Sunpetal Grove +1 [UNH:140] Forest +4 [M13:228] Rootbound Crag +4 [GTC:215] Boros Reckoner +3 [M14:195] Scavenging Ooze +3 [RTR:178] Loxodon Smiter +1 [RTR:101] Mizzium Mortars +4 [M13:150] Thundermaw Hellkite +2 [C13:211] Selesnya Charm +1 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +1 [ISD:243] Kessig Wolf Run +4 [RTR:248] Temple Garden +3 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [GTC:245] Sacred Foundry +2 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +1 [DKA:140] Huntmaster of the Fells +3 [ISD:238] Clifftop Retreat +4 [DGM:114] Voice of Resurgence +SB: 1 [RTR:101] Mizzium Mortars +SB: 1 [DKA:17] Ray of Revelation +SB: 2 [C13:179] Boros Charm +SB: 2 [DGM:111] Unflinching Courage +SB: 1 [AVR:149] Pillar of Flame +SB: 1 [M14:12] Celestial Flare +SB: 2 [DGM:99] Ruric Thar, the Unbowed +SB: 2 [M13:22] Oblivion Ring +SB: 1 [RTR:18] Rest in Peace +SB: 2 [M14:130] Burning Earth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Eldrazi Green-Black TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Eldrazi Green-Black TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..68569150f3d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Eldrazi Green-Black TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,25 @@ +1 [ROE:12] Ulamog, the Infinite Gyre +3 [ROE:186] Growth Spasm +10 [UNH:140] Forest +4 [ROE:190] Joraga Treespeaker +1 [ROE:6] Kozilek, Butcher of Truth +4 [ROE:227] Eldrazi Temple +1 [ROE:4] Emrakul, the Aeons Torn +1 [WWK:136] Eye of Ugin +4 [ROE:203] Overgrown Battlement +4 [M12:188] Primeval Titan +4 [C14:239] Everflowing Chalice +4 [ZEN:184] Summoning Trap +3 [C13:302] Khalni Garden +2 [ROE:1] All Is Dust +4 [C14:313] Tectonic Edge +4 [ZEN:229] Verdant Catacombs +2 [C14:283] Wurmcoil Engine +3 [WWK:99] Explore +1 [UNH:138] Swamp +SB: 3 [SOM:69] Memoricide +SB: 4 [M14:96] Doom Blade +SB: 4 [M11:188] Obstinate Baloth +SB: 1 [WWK:136] Eye of Ugin +SB: 2 [C14:218] Terastodon +SB: 1 [ROE:1] All Is Dust diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..b3d60e24e22 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,20 @@ +3 [ZEN:170] Nissa Revane +15 [UNH:140] Forest +3 [ROE:190] Joraga Treespeaker +3 [ZEN:199] Eldrazi Monument +4 [ZEN:171] Nissa's Chosen +4 [C14:305] Oran-Rief, the Vastwood +3 [ROE:212] Vengevine +2 [C14:216] Sylvan Ranger +4 [C14:204] Llanowar Elves +3 [C14:203] Joraga Warcaller +3 [M11:172] Fauna Shaman +4 [M13:160] Arbor Elf +3 [C14:195] Ezuri, Renegade Leader +4 [C14:190] Elvish Archdruid +2 [SOM:122] Genesis Wave +SB: 4 [M11:183] Leyline of Vitality +SB: 3 [C13:134] Acidic Slime +SB: 2 [CMD:157] Garruk Wildspeaker +SB: 3 [M11:202] Brittle Effigy +SB: 3 [ROE:211] Tajuru Preserver diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..d8a92dea12c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Elves TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,20 @@ +4 [CNS:170] Lead the Stampede +4 [CNS:160] Copperhorn Scout +20 [UNH:140] Forest +4 [ROE:190] Joraga Treespeaker +3 [ROE:212] Vengevine +2 [C14:216] Sylvan Ranger +4 [C14:204] Llanowar Elves +1 [C14:225] Wolfbriar Elemental +2 [C14:203] Joraga Warcaller +4 [M11:172] Fauna Shaman +4 [M13:160] Arbor Elf +4 [C14:195] Ezuri, Renegade Leader +4 [C14:190] Elvish Archdruid +SB: 4 [M11:183] Leyline of Vitality +SB: 1 [MBS:78] Creeping Corrosion +SB: 3 [CNS:171] Nature's Claim +SB: 2 [MBS:94] Viridian Corrupter +SB: 1 [M11:188] Obstinate Baloth +SB: 3 [NPH:159] Spellskite +SB: 1 [WWK:107] Leatherback Baloth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2012.mwDeck.dck new file mode 100644 index 00000000000..0378a406691 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2012.mwDeck.dck @@ -0,0 +1,31 @@ +2 [MBS:21] Consecrated Sphinx +1 [MBS:43] Go for the Throat +2 [M12:16] Gideon Jura +2 [M13:225] Glacial Fortress +2 [M13:223] Drowned Catacomb +2 [ISD:78] Snapcaster Mage +2 [ISD:55] Forbidden Alchemy +4 [ISD:242] Isolated Chapel +3 [C14:295] Evolving Wilds +4 [SOM:229] Seachrome Coast +1 [M14:96] Doom Blade +1 [SOM:226] Darkslick Shores +2 [MBS:115] Mortarpod +4 [DKA:12] Lingering Souls +3 [M12:12] Day of Judgment +3 [UNH:136] Plains +2 [DKA:142] Sorin, Lord of Innistrad +2 [UNH:137] Island +3 [ISD:94] Curse of Death's Hold +3 [ISD:83] Think Twice +5 [UNH:138] Swamp +3 [ISD:105] Liliana of the Veil +4 [M12:63] Mana Leak +SB: 1 [C14:136] Black Sun's Zenith +SB: 3 [M14:215] Ratchet Bomb +SB: 2 [CNS:72] Intangible Virtue +SB: 1 [SOM:53] Volition Reins +SB: 1 [NPH:130] Batterskull +SB: 3 [M12:11] Celestial Purge +SB: 3 [KTK:69] Despise +SB: 1 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2013.mwDeck.dck new file mode 100644 index 00000000000..760326eaa92 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2013.mwDeck.dck @@ -0,0 +1,33 @@ +2 [AVR:32] Restoration Angel +1 [RTR:82] Ultimate Price +4 [C13:30] Augur of Bolas +3 [RTR:54] Syncopate +4 [GTC:249] Watery Grave +4 [M13:225] Glacial Fortress +2 [M13:223] Drowned Catacomb +4 [RTR:241] Hallowed Fountain +2 [ISD:78] Snapcaster Mage +4 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [ISD:242] Isolated Chapel +1 [M15:51] Dissipate +4 [ISD:245] Nephalia Drownyard +1 [M13:22] Oblivion Ring +1 [GTC:154] Dimir Charm +2 [GTC:63] Devour Flesh +3 [GTC:242] Godless Shrine +1 [UNH:137] Island +1 [M14:60] Jace, Memory Adept +4 [ISD:83] Think Twice +SB: 3 [C14:167] Tragic Slip +SB: 1 [ISD:27] Purify the Grave +SB: 1 [AVR:84] Appetite for Brains +SB: 1 [ISD:236] Witchbane Orb +SB: 1 [RTR:47] Psychic Spiral +SB: 1 [RTR:36] Dispel +SB: 1 [M14:97] Duress +SB: 2 [ISD:212] Evil Twin +SB: 2 [RTR:18] Rest in Peace +SB: 1 [ISD:94] Curse of Death's Hold +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2014.mwDeck.dck new file mode 100644 index 00000000000..4af6e626cb3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Apr 2014.mwDeck.dck @@ -0,0 +1,29 @@ +4 [THS:225] Temple of Deceit +4 [THS:47] Dissolve +2 [RTR:54] Syncopate +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +2 [THS:107] Thoughtseize +4 [RTR:201] Supreme Verdict +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +1 [DGM:11] AEtherling +2 [M14:228] Mutavault +1 [BNG:25] Revoke Existence +2 [M14:96] Doom Blade +4 [RTR:44] Jace, Architect of Thought +2 [GTC:242] Godless Shrine +2 [UNH:136] Plains +3 [THS:9] Elspeth, Sun's Champion +5 [UNH:137] Island +2 [THS:22] Last Breath +4 [BNG:163] Temple of Enlightenment +SB: 2 [RTR:82] Ultimate Price +SB: 2 [GTC:6] Blind Obedience +SB: 1 [RTR:231] Pithing Needle +SB: 2 [M14:18] Fiendslayer Paladin +SB: 2 [THS:49] Gainsay +SB: 1 [BNG:25] Revoke Existence +SB: 1 [THS:83] Dark Betrayal +SB: 2 [THS:107] Thoughtseize +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..50d8674ab22 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,37 @@ +4 [M13:225] Glacial Fortress +4 [M13:223] Drowned Catacomb +1 [C14:104] Cyclonic Rift +2 [RTR:201] Supreme Verdict +1 [ISD:55] Forbidden Alchemy +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [ISD:242] Isolated Chapel +2 [M15:51] Dissipate +4 [ISD:245] Nephalia Drownyard +2 [DKA:12] Lingering Souls +1 [UNH:136] Plains +1 [DKA:142] Sorin, Lord of Innistrad +3 [UNH:137] Island +1 [ISD:94] Curse of Death's Hold +3 [AVR:38] Terminus +2 [UNH:138] Swamp +1 [M15:71] Negate +2 [RTR:82] Ultimate Price +1 [AVR:79] Tamiyo, the Moon Sage +4 [RTR:241] Hallowed Fountain +2 [RTR:155] Detention Sphere +1 [C14:298] Ghost Quarter +1 [C14:295] Evolving Wilds +2 [RTR:44] Jace, Architect of Thought +1 [M14:60] Jace, Memory Adept +3 [ISD:83] Think Twice +SB: 1 [RTR:201] Supreme Verdict +SB: 1 [RTR:155] Detention Sphere +SB: 2 [ISD:14] Feeling of Dread +SB: 1 [ISD:115] Sever the Bloodline +SB: 1 [RTR:36] Dispel +SB: 3 [RTR:18] Rest in Peace +SB: 1 [AVR:38] Terminus +SB: 1 [M14:60] Jace, Memory Adept +SB: 1 [ISD:94] Curse of Death's Hold +SB: 3 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..1e16ccf56bc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,30 @@ +1 [RTR:82] Ultimate Price +4 [THS:225] Temple of Deceit +2 [THS:47] Dissolve +1 [RTR:54] Syncopate +4 [GTC:249] Watery Grave +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +2 [THS:107] Thoughtseize +4 [RTR:201] Supreme Verdict +3 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +2 [DGM:11] AEtherling +2 [THS:90] Hero's Downfall +1 [M14:96] Doom Blade +1 [DGM:127] Far // Away +4 [RTR:44] Jace, Architect of Thought +1 [GTC:63] Devour Flesh +1 [GTC:154] Dimir Charm +3 [GTC:242] Godless Shrine +4 [UNH:136] Plains +4 [UNH:137] Island +SB: 1 [RTR:231] Pithing Needle +SB: 3 [M14:18] Fiendslayer Paladin +SB: 2 [DGM:57] Blood Baron of Vizkopa +SB: 3 [THS:49] Gainsay +SB: 3 [RTR:73] Pack Rat +SB: 1 [M14:116] Shrivel +SB: 1 [M14:96] Doom Blade +SB: 1 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..4eea2bbab98 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,30 @@ +3 [AVR:32] Restoration Angel +1 [RTR:82] Ultimate Price +2 [M14:29] Planar Cleansing +4 [C13:30] Augur of Bolas +2 [GTC:249] Watery Grave +4 [M13:225] Glacial Fortress +4 [M13:223] Drowned Catacomb +4 [RTR:241] Hallowed Fountain +2 [ISD:78] Snapcaster Mage +4 [RTR:201] Supreme Verdict +1 [RTR:156] Dramatic Rescue +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [ISD:242] Isolated Chapel +2 [M15:51] Dissipate +4 [ISD:245] Nephalia Drownyard +2 [GTC:63] Devour Flesh +1 [UNH:136] Plains +2 [GTC:242] Godless Shrine +2 [UNH:137] Island +4 [ISD:83] Think Twice +SB: 3 [AVR:104] Gloom Surgeon +SB: 2 [RTR:1] Angel of Serenity +SB: 2 [ISD:236] Witchbane Orb +SB: 1 [RTR:47] Psychic Spiral +SB: 1 [RTR:36] Dispel +SB: 2 [M14:97] Duress +SB: 1 [RTR:18] Rest in Peace +SB: 2 [M14:60] Jace, Memory Adept +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..4eea2bbab98 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,30 @@ +3 [AVR:32] Restoration Angel +1 [RTR:82] Ultimate Price +2 [M14:29] Planar Cleansing +4 [C13:30] Augur of Bolas +2 [GTC:249] Watery Grave +4 [M13:225] Glacial Fortress +4 [M13:223] Drowned Catacomb +4 [RTR:241] Hallowed Fountain +2 [ISD:78] Snapcaster Mage +4 [RTR:201] Supreme Verdict +1 [RTR:156] Dramatic Rescue +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [ISD:242] Isolated Chapel +2 [M15:51] Dissipate +4 [ISD:245] Nephalia Drownyard +2 [GTC:63] Devour Flesh +1 [UNH:136] Plains +2 [GTC:242] Godless Shrine +2 [UNH:137] Island +4 [ISD:83] Think Twice +SB: 3 [AVR:104] Gloom Surgeon +SB: 2 [RTR:1] Angel of Serenity +SB: 2 [ISD:236] Witchbane Orb +SB: 1 [RTR:47] Psychic Spiral +SB: 1 [RTR:36] Dispel +SB: 2 [M14:97] Duress +SB: 1 [RTR:18] Rest in Peace +SB: 2 [M14:60] Jace, Memory Adept +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..d109f21d9c9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,30 @@ +4 [THS:225] Temple of Deceit +4 [THS:47] Dissolve +2 [RTR:54] Syncopate +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +1 [THS:107] Thoughtseize +4 [RTR:201] Supreme Verdict +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +1 [DGM:11] AEtherling +2 [M14:228] Mutavault +1 [BNG:25] Revoke Existence +2 [M14:96] Doom Blade +4 [RTR:44] Jace, Architect of Thought +2 [GTC:242] Godless Shrine +2 [UNH:136] Plains +3 [THS:9] Elspeth, Sun's Champion +5 [UNH:137] Island +2 [THS:22] Last Breath +4 [BNG:163] Temple of Enlightenment +1 [M15:71] Negate +SB: 2 [RTR:82] Ultimate Price +SB: 2 [GTC:6] Blind Obedience +SB: 1 [RTR:231] Pithing Needle +SB: 1 [M14:18] Fiendslayer Paladin +SB: 2 [THS:49] Gainsay +SB: 1 [BNG:25] Revoke Existence +SB: 2 [THS:83] Dark Betrayal +SB: 3 [THS:107] Thoughtseize +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2014.mwDeck.dck new file mode 100644 index 00000000000..286545eace3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2014.mwDeck.dck @@ -0,0 +1,32 @@ +3 [RTR:82] Ultimate Price +4 [THS:225] Temple of Deceit +3 [THS:47] Dissolve +1 [JOU:7] Deicide +3 [RTR:54] Syncopate +3 [GTC:249] Watery Grave +1 [M14:68] Quicken +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +4 [RTR:201] Supreme Verdict +1 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +3 [RTR:155] Detention Sphere +1 [DGM:11] AEtherling +3 [THS:90] Hero's Downfall +1 [M14:228] Mutavault +4 [RTR:44] Jace, Architect of Thought +1 [UNH:136] Plains +3 [GTC:242] Godless Shrine +3 [THS:9] Elspeth, Sun's Champion +2 [UNH:137] Island +4 [BNG:163] Temple of Enlightenment +SB: 2 [JOU:18] Nyx-Fleece Ram +SB: 1 [JOU:7] Deicide +SB: 1 [THS:49] Gainsay +SB: 1 [M14:5] Archangel of Thune +SB: 1 [M14:96] Doom Blade +SB: 3 [GTC:222] Nightveil Specter +SB: 1 [GTC:154] Dimir Charm +SB: 2 [THS:107] Thoughtseize +SB: 2 [DGM:103] Sin Collector +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2015.mwDeck.dck new file mode 100644 index 00000000000..d81b73202c7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST May 2015.mwDeck.dck @@ -0,0 +1,32 @@ +4 [THS:225] Temple of Deceit +2 [THS:47] Dissolve +1 [THS:188] Ashiok, Nightmare Weaver +4 [KTK:239] Polluted Delta +4 [KTK:36] Dig Through Time +3 [THS:107] Thoughtseize +1 [KTK:233] Flooded Strand +2 [M15:241] Caves of Koilos +4 [FRF:168] Dismal Backwater +1 [FRF:157] Silumgar, the Drifting Death +2 [DTK:249] Haven of the Spirit Dragon +3 [BNG:61] Bile Blight +4 [DTK:219] Dragonlord Ojutai +3 [DTK:102] Foul-Tongue Invocation +1 [M15:248] Urborg, Tomb of Yawgmoth +3 [THS:90] Hero's Downfall +1 [DTK:220] Dragonlord Silumgar +2 [DTK:45] Anticipate +4 [DTK:78] Silumgar's Scorn +2 [FRF:65] Crux of Fate +3 [UNH:137] Island +2 [UNH:138] Swamp +4 [BNG:163] Temple of Enlightenment +SB: 1 [BNG:61] Bile Blight +SB: 2 [DTK:124] Ultimate Price +SB: 2 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [DTK:80] Stratus Dancer +SB: 1 [DTK:220] Dragonlord Silumgar +SB: 2 [FRF:87] Tasigur, the Golden Fang +SB: 3 [BNG:65] Drown in Sorrow +SB: 1 [THS:107] Thoughtseize +SB: 2 [DTK:52] Dragonlord's Prerogative diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..32518090e1d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,27 @@ +4 [THS:225] Temple of Deceit +3 [THS:47] Dissolve +4 [GTC:249] Watery Grave +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +2 [THS:107] Thoughtseize +4 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +2 [DGM:57] Blood Baron of Vizkopa +1 [DGM:11] AEtherling +2 [THS:90] Hero's Downfall +4 [RTR:44] Jace, Architect of Thought +2 [M15:52] Divination +3 [UNH:136] Plains +4 [GTC:242] Godless Shrine +1 [THS:9] Elspeth, Sun's Champion +4 [UNH:137] Island +SB: 1 [RTR:82] Ultimate Price +SB: 1 [RTR:231] Pithing Needle +SB: 2 [DGM:57] Blood Baron of Vizkopa +SB: 4 [THS:49] Gainsay +SB: 2 [M14:96] Doom Blade +SB: 1 [THS:83] Dark Betrayal +SB: 2 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..ca6badb6c3b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Control TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,27 @@ +4 [THS:225] Temple of Deceit +3 [THS:47] Dissolve +4 [GTC:249] Watery Grave +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +2 [THS:107] Thoughtseize +4 [RTR:201] Supreme Verdict +3 [RTR:200] Sphinx's Revelation +4 [RTR:145] Azorius Charm +1 [RTR:155] Detention Sphere +1 [DGM:11] AEtherling +4 [THS:90] Hero's Downfall +4 [M14:96] Doom Blade +4 [RTR:44] Jace, Architect of Thought +2 [M15:52] Divination +2 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +4 [UNH:137] Island +SB: 2 [RTR:155] Detention Sphere +SB: 2 [DGM:57] Blood Baron of Vizkopa +SB: 1 [THS:49] Gainsay +SB: 1 [DGM:11] AEtherling +SB: 1 [THS:107] Thoughtseize +SB: 2 [M15:71] Negate +SB: 2 [DGM:103] Sin Collector +SB: 4 [THS:32] Soldier of the Pantheon diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Dragon TDtB ST Apr 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Dragon TDtB ST Apr 2015.mwDeck.dck new file mode 100644 index 00000000000..a2d0b26172d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Dragon TDtB ST Apr 2015.mwDeck.dck @@ -0,0 +1,30 @@ +4 [THS:225] Temple of Deceit +4 [THS:47] Dissolve +4 [KTK:239] Polluted Delta +4 [KTK:36] Dig Through Time +1 [THS:107] Thoughtseize +1 [KTK:233] Flooded Strand +4 [FRF:168] Dismal Backwater +2 [FRF:157] Silumgar, the Drifting Death +2 [DTK:249] Haven of the Spirit Dragon +2 [DTK:219] Dragonlord Ojutai +1 [DTK:102] Foul-Tongue Invocation +2 [DTK:124] Ultimate Price +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [FRF:1] Ugin, the Spirit Dragon +4 [THS:90] Hero's Downfall +4 [DTK:45] Anticipate +4 [DTK:78] Silumgar's Scorn +3 [FRF:65] Crux of Fate +2 [M15:63] Jace's Ingenuity +3 [UNH:137] Island +3 [UNH:138] Swamp +4 [BNG:163] Temple of Enlightenment +SB: 1 [BNG:61] Bile Blight +SB: 2 [DTK:102] Foul-Tongue Invocation +SB: 2 [FRF:87] Tasigur, the Golden Fang +SB: 2 [DTK:220] Dragonlord Silumgar +SB: 3 [BNG:65] Drown in Sorrow +SB: 2 [THS:107] Thoughtseize +SB: 2 [DTK:52] Dragonlord's Prerogative +SB: 1 [DTK:65] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Feb 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Feb 2014.mwDeck.dck new file mode 100644 index 00000000000..9c5f2004b48 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Feb 2014.mwDeck.dck @@ -0,0 +1,26 @@ +2 [RTR:82] Ultimate Price +4 [THS:225] Temple of Deceit +4 [M14:22] Imposing Sovereign +2 [THS:110] Whip of Erebos +3 [GTC:249] Watery Grave +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +4 [RTR:179] Lyev Skyknight +2 [RTR:201] Supreme Verdict +3 [M14:123] Xathrid Necromancer +4 [RTR:155] Detention Sphere +3 [GTC:182] Obzedat, Ghost Council +2 [M14:228] Mutavault +1 [DGM:127] Far // Away +2 [BNG:145] Ephara, God of the Polis +3 [RTR:17] Precinct Captain +4 [GTC:242] Godless Shrine +4 [UNH:136] Plains +1 [THS:33] Spear of Heliod +4 [THS:32] Soldier of the Pantheon +SB: 2 [THS:15] Glare of Heresy +SB: 3 [DGM:57] Blood Baron of Vizkopa +SB: 2 [THS:49] Gainsay +SB: 2 [M14:96] Doom Blade +SB: 2 [THS:83] Dark Betrayal +SB: 4 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Jul 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Jul 2012.mwDeck.dck new file mode 100644 index 00000000000..aeceb56e394 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Esper Midrange TDtB ST Jul 2012.mwDeck.dck @@ -0,0 +1,32 @@ +4 [AVR:32] Restoration Angel +2 [MBS:43] Go for the Throat +1 [AVR:79] Tamiyo, the Moon Sage +2 [M12:16] Gideon Jura +4 [M13:225] Glacial Fortress +3 [NPH:4] Blade Splicer +1 [M13:223] Drowned Catacomb +4 [ISD:78] Snapcaster Mage +2 [DKA:158] Vault of the Archangel +1 [MBS:5] Divine Offering +2 [NPH:86] Gut Shot +4 [DKA:52] Thought Scour +2 [C14:295] Evolving Wilds +4 [SOM:229] Seachrome Coast +2 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +4 [DKA:12] Lingering Souls +2 [UNH:136] Plains +2 [M12:72] Phantasmal Image +3 [UNH:137] Island +4 [M12:73] Ponder +1 [UNH:138] Swamp +2 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [C14:298] Ghost Quarter +SB: 2 [M15:51] Dissipate +SB: 2 [C14:91] Sun Titan +SB: 2 [M12:11] Celestial Purge +SB: 2 [M12:12] Day of Judgment +SB: 1 [M13:22] Oblivion Ring +SB: 2 [C13:249] Nihil Spellbomb +SB: 2 [M12:72] Phantasmal Image diff --git a/Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..d492fda3016 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,26 @@ +1 [M13:228] Rootbound Crag +6 [UNH:140] Forest +4 [M12:165] Birds of Paradise +1 [C14:204] Llanowar Elves +1 [UNH:139] Mountain +2 [C13:114] Inferno Titan +4 [ISD:170] Avacyn's Pilgrim +4 [ISD:122] Unburial Rites +4 [DKA:128] Tracker's Instincts +4 [C14:175] Faithless Looting +4 [NPH:9] Elesh Norn, Grand Cenobite +4 [ISD:196] Mulch +4 [SOM:228] Razorverge Thicket +2 [C14:283] Wurmcoil Engine +2 [SOM:226] Darkslick Shores +4 [DKA:12] Lingering Souls +4 [SOM:225] Copperline Gorge +4 [SOM:224] Blackcleave Cliffs +1 [UNH:136] Plains +SB: 3 [DKA:17] Ray of Revelation +SB: 2 [ISD:66] Memory's Journey +SB: 1 [ISD:27] Purify the Grave +SB: 2 [ISD:122] Unburial Rites +SB: 2 [NPH:37] Jin-Gitaxias, Core Augur +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 4 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Oct 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Oct 2012.mwDeck.dck new file mode 100644 index 00000000000..85d1b018cd9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/FRites TDtB ST Oct 2012.mwDeck.dck @@ -0,0 +1,29 @@ +4 [AVR:32] Restoration Angel +3 [M13:229] Sunpetal Grove +5 [UNH:140] Forest +4 [RTR:1] Angel of Serenity +1 [DKA:158] Vault of the Archangel +4 [RTR:243] Overgrown Tomb +3 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +4 [RTR:165] Grisly Salvage +4 [ISD:122] Unburial Rites +4 [RTR:248] Temple Garden +1 [RTR:148] Centaur Healer +1 [RTR:213] Deathrite Shaman +4 [ISD:196] Mulch +2 [DKA:12] Lingering Souls +2 [AVR:169] Borderland Ranger +1 [ISD:239] Gavony Township +2 [UNH:136] Plains +2 [ISD:249] Woodland Cemetery +1 [UNH:138] Swamp +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 2 [ISD:10] Divine Reckoning +SB: 2 [RTR:148] Centaur Healer +SB: 2 [RTR:213] Deathrite Shaman +SB: 1 [ISD:115] Sever the Bloodline +SB: 2 [M14:97] Duress +SB: 2 [M13:22] Oblivion Ring +SB: 2 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..bfb6b0277e5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,26 @@ +4 [SOM:174] Memnite +3 [WWK:144] Stirring Wildwood +4 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +1 [SOM:10] Glint Hawk +4 [ROE:212] Vengevine +2 [C14:228] Argentum Armor +4 [ZEN:23] Kor Skyfisher +4 [M11:172] Fauna Shaman +4 [M15:223] Ornithopter +1 [ZEN:21] Kor Outfitter +1 [SOM:208] Sword of Body and Mind +4 [ZEN:33] Quest for the Holy Relic +4 [SOM:228] Razorverge Thicket +4 [M11:33] Squadron Hawk +1 [WWK:20] Stoneforge Mystic +8 [UNH:136] Plains +3 [SOM:156] Glint Hawk Idol +SB: 1 [ROE:33] Linvala, Keeper of Silence +SB: 1 [MBS:10] Leonin Relic-Warder +SB: 1 [M13:39] War Priest of Thune +SB: 4 [SOM:14] Leonin Arbiter +SB: 2 [WWK:17] Refraction Trap +SB: 4 [ZEN:10] Devout Lightcaster +SB: 1 [WWK:11] Kor Firewalker +SB: 1 [M11:7] Baneslayer Angel diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Mar 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Mar 2011.mwDeck.dck new file mode 100644 index 00000000000..87e7104deeb --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Fauna Quest TDtB ST Mar 2011.mwDeck.dck @@ -0,0 +1,27 @@ +4 [SOM:174] Memnite +3 [WWK:144] Stirring Wildwood +4 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +1 [SOM:10] Glint Hawk +4 [ROE:212] Vengevine +2 [C14:228] Argentum Armor +4 [ZEN:23] Kor Skyfisher +4 [M11:172] Fauna Shaman +4 [M15:223] Ornithopter +1 [ZEN:21] Kor Outfitter +1 [SOM:208] Sword of Body and Mind +4 [ZEN:33] Quest for the Holy Relic +4 [SOM:228] Razorverge Thicket +4 [M11:33] Squadron Hawk +1 [WWK:20] Stoneforge Mystic +8 [UNH:136] Plains +3 [SOM:156] Glint Hawk Idol +SB: 1 [ROE:33] Linvala, Keeper of Silence +SB: 1 [M13:39] War Priest of Thune +SB: 1 [MBS:10] Leonin Relic-Warder +SB: 2 [SOM:14] Leonin Arbiter +SB: 2 [WWK:17] Refraction Trap +SB: 2 [CMD:17] Journey to Nowhere +SB: 2 [ZEN:10] Devout Lightcaster +SB: 2 [WWK:11] Kor Firewalker +SB: 2 [M11:7] Baneslayer Angel diff --git a/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..db90f390e90 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,28 @@ +1 [C13:11] Fiend Hunter +2 [SOM:6] Elspeth Tirel +4 [M13:229] Sunpetal Grove +8 [UNH:140] Forest +2 [C14:72] Geist-Honored Monk +1 [M12:16] Gideon Jura +2 [NPH:4] Blade Splicer +2 [MBS:92] Thrun, the Last Troll +4 [M12:165] Birds of Paradise +2 [NPH:116] Mutagenic Growth +4 [ISD:170] Avacyn's Pilgrim +4 [ISD:181] Garruk Relentless +1 [NPH:9] Elesh Norn, Grand Cenobite +4 [SOM:228] Razorverge Thicket +2 [MBS:115] Mortarpod +3 [M13:22] Oblivion Ring +4 [ISD:239] Gavony Township +4 [UNH:136] Plains +3 [MBS:14] Mirran Crusader +3 [MBS:8] Hero of Bladehold +SB: 2 [KTK:142] Naturalize +SB: 2 [MBS:78] Creeping Corrosion +SB: 2 [NPH:86] Gut Shot +SB: 2 [NPH:161] Sword of War and Peace +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 1 [M12:16] Gideon Jura +SB: 1 [M13:22] Oblivion Ring +SB: 3 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..fd44a2e814d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,23 @@ +1 [NPH:161] Sword of War and Peace +4 [M13:229] Sunpetal Grove +7 [UNH:140] Forest +3 [M12:16] Gideon Jura +3 [NPH:4] Blade Splicer +4 [M12:165] Birds of Paradise +2 [ISD:23] Mikaeus, the Lunarch +4 [ISD:170] Avacyn's Pilgrim +3 [ISD:181] Garruk Relentless +2 [NPH:86] Gut Shot +4 [SOM:228] Razorverge Thicket +2 [MBS:115] Mortarpod +4 [M13:22] Oblivion Ring +4 [ISD:239] Gavony Township +5 [UNH:136] Plains +4 [MBS:14] Mirran Crusader +4 [MBS:8] Hero of Bladehold +SB: 2 [NPH:86] Gut Shot +SB: 2 [NPH:161] Sword of War and Peace +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 3 [MBS:92] Thrun, the Last Troll +SB: 2 [C13:249] Nihil Spellbomb +SB: 4 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..f9eee806beb --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/GW Aggro TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,24 @@ +3 [SOM:6] Elspeth Tirel +4 [M13:229] Sunpetal Grove +8 [UNH:140] Forest +1 [C14:72] Geist-Honored Monk +4 [NPH:4] Blade Splicer +4 [M12:165] Birds of Paradise +4 [ISD:170] Avacyn's Pilgrim +4 [ISD:181] Garruk Relentless +2 [NPH:86] Gut Shot +4 [SOM:228] Razorverge Thicket +3 [MBS:115] Mortarpod +4 [M13:22] Oblivion Ring +4 [ISD:239] Gavony Township +5 [UNH:136] Plains +2 [MBS:14] Mirran Crusader +4 [MBS:8] Hero of Bladehold +SB: 1 [ISD:23] Mikaeus, the Lunarch +SB: 2 [KTK:142] Naturalize +SB: 2 [NPH:86] Gut Shot +SB: 1 [NPH:161] Sword of War and Peace +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 2 [M12:11] Celestial Purge +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 3 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/GW Token TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/GW Token TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..3913457da79 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/GW Token TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,22 @@ +3 [SOM:6] Elspeth Tirel +4 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +1 [M12:16] Gideon Jura +4 [NPH:155] Shrine of Loyal Legions +2 [ISD:181] Garruk Relentless +4 [CNS:72] Intangible Virtue +3 [SOM:228] Razorverge Thicket +2 [NPH:57] Dismember +4 [C14:80] Midnight Haunting +2 [M12:23] Honor of the Pure +3 [M13:22] Oblivion Ring +3 [M12:12] Day of Judgment +4 [ISD:239] Gavony Township +10 [UNH:136] Plains +4 [MBS:8] Hero of Bladehold +3 [M12:40] Timely Reinforcements +SB: 3 [ISD:193] Mayor of Avabruck +SB: 4 [MBS:5] Divine Offering +SB: 3 [NPH:74] Surgical Extraction +SB: 2 [ISD:27] Purify the Grave +SB: 3 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/GWb Tokens TDtB ST Oct 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/GWb Tokens TDtB ST Oct 2012.mwDeck.dck new file mode 100644 index 00000000000..8ca4d6de5f3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/GWb Tokens TDtB ST Oct 2012.mwDeck.dck @@ -0,0 +1,31 @@ +1 [M13:229] Sunpetal Grove +5 [UNH:140] Forest +1 [RTR:1] Angel of Serenity +1 [DKA:158] Vault of the Archangel +4 [RTR:243] Overgrown Tomb +2 [C13:211] Selesnya Charm +1 [RTR:143] Armada Wurm +4 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +3 [ISD:181] Garruk Relentless +2 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +3 [CNS:72] Intangible Virtue +1 [ISD:115] Sever the Bloodline +4 [DKA:12] Lingering Souls +4 [AVR:169] Borderland Ranger +1 [M13:22] Oblivion Ring +2 [UNH:136] Plains +3 [ISD:239] Gavony Township +3 [DKA:142] Sorin, Lord of Innistrad +2 [ISD:249] Woodland Cemetery +1 [UNH:138] Swamp +SB: 1 [DKA:17] Ray of Revelation +SB: 2 [AVR:84] Appetite for Brains +SB: 4 [RTR:148] Centaur Healer +SB: 2 [RTR:1] Angel of Serenity +SB: 3 [RTR:213] Deathrite Shaman +SB: 1 [ISD:115] Sever the Bloodline +SB: 1 [RTR:208] Vraska the Unseen +SB: 1 [RTR:164] Golgari Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Goblins Deck Wins TDtB ST Apr 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Goblins Deck Wins TDtB ST Apr 2011.mwDeck.dck new file mode 100644 index 00000000000..0d338274f16 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Goblins Deck Wins TDtB ST Apr 2011.mwDeck.dck @@ -0,0 +1,46 @@ +1 [POR:214] Mountain +4 [MBS:64] Goblin Wardriver +1 [WWK:145] Tectonic Edge +3 [M10:139] Goblin Chieftain +1 [M12:138] Goblin Chieftain +1 [SHM:296] Mountain +1 [ARC:147] Mountain +1 [RTR:267] Mountain +1 [C13:352] Mountain +4 [ZEN:125] Goblin Bushwhacker +1 [DDE:69] Mountain +2 [ZEN:126] Goblin Guide +3 [MPRP:47] Burst Lightning +1 [ZEN:226] Teetering Peaks +1 [SOM:81] Arc Trail +1 [S00:102] Mountain +2 [MM2:127] Spikeshot Elder +1 [LEA:283] Mountain +1 [MMQ:345] Mountain +1 [RAV:300] Mountain +2 [GPX:6] Goblin Guide +4 [M11:135] Ember Hauler +2 [JR:1] Lightning Bolt +1 [M10:146] Lightning Bolt +1 [M10:243] Mountain +1 [M12:242] Mountain +2 [ROE:166] Staggershock +1 [C14:313] Tectonic Edge +1 [MIR:301] Mountain +1 [DDL:77] Mountain +2 [GRC:48] Staggershock +1 [ZEN:119] Burst Lightning +1 [DD3B:60] Mountain +3 [FNMP:136] Teetering Peaks +2 [SOM:104] Spikeshot Elder +1 [HOP:163] Mountain +1 [LEB:163] Lightning Bolt +1 [SOM:243] Mountain +SB: 2 [M12:151] Manic Vandal +SB: 2 [M13:141] Mark of Mutiny +SB: 1 [DDN:23] Arc Trail +SB: 1 [SOM:196] Ratchet Bomb +SB: 2 [PC2:39] Arc Trail +SB: 2 [PC2:47] Mark of Mutiny +SB: 3 [M14:215] Ratchet Bomb +SB: 2 [M11:151] Manic Vandal diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Golgari Constellation TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Golgari Constellation TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..aa1635ddd97 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Golgari Constellation TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,28 @@ +2 [THS:223] Nykthos, Shrine to Nyx +3 [THS:110] Whip of Erebos +5 [UNH:140] Forest +4 [JOU:122] Eidolon of Blossoms +2 [THS:155] Commune with the Gods +4 [JOU:165] Temple of Malady +2 [JOU:154] Pharika, God of Affliction +3 [JOU:66] Doomwake Giant +2 [KTK:248] Windswept Heath +2 [KTK:235] Jungle Hollow +2 [THS:107] Thoughtseize +4 [M15:198] Satyr Wayfinder +4 [M15:244] Llanowar Wastes +3 [M15:178] Hornet Queen +4 [BNG:119] Courser of Kruphix +4 [KTK:81] Murderous Cut +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [THS:90] Hero's Downfall +1 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +2 [UNH:138] Swamp +SB: 2 [C14:158] Read the Bones +SB: 2 [C14:213] Reclamation Sage +SB: 1 [JOU:154] Pharika, God of Affliction +SB: 2 [THS:90] Hero's Downfall +SB: 2 [THS:150] Arbor Colossus +SB: 4 [BNG:65] Drown in Sorrow +SB: 2 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Golgari Control TDtB ST Aug 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Golgari Control TDtB ST Aug 2013.mwDeck.dck new file mode 100644 index 00000000000..e64a0145eee --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Golgari Control TDtB ST Aug 2013.mwDeck.dck @@ -0,0 +1,32 @@ +1 [RTR:83] Underworld Connections +1 [UNH:140] Forest +4 [RTR:63] Desecration Demon +3 [M14:195] Scavenging Ooze +2 [RTR:141] Abrupt Decay +4 [RTR:243] Overgrown Tomb +3 [M14:101] Lifebane Zombie +4 [M13:193] Thragtusk +2 [C14:167] Tragic Slip +1 [C14:295] Evolving Wilds +3 [M14:228] Mutavault +2 [C14:140] Disciple of Bolas +1 [RTR:208] Vraska the Unseen +1 [M14:96] Doom Blade +3 [C14:150] Mutilate +3 [C14:161] Sign in Blood +1 [DGM:93] Putrefy +2 [GTC:63] Devour Flesh +4 [ISD:249] Woodland Cemetery +13 [UNH:138] Swamp +3 [ISD:105] Liliana of the Veil +SB: 1 [RTR:83] Underworld Connections +SB: 1 [M14:101] Lifebane Zombie +SB: 2 [AVR:94] Demonic Rising +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [M14:190] Primeval Bounty +SB: 1 [C14:150] Mutilate +SB: 1 [RTR:208] Vraska the Unseen +SB: 3 [M14:97] Duress +SB: 1 [RTR:164] Golgari Charm +SB: 1 [RTR:141] Abrupt Decay +SB: 1 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Apr 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Apr 2012.mwDeck.dck new file mode 100644 index 00000000000..67b764d8098 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Apr 2012.mwDeck.dck @@ -0,0 +1,29 @@ +4 [NPH:161] Sword of War and Peace +4 [M13:228] Rootbound Crag +10 [UNH:140] Forest +2 [CNS:138] Brimstone Volley +4 [MBS:81] Green Sun's Zenith +4 [M12:165] Birds of Paradise +4 [C14:204] Llanowar Elves +3 [UNH:139] Mountain +1 [C13:134] Acidic Slime +1 [ISD:170] Avacyn's Pilgrim +1 [ISD:181] Garruk Relentless +2 [ISD:243] Kessig Wolf Run +3 [NPH:42] Phyrexian Metamorph +4 [DKA:127] Strangleroot Geist +2 [ISD:176] Daybreak Ranger +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +3 [SOM:91] Galvanic Blast +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 2 [M12:150] Manabarbs +SB: 1 [C13:134] Acidic Slime +SB: 1 [MBS:138] Sword of Feast and Famine +SB: 1 [NPH:78] Act of Aggression +SB: 1 [NPH:130] Batterskull +SB: 2 [SOM:81] Arc Trail +SB: 1 [M12:188] Primeval Titan +SB: 2 [DKA:120] Increasing Savagery +SB: 1 [M12:197] Stingerfling Spider +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..554e6e18363 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,27 @@ +2 [NPH:161] Sword of War and Peace +4 [M13:228] Rootbound Crag +9 [UNH:140] Forest +2 [MBS:95] Viridian Emissary +4 [M12:165] Birds of Paradise +3 [C14:204] Llanowar Elves +2 [UNH:139] Mountain +3 [M13:185] Rancor +1 [M13:150] Thundermaw Hellkite +4 [ISD:243] Kessig Wolf Run +4 [DKA:127] Strangleroot Geist +2 [MBS:138] Sword of Feast and Famine +2 [AVR:149] Pillar of Flame +2 [AVR:206] Wolfir Silverheart +4 [AVR:129] Bonfire of the Damned +4 [SOM:225] Copperline Gorge +3 [AVR:169] Borderland Ranger +3 [DKA:140] Huntmaster of the Fells +2 [AVR:141] Hound of Griselbrand +SB: 1 [M13:185] Rancor +SB: 2 [AVR:149] Pillar of Flame +SB: 2 [M12:128] Combust +SB: 3 [AVR:166] Zealous Conscripts +SB: 2 [C14:184] Whipflare +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 1 [DKA:110] Crushing Vines +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..98ede8517fa --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,25 @@ +2 [MBS:66] Hero of Oxid Ridge +4 [NPH:161] Sword of War and Peace +4 [M13:228] Rootbound Crag +7 [UNH:140] Forest +1 [CNS:138] Brimstone Volley +4 [M12:146] Incinerate +1 [MBS:92] Thrun, the Last Troll +4 [M12:165] Birds of Paradise +4 [C14:204] Llanowar Elves +6 [UNH:139] Mountain +2 [ISD:243] Kessig Wolf Run +1 [NPH:42] Phyrexian Metamorph +4 [DKA:127] Strangleroot Geist +4 [NPH:86] Gut Shot +4 [DKA:93] Hellrider +4 [SOM:225] Copperline Gorge +2 [DKA:140] Huntmaster of the Fells +2 [SOM:91] Galvanic Blast +SB: 2 [KTK:142] Naturalize +SB: 2 [ISD:166] Traitorous Blood +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 3 [NPH:57] Dismember +SB: 2 [NPH:38] Mental Misstep +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Jul 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Jul 2012.mwDeck.dck new file mode 100644 index 00000000000..63456e38ea9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST Jul 2012.mwDeck.dck @@ -0,0 +1,28 @@ +1 [NPH:161] Sword of War and Peace +4 [M13:228] Rootbound Crag +8 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +4 [MBS:81] Green Sun's Zenith +4 [M12:165] Birds of Paradise +4 [C14:204] Llanowar Elves +2 [UNH:139] Mountain +4 [ISD:243] Kessig Wolf Run +3 [DKA:127] Strangleroot Geist +2 [AVR:226] Cavern of Souls +3 [MBS:138] Sword of Feast and Famine +3 [AVR:206] Wolfir Silverheart +4 [AVR:129] Bonfire of the Damned +2 [NPH:57] Dismember +4 [SOM:225] Copperline Gorge +3 [AVR:169] Borderland Ranger +4 [DKA:140] Huntmaster of the Fells +SB: 1 [NPH:161] Sword of War and Peace +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [M12:128] Combust +SB: 1 [AVR:206] Wolfir Silverheart +SB: 2 [C14:283] Wurmcoil Engine +SB: 2 [AVR:166] Zealous Conscripts +SB: 1 [M15:192] Plummet +SB: 1 [NPH:103] Beast Within +SB: 2 [DKA:110] Crushing Vines +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST May 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST May 2012.mwDeck.dck new file mode 100644 index 00000000000..b926075697f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gr Aggro TDtB ST May 2012.mwDeck.dck @@ -0,0 +1,28 @@ +3 [NPH:161] Sword of War and Peace +4 [M13:228] Rootbound Crag +9 [UNH:140] Forest +1 [M12:146] Incinerate +4 [MBS:81] Green Sun's Zenith +4 [M12:165] Birds of Paradise +4 [C14:204] Llanowar Elves +3 [UNH:139] Mountain +1 [C13:134] Acidic Slime +2 [ISD:181] Garruk Relentless +2 [ISD:243] Kessig Wolf Run +4 [DKA:127] Strangleroot Geist +1 [ISD:176] Daybreak Ranger +2 [DKA:93] Hellrider +1 [AVR:149] Pillar of Flame +3 [AVR:205] Wolfir Avenger +1 [AVR:206] Wolfir Silverheart +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +3 [SOM:91] Galvanic Blast +SB: 3 [KTK:142] Naturalize +SB: 1 [NPH:161] Sword of War and Peace +SB: 1 [MBS:138] Sword of Feast and Famine +SB: 2 [NPH:78] Act of Aggression +SB: 2 [AVR:166] Zealous Conscripts +SB: 2 [NPH:130] Batterskull +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 3 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Grixis Control TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Grixis Control TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..10547d5c10d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Grixis Control TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,33 @@ +2 [MBS:75] Slagstorm +1 [MBS:43] Go for the Throat +1 [NPH:130] Batterskull +3 [M13:223] Drowned Catacomb +3 [M13:222] Dragonskull Summit +2 [M12:111] Sorin's Vengeance +2 [UNH:139] Mountain +4 [ISD:78] Snapcaster Mage +4 [ISD:55] Forbidden Alchemy +2 [C14:136] Black Sun's Zenith +1 [ISD:247] Stensia Bloodhall +2 [M15:51] Dissipate +3 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +1 [SOM:224] Blackcleave Cliffs +1 [ISD:119] Tribute to Hunger +4 [UNH:137] Island +3 [ISD:139] Desperate Ravings +4 [ISD:248] Sulfur Falls +4 [UNH:138] Swamp +2 [ISD:215] Olivia Voldaren +3 [SOM:91] Galvanic Blast +4 [M12:63] Mana Leak +SB: 1 [C14:136] Black Sun's Zenith +SB: 3 [M14:215] Ratchet Bomb +SB: 1 [MBS:74] Red Sun's Zenith +SB: 1 [C14:283] Wurmcoil Engine +SB: 1 [M14:96] Doom Blade +SB: 1 [M15:51] Dissipate +SB: 2 [M12:72] Phantasmal Image +SB: 2 [NPH:159] Spellskite +SB: 2 [M15:71] Negate +SB: 1 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Grixis Tezzeret TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Grixis Tezzeret TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..fe801c19751 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Grixis Tezzeret TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,31 @@ +4 [MBS:97] Tezzeret, Agent of Bolas +1 [SOM:176] Mindslaver +2 [MBS:75] Slagstorm +1 [MBS:34] Treasure Mage +4 [WWK:134] Creeping Tar Pit +2 [SOM:46] Stoic Rebuttal +4 [C14:239] Everflowing Chalice +2 [M11:154] Pyroclasm +2 [UNH:139] Mountain +3 [C14:313] Tectonic Edge +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +3 [SOM:218] Tumble Magnet +1 [C14:283] Wurmcoil Engine +2 [MBS:145] Inkmoth Nexus +3 [MBS:134] Sphere of the Suns +3 [SOM:226] Darkslick Shores +4 [GTC:234] Prophetic Prism +3 [WWK:31] Jace, the Mind Sculptor +1 [SOM:224] Blackcleave Cliffs +2 [SOM:179] Mox Opal +3 [UNH:137] Island +2 [SOM:91] Galvanic Blast +SB: 2 [SOM:46] Stoic Rebuttal +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [SOM:96] Kuldotha Rebirth +SB: 4 [ZEN:70] Spreading Seas +SB: 3 [M14:97] Duress +SB: 1 [WWK:31] Jace, the Mind Sculptor +SB: 2 [M11:154] Pyroclasm +SB: 1 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Grixis Twin Exarch TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Grixis Twin Exarch TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..71e8b6147e2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Grixis Twin Exarch TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,25 @@ +1 [MBS:21] Consecrated Sphinx +2 [MBS:43] Go for the Throat +4 [WWK:134] Creeping Tar Pit +2 [WWK:137] Halimar Depths +4 [ROE:115] Inquisition of Kozilek +3 [NPH:159] Spellskite +4 [C13:37] Deceiver Exarch +4 [ROE:165] Splinter Twin +2 [UNH:139] Mountain +2 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +2 [NPH:57] Dismember +4 [SOM:226] Darkslick Shores +3 [M14:97] Duress +3 [WWK:31] Jace, the Mind Sculptor +4 [SOM:224] Blackcleave Cliffs +4 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 1 [MBS:21] Consecrated Sphinx +SB: 2 [KTK:120] Shatter +SB: 2 [M12:128] Combust +SB: 3 [SOM:50] Twisted Image +SB: 4 [WWK:25] Calcite Snapper +SB: 3 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Apr 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Apr 2013.mwDeck.dck new file mode 100644 index 00000000000..422f066eea4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Apr 2013.mwDeck.dck @@ -0,0 +1,22 @@ +4 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [M13:147] Searing Spear +12 [UNH:139] Mountain +2 [M13:185] Rancor +4 [M13:171] Flinthoof Boar +4 [RTR:220] Rakdos Cackler +1 [RTR:248] Temple Garden +3 [DKA:93] Hellrider +2 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [GTC:247] Stomping Ground +4 [AVR:144] Lightning Mauler +4 [GTC:167] Ghor-Clan Rampager +SB: 1 [RTR:93] Electrickery +SB: 2 [C14:278] Tormod's Crypt +SB: 2 [ISD:166] Traitorous Blood +SB: 1 [AVR:149] Pillar of Flame +SB: 3 [GTC:106] Skullcrack +SB: 2 [C14:172] Blasphemous Act +SB: 4 [M13:155] Volcanic Strength diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..95a460a583a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,20 @@ +4 [RTR:86] Ash Zealot +4 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [M13:147] Searing Spear +2 [M13:155] Volcanic Strength +10 [UNH:139] Mountain +4 [M13:185] Rancor +4 [M13:171] Flinthoof Boar +4 [RTR:220] Rakdos Cackler +4 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [GTC:247] Stomping Ground +4 [AVR:144] Lightning Mauler +SB: 3 [RTR:101] Mizzium Mortars +SB: 1 [DKA:93] Hellrider +SB: 4 [GTC:106] Skullcrack +SB: 2 [C14:172] Blasphemous Act +SB: 3 [GTC:156] Domri Rade +SB: 2 [M13:155] Volcanic Strength diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jul 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jul 2013.mwDeck.dck new file mode 100644 index 00000000000..9a1d3c60ef2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jul 2013.mwDeck.dck @@ -0,0 +1,19 @@ +4 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [M13:147] Searing Spear +12 [UNH:139] Mountain +4 [M13:171] Flinthoof Boar +4 [RTR:220] Rakdos Cackler +2 [RTR:248] Temple Garden +4 [DKA:93] Hellrider +3 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [GTC:247] Stomping Ground +4 [GTC:167] Ghor-Clan Rampager +4 [GTC:98] Madcap Skills +SB: 3 [M13:141] Mark of Mutiny +SB: 2 [RTR:93] Electrickery +SB: 3 [RTR:101] Mizzium Mortars +SB: 3 [GTC:106] Skullcrack +SB: 4 [M13:155] Volcanic Strength diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jun 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jun 2013.mwDeck.dck new file mode 100644 index 00000000000..d6e8c775023 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Jun 2013.mwDeck.dck @@ -0,0 +1,23 @@ +3 [GTC:90] Firefist Striker +4 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +3 [M13:147] Searing Spear +12 [UNH:139] Mountain +4 [M13:171] Flinthoof Boar +4 [RTR:220] Rakdos Cackler +1 [RTR:248] Temple Garden +3 [DKA:93] Hellrider +4 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [GTC:247] Stomping Ground +3 [AVR:144] Lightning Mauler +3 [GTC:167] Ghor-Clan Rampager +SB: 2 [RTR:101] Mizzium Mortars +SB: 1 [C14:278] Tormod's Crypt +SB: 3 [RTR:86] Ash Zealot +SB: 2 [ISD:166] Traitorous Blood +SB: 2 [GTC:106] Skullcrack +SB: 2 [C14:172] Blasphemous Act +SB: 1 [M13:147] Searing Spear +SB: 2 [M13:155] Volcanic Strength diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..7bd7ad080dc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,20 @@ +4 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [CNS:138] Brimstone Volley +4 [M13:147] Searing Spear +12 [UNH:139] Mountain +4 [M13:171] Flinthoof Boar +4 [RTR:220] Rakdos Cackler +4 [DKA:93] Hellrider +1 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [GTC:247] Stomping Ground +4 [AVR:144] Lightning Mauler +3 [GTC:167] Ghor-Clan Rampager +SB: 1 [RTR:101] Mizzium Mortars +SB: 3 [DKA:149] Grafdigger's Cage +SB: 2 [ISD:166] Traitorous Blood +SB: 4 [GTC:106] Skullcrack +SB: 2 [C14:172] Blasphemous Act +SB: 3 [M13:155] Volcanic Strength diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..17ef7447b2d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Aggro TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,18 @@ +4 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +3 [M13:147] Searing Spear +13 [UNH:139] Mountain +4 [M13:171] Flinthoof Boar +4 [RTR:220] Rakdos Cackler +4 [DKA:93] Hellrider +4 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [GTC:247] Stomping Ground +4 [AVR:144] Lightning Mauler +4 [GTC:167] Ghor-Clan Rampager +SB: 3 [DKA:101] Pyreheart Wolf +SB: 2 [RTR:101] Mizzium Mortars +SB: 2 [ISD:166] Traitorous Blood +SB: 4 [GTC:106] Skullcrack +SB: 4 [M13:155] Volcanic Strength diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST Apr 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST Apr 2015.mwDeck.dck new file mode 100644 index 00000000000..fe36ef1f747 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST Apr 2015.mwDeck.dck @@ -0,0 +1,25 @@ +1 [THS:224] Temple of Abandon +1 [UNH:140] Forest +4 [KTK:118] Monastery Swiftspear +4 [FRF:118] Wild Slash +4 [KTK:249] Wooded Foothills +4 [M15:141] Foundry Street Denizen +1 [M15:142] Frenzied Goblin +4 [M15:164] Stoke the Flames +10 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M15:145] Goblin Rabblemaster +4 [KTK:111] Hordeling Outburst +1 [KTK:130] Become Immense +1 [DTK:146] Lightning Berserker +4 [DTK:135] Dragon Fodder +3 [DTK:169] Zurgo Bellstriker +4 [DTK:213] Atarka's Command +4 [JOU:163] Mana Confluence +SB: 2 [M15:145] Goblin Rabblemaster +SB: 1 [BNG:110] Scouring Sands +SB: 2 [JOU:162] Hall of Triumph +SB: 4 [JOU:94] Eidolon of the Great Revel +SB: 4 [DTK:151] Roast +SB: 1 [FRF:102] Goblin Heelcutter +SB: 1 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST May 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST May 2015.mwDeck.dck new file mode 100644 index 00000000000..8b77597ad7e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Deck Wins TDtB ST May 2015.mwDeck.dck @@ -0,0 +1,25 @@ +1 [THS:224] Temple of Abandon +1 [UNH:140] Forest +4 [KTK:118] Monastery Swiftspear +4 [FRF:118] Wild Slash +4 [KTK:249] Wooded Foothills +4 [M15:141] Foundry Street Denizen +4 [M15:164] Stoke the Flames +10 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M15:145] Goblin Rabblemaster +4 [KTK:111] Hordeling Outburst +1 [KTK:130] Become Immense +2 [DTK:146] Lightning Berserker +4 [DTK:135] Dragon Fodder +3 [DTK:169] Zurgo Bellstriker +4 [DTK:213] Atarka's Command +4 [JOU:163] Mana Confluence +SB: 2 [M15:145] Goblin Rabblemaster +SB: 1 [JOU:100] Harness by Force +SB: 1 [BNG:110] Scouring Sands +SB: 4 [JOU:94] Eidolon of the Great Revel +SB: 1 [DTK:150] Rending Volley +SB: 1 [FRF:102] Goblin Heelcutter +SB: 4 [DTK:151] Roast +SB: 1 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Dragons TDtB ST Apr 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Dragons TDtB ST Apr 2015.mwDeck.dck new file mode 100644 index 00000000000..9ae5cd7287b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Dragons TDtB ST Apr 2015.mwDeck.dck @@ -0,0 +1,25 @@ +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +6 [UNH:140] Forest +1 [FRF:170] Rugged Highlands +4 [KTK:249] Wooded Foothills +4 [KTK:106] Crater's Claws +3 [KTK:134] Heir of the Wilds +1 [DTK:249] Haven of the Spirit Dragon +5 [UNH:139] Mountain +4 [M15:145] Goblin Rabblemaster +4 [KTK:144] Rattleclaw Mystic +2 [JOU:163] Mana Confluence +3 [DTK:210] Surrak, the Hunt Caller +4 [THS:152] Boon Satyr +2 [DTK:134] Draconic Roar +4 [C14:191] Elvish Mystic +4 [DTK:162] Thunderbreak Regent +1 [DTK:151] Roast +SB: 3 [M15:177] Hornet Nest +SB: 3 [THS:209] Xenagos, the Reveler +SB: 2 [KTK:97] Arc Lightning +SB: 1 [M15:192] Plummet +SB: 3 [FRF:118] Wild Slash +SB: 1 [DTK:151] Roast +SB: 2 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Midrange TDtB ST Aug 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Midrange TDtB ST Aug 2013.mwDeck.dck new file mode 100644 index 00000000000..6784a59698a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Midrange TDtB ST Aug 2013.mwDeck.dck @@ -0,0 +1,21 @@ +4 [M13:228] Rootbound Crag +9 [UNH:140] Forest +3 [M14:195] Scavenging Ooze +6 [UNH:139] Mountain +3 [RTR:101] Mizzium Mortars +4 [M13:150] Thundermaw Hellkite +4 [M13:160] Arbor Elf +4 [M13:171] Flinthoof Boar +4 [DKA:127] Strangleroot Geist +4 [DKA:93] Hellrider +1 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +4 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +2 [C14:191] Elvish Mystic +SB: 2 [M15:134] Chandra, Pyromaster +SB: 2 [AVR:149] Pillar of Flame +SB: 2 [AVR:129] Bonfire of the Damned +SB: 2 [M14:171] Fog +SB: 3 [M13:155] Volcanic Strength +SB: 4 [M14:130] Burning Earth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Monsters TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Monsters TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..405ab3acdce --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Monsters TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,26 @@ +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +8 [UNH:140] Forest +2 [THS:209] Xenagos, the Reveler +1 [M14:195] Scavenging Ooze +5 [UNH:139] Mountain +3 [RTR:101] Mizzium Mortars +4 [BNG:119] Courser of Kruphix +2 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +1 [DGM:128] Flesh // Blood +4 [THS:172] Polukranos, World Eater +4 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +2 [BNG:156] Xenagos, God of Revels +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 1 [RTR:101] Mizzium Mortars +SB: 1 [M15:134] Chandra, Pyromaster +SB: 2 [M14:155] Shock +SB: 1 [THS:153] Bow of Nylea +SB: 1 [DGM:99] Ruric Thar, the Unbowed +SB: 1 [THS:150] Arbor Colossus +SB: 2 [M15:192] Plummet +SB: 4 [THS:162] Mistcutter Hydra +SB: 2 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Gruul Team TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Team TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..4d48da0b7fe --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Gruul Team TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,21 @@ +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +10 [UNH:140] Forest +2 [THS:209] Xenagos, the Reveler +4 [M14:182] Kalonian Tusker +6 [UNH:139] Mountain +3 [M14:202] Witchstalker +4 [GTC:247] Stomping Ground +2 [DGM:128] Flesh // Blood +3 [THS:172] Polukranos, World Eater +3 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +4 [THS:152] Boon Satyr +4 [C14:191] Elvish Mystic +3 [THS:180] Sylvan Caryatid +SB: 2 [THS:157] Fade into Antiquity +SB: 3 [RTR:101] Mizzium Mortars +SB: 2 [RTR:231] Pithing Needle +SB: 2 [DGM:99] Ruric Thar, the Unbowed +SB: 2 [M15:192] Plummet +SB: 4 [THS:162] Mistcutter Hydra diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Hoof there it is TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Hoof there it is TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..6709a67d85c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Hoof there it is TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,22 @@ +4 [AVR:172] Craterhoof Behemoth +4 [AVR:194] Somberwald Sage +6 [UNH:140] Forest +2 [RTR:241] Hallowed Fountain +4 [RTR:243] Overgrown Tomb +4 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [RTR:165] Grisly Salvage +3 [ISD:122] Unburial Rites +4 [RTR:248] Temple Garden +4 [DKA:128] Tracker's Instincts +3 [RTR:213] Deathrite Shaman +3 [ISD:196] Mulch +1 [M14:229] Shimmering Grotto +4 [DKA:12] Lingering Souls +2 [ISD:239] Gavony Township +4 [ISD:249] Woodland Cemetery +SB: 2 [AVR:32] Restoration Angel +SB: 3 [RTR:178] Loxodon Smiter +SB: 4 [M13:193] Thragtusk +SB: 2 [AVR:226] Cavern of Souls +SB: 4 [RTR:1] Angel of Serenity diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..01acdbfab33 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,26 @@ +4 [C13:11] Fiend Hunter +3 [M13:229] Sunpetal Grove +4 [AVR:1] Angel of Glory's Rise +1 [RTR:141] Abrupt Decay +4 [GTC:150] Cartel Aristocrat +1 [RTR:243] Overgrown Tomb +4 [RTR:165] Grisly Salvage +1 [RTR:238] Blood Crypt +4 [M13:170] Farseek +4 [ISD:122] Unburial Rites +2 [RTR:248] Temple Garden +4 [AVR:226] Cavern of Souls +4 [C14:175] Faithless Looting +4 [ISD:196] Mulch +4 [GTC:247] Stomping Ground +1 [GTC:245] Sacred Foundry +4 [DKA:140] Huntmaster of the Fells +1 [GTC:242] Godless Shrine +2 [ISD:238] Clifftop Retreat +4 [ISD:249] Woodland Cemetery +SB: 2 [ISD:161] Rolling Temblor +SB: 3 [M13:193] Thragtusk +SB: 2 [ISD:27] Purify the Grave +SB: 3 [RTR:148] Centaur Healer +SB: 2 [M14:97] Duress +SB: 3 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..c3347d8770e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Human Reanimator TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,26 @@ +4 [C13:11] Fiend Hunter +2 [M13:228] Rootbound Crag +3 [GTC:216] Burning-Tree Emissary +4 [AVR:1] Angel of Glory's Rise +2 [GTC:150] Cartel Aristocrat +4 [RTR:243] Overgrown Tomb +4 [RTR:165] Grisly Salvage +4 [RTR:238] Blood Crypt +4 [ISD:122] Unburial Rites +2 [AVR:226] Cavern of Souls +3 [RTR:248] Temple Garden +4 [ISD:242] Isolated Chapel +4 [C14:175] Faithless Looting +4 [ISD:196] Mulch +2 [GTC:247] Stomping Ground +3 [DKA:140] Huntmaster of the Fells +1 [ISD:238] Clifftop Retreat +1 [ISD:249] Woodland Cemetery +2 [GTC:82] Undercity Informer +3 [ISD:105] Liliana of the Veil +SB: 2 [ISD:161] Rolling Temblor +SB: 3 [M13:193] Thragtusk +SB: 3 [DKA:138] Falkenrath Aristocrat +SB: 2 [AVR:166] Zealous Conscripts +SB: 1 [DKA:140] Huntmaster of the Fells +SB: 4 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..cb1a72c47ef --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,25 @@ +4 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +4 [M12:70] Phantasmal Bear +3 [NPH:86] Gut Shot +4 [SOM:229] Seachrome Coast +4 [NPH:35] Gitaxian Probe +2 [ISD:213] Geist of Saint Traft +4 [NPH:48] Vapor Snag +3 [ISD:244] Moorland Haunt +3 [M12:72] Phantasmal Image +4 [ISD:51] Delver of Secrets +9 [UNH:137] Island +4 [M12:62] Lord of the Unreal +4 [M12:73] Ponder +4 [M12:63] Mana Leak +SB: 1 [NPH:86] Gut Shot +SB: 2 [M15:51] Dissipate +SB: 1 [MBS:115] Mortarpod +SB: 1 [ISD:244] Moorland Haunt +SB: 3 [NPH:38] Mental Misstep +SB: 2 [M13:22] Oblivion Ring +SB: 1 [M12:72] Phantasmal Image +SB: 1 [M15:71] Negate +SB: 2 [M12:52] Flashfreeze +SB: 1 [C14:79] Mentor of the Meek diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..71da5971513 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,26 @@ +2 [NPH:161] Sword of War and Peace +4 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +4 [M12:70] Phantasmal Bear +3 [NPH:86] Gut Shot +4 [SOM:229] Seachrome Coast +3 [NPH:35] Gitaxian Probe +3 [ISD:213] Geist of Saint Traft +4 [NPH:48] Vapor Snag +4 [ISD:244] Moorland Haunt +3 [M12:72] Phantasmal Image +4 [ISD:51] Delver of Secrets +8 [UNH:137] Island +2 [M12:62] Lord of the Unreal +4 [M12:73] Ponder +4 [M12:63] Mana Leak +SB: 1 [NPH:161] Sword of War and Peace +SB: 1 [ISD:80] Stitched Drake +SB: 2 [M15:51] Dissipate +SB: 2 [M13:75] Unsummon +SB: 2 [M13:22] Oblivion Ring +SB: 1 [M12:72] Phantasmal Image +SB: 3 [M12:40] Timely Reinforcements +SB: 1 [M12:52] Flashfreeze +SB: 1 [M15:71] Negate +SB: 1 [C14:79] Mentor of the Meek diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..e9843d65ae4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Illusions TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,25 @@ +3 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +4 [M12:70] Phantasmal Bear +3 [NPH:86] Gut Shot +4 [SOM:229] Seachrome Coast +2 [NPH:57] Dismember +4 [NPH:35] Gitaxian Probe +1 [ISD:80] Stitched Drake +2 [NPH:48] Vapor Snag +3 [ISD:244] Moorland Haunt +4 [ISD:51] Delver of Secrets +4 [M12:72] Phantasmal Image +10 [UNH:137] Island +4 [M12:62] Lord of the Unreal +4 [M12:73] Ponder +4 [M12:63] Mana Leak +SB: 3 [ISD:80] Stitched Drake +SB: 2 [M15:51] Dissipate +SB: 1 [MBS:115] Mortarpod +SB: 1 [ISD:244] Moorland Haunt +SB: 2 [NPH:38] Mental Misstep +SB: 1 [NPH:159] Spellskite +SB: 2 [M12:40] Timely Reinforcements +SB: 1 [M15:71] Negate +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Ascendancy TDtB ST Oct 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Ascendancy TDtB ST Oct 2014.mwDeck.dck new file mode 100644 index 00000000000..8fc729be8c2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Ascendancy TDtB ST Oct 2014.mwDeck.dck @@ -0,0 +1,29 @@ +2 [THS:224] Temple of Abandon +2 [JOU:115] Twinflame +2 [THS:226] Temple of Mystery +1 [UNH:140] Forest +4 [BNG:49] Retraction Helix +4 [THS:155] Commune with the Gods +2 [KTK:217] Briber's Purse +2 [KTK:249] Wooded Foothills +3 [KTK:36] Dig Through Time +2 [KTK:233] Flooded Strand +4 [THS:119] Dragon Mantle +3 [KTK:123] Tormenting Voice +2 [KTK:234] Frontier Bivouac +1 [M15:187] Nissa, Worldwaker +1 [UNH:139] Mountain +4 [KTK:144] Rattleclaw Mystic +2 [M15:249] Yavimaya Coast +2 [BNG:165] Temple of Plenty +4 [JOU:163] Mana Confluence +4 [KTK:180] Jeskai Ascendancy +1 [UNH:136] Plains +3 [BNG:150] Kiora's Follower +1 [UNH:137] Island +4 [THS:180] Sylvan Caryatid +SB: 3 [M15:155] Lightning Strike +SB: 4 [KTK:197] Savage Knuckleblade +SB: 3 [KTK:97] Arc Lightning +SB: 2 [THS:172] Polukranos, World Eater +SB: 3 [THS:65] Swan Song diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Feb 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Feb 2015.mwDeck.dck new file mode 100644 index 00000000000..54744e25718 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Feb 2015.mwDeck.dck @@ -0,0 +1,29 @@ +3 [FRF:28] Valorous Stance +1 [FRF:110] Outpost Siege +3 [THS:143] Stormbreath Dragon +3 [FRF:118] Wild Slash +4 [KTK:22] Seeker of the Way +2 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +1 [KTK:36] Dig Through Time +4 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +3 [KTK:59] Treasure Cruise +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +2 [JOU:164] Temple of Epiphany +1 [FRF:2] Abzan Advantage +2 [UNH:136] Plains +2 [UNH:137] Island +1 [FRF:27] Soulfire Grand Master +SB: 1 [FRF:28] Valorous Stance +SB: 1 [FRF:110] Outpost Siege +SB: 1 [THS:15] Glare of Heresy +SB: 2 [BNG:5] Brimaz, King of Oreskos +SB: 3 [THS:112] Anger of the Gods +SB: 2 [THS:9] Elspeth, Sun's Champion +SB: 3 [KTK:37] Disdainful Stroke +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Mar 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Mar 2015.mwDeck.dck new file mode 100644 index 00000000000..09b579052cf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Midrange TDtB ST Mar 2015.mwDeck.dck @@ -0,0 +1,32 @@ +3 [FRF:28] Valorous Stance +1 [FRF:110] Outpost Siege +2 [KTK:119] Sarkhan, the Dragonspeaker +3 [FRF:118] Wild Slash +4 [KTK:22] Seeker of the Way +2 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +3 [KTK:36] Dig Through Time +4 [KTK:233] Flooded Strand +1 [KTK:37] Disdainful Stroke +4 [M15:164] Stoke the Flames +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +2 [JOU:164] Temple of Epiphany +2 [UNH:136] Plains +1 [THS:9] Elspeth, Sun's Champion +2 [UNH:137] Island +2 [FRF:27] Soulfire Grand Master +SB: 1 [FRF:28] Valorous Stance +SB: 1 [FRF:110] Outpost Siege +SB: 1 [THS:15] Glare of Heresy +SB: 1 [KTK:9] Erase +SB: 1 [KTK:8] End Hostilities +SB: 2 [BNG:5] Brimaz, King of Oreskos +SB: 2 [THS:112] Anger of the Gods +SB: 1 [FRF:2] Abzan Advantage +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 2 [KTK:37] Disdainful Stroke +SB: 2 [DTK:65] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..eb6306732e2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,26 @@ +4 [KTK:22] Seeker of the Way +3 [THS:128] Magma Jet +2 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [KTK:36] Dig Through Time +4 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +1 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +4 [KTK:181] Jeskai Charm +2 [JOU:164] Temple of Epiphany +1 [THS:60] Prognostic Sphinx +1 [JOU:163] Mana Confluence +4 [BNG:45] Nullify +2 [UNH:136] Plains +2 [UNH:137] Island +2 [BNG:163] Temple of Enlightenment +SB: 2 [JOU:103] Magma Spray +SB: 3 [BNG:5] Brimaz, King of Oreskos +SB: 1 [JOU:5] Banishing Light +SB: 4 [KTK:25] Suspension Field +SB: 3 [KTK:37] Disdainful Stroke +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Nov 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Nov 2014.mwDeck.dck new file mode 100644 index 00000000000..24e4878ad66 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Nov 2014.mwDeck.dck @@ -0,0 +1,29 @@ +3 [BNG:5] Brimaz, King of Oreskos +1 [THS:16] Gods Willing +1 [JOU:5] Banishing Light +2 [KTK:119] Sarkhan, the Dragonspeaker +2 [KTK:99] Ashcloud Phoenix +4 [KTK:22] Seeker of the Way +3 [THS:128] Magma Jet +3 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +1 [KTK:36] Dig Through Time +3 [KTK:233] Flooded Strand +3 [M15:164] Stoke the Flames +2 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +3 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +4 [KTK:181] Jeskai Charm +1 [JOU:164] Temple of Epiphany +2 [UNH:136] Plains +2 [UNH:137] Island +SB: 3 [JOU:103] Magma Spray +SB: 1 [THS:16] Gods Willing +SB: 2 [KTK:97] Arc Lightning +SB: 1 [JOU:151] Keranos, God of Storms +SB: 3 [KTK:25] Suspension Field +SB: 3 [KTK:37] Disdainful Stroke +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Oct 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Oct 2014.mwDeck.dck new file mode 100644 index 00000000000..26f8c23a1e4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tempo TDtB ST Oct 2014.mwDeck.dck @@ -0,0 +1,25 @@ +3 [BNG:5] Brimaz, King of Oreskos +2 [THS:16] Gods Willing +3 [KTK:119] Sarkhan, the Dragonspeaker +4 [KTK:22] Seeker of the Way +4 [THS:128] Magma Jet +3 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +3 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +3 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +3 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +4 [KTK:181] Jeskai Charm +2 [UNH:136] Plains +2 [UNH:137] Island +SB: 1 [M15:134] Chandra, Pyromaster +SB: 3 [JOU:103] Magma Spray +SB: 1 [THS:16] Gods Willing +SB: 2 [THS:60] Prognostic Sphinx +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 4 [KTK:25] Suspension Field +SB: 3 [KTK:37] Disdainful Stroke diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Token TDtB ST Jan 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Token TDtB ST Jan 2015.mwDeck.dck new file mode 100644 index 00000000000..9353431d875 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Token TDtB ST Jan 2015.mwDeck.dck @@ -0,0 +1,28 @@ +4 [M15:26] Raise the Alarm +4 [KTK:22] Seeker of the Way +1 [THS:128] Magma Jet +3 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +3 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +4 [KTK:59] Treasure Cruise +2 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +2 [M15:134] Chandra, Pyromaster +4 [KTK:111] Hordeling Outburst +3 [M15:246] Shivan Reef +1 [KTK:181] Jeskai Charm +2 [JOU:164] Temple of Epiphany +4 [KTK:180] Jeskai Ascendancy +2 [UNH:136] Plains +1 [UNH:137] Island +SB: 2 [M15:15] Hushwing Gryff +SB: 2 [THS:15] Glare of Heresy +SB: 2 [KTK:9] Erase +SB: 3 [KTK:8] End Hostilities +SB: 1 [JOU:23] Reprisal +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 3 [KTK:37] Disdainful Stroke +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tokens TDtB ST Apr 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tokens TDtB ST Apr 2015.mwDeck.dck new file mode 100644 index 00000000000..3271b205706 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jeskai Tokens TDtB ST Apr 2015.mwDeck.dck @@ -0,0 +1,29 @@ +2 [FRF:28] Valorous Stance +3 [M15:26] Raise the Alarm +1 [KTK:119] Sarkhan, the Dragonspeaker +4 [FRF:118] Wild Slash +4 [KTK:22] Seeker of the Way +3 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +4 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +4 [KTK:59] Treasure Cruise +2 [UNH:139] Mountain +2 [M15:155] Lightning Strike +4 [KTK:111] Hordeling Outburst +3 [M15:246] Shivan Reef +1 [DTK:135] Dragon Fodder +1 [KTK:184] Mantis Rider +1 [JOU:164] Temple of Epiphany +4 [KTK:180] Jeskai Ascendancy +2 [DTK:36] Secure the Wastes +1 [UNH:136] Plains +2 [UNH:137] Island +SB: 1 [THS:15] Glare of Heresy +SB: 2 [DTK:27] Ojutai Exemplars +SB: 2 [KTK:8] End Hostilities +SB: 2 [DTK:156] Seismic Rupture +SB: 2 [THS:9] Elspeth, Sun's Champion +SB: 4 [KTK:37] Disdainful Stroke +SB: 2 [DTK:65] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Apr 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Apr 2014.mwDeck.dck new file mode 100644 index 00000000000..cea274efcc6 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Apr 2014.mwDeck.dck @@ -0,0 +1,28 @@ +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +4 [UNH:140] Forest +2 [THS:209] Xenagos, the Reveler +3 [M14:195] Scavenging Ooze +3 [RTR:157] Dreadbore +1 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +3 [BNG:119] Courser of Kruphix +4 [RTR:238] Blood Crypt +1 [BNG:164] Temple of Malice +2 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +4 [THS:172] Polukranos, World Eater +4 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +1 [DGM:104] Sire of Insanity +4 [THS:180] Sylvan Caryatid +SB: 2 [RTR:82] Ultimate Price +SB: 1 [RTR:101] Mizzium Mortars +SB: 1 [M15:134] Chandra, Pyromaster +SB: 1 [RTR:208] Vraska the Unseen +SB: 3 [THS:162] Mistcutter Hydra +SB: 2 [RTR:164] Golgari Charm +SB: 2 [THS:107] Thoughtseize +SB: 2 [RTR:141] Abrupt Decay +SB: 1 [DGM:104] Sire of Insanity diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..6d0c16098f5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Aggro TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,27 @@ +4 [GTC:119] Experiment One +2 [UNH:140] Forest +3 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +2 [M13:147] Searing Spear +2 [M13:222] Dragonskull Summit +2 [RTR:141] Abrupt Decay +4 [M13:143] Mogg Flunkies +1 [UNH:139] Mountain +3 [RTR:157] Dreadbore +4 [RTR:243] Overgrown Tomb +4 [M13:171] Flinthoof Boar +4 [RTR:220] Rakdos Cackler +4 [RTR:238] Blood Crypt +4 [DKA:138] Falkenrath Aristocrat +3 [RTR:158] Dreg Mangler +4 [GTC:247] Stomping Ground +4 [GTC:167] Ghor-Clan Rampager +2 [ISD:249] Woodland Cemetery +SB: 1 [ISD:243] Kessig Wolf Run +SB: 3 [C13:97] Vampire Nighthawk +SB: 2 [AVR:206] Wolfir Silverheart +SB: 1 [M13:147] Searing Spear +SB: 2 [GTC:156] Domri Rade +SB: 1 [RTR:141] Abrupt Decay +SB: 3 [RTR:59] Cremate +SB: 2 [ISD:215] Olivia Voldaren diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Apr 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Apr 2013.mwDeck.dck new file mode 100644 index 00000000000..4fbb154180a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Apr 2013.mwDeck.dck @@ -0,0 +1,35 @@ +2 [C13:97] Vampire Nighthawk +1 [M13:228] Rootbound Crag +2 [UNH:140] Forest +4 [M13:222] Dragonskull Summit +1 [M13:101] Murder +2 [M13:174] Garruk, Primal Hunter +1 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +2 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +2 [C14:167] Tragic Slip +2 [ISD:243] Kessig Wolf Run +4 [M13:170] Farseek +2 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +1 [ISD:124] Victim of Night +4 [DKA:140] Huntmaster of the Fells +4 [ISD:249] Woodland Cemetery +1 [ISD:105] Liliana of the Veil +1 [RTR:141] Abrupt Decay +2 [M13:176] Ground Seal +1 [RTR:157] Dreadbore +2 [M13:160] Arbor Elf +4 [RTR:238] Blood Crypt +3 [ISD:215] Olivia Voldaren +SB: 1 [RTR:101] Mizzium Mortars +SB: 2 [RTR:83] Underworld Connections +SB: 1 [RTR:188] Rakdos's Return +SB: 1 [DKA:149] Grafdigger's Cage +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [AVR:129] Bonfire of the Damned +SB: 1 [RTR:208] Vraska the Unseen +SB: 2 [M14:97] Duress +SB: 2 [RTR:197] Slaughter Games +SB: 2 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..0dbbe145813 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,24 @@ +4 [M13:228] Rootbound Crag +4 [RTR:173] Izzet Staticaster +4 [RTR:243] Overgrown Tomb +2 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +1 [ISD:243] Kessig Wolf Run +3 [RTR:238] Blood Crypt +4 [M13:170] Farseek +2 [AVR:226] Cavern of Souls +4 [DKA:128] Tracker's Instincts +3 [RTR:247] Steam Vents +4 [ISD:241] Hinterland Harbor +4 [RTR:213] Deathrite Shaman +1 [AVR:129] Bonfire of the Damned +4 [DKA:140] Huntmaster of the Fells +4 [ISD:249] Woodland Cemetery +4 [AVR:187] Nightshade Peddler +4 [ISD:215] Olivia Voldaren +SB: 3 [ISD:78] Snapcaster Mage +SB: 3 [AVR:84] Appetite for Brains +SB: 4 [AVR:149] Pillar of Flame +SB: 1 [AVR:129] Bonfire of the Damned +SB: 1 [M14:97] Duress +SB: 3 [RTR:197] Slaughter Games diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..d89a80d4c4d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,32 @@ +1 [RTR:82] Ultimate Price +1 [M13:228] Rootbound Crag +3 [UNH:140] Forest +3 [M13:222] Dragonskull Summit +1 [M13:101] Murder +2 [RTR:141] Abrupt Decay +2 [M13:174] Garruk, Primal Hunter +1 [RTR:157] Dreadbore +4 [RTR:243] Overgrown Tomb +2 [RTR:188] Rakdos's Return +3 [M13:160] Arbor Elf +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +2 [AVR:149] Pillar of Flame +4 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [DKA:140] Huntmaster of the Fells +4 [ISD:249] Woodland Cemetery +2 [ISD:215] Olivia Voldaren +3 [ISD:105] Liliana of the Veil +SB: 2 [RTR:83] Underworld Connections +SB: 1 [RTR:188] Rakdos's Return +SB: 1 [C14:167] Tragic Slip +SB: 2 [DKA:149] Grafdigger's Cage +SB: 2 [DKA:127] Strangleroot Geist +SB: 1 [AVR:149] Pillar of Flame +SB: 2 [M13:217] Staff of Nin +SB: 2 [M14:97] Duress +SB: 1 [M13:101] Murder +SB: 1 [ISD:215] Olivia Voldaren diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..f45f86d438f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,29 @@ +3 [RTR:82] Ultimate Price +4 [C13:97] Vampire Nighthawk +2 [UNH:140] Forest +4 [M13:228] Rootbound Crag +3 [M13:147] Searing Spear +1 [M13:222] Dragonskull Summit +1 [UNH:139] Mountain +1 [M13:174] Garruk, Primal Hunter +4 [RTR:243] Overgrown Tomb +2 [M13:150] Thundermaw Hellkite +1 [RTR:232] Rakdos Keyrune +2 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +3 [AVR:226] Cavern of Souls +2 [AVR:149] Pillar of Flame +2 [AVR:129] Bonfire of the Damned +4 [DKA:140] Huntmaster of the Fells +4 [ISD:249] Woodland Cemetery +3 [ISD:215] Olivia Voldaren +SB: 1 [ISD:161] Rolling Temblor +SB: 1 [RTR:188] Rakdos's Return +SB: 1 [M13:217] Staff of Nin +SB: 4 [RTR:213] Deathrite Shaman +SB: 3 [RTR:197] Slaughter Games +SB: 2 [ISD:94] Curse of Death's Hold +SB: 3 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jul 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jul 2013.mwDeck.dck new file mode 100644 index 00000000000..96fa68585dc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Jul 2013.mwDeck.dck @@ -0,0 +1,31 @@ +2 [C13:97] Vampire Nighthawk +3 [M13:228] Rootbound Crag +3 [M13:222] Dragonskull Summit +1 [RTR:141] Abrupt Decay +2 [M13:176] Ground Seal +2 [M13:174] Garruk, Primal Hunter +4 [RTR:243] Overgrown Tomb +1 [RTR:232] Rakdos Keyrune +2 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +2 [C14:167] Tragic Slip +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +1 [AVR:226] Cavern of Souls +2 [AVR:149] Pillar of Flame +4 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [DKA:140] Huntmaster of the Fells +2 [DGM:93] Putrefy +4 [ISD:249] Woodland Cemetery +3 [ISD:215] Olivia Voldaren +SB: 1 [RTR:83] Underworld Connections +SB: 1 [RTR:188] Rakdos's Return +SB: 2 [C14:167] Tragic Slip +SB: 2 [DGM:99] Ruric Thar, the Unbowed +SB: 1 [AVR:149] Pillar of Flame +SB: 2 [M14:97] Duress +SB: 1 [ISD:94] Curse of Death's Hold +SB: 2 [M13:176] Ground Seal +SB: 3 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..eceb4d98e7f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,34 @@ +3 [M13:228] Rootbound Crag +2 [M13:222] Dragonskull Summit +1 [RTR:141] Abrupt Decay +2 [M13:176] Ground Seal +2 [M13:174] Garruk, Primal Hunter +1 [RTR:157] Dreadbore +2 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +1 [RTR:232] Rakdos Keyrune +1 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +2 [C14:167] Tragic Slip +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +2 [AVR:226] Cavern of Souls +3 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [DKA:140] Huntmaster of the Fells +2 [DGM:93] Putrefy +4 [ISD:249] Woodland Cemetery +2 [DGM:104] Sire of Insanity +3 [ISD:215] Olivia Voldaren +1 [ISD:105] Liliana of the Veil +SB: 1 [RTR:101] Mizzium Mortars +SB: 1 [RTR:188] Rakdos's Return +SB: 2 [C14:167] Tragic Slip +SB: 2 [C13:97] Vampire Nighthawk +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [DGM:63] Deadbridge Chant +SB: 2 [RTR:208] Vraska the Unseen +SB: 1 [M14:97] Duress +SB: 1 [M13:176] Ground Seal +SB: 2 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..010b7a10f81 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Control TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,31 @@ +1 [C13:97] Vampire Nighthawk +3 [UNH:140] Forest +3 [M13:228] Rootbound Crag +3 [M13:222] Dragonskull Summit +2 [UNH:139] Mountain +3 [RTR:157] Dreadbore +2 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +3 [M13:150] Thundermaw Hellkite +2 [RTR:232] Rakdos Keyrune +2 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +1 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +3 [AVR:149] Pillar of Flame +2 [AVR:129] Bonfire of the Damned +1 [RTR:208] Vraska the Unseen +4 [DKA:140] Huntmaster of the Fells +2 [ISD:249] Woodland Cemetery +2 [UNH:138] Swamp +2 [ISD:215] Olivia Voldaren +3 [ISD:105] Liliana of the Veil +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 1 [RTR:83] Underworld Connections +SB: 1 [RTR:101] Mizzium Mortars +SB: 3 [C13:97] Vampire Nighthawk +SB: 3 [AVR:84] Appetite for Brains +SB: 1 [AVR:149] Pillar of Flame +SB: 3 [ISD:115] Sever the Bloodline +SB: 2 [RTR:164] Golgari Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Aug 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Aug 2013.mwDeck.dck new file mode 100644 index 00000000000..f2c396c87a3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Aug 2013.mwDeck.dck @@ -0,0 +1,33 @@ +4 [M13:228] Rootbound Crag +1 [M13:222] Dragonskull Summit +3 [M14:195] Scavenging Ooze +1 [RTR:141] Abrupt Decay +2 [M13:174] Garruk, Primal Hunter +1 [RTR:157] Dreadbore +1 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +1 [RTR:232] Rakdos Keyrune +2 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +2 [C14:167] Tragic Slip +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +4 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +1 [M14:96] Doom Blade +4 [DKA:140] Huntmaster of the Fells +2 [DGM:93] Putrefy +4 [ISD:249] Woodland Cemetery +2 [UNH:138] Swamp +3 [ISD:215] Olivia Voldaren +SB: 2 [RTR:83] Underworld Connections +SB: 1 [RTR:188] Rakdos's Return +SB: 1 [C13:134] Acidic Slime +SB: 1 [C14:167] Tragic Slip +SB: 1 [DKA:149] Grafdigger's Cage +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [AVR:85] Barter in Blood +SB: 2 [M14:97] Duress +SB: 1 [ISD:94] Curse of Death's Hold +SB: 3 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2013.mwDeck.dck new file mode 100644 index 00000000000..6acb46e2c12 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2013.mwDeck.dck @@ -0,0 +1,33 @@ +2 [C13:97] Vampire Nighthawk +2 [UNH:140] Forest +2 [M13:228] Rootbound Crag +3 [M13:222] Dragonskull Summit +2 [M13:176] Ground Seal +3 [M13:174] Garruk, Primal Hunter +1 [RTR:157] Dreadbore +2 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +1 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +2 [AVR:149] Pillar of Flame +2 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [DKA:140] Huntmaster of the Fells +2 [DGM:93] Putrefy +4 [ISD:249] Woodland Cemetery +1 [DGM:104] Sire of Insanity +3 [ISD:215] Olivia Voldaren +2 [ISD:105] Liliana of the Veil +SB: 1 [RTR:157] Dreadbore +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [DGM:63] Deadbridge Chant +SB: 1 [DGM:72] Gaze of Granite +SB: 2 [M14:97] Duress +SB: 2 [RTR:197] Slaughter Games +SB: 2 [GTC:63] Devour Flesh +SB: 2 [RTR:141] Abrupt Decay +SB: 1 [DGM:104] Sire of Insanity +SB: 1 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2014.mwDeck.dck new file mode 100644 index 00000000000..1a2a8490229 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Jun 2014.mwDeck.dck @@ -0,0 +1,29 @@ +2 [RTR:82] Ultimate Price +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +4 [UNH:140] Forest +4 [THS:209] Xenagos, the Reveler +3 [M14:195] Scavenging Ooze +1 [RTR:141] Abrupt Decay +2 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +2 [BNG:119] Courser of Kruphix +4 [RTR:238] Blood Crypt +1 [BNG:164] Temple of Malice +2 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +1 [JOU:163] Mana Confluence +4 [THS:172] Polukranos, World Eater +3 [GTC:167] Ghor-Clan Rampager +3 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 1 [RTR:101] Mizzium Mortars +SB: 2 [M15:134] Chandra, Pyromaster +SB: 2 [RTR:188] Rakdos's Return +SB: 2 [M14:96] Doom Blade +SB: 1 [RTR:208] Vraska the Unseen +SB: 4 [THS:162] Mistcutter Hydra +SB: 1 [THS:83] Dark Betrayal +SB: 1 [DGM:93] Putrefy +SB: 1 [RTR:164] Golgari Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..bcbad1f560b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund Midrange TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,32 @@ +2 [UNH:140] Forest +2 [M13:228] Rootbound Crag +3 [M13:222] Dragonskull Summit +1 [M13:101] Murder +2 [RTR:141] Abrupt Decay +3 [M13:174] Garruk, Primal Hunter +2 [RTR:157] Dreadbore +1 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +1 [RTR:188] Rakdos's Return +2 [M13:160] Arbor Elf +4 [M13:193] Thragtusk +3 [C14:167] Tragic Slip +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +3 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [DKA:140] Huntmaster of the Fells +4 [ISD:249] Woodland Cemetery +2 [ISD:215] Olivia Voldaren +3 [ISD:105] Liliana of the Veil +SB: 2 [RTR:83] Underworld Connections +SB: 2 [RTR:188] Rakdos's Return +SB: 1 [C13:134] Acidic Slime +SB: 1 [C14:167] Tragic Slip +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [M13:217] Staff of Nin +SB: 2 [M14:97] Duress +SB: 2 [RTR:197] Slaughter Games +SB: 1 [M13:176] Ground Seal +SB: 1 [ISD:215] Olivia Voldaren diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..6cbfb8b166b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,26 @@ +4 [THS:224] Temple of Abandon +3 [THS:143] Stormbreath Dragon +1 [UNH:140] Forest +4 [JOU:165] Temple of Malady +3 [THS:209] Xenagos, the Reveler +4 [M14:195] Scavenging Ooze +4 [RTR:141] Abrupt Decay +1 [UNH:139] Mountain +4 [RTR:157] Dreadbore +4 [M15:244] Llanowar Wastes +2 [M15:134] Chandra, Pyromaster +4 [BNG:119] Courser of Kruphix +3 [RTR:188] Rakdos's Return +3 [RTR:238] Blood Crypt +2 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +4 [THS:172] Polukranos, World Eater +2 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 2 [RTR:101] Mizzium Mortars +SB: 3 [JOU:103] Magma Spray +SB: 3 [THS:162] Mistcutter Hydra +SB: 2 [THS:83] Dark Betrayal +SB: 1 [DGM:93] Putrefy +SB: 2 [RTR:164] Golgari Charm +SB: 2 [RTR:197] Slaughter Games diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Jul 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Jul 2014.mwDeck.dck new file mode 100644 index 00000000000..2a360ee8466 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Jul 2014.mwDeck.dck @@ -0,0 +1,27 @@ +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +4 [UNH:140] Forest +3 [THS:209] Xenagos, the Reveler +3 [M14:195] Scavenging Ooze +3 [RTR:157] Dreadbore +2 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +3 [BNG:119] Courser of Kruphix +4 [RTR:238] Blood Crypt +1 [BNG:164] Temple of Malice +2 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +1 [JOU:163] Mana Confluence +4 [THS:172] Polukranos, World Eater +2 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 1 [RTR:82] Ultimate Price +SB: 2 [RTR:101] Mizzium Mortars +SB: 1 [M15:134] Chandra, Pyromaster +SB: 2 [RTR:188] Rakdos's Return +SB: 1 [RTR:208] Vraska the Unseen +SB: 4 [THS:162] Mistcutter Hydra +SB: 2 [DGM:93] Putrefy +SB: 2 [RTR:164] Golgari Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..b7d3ba794bf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Jund TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,29 @@ +2 [THS:201] Reaper of the Wilds +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +5 [UNH:140] Forest +3 [THS:209] Xenagos, the Reveler +1 [M14:195] Scavenging Ooze +2 [UNH:139] Mountain +2 [RTR:157] Dreadbore +2 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +4 [BNG:119] Courser of Kruphix +4 [RTR:238] Blood Crypt +4 [GTC:247] Stomping Ground +4 [THS:172] Polukranos, World Eater +1 [RTR:208] Vraska the Unseen +1 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +1 [BNG:156] Xenagos, God of Revels +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 2 [RTR:82] Ultimate Price +SB: 2 [RTR:101] Mizzium Mortars +SB: 2 [RTR:188] Rakdos's Return +SB: 1 [THS:153] Bow of Nylea +SB: 1 [DGM:99] Ruric Thar, the Unbowed +SB: 1 [M14:96] Doom Blade +SB: 3 [THS:162] Mistcutter Hydra +SB: 2 [RTR:164] Golgari Charm +SB: 1 [DGM:104] Sire of Insanity diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Apr 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Apr 2013.mwDeck.dck new file mode 100644 index 00000000000..e9d86f9ec82 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Apr 2013.mwDeck.dck @@ -0,0 +1,29 @@ +3 [AVR:32] Restoration Angel +2 [AVR:172] Craterhoof Behemoth +3 [M13:229] Sunpetal Grove +3 [UNH:140] Forest +3 [RTR:1] Angel of Serenity +3 [RTR:178] Loxodon Smiter +1 [DKA:158] Vault of the Archangel +4 [RTR:243] Overgrown Tomb +3 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +4 [RTR:165] Grisly Salvage +3 [ISD:122] Unburial Rites +1 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +2 [RTR:213] Deathrite Shaman +3 [ISD:196] Mulch +3 [DKA:12] Lingering Souls +1 [ISD:239] Gavony Township +2 [GTC:242] Godless Shrine +4 [ISD:249] Woodland Cemetery +SB: 2 [M13:29] Rhox Faithmender +SB: 4 [C13:134] Acidic Slime +SB: 2 [GTC:182] Obzedat, Ghost Council +SB: 1 [AVR:226] Cavern of Souls +SB: 1 [RTR:213] Deathrite Shaman +SB: 2 [ISD:115] Sever the Bloodline +SB: 1 [RTR:208] Vraska the Unseen +SB: 2 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jul 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jul 2013.mwDeck.dck new file mode 100644 index 00000000000..6adab747402 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jul 2013.mwDeck.dck @@ -0,0 +1,30 @@ +3 [AVR:32] Restoration Angel +2 [C13:11] Fiend Hunter +1 [AVR:172] Craterhoof Behemoth +3 [M13:229] Sunpetal Grove +2 [UNH:140] Forest +4 [RTR:1] Angel of Serenity +2 [RTR:141] Abrupt Decay +3 [RTR:178] Loxodon Smiter +4 [RTR:243] Overgrown Tomb +2 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +4 [RTR:165] Grisly Salvage +4 [ISD:122] Unburial Rites +1 [AVR:226] Cavern of Souls +1 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +3 [ISD:196] Mulch +1 [ISD:115] Sever the Bloodline +1 [ISD:239] Gavony Township +3 [GTC:242] Godless Shrine +4 [ISD:249] Woodland Cemetery +SB: 2 [C13:134] Acidic Slime +SB: 1 [GTC:182] Obzedat, Ghost Council +SB: 3 [AVR:194] Somberwald Sage +SB: 1 [AVR:226] Cavern of Souls +SB: 1 [DGM:72] Gaze of Granite +SB: 2 [RTR:206] Trostani, Selesnya's Voice +SB: 2 [ISD:96] Dead Weight +SB: 3 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jun 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jun 2013.mwDeck.dck new file mode 100644 index 00000000000..2fd620b73e8 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Jun 2013.mwDeck.dck @@ -0,0 +1,27 @@ +3 [AVR:32] Restoration Angel +2 [C13:11] Fiend Hunter +4 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +3 [RTR:1] Angel of Serenity +2 [RTR:141] Abrupt Decay +1 [DKA:158] Vault of the Archangel +4 [RTR:243] Overgrown Tomb +2 [DGM:57] Blood Baron of Vizkopa +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +4 [RTR:165] Grisly Salvage +4 [M13:170] Farseek +4 [ISD:122] Unburial Rites +1 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +1 [RTR:148] Centaur Healer +3 [ISD:196] Mulch +1 [ISD:115] Sever the Bloodline +2 [GTC:242] Godless Shrine +3 [ISD:249] Woodland Cemetery +SB: 3 [C13:134] Acidic Slime +SB: 2 [RTR:213] Deathrite Shaman +SB: 2 [RTR:206] Trostani, Selesnya's Voice +SB: 2 [RTR:141] Abrupt Decay +SB: 2 [DGM:103] Sin Collector +SB: 4 [DGM:114] Voice of Resurgence diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..319f7f68c13 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,25 @@ +4 [AVR:32] Restoration Angel +2 [AVR:172] Craterhoof Behemoth +4 [M13:229] Sunpetal Grove +3 [UNH:140] Forest +3 [RTR:1] Angel of Serenity +1 [DKA:158] Vault of the Archangel +4 [RTR:243] Overgrown Tomb +3 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +4 [RTR:165] Grisly Salvage +4 [ISD:122] Unburial Rites +2 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +4 [RTR:148] Centaur Healer +3 [ISD:196] Mulch +2 [DKA:12] Lingering Souls +1 [GTC:242] Godless Shrine +4 [ISD:249] Woodland Cemetery +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 4 [C13:134] Acidic Slime +SB: 2 [M13:29] Rhox Faithmender +SB: 2 [RTR:213] Deathrite Shaman +SB: 1 [ISD:115] Sever the Bloodline +SB: 4 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..f32379d5430 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Junk Reanimator TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,29 @@ +3 [AVR:32] Restoration Angel +2 [C13:11] Fiend Hunter +1 [AVR:172] Craterhoof Behemoth +3 [M13:229] Sunpetal Grove +3 [UNH:140] Forest +4 [RTR:1] Angel of Serenity +4 [RTR:243] Overgrown Tomb +2 [RTR:177] Lotleth Troll +2 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +1 [ISD:181] Garruk Relentless +4 [RTR:165] Grisly Salvage +4 [ISD:122] Unburial Rites +2 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +3 [ISD:196] Mulch +2 [DKA:12] Lingering Souls +2 [ISD:239] Gavony Township +2 [GTC:242] Godless Shrine +4 [ISD:249] Woodland Cemetery +SB: 1 [DGM:111] Unflinching Courage +SB: 2 [C13:134] Acidic Slime +SB: 1 [ISD:181] Garruk Relentless +SB: 2 [DGM:5] Renounce the Guilds +SB: 1 [RTR:148] Centaur Healer +SB: 4 [RTR:213] Deathrite Shaman +SB: 1 [ISD:115] Sever the Bloodline +SB: 3 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Junk TDtB ST Jul 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Junk TDtB ST Jul 2013.mwDeck.dck new file mode 100644 index 00000000000..b4b7b3b16f0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Junk TDtB ST Jul 2013.mwDeck.dck @@ -0,0 +1,25 @@ +3 [M13:229] Sunpetal Grove +4 [AVR:86] Blood Artist +3 [DKA:134] Young Wolf +4 [GTC:150] Cartel Aristocrat +4 [RTR:243] Overgrown Tomb +1 [GTC:182] Obzedat, Ghost Council +2 [ISD:181] Garruk Relentless +4 [C14:167] Tragic Slip +3 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +3 [C14:163] Skirsdag High Priest +4 [DKA:12] Lingering Souls +2 [ISD:239] Gavony Township +4 [GTC:242] Godless Shrine +3 [DGM:112] Varolz, the Scar-Striped +4 [ISD:249] Woodland Cemetery +4 [CNS:69] Doomed Traveler +4 [DGM:114] Voice of Resurgence +SB: 2 [DGM:111] Unflinching Courage +SB: 1 [GTC:182] Obzedat, Ghost Council +SB: 3 [RTR:213] Deathrite Shaman +SB: 2 [M14:97] Duress +SB: 2 [RTR:164] Golgari Charm +SB: 3 [RTR:141] Abrupt Decay +SB: 2 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Bant TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Bant TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..583f40b827f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Bant TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,31 @@ +4 [AVR:32] Restoration Angel +2 [M13:229] Sunpetal Grove +3 [C13:30] Augur of Bolas +1 [RTR:54] Syncopate +3 [M13:225] Glacial Fortress +4 [RTR:241] Hallowed Fountain +3 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +1 [RTR:155] Detention Sphere +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [M13:170] Farseek +3 [RTR:248] Temple Garden +1 [RTR:247] Steam Vents +4 [ISD:241] Hinterland Harbor +3 [RTR:148] Centaur Healer +1 [GTC:247] Stomping Ground +2 [M15:51] Dissipate +1 [GTC:245] Sacred Foundry +2 [ISD:83] Think Twice +4 [GTC:240] Breeding Pool +SB: 1 [RTR:201] Supreme Verdict +SB: 1 [RTR:155] Detention Sphere +SB: 3 [M13:29] Rhox Faithmender +SB: 1 [AVR:209] Gisela, Blade of Goldnight +SB: 2 [ISD:181] Garruk Relentless +SB: 1 [RTR:148] Centaur Healer +SB: 2 [ISD:236] Witchbane Orb +SB: 2 [RTR:18] Rest in Peace +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Apr 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Apr 2012.mwDeck.dck new file mode 100644 index 00000000000..02391602d2e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Apr 2012.mwDeck.dck @@ -0,0 +1,28 @@ +4 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +6 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +5 [UNH:139] Mountain +3 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +1 [C14:184] Whipflare +4 [MBS:145] Inkmoth Nexus +2 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +4 [SOM:91] Galvanic Blast +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 2 [SOM:175] Mimic Vat +SB: 2 [NPH:74] Surgical Extraction +SB: 2 [KTK:142] Naturalize +SB: 2 [DKA:107] Wrack with Madness +SB: 1 [C14:184] Whipflare +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 1 [ISD:127] Ancient Grudge +SB: 2 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..88c503ed749 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,26 @@ +3 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +6 [UNH:139] Mountain +4 [C13:114] Inferno Titan +2 [ISD:140] Devil's Play +1 [M14:155] Shock +3 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +4 [MBS:145] Inkmoth Nexus +4 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [SOM:91] Galvanic Blast +SB: 1 [MBS:75] Slagstorm +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 1 [MBS:94] Viridian Corrupter +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 2 [ISD:207] Tree of Redemption +SB: 1 [NPH:103] Beast Within +SB: 4 [M12:164] Autumn's Veil +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..556549e5acf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,28 @@ +4 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +6 [UNH:139] Mountain +2 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +1 [C14:184] Whipflare +4 [MBS:145] Inkmoth Nexus +3 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +4 [SOM:91] Galvanic Blast +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 2 [KTK:142] Naturalize +SB: 1 [M12:128] Combust +SB: 1 [C14:184] Whipflare +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 2 [NPH:103] Beast Within +SB: 1 [M12:164] Autumn's Veil +SB: 2 [NPH:1] Karn Liberated +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..3900c13d23f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,27 @@ +4 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +6 [UNH:139] Mountain +3 [C13:114] Inferno Titan +2 [ISD:140] Devil's Play +3 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +1 [C14:283] Wurmcoil Engine +4 [MBS:145] Inkmoth Nexus +4 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [SOM:91] Galvanic Blast +SB: 2 [C13:134] Acidic Slime +SB: 2 [NPH:161] Sword of War and Peace +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 1 [NPH:130] Batterskull +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 1 [SOM:104] Spikeshot Elder +SB: 1 [NPH:103] Beast Within +SB: 3 [M12:164] Autumn's Veil +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jul 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jul 2012.mwDeck.dck new file mode 100644 index 00000000000..242dabfdaaf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Jul 2012.mwDeck.dck @@ -0,0 +1,28 @@ +4 [MBS:75] Slagstorm +4 [UNH:140] Forest +4 [M13:228] Rootbound Crag +4 [M12:188] Primeval Titan +3 [NPH:103] Beast Within +3 [UNH:139] Mountain +4 [C13:114] Inferno Titan +2 [ISD:140] Devil's Play +1 [ISD:243] Kessig Wolf Run +4 [AVR:226] Cavern of Souls +4 [M12:190] Rampant Growth +1 [C14:184] Whipflare +2 [MBS:145] Inkmoth Nexus +4 [SOM:227] Glimmerpost +4 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 1 [ISD:243] Kessig Wolf Run +SB: 2 [M12:128] Combust +SB: 2 [MBS:74] Red Sun's Zenith +SB: 1 [C14:283] Wurmcoil Engine +SB: 1 [NPH:103] Beast Within +SB: 1 [M13:123] Chandra, the Firebrand +SB: 2 [SOM:222] Wall of Tanglecord +SB: 2 [DKA:110] Crushing Vines +SB: 2 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST May 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST May 2012.mwDeck.dck new file mode 100644 index 00000000000..2f3a4fffd2c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST May 2012.mwDeck.dck @@ -0,0 +1,28 @@ +3 [NPH:161] Sword of War and Peace +4 [M13:228] Rootbound Crag +10 [UNH:140] Forest +1 [M12:146] Incinerate +4 [MBS:81] Green Sun's Zenith +4 [M12:165] Birds of Paradise +4 [C14:204] Llanowar Elves +3 [UNH:139] Mountain +1 [C13:134] Acidic Slime +2 [ISD:243] Kessig Wolf Run +2 [NPH:42] Phyrexian Metamorph +4 [DKA:127] Strangleroot Geist +2 [DKA:93] Hellrider +1 [MBS:138] Sword of Feast and Famine +3 [AVR:205] Wolfir Avenger +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +4 [SOM:91] Galvanic Blast +SB: 1 [NPH:107] Corrosive Gale +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 2 [M12:150] Manabarbs +SB: 2 [KTK:142] Naturalize +SB: 1 [ISD:176] Daybreak Ranger +SB: 2 [NPH:78] Act of Aggression +SB: 1 [AVR:166] Zealous Conscripts +SB: 3 [SOM:81] Arc Trail +SB: 1 [DKA:120] Increasing Savagery +SB: 1 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..88c503ed749 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,26 @@ +3 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +6 [UNH:139] Mountain +4 [C13:114] Inferno Titan +2 [ISD:140] Devil's Play +1 [M14:155] Shock +3 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +4 [MBS:145] Inkmoth Nexus +4 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [SOM:91] Galvanic Blast +SB: 1 [MBS:75] Slagstorm +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 1 [MBS:94] Viridian Corrupter +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 2 [ISD:207] Tree of Redemption +SB: 1 [NPH:103] Beast Within +SB: 4 [M12:164] Autumn's Veil +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..11ea4f3ed56 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig Titan TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,25 @@ +3 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +9 [UNH:140] Forest +4 [MBS:95] Viridian Emissary +4 [MBS:81] Green Sun's Zenith +3 [M12:188] Primeval Titan +4 [NPH:103] Beast Within +1 [M12:165] Birds of Paradise +3 [UNH:139] Mountain +4 [M13:174] Garruk, Primal Hunter +1 [C13:134] Acidic Slime +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +3 [C14:283] Wurmcoil Engine +4 [MBS:145] Inkmoth Nexus +3 [C14:271] Solemn Simulacrum +4 [SOM:225] Copperline Gorge +SB: 1 [MBS:75] Slagstorm +SB: 1 [MBS:94] Viridian Corrupter +SB: 3 [MBS:138] Sword of Feast and Famine +SB: 1 [M14:215] Ratchet Bomb +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 2 [ISD:207] Tree of Redemption +SB: 1 [NPH:159] Spellskite +SB: 4 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kessig U TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kessig U TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..29b0c891699 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kessig U TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,28 @@ +5 [UNH:140] Forest +4 [AVR:81] Temporal Mastery +4 [M12:188] Primeval Titan +1 [UNH:139] Mountain +2 [ISD:78] Snapcaster Mage +2 [C14:112] Frost Titan +2 [M13:193] Thragtusk +1 [ISD:243] Kessig Wolf Run +4 [M13:170] Farseek +2 [AVR:226] Cavern of Souls +4 [M12:190] Rampant Growth +4 [ISD:241] Hinterland Harbor +4 [AVR:129] Bonfire of the Damned +1 [MBS:145] Inkmoth Nexus +4 [SOM:227] Glimmerpost +2 [C14:271] Solemn Simulacrum +4 [SOM:225] Copperline Gorge +2 [M12:72] Phantasmal Image +4 [UNH:137] Island +4 [M12:73] Ponder +SB: 2 [M13:193] Thragtusk +SB: 2 [AVR:226] Cavern of Souls +SB: 1 [M12:128] Combust +SB: 2 [C14:184] Whipflare +SB: 2 [NPH:103] Beast Within +SB: 2 [DKA:110] Crushing Vines +SB: 2 [NPH:1] Karn Liberated +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kozilek Caw-Blade TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kozilek Caw-Blade TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..7d67c0a5fff --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kozilek Caw-Blade TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,28 @@ +3 [MBS:43] Go for the Throat +1 [NPH:161] Sword of War and Peace +4 [WWK:134] Creeping Tar Pit +3 [M13:225] Glacial Fortress +1 [NPH:130] Batterskull +2 [ZEN:211] Arid Mesa +4 [ROE:115] Inquisition of Kozilek +2 [KTK:69] Despise +1 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [ZEN:219] Marsh Flats +1 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +2 [ZEN:11] Emeria Angel +4 [M11:33] Squadron Hawk +4 [SOM:226] Darkslick Shores +4 [WWK:20] Stoneforge Mystic +4 [WWK:31] Jace, the Mind Sculptor +4 [UNH:136] Plains +2 [UNH:138] Swamp +2 [M12:63] Mana Leak +SB: 2 [MBS:5] Divine Offering +SB: 2 [ZEN:11] Emeria Angel +SB: 2 [NPH:130] Batterskull +SB: 1 [M14:97] Duress +SB: 3 [ROE:40] Oust +SB: 3 [NPH:159] Spellskite +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Kuldotha Red TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Kuldotha Red TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..09c1d144168 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Kuldotha Red TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,20 @@ +4 [SOM:174] Memnite +3 [SOM:141] Chimeric Mass +2 [ROE:140] Devastating Summons +16 [UNH:139] Mountain +4 [M15:223] Ornithopter +4 [ZEN:125] Goblin Bushwhacker +4 [ZEN:126] Goblin Guide +4 [MBS:107] Flayer Husk +4 [SOM:96] Kuldotha Rebirth +4 [MBS:131] Signal Pest +3 [SOM:179] Mox Opal +4 [MBS:144] Contested War Zone +4 [SOM:91] Galvanic Blast +SB: 3 [M13:141] Mark of Mutiny +SB: 4 [M11:208] Jinxed Idol +SB: 1 [M15:225] Phyrexian Revoker +SB: 1 [ZEN:226] Teetering Peaks +SB: 1 [C14:183] Tuktuk the Explorer +SB: 3 [SOM:81] Arc Trail +SB: 2 [ROE:146] Forked Bolt diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..77253da0835 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,48 @@ +3 [ONS:313] Bloodstained Mire +1 [THS:127] Lightning Strike +1 [7ED:339] Mountain +1 [INV:343] Mountain +1 [ZEN:263] Mountain +1 [APC:140] Caves of Koilos +3 [KTK:22] Seeker of the Way +1 [THS:227] Temple of Silence +1 [KTK:202] Sorin, Solemn Visitor +4 [THS:228] Temple of Triumph +4 [KTK:168] Butcher of the Horde +1 [M14:132] Chandra, Pyromaster +2 [M15:145] Goblin Rabblemaster +1 [APC:139] Battlefield Forge +1 [DDL:22] Magma Jet +3 [THS:4] Chained to the Rocks +1 [10E:348] Battlefield Forge +1 [PO2:157] Mountain +1 [SOM:238] Swamp +1 [DDO:1] Elspeth, Sun's Champion +1 [JR:43] Bloodstained Mire +2 [MBP:98] Goblin Rabblemaster +1 [KTK:31] Wingmate Roc +2 [KTK:97] Arc Lightning +1 [9ED:320] Caves of Koilos +2 [KTK:119] Sarkhan, the Dragonspeaker +2 [KTK:237] Nomad Outpost +1 [M12:243] Mountain +2 [M15:155] Lightning Strike +2 [DDN:34] Nomad Outpost +4 [KTK:111] Hordeling Outburst +1 [9ED:318] Battlefield Forge +1 [KTK:81] Murderous Cut +4 [KTK:171] Crackling Doom +1 [TPR:262] Mountain +SB: 1 [ULG:7] Erase +SB: 1 [THS:15] Glare of Heresy +SB: 1 [MBP:75] Chandra, Pyromaster +SB: 2 [THS:112] Anger of the Gods +SB: 1 [THS:101] Read the Bones +SB: 1 [KTK:104] Burn Away +SB: 1 [THS:107] Thoughtseize +SB: 1 [C14:158] Read the Bones +SB: 1 [KTK:186] Mardu Charm +SB: 1 [MGDC:38] Utter End +SB: 1 [KTK:9] Erase +SB: 2 [KTK:8] End Hostilities +SB: 1 [THS:9] Elspeth, Sun's Champion diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Nov 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Nov 2014.mwDeck.dck new file mode 100644 index 00000000000..c02752c3ca5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Control TDtB ST Nov 2014.mwDeck.dck @@ -0,0 +1,26 @@ +3 [KTK:119] Sarkhan, the Dragonspeaker +4 [KTK:237] Nomad Outpost +3 [KTK:22] Seeker of the Way +2 [THS:227] Temple of Silence +2 [KTK:202] Sorin, Solemn Visitor +2 [THS:128] Magma Jet +3 [M15:240] Battlefield Forge +3 [THS:228] Temple of Triumph +2 [M15:241] Caves of Koilos +4 [KTK:168] Butcher of the Horde +6 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [KTK:111] Hordeling Outburst +3 [THS:4] Chained to the Rocks +4 [KTK:230] Bloodstained Mire +1 [KTK:81] Murderous Cut +4 [KTK:171] Crackling Doom +1 [THS:9] Elspeth, Sun's Champion +1 [UNH:138] Swamp +SB: 2 [KTK:210] Utter End +SB: 2 [M15:134] Chandra, Pyromaster +SB: 2 [THS:15] Glare of Heresy +SB: 3 [KTK:8] End Hostilities +SB: 3 [THS:112] Anger of the Gods +SB: 3 [M15:164] Stoke the Flames diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Jan 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Jan 2015.mwDeck.dck new file mode 100644 index 00000000000..8b4efaf503e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Jan 2015.mwDeck.dck @@ -0,0 +1,29 @@ +2 [KTK:31] Wingmate Roc +2 [KTK:119] Sarkhan, the Dragonspeaker +4 [KTK:237] Nomad Outpost +3 [KTK:22] Seeker of the Way +2 [THS:227] Temple of Silence +2 [KTK:202] Sorin, Solemn Visitor +3 [M15:240] Battlefield Forge +4 [THS:228] Temple of Triumph +2 [M15:241] Caves of Koilos +4 [KTK:168] Butcher of the Horde +5 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +1 [KTK:210] Utter End +4 [KTK:111] Hordeling Outburst +3 [THS:4] Chained to the Rocks +4 [KTK:230] Bloodstained Mire +1 [KTK:81] Murderous Cut +4 [KTK:171] Crackling Doom +1 [THS:9] Elspeth, Sun's Champion +1 [UNH:138] Swamp +SB: 1 [KTK:210] Utter End +SB: 2 [C14:158] Read the Bones +SB: 3 [M15:15] Hushwing Gryff +SB: 1 [THS:15] Glare of Heresy +SB: 1 [KTK:9] Erase +SB: 1 [KTK:8] End Hostilities +SB: 3 [THS:112] Anger of the Gods +SB: 3 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Oct 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Oct 2014.mwDeck.dck new file mode 100644 index 00000000000..601d07e4c31 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mardu Midrange TDtB ST Oct 2014.mwDeck.dck @@ -0,0 +1,32 @@ +3 [BNG:5] Brimaz, King of Oreskos +3 [THS:143] Stormbreath Dragon +2 [KTK:119] Sarkhan, the Dragonspeaker +4 [KTK:237] Nomad Outpost +2 [THS:227] Temple of Silence +2 [KTK:202] Sorin, Solemn Visitor +2 [M15:240] Battlefield Forge +2 [THS:228] Temple of Triumph +4 [THS:107] Thoughtseize +4 [M15:241] Caves of Koilos +2 [M15:164] Stoke the Flames +4 [KTK:168] Butcher of the Horde +2 [UNH:139] Mountain +3 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [KTK:230] Bloodstained Mire +1 [KTK:81] Murderous Cut +3 [THS:90] Hero's Downfall +4 [KTK:171] Crackling Doom +2 [BNG:164] Temple of Malice +1 [JOU:163] Mana Confluence +2 [UNH:138] Swamp +SB: 2 [JOU:18] Nyx-Fleece Ram +SB: 1 [KTK:210] Utter End +SB: 2 [JOU:103] Magma Spray +SB: 1 [KTK:72] Empty the Pits +SB: 1 [JOU:100] Harness by Force +SB: 3 [THS:112] Anger of the Gods +SB: 1 [KTK:31] Wingmate Roc +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 2 [KTK:69] Despise +SB: 1 [KTK:25] Suspension Field diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Aggro TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Aggro TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..8f2be967420 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Aggro TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,20 @@ +1 [RTR:82] Ultimate Price +4 [RTR:73] Pack Rat +4 [THS:107] Thoughtseize +4 [THS:108] Tormented Hero +3 [BNG:61] Bile Blight +3 [M14:101] Lifebane Zombie +4 [RTR:220] Rakdos Cackler +3 [BNG:80] Pain Seer +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +2 [THS:97] Mogis's Marauder +20 [UNH:138] Swamp +4 [BNG:75] Herald of Torment +SB: 1 [THS:110] Whip of Erebos +SB: 2 [RTR:63] Desecration Demon +SB: 2 [M14:96] Doom Blade +SB: 3 [M14:97] Duress +SB: 3 [THS:83] Dark Betrayal +SB: 2 [GTC:63] Devour Flesh +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..a97fed56249 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,26 @@ +2 [MBS:43] Go for the Throat +2 [M12:109] Sorin Markov +4 [C13:97] Vampire Nighthawk +1 [M12:111] Sorin's Vengeance +2 [NPH:1] Karn Liberated +3 [C14:136] Black Sun's Zenith +2 [C14:145] Grave Titan +1 [NPH:74] Surgical Extraction +2 [NPH:42] Phyrexian Metamorph +4 [C14:264] Pristine Talisman +1 [NPH:57] Dismember +1 [ISD:115] Sever the Bloodline +1 [M14:96] Doom Blade +3 [C14:150] Mutilate +4 [C14:161] Sign in Blood +3 [M14:97] Duress +2 [ISD:94] Curse of Death's Hold +23 [UNH:138] Swamp +SB: 1 [NPH:74] Surgical Extraction +SB: 3 [DKA:149] Grafdigger's Cage +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [ISD:115] Sever the Bloodline +SB: 2 [ISD:90] Bloodline Keeper +SB: 2 [C13:249] Nihil Spellbomb +SB: 1 [NPH:137] Hex Parasite +SB: 3 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..bb087ddf3bd --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Control TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,18 @@ +1 [MBS:43] Go for the Throat +4 [C13:97] Vampire Nighthawk +4 [ROE:115] Inquisition of Kozilek +4 [ZEN:89] Gatekeeper of Malakir +4 [C14:245] Lashwrithe +2 [M15:103] Liliana Vess +4 [NPH:68] Phyrexian Obliterator +2 [NPH:57] Dismember +2 [M14:96] Doom Blade +4 [C14:161] Sign in Blood +4 [M14:97] Duress +1 [M14:91] Corrupt +24 [UNH:138] Swamp +SB: 4 [SOM:69] Memoricide +SB: 4 [MBS:50] Phyrexian Crusader +SB: 2 [M14:96] Doom Blade +SB: 4 [ZEN:83] Bloodghast +SB: 1 [NPH:130] Batterskull diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Infect TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Infect TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..68a90eabb8c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mono Black Infect TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,24 @@ +2 [SOM:79] Skithiryx, the Blight Dragon +4 [MBS:50] Phyrexian Crusader +3 [C13:249] Nihil Spellbomb +4 [C14:245] Lashwrithe +2 [NPH:77] Whispering Specter +1 [SOM:218] Tumble Magnet +2 [NPH:57] Dismember +4 [MBS:145] Inkmoth Nexus +4 [SOM:75] Plague Stinger +2 [M14:96] Doom Blade +2 [NPH:47] Tezzeret's Gambit +2 [MBS:57] Virulent Wound +2 [M12:94] Distress +21 [UNH:138] Swamp +3 [ISD:105] Liliana of the Veil +2 [SOM:144] Contagion Clasp +SB: 2 [C14:136] Black Sun's Zenith +SB: 2 [NPH:77] Whispering Specter +SB: 3 [MBS:52] Phyrexian Vatmother +SB: 1 [M14:96] Doom Blade +SB: 2 [MBS:57] Virulent Wound +SB: 2 [M12:94] Distress +SB: 1 [C13:249] Nihil Spellbomb +SB: 2 [NPH:159] Spellskite diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Mono Green Infect TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Mono Green Infect TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..97005651c11 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Mono Green Infect TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,22 @@ +1 [MBS:94] Viridian Corrupter +13 [UNH:140] Forest +4 [NPH:2] Apostle's Blessing +4 [NPH:111] Glistener Elf +2 [MBS:81] Green Sun's Zenith +4 [M13:221] Cathedral of War +4 [M13:185] Rancor +4 [NPH:116] Mutagenic Growth +4 [AVR:203] Wild Defiance +4 [NPH:86] Gut Shot +4 [M15:203] Titanic Growth +4 [MBS:145] Inkmoth Nexus +3 [NPH:38] Mental Misstep +1 [SOM:112] Blight Mamba +4 [SOM:166] Ichorclaw Myr +SB: 3 [MBS:94] Viridian Corrupter +SB: 4 [NPH:57] Dismember +SB: 1 [NPH:38] Mental Misstep +SB: 2 [NPH:103] Beast Within +SB: 1 [NPH:115] Melira, Sylvok Outcast +SB: 3 [NPH:159] Spellskite +SB: 1 [SOM:112] Blight Mamba diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Apr 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Apr 2014.mwDeck.dck new file mode 100644 index 00000000000..ec8c5863ea0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Apr 2014.mwDeck.dck @@ -0,0 +1,23 @@ +3 [THS:224] Temple of Abandon +2 [M14:1] Ajani, Caller of the Pride +4 [GTC:119] Experiment One +2 [UNH:140] Forest +1 [THS:228] Temple of Triumph +4 [C13:179] Boros Charm +4 [C13:211] Selesnya Charm +4 [M14:202] Witchstalker +4 [RTR:248] Temple Garden +4 [GTC:247] Stomping Ground +4 [THS:193] Fleecemane Lion +4 [BNG:165] Temple of Plenty +3 [DGM:51] Advent of the Wurm +4 [GTC:245] Sacred Foundry +4 [GTC:167] Ghor-Clan Rampager +1 [GTC:98] Madcap Skills +3 [THS:152] Boon Satyr +1 [UNH:136] Plains +4 [DGM:114] Voice of Resurgence +SB: 4 [DGM:49] Skylasher +SB: 4 [DGM:111] Unflinching Courage +SB: 3 [GTC:98] Madcap Skills +SB: 4 [RTR:9] Ethereal Armor diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..7fa129f9df3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,23 @@ +4 [AVR:32] Restoration Angel +4 [UNH:140] Forest +4 [M13:228] Rootbound Crag +3 [UNH:139] Mountain +4 [RTR:178] Loxodon Smiter +4 [M13:150] Thundermaw Hellkite +4 [C13:211] Selesnya Charm +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [M13:170] Farseek +4 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +4 [AVR:129] Bonfire of the Damned +4 [DKA:140] Huntmaster of the Fells +3 [ISD:238] Clifftop Retreat +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 1 [DKA:17] Ray of Revelation +SB: 2 [ISD:181] Garruk Relentless +SB: 4 [AVR:149] Pillar of Flame +SB: 2 [RTR:1] Angel of Serenity +SB: 2 [AVR:210] Sigarda, Host of Herons +SB: 2 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..d794aa0a0cd --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aggro TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,33 @@ +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +3 [UNH:140] Forest +3 [GTC:215] Boros Reckoner +1 [THS:209] Xenagos, the Reveler +2 [THS:228] Temple of Triumph +1 [M14:195] Scavenging Ooze +1 [UNH:139] Mountain +3 [RTR:178] Loxodon Smiter +1 [M15:134] Chandra, Pyromaster +1 [RTR:101] Mizzium Mortars +4 [RTR:248] Temple Garden +4 [GTC:247] Stomping Ground +4 [THS:193] Fleecemane Lion +1 [THS:172] Polukranos, World Eater +4 [GTC:245] Sacred Foundry +4 [GTC:167] Ghor-Clan Rampager +4 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +2 [UNH:136] Plains +1 [THS:180] Sylvan Caryatid +4 [DGM:114] Voice of Resurgence +SB: 1 [RTR:101] Mizzium Mortars +SB: 1 [M14:155] Shock +SB: 2 [C13:179] Boros Charm +SB: 3 [DGM:111] Unflinching Courage +SB: 1 [C13:211] Selesnya Charm +SB: 2 [THS:15] Glare of Heresy +SB: 1 [RTR:231] Pithing Needle +SB: 1 [GTC:169] Gruul Charm +SB: 1 [THS:150] Arbor Colossus +SB: 1 [DGM:135] Wear // Tear +SB: 1 [M14:195] Scavenging Ooze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..ea1b95c2576 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,25 @@ +2 [M14:1] Ajani, Caller of the Pride +2 [BNG:7] Eidolon of Countless Battles +2 [M14:18] Fiendslayer Paladin +4 [UNH:140] Forest +2 [BNG:27] Spirit of the Labyrinth +1 [THS:228] Temple of Triumph +4 [RTR:9] Ethereal Armor +4 [M14:176] Gladecover Scout +4 [C13:179] Boros Charm +4 [THS:4] Chained to the Rocks +4 [DGM:111] Unflinching Courage +2 [C13:211] Selesnya Charm +4 [M14:202] Witchstalker +4 [RTR:248] Temple Garden +4 [GTC:247] Stomping Ground +4 [BNG:165] Temple of Plenty +4 [GTC:245] Sacred Foundry +4 [GTC:98] Madcap Skills +1 [UNH:136] Plains +SB: 4 [DGM:49] Skylasher +SB: 2 [C13:211] Selesnya Charm +SB: 3 [GTC:219] Gift of Orzhova +SB: 3 [DGM:44] Mending Touch +SB: 2 [BNG:27] Spirit of the Labyrinth +SB: 1 [BNG:25] Revoke Existence diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST May 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST May 2014.mwDeck.dck new file mode 100644 index 00000000000..9f495c8c1a4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Aura TDtB ST May 2014.mwDeck.dck @@ -0,0 +1,24 @@ +4 [JOU:117] Bassara Tower Archer +2 [THS:224] Temple of Abandon +1 [UNH:140] Forest +4 [RTR:9] Ethereal Armor +4 [M14:176] Gladecover Scout +4 [C13:179] Boros Charm +4 [DGM:111] Unflinching Courage +4 [M14:202] Witchstalker +4 [RTR:248] Temple Garden +4 [GTC:247] Stomping Ground +2 [THS:193] Fleecemane Lion +4 [JOU:163] Mana Confluence +4 [BNG:165] Temple of Plenty +4 [GTC:245] Sacred Foundry +4 [GTC:167] Ghor-Clan Rampager +4 [GTC:98] Madcap Skills +3 [THS:152] Boon Satyr +SB: 2 [DGM:49] Skylasher +SB: 2 [C13:211] Selesnya Charm +SB: 2 [THS:4] Chained to the Rocks +SB: 2 [JOU:5] Banishing Light +SB: 3 [GTC:106] Skullcrack +SB: 2 [DGM:135] Wear // Tear +SB: 2 [M14:195] Scavenging Ooze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Blitz TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Blitz TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..ead1e4e5b8c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Blitz TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,24 @@ +4 [GTC:7] Boros Elite +2 [M13:229] Sunpetal Grove +4 [GTC:119] Experiment One +1 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [M13:147] Searing Spear +4 [ISD:193] Mayor of Avabruck +4 [M13:171] Flinthoof Boar +4 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +4 [GTC:247] Stomping Ground +4 [GTC:12] Frontline Medic +4 [AVR:144] Lightning Mauler +4 [GTC:245] Sacred Foundry +1 [GTC:167] Ghor-Clan Rampager +3 [DKA:24] Thalia, Guardian of Thraben +1 [ISD:238] Clifftop Retreat +4 [ISD:6] Champion of the Parish +SB: 4 [C13:179] Boros Charm +SB: 2 [C13:11] Fiend Hunter +SB: 3 [M14:25] Pacifism +SB: 2 [GTC:215] Boros Reckoner +SB: 2 [AVR:31] Nearheath Pilgrim +SB: 2 [M14:139] Flames of the Firebrand diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST Jun 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST Jun 2013.mwDeck.dck new file mode 100644 index 00000000000..de642397811 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST Jun 2013.mwDeck.dck @@ -0,0 +1,24 @@ +4 [GTC:7] Boros Elite +2 [M13:229] Sunpetal Grove +4 [GTC:119] Experiment One +1 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [M13:147] Searing Spear +4 [ISD:193] Mayor of Avabruck +4 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +4 [ISD:187] Hamlet Captain +4 [GTC:247] Stomping Ground +4 [GTC:12] Frontline Medic +4 [AVR:144] Lightning Mauler +4 [GTC:245] Sacred Foundry +1 [GTC:167] Ghor-Clan Rampager +3 [DKA:24] Thalia, Guardian of Thraben +1 [ISD:238] Clifftop Retreat +4 [ISD:6] Champion of the Parish +SB: 2 [RTR:93] Electrickery +SB: 3 [C13:179] Boros Charm +SB: 2 [C13:11] Fiend Hunter +SB: 3 [C14:278] Tormod's Crypt +SB: 2 [M14:25] Pacifism +SB: 3 [GTC:106] Skullcrack diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..e0dbe60f93a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Human TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,25 @@ +4 [GTC:7] Boros Elite +4 [GTC:119] Experiment One +2 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +1 [ISD:34] Spare from Evil +2 [C13:179] Boros Charm +4 [ISD:193] Mayor of Avabruck +4 [M13:171] Flinthoof Boar +4 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +4 [GTC:247] Stomping Ground +4 [GTC:12] Frontline Medic +4 [AVR:144] Lightning Mauler +4 [GTC:245] Sacred Foundry +2 [GTC:167] Ghor-Clan Rampager +3 [DKA:24] Thalia, Guardian of Thraben +2 [ISD:238] Clifftop Retreat +4 [ISD:6] Champion of the Parish +SB: 1 [ISD:34] Spare from Evil +SB: 3 [M13:141] Mark of Mutiny +SB: 1 [C13:179] Boros Charm +SB: 3 [C14:278] Tormod's Crypt +SB: 2 [C13:11] Fiend Hunter +SB: 2 [DGM:111] Unflinching Courage +SB: 3 [AVR:149] Pillar of Flame diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Humans TDtB ST Jul 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Humans TDtB ST Jul 2012.mwDeck.dck new file mode 100644 index 00000000000..877132184be --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Humans TDtB ST Jul 2012.mwDeck.dck @@ -0,0 +1,26 @@ +4 [AVR:32] Restoration Angel +3 [UNH:140] Forest +3 [C14:72] Geist-Honored Monk +4 [NPH:4] Blade Splicer +4 [M12:165] Birds of Paradise +2 [UNH:139] Mountain +4 [ISD:170] Avacyn's Pilgrim +3 [DKA:127] Strangleroot Geist +4 [AVR:226] Cavern of Souls +4 [AVR:129] Bonfire of the Damned +4 [SOM:228] Razorverge Thicket +4 [SOM:225] Copperline Gorge +4 [AVR:169] Borderland Ranger +4 [DKA:140] Huntmaster of the Fells +2 [UNH:136] Plains +4 [ISD:239] Gavony Township +3 [DKA:24] Thalia, Guardian of Thraben +SB: 2 [M12:128] Combust +SB: 2 [AVR:206] Wolfir Silverheart +SB: 3 [AVR:166] Zealous Conscripts +SB: 1 [M15:192] Plummet +SB: 2 [M12:11] Celestial Purge +SB: 1 [M13:22] Oblivion Ring +SB: 1 [DKA:110] Crushing Vines +SB: 2 [MBS:8] Hero of Bladehold +SB: 1 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Midrange TDtB ST Jul 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Midrange TDtB ST Jul 2013.mwDeck.dck new file mode 100644 index 00000000000..45a6b087871 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Midrange TDtB ST Jul 2013.mwDeck.dck @@ -0,0 +1,24 @@ +3 [AVR:32] Restoration Angel +3 [M13:229] Sunpetal Grove +4 [M13:228] Rootbound Crag +4 [GTC:215] Boros Reckoner +4 [RTR:178] Loxodon Smiter +4 [M13:150] Thundermaw Hellkite +2 [C13:211] Selesnya Charm +4 [ISD:170] Avacyn's Pilgrim +4 [RTR:248] Temple Garden +3 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [GTC:245] Sacred Foundry +4 [GTC:156] Domri Rade +4 [DKA:140] Huntmaster of the Fells +2 [ISD:239] Gavony Township +3 [ISD:238] Clifftop Retreat +4 [DGM:114] Voice of Resurgence +SB: 3 [C13:179] Boros Charm +SB: 2 [DKA:17] Ray of Revelation +SB: 2 [DGM:111] Unflinching Courage +SB: 2 [AVR:149] Pillar of Flame +SB: 2 [AVR:166] Zealous Conscripts +SB: 2 [M13:22] Oblivion Ring +SB: 2 [DKA:7] Faith's Shield diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Apr 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Apr 2012.mwDeck.dck new file mode 100644 index 00000000000..3998b644a44 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Apr 2012.mwDeck.dck @@ -0,0 +1,34 @@ +1 [C13:11] Fiend Hunter +3 [M13:229] Sunpetal Grove +3 [M13:228] Rootbound Crag +6 [UNH:140] Forest +1 [C14:72] Geist-Honored Monk +4 [NPH:4] Blade Splicer +4 [NPH:104] Birthing Pod +1 [C14:204] Llanowar Elves +1 [UNH:139] Mountain +1 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +4 [DKA:127] Strangleroot Geist +1 [NPH:9] Elesh Norn, Grand Cenobite +1 [C14:283] Wurmcoil Engine +3 [DKA:140] Huntmaster of the Fells +1 [UNH:136] Plains +4 [M12:165] Birds of Paradise +3 [ISD:170] Avacyn's Pilgrim +1 [NPH:42] Phyrexian Metamorph +2 [ISD:176] Daybreak Ranger +4 [SOM:228] Razorverge Thicket +1 [C14:271] Solemn Simulacrum +4 [SOM:225] Copperline Gorge +2 [M13:22] Oblivion Ring +2 [ISD:239] Gavony Township +1 [MBS:8] Hero of Bladehold +SB: 3 [M12:150] Manabarbs +SB: 1 [NPH:42] Phyrexian Metamorph +SB: 2 [ISD:176] Daybreak Ranger +SB: 2 [NPH:78] Act of Aggression +SB: 3 [M12:11] Celestial Purge +SB: 1 [M13:22] Oblivion Ring +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 1 [MBS:8] Hero of Bladehold diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..d0f052dc40c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,34 @@ +4 [AVR:32] Restoration Angel +1 [M13:229] Sunpetal Grove +1 [M13:228] Rootbound Crag +5 [UNH:140] Forest +4 [NPH:4] Blade Splicer +4 [M12:165] Birds of Paradise +3 [NPH:104] Birthing Pod +1 [UNH:139] Mountain +1 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +1 [M13:193] Thragtusk +4 [ISD:170] Avacyn's Pilgrim +1 [NPH:42] Phyrexian Metamorph +4 [AVR:226] Cavern of Souls +1 [AVR:206] Wolfir Silverheart +3 [AVR:129] Bonfire of the Damned +4 [SOM:228] Razorverge Thicket +1 [AVR:166] Zealous Conscripts +3 [C14:193] Elvish Visionary +4 [SOM:225] Copperline Gorge +2 [DKA:140] Huntmaster of the Fells +3 [AVR:169] Borderland Ranger +1 [UNH:136] Plains +3 [ISD:239] Gavony Township +SB: 1 [M13:193] Thragtusk +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [AVR:166] Zealous Conscripts +SB: 2 [M12:11] Celestial Purge +SB: 2 [SOM:81] Arc Trail +SB: 1 [NPH:115] Melira, Sylvok Outcast +SB: 1 [NPH:159] Spellskite +SB: 1 [M12:197] Stingerfling Spider +SB: 2 [DKA:110] Crushing Vines +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..6978cca83b1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,36 @@ +1 [C13:11] Fiend Hunter +3 [M13:229] Sunpetal Grove +2 [M13:228] Rootbound Crag +6 [UNH:140] Forest +1 [C14:72] Geist-Honored Monk +4 [NPH:4] Blade Splicer +4 [NPH:104] Birthing Pod +1 [C14:204] Llanowar Elves +1 [UNH:139] Mountain +1 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +4 [DKA:127] Strangleroot Geist +1 [NPH:9] Elesh Norn, Grand Cenobite +1 [C14:283] Wurmcoil Engine +2 [MBS:115] Mortarpod +4 [DKA:140] Huntmaster of the Fells +1 [UNH:136] Plains +1 [MBS:95] Viridian Emissary +4 [M12:165] Birds of Paradise +3 [ISD:170] Avacyn's Pilgrim +4 [SOM:228] Razorverge Thicket +1 [C14:271] Solemn Simulacrum +4 [SOM:225] Copperline Gorge +2 [M13:22] Oblivion Ring +3 [ISD:239] Gavony Township +SB: 1 [DKA:17] Ray of Revelation +SB: 1 [C13:134] Acidic Slime +SB: 1 [NPH:42] Phyrexian Metamorph +SB: 1 [NPH:97] Tormentor Exarch +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 1 [M13:22] Oblivion Ring +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 3 [NPH:38] Mental Misstep +SB: 2 [MBS:8] Hero of Bladehold +SB: 1 [M12:164] Autumn's Veil +SB: 1 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST May 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST May 2012.mwDeck.dck new file mode 100644 index 00000000000..bc7638937a5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Pod TDtB ST May 2012.mwDeck.dck @@ -0,0 +1,32 @@ +2 [M13:229] Sunpetal Grove +3 [M13:228] Rootbound Crag +8 [UNH:140] Forest +4 [NPH:4] Blade Splicer +4 [MBS:81] Green Sun's Zenith +1 [M12:188] Primeval Titan +1 [NPH:90] Priest of Urabrask +4 [M12:165] Birds of Paradise +4 [NPH:104] Birthing Pod +2 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +2 [ISD:170] Avacyn's Pilgrim +1 [ISD:243] Kessig Wolf Run +1 [NPH:42] Phyrexian Metamorph +4 [DKA:127] Strangleroot Geist +1 [DKA:93] Hellrider +1 [MBS:138] Sword of Feast and Famine +4 [SOM:228] Razorverge Thicket +2 [AVR:166] Zealous Conscripts +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +2 [ISD:239] Gavony Township +SB: 1 [DKA:17] Ray of Revelation +SB: 1 [NPH:42] Phyrexian Metamorph +SB: 1 [MBS:94] Viridian Corrupter +SB: 2 [AVR:149] Pillar of Flame +SB: 1 [C14:175] Faithless Looting +SB: 1 [MBS:145] Inkmoth Nexus +SB: 2 [M12:11] Celestial Purge +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 3 [M13:22] Oblivion Ring +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya Podlight TDtB ST Jul 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya Podlight TDtB ST Jul 2012.mwDeck.dck new file mode 100644 index 00000000000..35bd1444f5d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya Podlight TDtB ST Jul 2012.mwDeck.dck @@ -0,0 +1,37 @@ +1 [C13:11] Fiend Hunter +2 [M13:229] Sunpetal Grove +2 [M13:228] Rootbound Crag +4 [UNH:140] Forest +4 [NPH:4] Blade Splicer +2 [NPH:104] Birthing Pod +1 [UNH:139] Mountain +1 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +2 [ISD:181] Garruk Relentless +2 [DKA:127] Strangleroot Geist +2 [AVR:226] Cavern of Souls +1 [AVR:206] Wolfir Silverheart +1 [AVR:166] Zealous Conscripts +1 [AVR:200] Ulvenwald Tracker +1 [AVR:169] Borderland Ranger +3 [DKA:140] Huntmaster of the Fells +2 [UNH:136] Plains +4 [AVR:32] Restoration Angel +4 [M12:165] Birds of Paradise +3 [ISD:170] Avacyn's Pilgrim +2 [NPH:42] Phyrexian Metamorph +4 [SOM:228] Razorverge Thicket +4 [SOM:225] Copperline Gorge +3 [ISD:239] Gavony Township +3 [DKA:24] Thalia, Guardian of Thraben +SB: 2 [NPH:161] Sword of War and Peace +SB: 1 [ISD:176] Daybreak Ranger +SB: 3 [AVR:129] Bonfire of the Damned +SB: 1 [AVR:166] Zealous Conscripts +SB: 1 [AVR:200] Ulvenwald Tracker +SB: 1 [DKA:140] Huntmaster of the Fells +SB: 2 [M13:22] Oblivion Ring +SB: 1 [DKA:110] Crushing Vines +SB: 1 [M12:197] Stingerfling Spider +SB: 1 [MBS:8] Hero of Bladehold +SB: 1 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Naya TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Naya TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..4a1b2cb2f4f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Naya TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,28 @@ +4 [AVR:32] Restoration Angel +4 [M13:229] Sunpetal Grove +3 [UNH:140] Forest +4 [M13:228] Rootbound Crag +3 [RTR:1] Angel of Serenity +1 [UNH:139] Mountain +2 [M13:174] Garruk, Primal Hunter +2 [RTR:178] Loxodon Smiter +3 [C13:211] Selesnya Charm +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [M13:170] Farseek +4 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +3 [AVR:129] Bonfire of the Damned +3 [AVR:169] Borderland Ranger +4 [DKA:140] Huntmaster of the Fells +2 [UNH:136] Plains +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 1 [DKA:17] Ray of Revelation +SB: 2 [RTR:178] Loxodon Smiter +SB: 1 [AVR:129] Bonfire of the Damned +SB: 1 [AVR:210] Sigarda, Host of Herons +SB: 2 [AVR:166] Zealous Conscripts +SB: 2 [M13:22] Oblivion Ring +SB: 3 [RTR:18] Rest in Peace +SB: 2 [AVR:198] Triumph of Ferocity diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..358bddefadb --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,28 @@ +3 [RTR:83] Underworld Connections +1 [THS:110] Whip of Erebos +4 [RTR:73] Pack Rat +3 [RTR:63] Desecration Demon +2 [JOU:5] Banishing Light +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +4 [M15:241] Caves of Koilos +3 [BNG:61] Bile Blight +3 [GTC:182] Obzedat, Ghost Council +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [GTC:222] Nightveil Specter +3 [GTC:63] Devour Flesh +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +2 [BNG:163] Temple of Enlightenment +7 [UNH:138] Swamp +SB: 1 [RTR:83] Underworld Connections +SB: 1 [THS:110] Whip of Erebos +SB: 2 [M14:5] Archangel of Thune +SB: 1 [JOU:5] Banishing Light +SB: 2 [M14:96] Doom Blade +SB: 3 [M14:97] Duress +SB: 2 [BNG:65] Drown in Sorrow +SB: 1 [THS:85] Erebos, God of the Dead +SB: 2 [THS:22] Last Breath diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Feb 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Feb 2014.mwDeck.dck new file mode 100644 index 00000000000..a0e8ad57eff --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Feb 2014.mwDeck.dck @@ -0,0 +1,24 @@ +1 [RTR:82] Ultimate Price +3 [RTR:83] Underworld Connections +1 [THS:110] Whip of Erebos +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +3 [C13:312] Orzhov Guildgate +3 [BNG:61] Bile Blight +2 [GTC:182] Obzedat, Ghost Council +4 [DGM:57] Blood Baron of Vizkopa +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +3 [GTC:63] Devour Flesh +1 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +9 [UNH:138] Swamp +SB: 3 [M14:101] Lifebane Zombie +SB: 4 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 2 [THS:83] Dark Betrayal +SB: 1 [THS:85] Erebos, God of the Dead +SB: 1 [GTC:177] Merciless Eviction diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jan 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jan 2014.mwDeck.dck new file mode 100644 index 00000000000..4d4baeef4e8 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jan 2014.mwDeck.dck @@ -0,0 +1,27 @@ +2 [RTR:82] Ultimate Price +3 [RTR:83] Underworld Connections +3 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +2 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +2 [C13:312] Orzhov Guildgate +4 [DGM:57] Blood Baron of Vizkopa +1 [M14:215] Ratchet Bomb +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +3 [GTC:222] Nightveil Specter +2 [GTC:63] Devour Flesh +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +2 [THS:22] Last Breath +10 [UNH:138] Swamp +SB: 2 [M14:101] Lifebane Zombie +SB: 1 [THS:15] Glare of Heresy +SB: 3 [GTC:182] Obzedat, Ghost Council +SB: 1 [M14:215] Ratchet Bomb +SB: 2 [M14:96] Doom Blade +SB: 2 [M14:97] Duress +SB: 2 [THS:83] Dark Betrayal +SB: 1 [THS:22] Last Breath +SB: 1 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jul 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jul 2014.mwDeck.dck new file mode 100644 index 00000000000..7b645864cfc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Jul 2014.mwDeck.dck @@ -0,0 +1,30 @@ +2 [RTR:82] Ultimate Price +3 [RTR:83] Underworld Connections +1 [THS:110] Whip of Erebos +4 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +2 [JOU:5] Banishing Light +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +4 [M15:241] Caves of Koilos +1 [BNG:61] Bile Blight +4 [M14:101] Lifebane Zombie +2 [GTC:182] Obzedat, Ghost Council +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +3 [GTC:63] Devour Flesh +1 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +8 [UNH:138] Swamp +SB: 1 [RTR:83] Underworld Connections +SB: 2 [DGM:57] Blood Baron of Vizkopa +SB: 1 [THS:110] Whip of Erebos +SB: 1 [JOU:7] Deicide +SB: 2 [THS:100] Pharika's Cure +SB: 1 [M14:96] Doom Blade +SB: 2 [M14:97] Duress +SB: 2 [BNG:65] Drown in Sorrow +SB: 1 [THS:85] Erebos, God of the Dead +SB: 2 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Mar 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Mar 2014.mwDeck.dck new file mode 100644 index 00000000000..c4cff552ace --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST Mar 2014.mwDeck.dck @@ -0,0 +1,27 @@ +3 [RTR:82] Ultimate Price +3 [RTR:83] Underworld Connections +2 [BNG:5] Brimaz, King of Oreskos +1 [THS:110] Whip of Erebos +2 [RTR:63] Desecration Demon +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +4 [C13:312] Orzhov Guildgate +3 [BNG:61] Bile Blight +4 [M14:101] Lifebane Zombie +3 [DGM:57] Blood Baron of Vizkopa +3 [GTC:182] Obzedat, Ghost Council +4 [THS:90] Hero's Downfall +2 [M14:228] Mutavault +1 [GTC:63] Devour Flesh +4 [GTC:242] Godless Shrine +4 [UNH:136] Plains +2 [THS:9] Elspeth, Sun's Champion +7 [UNH:138] Swamp +SB: 1 [RTR:83] Underworld Connections +SB: 1 [RTR:231] Pithing Needle +SB: 2 [BNG:25] Revoke Existence +SB: 3 [M14:96] Doom Blade +SB: 4 [M14:97] Duress +SB: 1 [GTC:63] Devour Flesh +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 2 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST May 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST May 2014.mwDeck.dck new file mode 100644 index 00000000000..7288955c4f5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Control TDtB ST May 2014.mwDeck.dck @@ -0,0 +1,25 @@ +1 [RTR:82] Ultimate Price +3 [RTR:83] Underworld Connections +4 [RTR:73] Pack Rat +3 [RTR:63] Desecration Demon +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +2 [C13:312] Orzhov Guildgate +4 [BNG:61] Bile Blight +2 [GTC:182] Obzedat, Ghost Council +3 [DGM:57] Blood Baron of Vizkopa +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +1 [M14:97] Duress +3 [GTC:63] Devour Flesh +1 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +11 [UNH:138] Swamp +SB: 1 [RTR:82] Ultimate Price +SB: 2 [BNG:25] Revoke Existence +SB: 2 [M14:96] Doom Blade +SB: 3 [M14:97] Duress +SB: 3 [THS:83] Dark Betrayal +SB: 2 [BNG:65] Drown in Sorrow +SB: 2 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Jan 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Jan 2014.mwDeck.dck new file mode 100644 index 00000000000..73111d297d9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Jan 2014.mwDeck.dck @@ -0,0 +1,26 @@ +2 [RTR:82] Ultimate Price +4 [THS:225] Temple of Deceit +4 [M14:22] Imposing Sovereign +2 [THS:110] Whip of Erebos +4 [GTC:249] Watery Grave +2 [THS:188] Ashiok, Nightmare Weaver +2 [RTR:63] Desecration Demon +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +4 [RTR:179] Lyev Skyknight +2 [RTR:201] Supreme Verdict +4 [M14:123] Xathrid Necromancer +4 [RTR:155] Detention Sphere +3 [GTC:182] Obzedat, Ghost Council +2 [M14:228] Mutavault +2 [DGM:127] Far // Away +3 [UNH:136] Plains +4 [GTC:242] Godless Shrine +4 [THS:32] Soldier of the Pantheon +SB: 1 [DGM:130] Profit // Loss +SB: 2 [THS:15] Glare of Heresy +SB: 3 [DGM:57] Blood Baron of Vizkopa +SB: 3 [M14:96] Doom Blade +SB: 1 [DGM:127] Far // Away +SB: 3 [THS:83] Dark Betrayal +SB: 2 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..0fc9e808bb9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Orzhov Midrange TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,29 @@ +1 [THS:110] Whip of Erebos +4 [RTR:63] Desecration Demon +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +4 [C13:312] Orzhov Guildgate +3 [C14:158] Read the Bones +1 [DGM:57] Blood Baron of Vizkopa +3 [GTC:182] Obzedat, Ghost Council +4 [THS:90] Hero's Downfall +1 [M14:228] Mutavault +3 [M14:96] Doom Blade +4 [RTR:17] Precinct Captain +4 [GTC:242] Godless Shrine +7 [UNH:136] Plains +1 [THS:9] Elspeth, Sun's Champion +6 [UNH:138] Swamp +2 [DGM:103] Sin Collector +4 [THS:32] Soldier of the Pantheon +SB: 1 [RTR:83] Underworld Connections +SB: 2 [M14:101] Lifebane Zombie +SB: 1 [DGM:57] Blood Baron of Vizkopa +SB: 3 [M14:18] Fiendslayer Paladin +SB: 1 [RTR:231] Pithing Needle +SB: 1 [THS:100] Pharika's Cure +SB: 1 [M14:96] Doom Blade +SB: 1 [GTC:63] Devour Flesh +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 1 [THS:22] Last Breath +SB: 2 [DGM:103] Sin Collector diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Patriot Midrange TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Patriot Midrange TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..14626614355 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Patriot Midrange TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,32 @@ +3 [AVR:32] Restoration Angel +2 [C13:30] Augur of Bolas +3 [GTC:215] Boros Reckoner +4 [M13:225] Glacial Fortress +2 [M13:147] Searing Spear +4 [RTR:241] Hallowed Fountain +2 [RTR:172] Izzet Charm +3 [ISD:78] Snapcaster Mage +2 [RTR:201] Supreme Verdict +2 [RTR:145] Azorius Charm +3 [RTR:200] Sphinx's Revelation +2 [RTR:101] Mizzium Mortars +2 [AVR:227] Desolate Lighthouse +4 [RTR:247] Steam Vents +2 [M15:51] Dissipate +4 [GTC:245] Sacred Foundry +2 [DGM:94] Ral Zarek +2 [GTC:143] Aurelia, the Warleader +3 [DGM:134] Turn // Burn +3 [ISD:238] Clifftop Retreat +2 [ISD:83] Think Twice +4 [ISD:248] Sulfur Falls +SB: 1 [RTR:201] Supreme Verdict +SB: 1 [AVR:149] Pillar of Flame +SB: 3 [M14:47] Clone +SB: 1 [RTR:1] Angel of Serenity +SB: 1 [M15:51] Dissipate +SB: 1 [RTR:153] Counterflux +SB: 1 [M14:60] Jace, Memory Adept +SB: 3 [RTR:173] Izzet Staticaster +SB: 2 [M15:71] Negate +SB: 1 [GTC:142] Assemble the Legion diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Prime Speaker Bant TDtB ST May 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Prime Speaker Bant TDtB ST May 2013.mwDeck.dck new file mode 100644 index 00000000000..5deeb901492 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Prime Speaker Bant TDtB ST May 2013.mwDeck.dck @@ -0,0 +1,32 @@ +3 [AVR:32] Restoration Angel +4 [M13:229] Sunpetal Grove +2 [RTR:1] Angel of Serenity +4 [M13:225] Glacial Fortress +2 [RTR:241] Hallowed Fountain +2 [RTR:201] Supreme Verdict +4 [RTR:178] Loxodon Smiter +2 [GTC:195] Simic Charm +3 [RTR:200] Sphinx's Revelation +2 [RTR:155] Detention Sphere +3 [C13:211] Selesnya Charm +3 [M13:193] Thragtusk +1 [ISD:243] Kessig Wolf Run +4 [M13:170] Farseek +2 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +3 [ISD:241] Hinterland Harbor +1 [GTC:247] Stomping Ground +2 [DGM:92] Progenitor Mimic +2 [GTC:188] Prime Speaker Zegana +3 [DGM:91] Plasm Capture +4 [GTC:240] Breeding Pool +SB: 1 [RTR:201] Supreme Verdict +SB: 1 [C13:211] Selesnya Charm +SB: 2 [M13:29] Rhox Faithmender +SB: 1 [DGM:11] AEtherling +SB: 2 [RTR:148] Centaur Healer +SB: 2 [M15:51] Dissipate +SB: 1 [M13:22] Oblivion Ring +SB: 1 [DGM:92] Progenitor Mimic +SB: 2 [RTR:18] Rest in Peace +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Quest WW TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Quest WW TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..16beda95888 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Quest WW TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,18 @@ +4 [SOM:174] Memnite +3 [ROE:47] Student of Warfare +3 [SOM:10] Glint Hawk +2 [C14:228] Argentum Armor +2 [C14:313] Tectonic Edge +4 [ZEN:23] Kor Skyfisher +4 [M15:223] Ornithopter +4 [ZEN:21] Kor Outfitter +2 [SOM:208] Sword of Body and Mind +4 [ZEN:33] Quest for the Holy Relic +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +19 [UNH:136] Plains +1 [SOM:156] Glint Hawk Idol +SB: 4 [CMD:17] Journey to Nowhere +SB: 4 [ZEN:10] Devout Lightcaster +SB: 3 [M11:39] White Knight +SB: 4 [WWK:11] Kor Firewalker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Apr 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Apr 2011.mwDeck.dck new file mode 100644 index 00000000000..00af42f109c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Apr 2011.mwDeck.dck @@ -0,0 +1,25 @@ +4 [WWK:141] Raging Ravine +3 [SOM:194] Precursor Golem +3 [UNH:140] Forest +4 [M11:149] Lightning Bolt +2 [WWK:137] Halimar Depths +4 [ZEN:220] Misty Rainforest +1 [ZEN:172] Oracle of Mul Daya +2 [UNH:139] Mountain +4 [C13:114] Inferno Titan +1 [C13:135] Avenger of Zendikar +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +4 [ZEN:168] Lotus Cobra +4 [WWK:99] Explore +3 [SOM:225] Copperline Gorge +4 [WWK:31] Jace, the Mind Sculptor +5 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 2 [C13:134] Acidic Slime +SB: 1 [ZEN:119] Burst Lightning +SB: 1 [ROE:59] Deprive +SB: 2 [SOM:218] Tumble Magnet +SB: 3 [M11:188] Obstinate Baloth +SB: 3 [M11:154] Pyroclasm +SB: 3 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..c2200a0c97d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,24 @@ +4 [WWK:141] Raging Ravine +3 [UNH:140] Forest +4 [M11:149] Lightning Bolt +2 [WWK:137] Halimar Depths +4 [ZEN:220] Misty Rainforest +3 [ZEN:172] Oracle of Mul Daya +2 [UNH:139] Mountain +4 [M11:70] Preordain +3 [C14:112] Frost Titan +4 [ZEN:223] Scalding Tarn +4 [ZEN:168] Lotus Cobra +3 [ZEN:127] Goblin Ruinblaster +4 [WWK:99] Explore +3 [SOM:225] Copperline Gorge +4 [WWK:31] Jace, the Mind Sculptor +5 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 3 [ZEN:67] Spell Pierce +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [ZEN:127] Goblin Ruinblaster +SB: 1 [SOM:53] Volition Reins +SB: 3 [M11:188] Obstinate Baloth +SB: 4 [M11:154] Pyroclasm +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..c73eb8ad109 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,23 @@ +4 [WWK:141] Raging Ravine +3 [SOM:194] Precursor Golem +3 [UNH:140] Forest +4 [M11:149] Lightning Bolt +1 [WWK:137] Halimar Depths +3 [CMD:157] Garruk Wildspeaker +4 [ZEN:220] Misty Rainforest +2 [UNH:139] Mountain +3 [C13:114] Inferno Titan +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +4 [ZEN:168] Lotus Cobra +4 [WWK:99] Explore +4 [SOM:225] Copperline Gorge +4 [WWK:31] Jace, the Mind Sculptor +5 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 2 [ZEN:67] Spell Pierce +SB: 3 [M14:215] Ratchet Bomb +SB: 1 [M11:188] Obstinate Baloth +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 4 [M11:154] Pyroclasm +SB: 3 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Mar 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Mar 2011.mwDeck.dck new file mode 100644 index 00000000000..b5028124950 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Mar 2011.mwDeck.dck @@ -0,0 +1,23 @@ +4 [WWK:141] Raging Ravine +3 [UNH:140] Forest +4 [M11:149] Lightning Bolt +2 [WWK:137] Halimar Depths +4 [ZEN:220] Misty Rainforest +2 [UNH:139] Mountain +4 [C13:114] Inferno Titan +3 [C13:134] Acidic Slime +4 [M11:70] Preordain +2 [C14:112] Frost Titan +4 [ZEN:223] Scalding Tarn +4 [ZEN:168] Lotus Cobra +4 [WWK:99] Explore +3 [SOM:225] Copperline Gorge +4 [WWK:31] Jace, the Mind Sculptor +5 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 2 [C13:156] Mold Shambler +SB: 1 [WWK:84] Kazuul, Tyrant of the Cliffs +SB: 2 [M14:215] Ratchet Bomb +SB: 3 [M11:188] Obstinate Baloth +SB: 4 [M11:154] Pyroclasm +SB: 3 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..43d5edf904d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Control TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,28 @@ +2 [MBS:21] Consecrated Sphinx +2 [NPH:161] Sword of War and Peace +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +4 [MBS:95] Viridian Emissary +3 [CNS:138] Brimstone Volley +1 [NPH:130] Batterskull +3 [MBS:92] Thrun, the Last Troll +2 [ISD:78] Snapcaster Mage +4 [M12:195] Skinshifter +2 [M13:174] Garruk, Primal Hunter +2 [ISD:181] Garruk Relentless +3 [ISD:144] Geistflame +4 [ISD:241] Hinterland Harbor +1 [C14:283] Wurmcoil Engine +4 [SOM:225] Copperline Gorge +1 [SOM:81] Arc Trail +6 [UNH:137] Island +2 [ISD:248] Sulfur Falls +1 [M15:71] Negate +4 [M12:63] Mana Leak +SB: 3 [ISD:193] Mayor of Avabruck +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 2 [M15:51] Dissipate +SB: 2 [SOM:81] Arc Trail +SB: 3 [ISD:207] Tree of Redemption +SB: 2 [M15:71] Negate +SB: 1 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Exarch TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Exarch TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..c6c39b7da56 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Exarch TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,24 @@ +4 [WWK:141] Raging Ravine +2 [M11:58] Jace Beleren +2 [UNH:140] Forest +3 [M11:149] Lightning Bolt +3 [WWK:137] Halimar Depths +4 [ZEN:220] Misty Rainforest +1 [ZEN:172] Oracle of Mul Daya +4 [C13:37] Deceiver Exarch +3 [ROE:165] Splinter Twin +2 [UNH:139] Mountain +4 [C13:114] Inferno Titan +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +4 [ZEN:168] Lotus Cobra +2 [WWK:99] Explore +4 [SOM:225] Copperline Gorge +4 [WWK:31] Jace, the Mind Sculptor +4 [UNH:137] Island +2 [M12:63] Mana Leak +SB: 2 [ZEN:67] Spell Pierce +SB: 3 [CNS:171] Nature's Claim +SB: 2 [M11:188] Obstinate Baloth +SB: 4 [M11:154] Pyroclasm +SB: 4 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..1245022a6bb --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,33 @@ +2 [WWK:141] Raging Ravine +3 [UNH:140] Forest +4 [ZEN:220] Misty Rainforest +1 [M11:188] Obstinate Baloth +1 [NPH:159] Spellskite +4 [M12:165] Birds of Paradise +4 [NPH:104] Birthing Pod +4 [C13:37] Deceiver Exarch +4 [ROE:165] Splinter Twin +3 [UNH:139] Mountain +1 [C13:134] Acidic Slime +1 [C14:124] Sea Gate Oracle +4 [M11:70] Preordain +1 [C14:112] Frost Titan +4 [ZEN:223] Scalding Tarn +1 [NPH:42] Phyrexian Metamorph +4 [ZEN:168] Lotus Cobra +1 [NPH:98] Urabrask the Hidden +1 [NPH:57] Dismember +1 [C14:271] Solemn Simulacrum +4 [SOM:225] Copperline Gorge +1 [M12:72] Phantasmal Image +4 [UNH:137] Island +2 [M12:73] Ponder +SB: 1 [ZEN:67] Spell Pierce +SB: 4 [CNS:171] Nature's Claim +SB: 1 [C14:283] Wurmcoil Engine +SB: 1 [RTR:36] Dispel +SB: 2 [M12:145] Grim Lavamancer +SB: 2 [SOM:81] Arc Trail +SB: 2 [NPH:159] Spellskite +SB: 1 [M15:71] Negate +SB: 1 [SOM:210] Sylvok Replica diff --git a/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..86ea5652e40 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/RUG Twin Pod TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,32 @@ +3 [WWK:141] Raging Ravine +2 [UNH:140] Forest +1 [WWK:137] Halimar Depths +4 [ZEN:220] Misty Rainforest +4 [ROE:203] Overgrown Battlement +2 [NPH:159] Spellskite +4 [M12:165] Birds of Paradise +3 [NPH:104] Birthing Pod +4 [C13:37] Deceiver Exarch +4 [ROE:165] Splinter Twin +2 [UNH:139] Mountain +1 [C13:134] Acidic Slime +3 [M11:70] Preordain +2 [C14:112] Frost Titan +4 [ZEN:223] Scalding Tarn +1 [NPH:98] Urabrask the Hidden +1 [C14:183] Tuktuk the Explorer +2 [C14:271] Solemn Simulacrum +4 [SOM:225] Copperline Gorge +1 [M12:72] Phantasmal Image +4 [UNH:137] Island +3 [M12:73] Ponder +1 [SOM:177] Molten-Tail Masticore +SB: 2 [CNS:171] Nature's Claim +SB: 1 [C14:283] Wurmcoil Engine +SB: 1 [M11:188] Obstinate Baloth +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 1 [NPH:159] Spellskite +SB: 4 [M11:154] Pyroclasm +SB: 1 [SOM:101] Oxidda Scrapmelter +SB: 3 [M12:63] Mana Leak +SB: 1 [SOM:210] Sylvok Replica diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..1ad7926e473 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,22 @@ +4 [RTR:86] Ash Zealot +4 [M13:147] Searing Spear +4 [M13:222] Dragonskull Summit +10 [UNH:139] Mountain +3 [RTR:167] Hellhole Flailer +2 [M13:150] Thundermaw Hellkite +4 [RTR:220] Rakdos Cackler +4 [RTR:238] Blood Crypt +4 [DKA:138] Falkenrath Aristocrat +4 [AVR:226] Cavern of Souls +3 [DKA:93] Hellrider +4 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [M13:96] Knight of Infamy +2 [UNH:138] Swamp +SB: 2 [RTR:82] Ultimate Price +SB: 4 [C13:97] Vampire Nighthawk +SB: 2 [AVR:84] Appetite for Brains +SB: 2 [M14:139] Flames of the Firebrand +SB: 2 [AVR:166] Zealous Conscripts +SB: 1 [RTR:197] Slaughter Games +SB: 2 [RTR:59] Cremate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..d0444e8b350 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,26 @@ +2 [RTR:82] Ultimate Price +2 [C13:97] Vampire Nighthawk +4 [AVR:86] Blood Artist +2 [M13:147] Searing Spear +4 [M13:222] Dragonskull Summit +3 [C13:314] Rakdos Guildgate +4 [ISD:97] Diregraf Ghoul +2 [C14:167] Tragic Slip +4 [RTR:238] Blood Crypt +4 [DKA:138] Falkenrath Aristocrat +3 [AVR:226] Cavern of Souls +4 [DKA:93] Hellrider +4 [DKA:63] Geralf's Messenger +1 [AVR:129] Bonfire of the Damned +1 [AVR:166] Zealous Conscripts +4 [M13:96] Knight of Infamy +4 [DKA:64] Gravecrawler +8 [UNH:138] Swamp +SB: 2 [M13:141] Mark of Mutiny +SB: 2 [RTR:101] Mizzium Mortars +SB: 2 [AVR:84] Appetite for Brains +SB: 3 [AVR:149] Pillar of Flame +SB: 1 [M14:139] Flames of the Firebrand +SB: 1 [AVR:129] Bonfire of the Damned +SB: 2 [RTR:197] Slaughter Games +SB: 2 [RTR:184] Rakdos Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..fb48c9a3abc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Rakdos Aggro TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,24 @@ +2 [CNS:138] Brimstone Volley +4 [M13:147] Searing Spear +4 [M13:222] Dragonskull Summit +4 [C13:314] Rakdos Guildgate +1 [UNH:139] Mountain +3 [M13:150] Thundermaw Hellkite +4 [ISD:97] Diregraf Ghoul +4 [RTR:238] Blood Crypt +4 [DKA:138] Falkenrath Aristocrat +4 [AVR:226] Cavern of Souls +3 [DKA:93] Hellrider +4 [DKA:63] Geralf's Messenger +4 [M13:96] Knight of Infamy +4 [DKA:64] Gravecrawler +2 [C14:161] Sign in Blood +2 [ISD:124] Victim of Night +7 [UNH:138] Swamp +SB: 2 [RTR:83] Underworld Connections +SB: 2 [AVR:84] Appetite for Brains +SB: 3 [AVR:149] Pillar of Flame +SB: 3 [AVR:129] Bonfire of the Damned +SB: 2 [AVR:166] Zealous Conscripts +SB: 1 [ISD:124] Victim of Night +SB: 2 [RTR:59] Cremate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..dec79db42c3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,25 @@ +2 [AVR:32] Restoration Angel +2 [AVR:172] Craterhoof Behemoth +3 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +4 [RTR:1] Angel of Serenity +4 [RTR:243] Overgrown Tomb +4 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +4 [RTR:165] Grisly Salvage +4 [ISD:122] Unburial Rites +2 [AVR:226] Cavern of Souls +3 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +4 [RTR:148] Centaur Healer +4 [ISD:196] Mulch +1 [ISD:239] Gavony Township +3 [ISD:249] Woodland Cemetery +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 3 [AVR:194] Somberwald Sage +SB: 2 [AVR:226] Cavern of Souls +SB: 3 [RTR:213] Deathrite Shaman +SB: 2 [ISD:115] Sever the Bloodline +SB: 1 [M13:22] Oblivion Ring +SB: 2 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..8ed9a1640f1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Reanimator TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,28 @@ +3 [AVR:32] Restoration Angel +2 [AVR:172] Craterhoof Behemoth +3 [M13:229] Sunpetal Grove +1 [UNH:140] Forest +4 [RTR:1] Angel of Serenity +4 [RTR:243] Overgrown Tomb +2 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +4 [RTR:165] Grisly Salvage +4 [ISD:122] Unburial Rites +3 [AVR:226] Cavern of Souls +3 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +3 [RTR:148] Centaur Healer +4 [ISD:196] Mulch +3 [DKA:12] Lingering Souls +2 [ISD:239] Gavony Township +3 [ISD:249] Woodland Cemetery +SB: 1 [DKA:17] Ray of Revelation +SB: 3 [RTR:178] Loxodon Smiter +SB: 1 [M13:29] Rhox Faithmender +SB: 1 [AVR:226] Cavern of Souls +SB: 2 [RTR:213] Deathrite Shaman +SB: 2 [ISD:115] Sever the Bloodline +SB: 2 [M14:97] Duress +SB: 2 [M13:22] Oblivion Ring +SB: 1 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Apr 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Apr 2014.mwDeck.dck new file mode 100644 index 00000000000..7a56d373d40 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Apr 2014.mwDeck.dck @@ -0,0 +1,19 @@ +4 [GTC:90] Firefist Striker +4 [GTC:216] Burning-Tree Emissary +4 [THS:122] Firedrinker Satyr +4 [RTR:96] Gore-House Chainwalker +4 [M15:141] Foundry Street Denizen +18 [UNH:139] Mountain +4 [DGM:38] Rubblebelt Maaka +2 [M14:155] Shock +2 [RTR:101] Mizzium Mortars +4 [M14:134] Chandra's Phoenix +4 [RTR:220] Rakdos Cackler +4 [M14:228] Mutavault +2 [BNG:111] Searing Blood +SB: 2 [THS:124] Hammer of Purphoros +SB: 3 [THS:132] Peak Eruption +SB: 4 [GTC:106] Skullcrack +SB: 3 [GTC:215] Boros Reckoner +SB: 2 [BNG:111] Searing Blood +SB: 1 [M14:130] Burning Earth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..d82e7c3a331 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,24 @@ +1 [ROE:152] Kargan Dragonlord +2 [MBS:66] Hero of Oxid Ridge +1 [NPH:161] Sword of War and Peace +4 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +4 [M12:145] Grim Lavamancer +4 [NPH:153] Shrine of Burning Rage +2 [ZEN:141] Plated Geopede +4 [ROE:166] Staggershock +11 [UNH:139] Mountain +4 [WWK:90] Searing Blaze +4 [M14:134] Chandra's Phoenix +2 [ZEN:119] Burst Lightning +4 [ZEN:223] Scalding Tarn +4 [ZEN:126] Goblin Guide +4 [ZEN:226] Teetering Peaks +1 [SOM:94] Koth of the Hammer +SB: 3 [M12:151] Manic Vandal +SB: 2 [M12:150] Manabarbs +SB: 2 [M12:128] Combust +SB: 3 [NPH:78] Act of Aggression +SB: 2 [NPH:57] Dismember +SB: 2 [SOM:81] Arc Trail +SB: 1 [NPH:101] Vulshok Refugee diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..4799f77ee08 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,23 @@ +3 [GTC:90] Firefist Striker +2 [RTR:86] Ash Zealot +4 [GTC:216] Burning-Tree Emissary +4 [THS:122] Firedrinker Satyr +1 [THS:145] Titan's Strength +4 [M15:141] Foundry Street Denizen +4 [M15:164] Stoke the Flames +18 [UNH:139] Mountain +3 [DGM:38] Rubblebelt Maaka +3 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [RTR:220] Rakdos Cackler +3 [M14:228] Mutavault +3 [GTC:97] Legion Loyalist +SB: 1 [RTR:93] Electrickery +SB: 2 [RTR:101] Mizzium Mortars +SB: 2 [JOU:103] Magma Spray +SB: 1 [RTR:92] Dynacharge +SB: 1 [JOU:100] Harness by Force +SB: 1 [THS:145] Titan's Strength +SB: 2 [GTC:106] Skullcrack +SB: 1 [BNG:111] Searing Blood +SB: 4 [JOU:94] Eidolon of the Great Revel diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..4c0beb4045f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,20 @@ +4 [ROE:152] Kargan Dragonlord +4 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +4 [ROE:145] Flame Slash +4 [ZEN:141] Plated Geopede +13 [UNH:139] Mountain +4 [ZEN:119] Burst Lightning +4 [ZEN:223] Scalding Tarn +4 [ZEN:126] Goblin Guide +3 [ZEN:226] Teetering Peaks +4 [SOM:94] Koth of the Hammer +4 [SOM:104] Spikeshot Elder +4 [SOM:177] Molten-Tail Masticore +SB: 1 [M12:151] Manic Vandal +SB: 3 [M13:141] Mark of Mutiny +SB: 1 [KTK:120] Shatter +SB: 3 [M12:128] Combust +SB: 3 [M11:202] Brittle Effigy +SB: 2 [SOM:105] Tunnel Ignus +SB: 2 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..ad9ea9eb4da --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,20 @@ +3 [M13:228] Rootbound Crag +4 [M12:139] Goblin Fireslinger +4 [NPH:100] Volt Charge +2 [M12:146] Incinerate +3 [M12:145] Grim Lavamancer +4 [M12:156] Stormblood Berserker +4 [NPH:153] Shrine of Burning Rage +18 [UNH:139] Mountain +4 [M14:134] Chandra's Phoenix +4 [NPH:86] Gut Shot +4 [ISD:164] Stromkirk Noble +1 [SOM:104] Spikeshot Elder +2 [SOM:81] Arc Trail +3 [SOM:91] Galvanic Blast +SB: 2 [MBS:66] Hero of Oxid Ridge +SB: 2 [ISD:166] Traitorous Blood +SB: 4 [NPH:57] Dismember +SB: 1 [SOM:81] Arc Trail +SB: 4 [NPH:101] Vulshok Refugee +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..1bdc8329718 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,16 @@ +20 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M14:155] Shock +4 [M14:134] Chandra's Phoenix +4 [RTR:220] Rakdos Cackler +4 [RTR:86] Ash Zealot +4 [THS:121] Fanatic of Mogis +4 [GTC:216] Burning-Tree Emissary +4 [THS:122] Firedrinker Satyr +4 [GTC:215] Boros Reckoner +4 [THS:119] Dragon Mantle +SB: 2 [RTR:101] Mizzium Mortars +SB: 3 [THS:132] Peak Eruption +SB: 3 [KTK:95] Act of Treason +SB: 4 [GTC:106] Skullcrack +SB: 3 [M14:130] Burning Earth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..1901d9eb8ed --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,19 @@ +22 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [KTK:111] Hordeling Outburst +4 [THS:145] Titan's Strength +4 [KTK:118] Monastery Swiftspear +2 [BNG:111] Searing Blood +4 [KTK:125] Valley Dasher +4 [THS:128] Magma Jet +4 [M15:141] Foundry Street Denizen +4 [M15:164] Stoke the Flames +SB: 4 [M15:134] Chandra, Pyromaster +SB: 1 [THS:224] Temple of Abandon +SB: 1 [M15:147] Hammerhand +SB: 1 [THS:143] Stormbreath Dragon +SB: 2 [KTK:97] Arc Lightning +SB: 3 [KTK:119] Sarkhan, the Dragonspeaker +SB: 2 [BNG:111] Searing Blood +SB: 1 [THS:228] Temple of Triumph diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..5dd745b584a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,20 @@ +4 [ROE:152] Kargan Dragonlord +1 [WWK:122] Basilisk Collar +4 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +4 [ZEN:141] Plated Geopede +12 [UNH:139] Mountain +2 [WWK:90] Searing Blaze +2 [M13:141] Mark of Mutiny +4 [ZEN:119] Burst Lightning +4 [ZEN:223] Scalding Tarn +4 [ZEN:126] Goblin Guide +4 [ZEN:226] Teetering Peaks +4 [SOM:94] Koth of the Hammer +4 [SOM:104] Spikeshot Elder +3 [SOM:81] Arc Trail +SB: 1 [M13:141] Mark of Mutiny +SB: 4 [M11:202] Brittle Effigy +SB: 4 [ROE:145] Flame Slash +SB: 3 [SOM:177] Molten-Tail Masticore +SB: 3 [WWK:79] Cunning Sparkmage diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..d9244811e0b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,16 @@ +22 [UNH:139] Mountain +4 [DKA:101] Pyreheart Wolf +4 [RTR:220] Rakdos Cackler +4 [RTR:86] Ash Zealot +4 [DKA:93] Hellrider +4 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [GTC:215] Boros Reckoner +4 [AVR:144] Lightning Mauler +2 [AVR:157] Stonewright +4 [M13:147] Searing Spear +SB: 4 [RTR:101] Mizzium Mortars +SB: 2 [AVR:126] Archwing Dragon +SB: 3 [GTC:106] Skullcrack +SB: 2 [M14:139] Flames of the Firebrand +SB: 4 [ISD:159] Reckless Waif diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..ad9ea9eb4da --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,20 @@ +3 [M13:228] Rootbound Crag +4 [M12:139] Goblin Fireslinger +4 [NPH:100] Volt Charge +2 [M12:146] Incinerate +3 [M12:145] Grim Lavamancer +4 [M12:156] Stormblood Berserker +4 [NPH:153] Shrine of Burning Rage +18 [UNH:139] Mountain +4 [M14:134] Chandra's Phoenix +4 [NPH:86] Gut Shot +4 [ISD:164] Stromkirk Noble +1 [SOM:104] Spikeshot Elder +2 [SOM:81] Arc Trail +3 [SOM:91] Galvanic Blast +SB: 2 [MBS:66] Hero of Oxid Ridge +SB: 2 [ISD:166] Traitorous Blood +SB: 4 [NPH:57] Dismember +SB: 1 [SOM:81] Arc Trail +SB: 4 [NPH:101] Vulshok Refugee +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..da60362949f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,20 @@ +4 [RTR:86] Ash Zealot +2 [M13:226] Hellion Crucible +2 [CNS:138] Brimstone Volley +4 [M13:147] Searing Spear +21 [UNH:139] Mountain +4 [DKA:101] Pyreheart Wolf +2 [M13:150] Thundermaw Hellkite +4 [RTR:220] Rakdos Cackler +4 [DKA:93] Hellrider +3 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +4 [AVR:144] Lightning Mauler +2 [AVR:157] Stonewright +SB: 4 [RTR:101] Mizzium Mortars +SB: 2 [AVR:126] Archwing Dragon +SB: 1 [RTR:215] Frostburn Weird +SB: 1 [AVR:226] Cavern of Souls +SB: 1 [AVR:149] Pillar of Flame +SB: 4 [ISD:159] Reckless Waif +SB: 2 [M13:155] Volcanic Strength diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..2fe0d9b78ea --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,20 @@ +1 [MBS:66] Hero of Oxid Ridge +4 [M11:149] Lightning Bolt +3 [M11:135] Ember Hauler +4 [ZEN:211] Arid Mesa +4 [M12:145] Grim Lavamancer +4 [NPH:153] Shrine of Burning Rage +4 [ZEN:141] Plated Geopede +11 [UNH:139] Mountain +4 [WWK:90] Searing Blaze +2 [ZEN:119] Burst Lightning +4 [ZEN:223] Scalding Tarn +4 [ZEN:126] Goblin Guide +4 [ZEN:226] Teetering Peaks +3 [NPH:57] Dismember +4 [SOM:81] Arc Trail +SB: 3 [M12:151] Manic Vandal +SB: 2 [MBS:75] Slagstorm +SB: 3 [NPH:78] Act of Aggression +SB: 3 [SOM:94] Koth of the Hammer +SB: 4 [NPH:101] Vulshok Refugee diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2011.mwDeck.dck new file mode 100644 index 00000000000..763ec1de8f2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2011.mwDeck.dck @@ -0,0 +1,18 @@ +4 [M11:149] Lightning Bolt +4 [M11:135] Ember Hauler +4 [ZEN:211] Arid Mesa +4 [NPH:153] Shrine of Burning Rage +4 [ROE:166] Staggershock +12 [UNH:139] Mountain +4 [WWK:90] Searing Blaze +4 [ZEN:119] Burst Lightning +4 [ZEN:223] Scalding Tarn +4 [ZEN:126] Goblin Guide +4 [ZEN:226] Teetering Peaks +4 [SOM:94] Koth of the Hammer +4 [SOM:104] Spikeshot Elder +SB: 2 [M12:151] Manic Vandal +SB: 3 [M12:128] Combust +SB: 3 [NPH:78] Act of Aggression +SB: 3 [NPH:57] Dismember +SB: 4 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2014.mwDeck.dck new file mode 100644 index 00000000000..812baf0eeee --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Jun 2014.mwDeck.dck @@ -0,0 +1,19 @@ +3 [GTC:90] Firefist Striker +4 [RTR:86] Ash Zealot +4 [THS:121] Fanatic of Mogis +4 [GTC:216] Burning-Tree Emissary +4 [THS:122] Firedrinker Satyr +4 [GTC:215] Boros Reckoner +2 [THS:128] Magma Jet +19 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M14:155] Shock +4 [M14:134] Chandra's Phoenix +4 [RTR:220] Rakdos Cackler +2 [M14:228] Mutavault +1 [BNG:111] Searing Blood +SB: 4 [RTR:101] Mizzium Mortars +SB: 2 [DGM:133] Toil // Trouble +SB: 2 [JOU:100] Harness by Force +SB: 4 [GTC:106] Skullcrack +SB: 3 [BNG:111] Searing Blood diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Mar 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Mar 2015.mwDeck.dck new file mode 100644 index 00000000000..728f9ca2642 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Mar 2015.mwDeck.dck @@ -0,0 +1,18 @@ +20 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [KTK:111] Hordeling Outburst +4 [THS:122] Firedrinker Satyr +4 [FRF:108] Mardu Scout +4 [KTK:118] Monastery Swiftspear +4 [FRF:118] Wild Slash +4 [BNG:111] Searing Blood +4 [M15:141] Foundry Street Denizen +4 [M15:164] Stoke the Flames +SB: 2 [THS:124] Hammer of Purphoros +SB: 2 [JOU:106] Prophetic Flamespeaker +SB: 2 [FRF:92] Bathe in Dragonfire +SB: 2 [THS:132] Peak Eruption +SB: 2 [KTK:97] Arc Lightning +SB: 4 [JOU:94] Eidolon of the Great Revel +SB: 1 [FRF:102] Goblin Heelcutter diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..592282bd4ac --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,20 @@ +1 [WWK:143] Smoldering Spires +4 [M11:149] Lightning Bolt +4 [M11:135] Ember Hauler +4 [ZEN:211] Arid Mesa +4 [NPH:153] Shrine of Burning Rage +4 [ROE:166] Staggershock +13 [UNH:139] Mountain +4 [WWK:90] Searing Blaze +4 [ZEN:119] Burst Lightning +4 [ZEN:223] Scalding Tarn +4 [ZEN:126] Goblin Guide +2 [ZEN:226] Teetering Peaks +4 [SOM:94] Koth of the Hammer +4 [SOM:104] Spikeshot Elder +SB: 3 [M13:141] Mark of Mutiny +SB: 3 [MBS:75] Slagstorm +SB: 1 [SOM:192] Perilous Myr +SB: 3 [M12:128] Combust +SB: 3 [ROE:145] Flame Slash +SB: 2 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..22cb3f2ea62 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,19 @@ +4 [M12:139] Goblin Fireslinger +4 [NPH:100] Volt Charge +2 [M12:146] Incinerate +3 [M12:145] Grim Lavamancer +4 [M12:156] Stormblood Berserker +4 [NPH:153] Shrine of Burning Rage +21 [UNH:139] Mountain +4 [M14:134] Chandra's Phoenix +4 [NPH:86] Gut Shot +4 [ISD:164] Stromkirk Noble +1 [SOM:104] Spikeshot Elder +2 [SOM:81] Arc Trail +3 [SOM:91] Galvanic Blast +SB: 1 [M12:151] Manic Vandal +SB: 2 [ISD:166] Traitorous Blood +SB: 4 [NPH:57] Dismember +SB: 2 [SOM:94] Koth of the Hammer +SB: 2 [SOM:81] Arc Trail +SB: 4 [NPH:101] Vulshok Refugee diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..3f517fdf05f --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,21 @@ +4 [RTR:86] Ash Zealot +3 [RTR:96] Gore-House Chainwalker +3 [M13:226] Hellion Crucible +2 [M13:147] Searing Spear +21 [UNH:139] Mountain +4 [DKA:101] Pyreheart Wolf +3 [M13:150] Thundermaw Hellkite +4 [RTR:220] Rakdos Cackler +4 [DKA:93] Hellrider +2 [AVR:149] Pillar of Flame +4 [ISD:164] Stromkirk Noble +2 [M14:139] Flames of the Firebrand +4 [AVR:144] Lightning Mauler +SB: 1 [ISD:166] Traitorous Blood +SB: 3 [AVR:126] Archwing Dragon +SB: 1 [AVR:149] Pillar of Flame +SB: 2 [M14:139] Flames of the Firebrand +SB: 1 [M13:226] Hellion Crucible +SB: 2 [AVR:166] Zealous Conscripts +SB: 4 [ISD:159] Reckless Waif +SB: 1 [M13:147] Searing Spear diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..18e19448d6d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,18 @@ +18 [UNH:139] Mountain +2 [DGM:38] Rubblebelt Maaka +4 [M15:155] Lightning Strike +4 [M14:155] Shock +4 [M14:134] Chandra's Phoenix +4 [GTC:90] Firefist Striker +4 [RTR:220] Rakdos Cackler +4 [GTC:216] Burning-Tree Emissary +4 [THS:122] Firedrinker Satyr +4 [RTR:96] Gore-House Chainwalker +4 [M14:228] Mutavault +4 [M15:141] Foundry Street Denizen +SB: 1 [DGM:38] Rubblebelt Maaka +SB: 4 [RTR:101] Mizzium Mortars +SB: 3 [THS:132] Peak Eruption +SB: 2 [KTK:95] Act of Treason +SB: 4 [GTC:106] Skullcrack +SB: 1 [M14:130] Burning Earth diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2014.mwDeck.dck new file mode 100644 index 00000000000..cd5d44d68a9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Nov 2014.mwDeck.dck @@ -0,0 +1,17 @@ +18 [UNH:139] Mountain +3 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [M15:147] Hammerhand +4 [THS:111] Akroan Crusader +4 [THS:122] Firedrinker Satyr +4 [THS:145] Titan's Strength +4 [KTK:118] Monastery Swiftspear +4 [M15:141] Foundry Street Denizen +3 [M15:142] Frenzied Goblin +4 [THS:119] Dragon Mantle +4 [M15:164] Stoke the Flames +SB: 1 [M15:155] Lightning Strike +SB: 3 [JOU:103] Magma Spray +SB: 3 [JOU:100] Harness by Force +SB: 4 [BNG:111] Searing Blood +SB: 4 [JOU:94] Eidolon of the Great Revel diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..e0b6155848a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,18 @@ +20 [UNH:139] Mountain +3 [NPH:84] Furnace Scamp +4 [M14:134] Chandra's Phoenix +4 [ISD:144] Geistflame +3 [M13:228] Rootbound Crag +4 [ISD:164] Stromkirk Noble +4 [CNS:138] Brimstone Volley +4 [SOM:94] Koth of the Hammer +4 [M12:146] Incinerate +2 [SOM:104] Spikeshot Elder +4 [M12:156] Stormblood Berserker +4 [NPH:153] Shrine of Burning Rage +SB: 2 [MBS:66] Hero of Oxid Ridge +SB: 2 [ISD:166] Traitorous Blood +SB: 3 [SOM:192] Perilous Myr +SB: 2 [SOM:81] Arc Trail +SB: 4 [NPH:101] Vulshok Refugee +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Sep 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Sep 2011.mwDeck.dck new file mode 100644 index 00000000000..7a2314a3b8b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Red Deck Wins TDtB ST Sep 2011.mwDeck.dck @@ -0,0 +1,21 @@ +3 [ROE:152] Kargan Dragonlord +2 [MBS:66] Hero of Oxid Ridge +4 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +4 [M12:145] Grim Lavamancer +4 [NPH:153] Shrine of Burning Rage +3 [ROE:146] Forked Bolt +3 [ROE:166] Staggershock +11 [UNH:139] Mountain +4 [WWK:90] Searing Blaze +4 [M14:134] Chandra's Phoenix +4 [ZEN:223] Scalding Tarn +4 [ZEN:126] Goblin Guide +4 [ZEN:226] Teetering Peaks +2 [SOM:81] Arc Trail +SB: 3 [M12:151] Manic Vandal +SB: 3 [M12:128] Combust +SB: 3 [NPH:78] Act of Aggression +SB: 2 [NPH:57] Dismember +SB: 1 [SOM:81] Arc Trail +SB: 3 [NPH:101] Vulshok Refugee diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..81d1b5e28ee --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,43 @@ +1 [WMCQ:2] Geist of Saint Traft +2 [M12:18] Gideon's Lawkeeper +1 [M12:19] Grand Abolisher +3 [C13:11] Fiend Hunter +1 [ALA:20] Oblivion Ring +3 [C14:74] Grand Abolisher +2 [M10:16] Honor of the Pure +1 [POR:216] Plains +1 [M10:233] Plains +1 [M13:225] Glacial Fortress +4 [PTC:47] Hero of Bladehold +3 [ISD:11] Doomed Traveler +1 [DDK:2] Doomed Traveler +1 [DDN:81] Plains +1 [ODY:333] Plains +1 [DDI:40] Plains +3 [ISD:244] Moorland Haunt +1 [MBS:14] Mirran Crusader +1 [ALA:230] Plains +2 [M10:226] Glacial Fortress +1 [M12:227] Glacial Fortress +2 [MBP:32] Mirran Crusader +3 [M12:3] Angelic Destiny +1 [LRW:34] Oblivion Ring +1 [ZEN:232] Plains +1 [DDN:38] Plains +1 [HOP:145] Plains +1 [KTK:250] Plains +1 [MM2:25] Mirran Crusader +1 [ISD:251] Plains +4 [SOM:229] Seachrome Coast +1 [ISD:213] Geist of Saint Traft +2 [M12:23] Honor of the Pure +1 [ME3:220] Island +4 [ISD:6] Champion of the Parish +1 [AVR:231] Plains +SB: 2 [NPH:161] Sword of War and Peace +SB: 2 [NPH:57] Dismember +SB: 1 [M12:11] Celestial Purge +SB: 1 [MBS:115] Mortarpod +SB: 4 [M12:40] Timely Reinforcements +SB: 3 [M12:63] Mana Leak +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..8514cee2baf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,21 @@ +4 [C14:74] Grand Abolisher +4 [M12:15] Elite Vanguard +4 [M12:3] Angelic Destiny +4 [M13:225] Glacial Fortress +4 [SOM:229] Seachrome Coast +2 [NPH:57] Dismember +4 [ISD:213] Geist of Saint Traft +2 [ISD:244] Moorland Haunt +3 [M13:22] Oblivion Ring +4 [M12:23] Honor of the Pure +12 [UNH:136] Plains +4 [MBS:14] Mirran Crusader +1 [UNH:137] Island +4 [ISD:6] Champion of the Parish +4 [MBS:8] Hero of Bladehold +SB: 3 [ISD:27] Purify the Grave +SB: 3 [M14:215] Ratchet Bomb +SB: 1 [NPH:57] Dismember +SB: 3 [BNG:25] Revoke Existence +SB: 1 [M13:22] Oblivion Ring +SB: 4 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..100fa002955 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,30 @@ +2 [MBS:10] Leonin Relic-Warder +2 [SOM:14] Leonin Arbiter +4 [C13:11] Fiend Hunter +1 [NPH:161] Sword of War and Peace +1 [M12:3] Angelic Destiny +4 [M13:225] Glacial Fortress +1 [C14:298] Ghost Quarter +4 [SOM:229] Seachrome Coast +2 [NPH:57] Dismember +3 [ISD:213] Geist of Saint Traft +3 [ISD:244] Moorland Haunt +2 [M13:22] Oblivion Ring +4 [M12:23] Honor of the Pure +11 [UNH:136] Plains +4 [MBS:14] Mirran Crusader +1 [UNH:137] Island +4 [MBS:8] Hero of Bladehold +4 [CNS:69] Doomed Traveler +3 [M12:63] Mana Leak +SB: 1 [SOM:14] Leonin Arbiter +SB: 1 [NPH:161] Sword of War and Peace +SB: 1 [M12:3] Angelic Destiny +SB: 1 [NPH:57] Dismember +SB: 2 [BNG:25] Revoke Existence +SB: 1 [M13:22] Oblivion Ring +SB: 1 [M12:12] Day of Judgment +SB: 4 [M12:40] Timely Reinforcements +SB: 1 [M12:63] Mana Leak +SB: 1 [M12:52] Flashfreeze +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..82965ed6233 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Saint WW with Leaks TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,27 @@ +2 [MBS:10] Leonin Relic-Warder +3 [M12:18] Gideon's Lawkeeper +4 [C13:11] Fiend Hunter +4 [M13:225] Glacial Fortress +4 [SOM:229] Seachrome Coast +2 [NPH:57] Dismember +3 [ISD:213] Geist of Saint Traft +1 [MBS:115] Mortarpod +4 [ISD:244] Moorland Haunt +2 [M13:22] Oblivion Ring +4 [M12:23] Honor of the Pure +11 [UNH:136] Plains +4 [MBS:14] Mirran Crusader +1 [UNH:137] Island +4 [MBS:8] Hero of Bladehold +4 [CNS:69] Doomed Traveler +3 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [M12:3] Angelic Destiny +SB: 2 [NPH:57] Dismember +SB: 2 [BNG:25] Revoke Existence +SB: 1 [ISD:213] Geist of Saint Traft +SB: 1 [M12:11] Celestial Purge +SB: 1 [M13:22] Oblivion Ring +SB: 1 [M12:12] Day of Judgment +SB: 4 [M12:40] Timely Reinforcements +SB: 1 [M12:63] Mana Leak diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Saito Naya TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Saito Naya TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..95279e6802a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Saito Naya TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,25 @@ +3 [M13:229] Sunpetal Grove +4 [M13:228] Rootbound Crag +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +2 [UNH:139] Mountain +4 [RTR:178] Loxodon Smiter +4 [RTR:101] Mizzium Mortars +3 [M13:150] Thundermaw Hellkite +1 [M13:193] Thragtusk +4 [M13:171] Flinthoof Boar +4 [RTR:248] Temple Garden +4 [DKA:93] Hellrider +4 [GTC:247] Stomping Ground +4 [GTC:245] Sacred Foundry +4 [GTC:123] Gyre Sage +4 [GTC:156] Domri Rade +3 [ISD:238] Clifftop Retreat +SB: 3 [C13:179] Boros Charm +SB: 1 [M13:193] Thragtusk +SB: 2 [ISD:181] Garruk Relentless +SB: 2 [M14:25] Pacifism +SB: 2 [AVR:31] Nearheath Pilgrim +SB: 1 [GTC:143] Aurelia, the Warleader +SB: 2 [RTR:18] Rest in Peace +SB: 2 [AVR:198] Triumph of Ferocity diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..4a0631f59d9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,22 @@ +3 [M14:1] Ajani, Caller of the Pride +4 [GTC:119] Experiment One +7 [UNH:140] Forest +3 [JOU:5] Banishing Light +4 [RTR:178] Loxodon Smiter +4 [C13:211] Selesnya Charm +2 [M15:202] Sunblade Elf +4 [RTR:248] Temple Garden +4 [THS:193] Fleecemane Lion +2 [BNG:165] Temple of Plenty +4 [JOU:163] Mana Confluence +4 [DGM:51] Advent of the Wurm +7 [UNH:136] Plains +4 [THS:32] Soldier of the Pantheon +4 [DGM:114] Voice of Resurgence +SB: 4 [DGM:49] Skylasher +SB: 2 [C14:213] Reclamation Sage +SB: 3 [DGM:111] Unflinching Courage +SB: 2 [M14:5] Archangel of Thune +SB: 1 [JOU:5] Banishing Light +SB: 2 [JOU:140] Setessan Tactics +SB: 1 [THS:152] Boon Satyr diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Jul 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Jul 2014.mwDeck.dck new file mode 100644 index 00000000000..8845cd114d5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Jul 2014.mwDeck.dck @@ -0,0 +1,25 @@ +3 [M14:1] Ajani, Caller of the Pride +4 [GTC:119] Experiment One +5 [UNH:140] Forest +2 [JOU:5] Banishing Light +4 [RTR:178] Loxodon Smiter +4 [C13:211] Selesnya Charm +2 [M15:202] Sunblade Elf +4 [RTR:248] Temple Garden +2 [M14:228] Mutavault +4 [THS:193] Fleecemane Lion +4 [JOU:163] Mana Confluence +4 [BNG:165] Temple of Plenty +3 [DGM:51] Advent of the Wurm +3 [THS:152] Boon Satyr +5 [UNH:136] Plains +3 [THS:32] Soldier of the Pantheon +4 [DGM:114] Voice of Resurgence +SB: 4 [DGM:49] Skylasher +SB: 2 [THS:159] Hunt the Hunter +SB: 2 [M15:1] Ajani Steadfast +SB: 2 [THS:16] Gods Willing +SB: 2 [M14:5] Archangel of Thune +SB: 1 [DGM:51] Advent of the Wurm +SB: 1 [THS:162] Mistcutter Hydra +SB: 1 [JOU:140] Setessan Tactics diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST May 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST May 2015.mwDeck.dck new file mode 100644 index 00000000000..8047e926796 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST May 2015.mwDeck.dck @@ -0,0 +1,27 @@ +2 [THS:223] Nykthos, Shrine to Nyx +2 [FRF:28] Valorous Stance +4 [DTK:181] Den Protector +8 [UNH:140] Forest +4 [KTK:248] Windswept Heath +2 [BNG:117] Aspect of Hydra +3 [DTK:248] Evolving Wilds +4 [DTK:175] Avatar of the Resolute +4 [THS:193] Fleecemane Lion +4 [BNG:165] Temple of Plenty +2 [DTK:210] Surrak, the Hunt Caller +4 [THS:173] Reverent Hunter +3 [DTK:221] Dromoka's Command +4 [DTK:177] Collected Company +4 [THS:152] Boon Satyr +4 [C14:191] Elvish Mystic +2 [UNH:136] Plains +SB: 1 [C14:213] Reclamation Sage +SB: 2 [FRF:18] Mardu Woe-Reaper +SB: 1 [KTK:130] Become Immense +SB: 1 [THS:16] Gods Willing +SB: 2 [BNG:4] Archetype of Courage +SB: 1 [THS:167] Nylea's Disciple +SB: 3 [FRF:5] Arashin Cleric +SB: 1 [DTK:221] Dromoka's Command +SB: 1 [DTK:210] Surrak, the Hunt Caller +SB: 2 [KTK:157] Windstorm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..5abc7495c81 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,27 @@ +4 [AVR:32] Restoration Angel +2 [C14:88] Silverblade Paladin +2 [AVR:12] Cloudshift +4 [M13:229] Sunpetal Grove +6 [UNH:140] Forest +1 [C14:72] Geist-Honored Monk +2 [M13:36] Sublime Archangel +4 [RTR:178] Loxodon Smiter +3 [C13:211] Selesnya Charm +2 [RTR:143] Armada Wurm +4 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +2 [AVR:226] Cavern of Souls +4 [RTR:248] Temple Garden +2 [M13:22] Oblivion Ring +3 [UNH:136] Plains +4 [ISD:239] Gavony Township +3 [DKA:24] Thalia, Guardian of Thraben +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 2 [ISD:32] Slayer of the Wicked +SB: 3 [RTR:148] Centaur Healer +SB: 2 [AVR:210] Sigarda, Host of Herons +SB: 1 [AVR:18] Divine Deflection +SB: 1 [M13:22] Oblivion Ring +SB: 1 [DKA:24] Thalia, Guardian of Thraben +SB: 3 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2013.mwDeck.dck new file mode 100644 index 00000000000..205021fe44c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Nov 2013.mwDeck.dck @@ -0,0 +1,20 @@ +2 [M14:1] Ajani, Caller of the Pride +4 [GTC:119] Experiment One +3 [THS:16] Gods Willing +8 [UNH:140] Forest +4 [RTR:178] Loxodon Smiter +3 [C13:321] Selesnya Guildgate +4 [C13:211] Selesnya Charm +4 [RTR:248] Temple Garden +4 [THS:193] Fleecemane Lion +4 [DGM:51] Advent of the Wurm +4 [THS:152] Boon Satyr +8 [UNH:136] Plains +4 [THS:32] Soldier of the Pantheon +4 [DGM:114] Voice of Resurgence +SB: 3 [DGM:111] Unflinching Courage +SB: 3 [RTR:19] Rootborn Defenses +SB: 1 [M14:1] Ajani, Caller of the Pride +SB: 3 [M14:12] Celestial Flare +SB: 2 [THS:172] Polukranos, World Eater +SB: 3 [THS:162] Mistcutter Hydra diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2012.mwDeck.dck new file mode 100644 index 00000000000..be9097c524a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2012.mwDeck.dck @@ -0,0 +1,27 @@ +4 [AVR:32] Restoration Angel +4 [M13:229] Sunpetal Grove +8 [UNH:140] Forest +3 [RTR:146] Call of the Conclave +3 [RTR:178] Loxodon Smiter +3 [C13:211] Selesnya Charm +2 [RTR:143] Armada Wurm +4 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +2 [ISD:181] Garruk Relentless +4 [RTR:248] Temple Garden +4 [RTR:148] Centaur Healer +1 [AVR:200] Ulvenwald Tracker +2 [RTR:206] Trostani, Selesnya's Voice +2 [M13:22] Oblivion Ring +2 [ISD:239] Gavony Township +4 [UNH:136] Plains +SB: 2 [RTR:223] Sundering Growth +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 1 [DKA:17] Ray of Revelation +SB: 1 [AVR:210] Sigarda, Host of Herons +SB: 1 [M13:22] Oblivion Ring +SB: 2 [DKA:24] Thalia, Guardian of Thraben +SB: 3 [RTR:18] Rest in Peace +SB: 1 [DKA:110] Crushing Vines +SB: 2 [RTR:150] Collective Blessing diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2013.mwDeck.dck new file mode 100644 index 00000000000..834a1c0280a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Selesnya Aggro TDtB ST Oct 2013.mwDeck.dck @@ -0,0 +1,22 @@ +4 [GTC:119] Experiment One +9 [UNH:140] Forest +2 [RTR:146] Call of the Conclave +3 [RTR:178] Loxodon Smiter +3 [C13:321] Selesnya Guildgate +3 [DGM:111] Unflinching Courage +4 [C13:211] Selesnya Charm +4 [RTR:248] Temple Garden +4 [THS:193] Fleecemane Lion +4 [DGM:51] Advent of the Wurm +1 [RTR:206] Trostani, Selesnya's Voice +4 [THS:152] Boon Satyr +7 [UNH:136] Plains +4 [THS:32] Soldier of the Pantheon +4 [DGM:114] Voice of Resurgence +SB: 2 [M14:1] Ajani, Caller of the Pride +SB: 4 [THS:15] Glare of Heresy +SB: 4 [THS:159] Hunt the Hunter +SB: 1 [RTR:19] Rootborn Defenses +SB: 1 [GTC:13] Gideon, Champion of Justice +SB: 1 [RTR:206] Trostani, Selesnya's Voice +SB: 2 [M14:195] Scavenging Ooze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..7d394d2ca5d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,35 @@ +2 [MBS:43] Go for the Throat +2 [M12:16] Gideon Jura +4 [M13:225] Glacial Fortress +1 [ISD:78] Snapcaster Mage +4 [ISD:55] Forbidden Alchemy +1 [ISD:122] Unburial Rites +2 [AVR:226] Cavern of Souls +4 [ISD:242] Isolated Chapel +2 [M14:215] Ratchet Bomb +1 [M14:96] Doom Blade +4 [DKA:12] Lingering Souls +3 [M12:12] Day of Judgment +2 [ISD:96] Dead Weight +3 [UNH:136] Plains +4 [M12:72] Phantasmal Image +2 [UNH:137] Island +3 [M12:73] Ponder +2 [UNH:138] Swamp +1 [DKA:158] Vault of the Archangel +1 [C14:298] Ghost Quarter +1 [SOM:229] Seachrome Coast +2 [C14:295] Evolving Wilds +3 [C14:91] Sun Titan +4 [SOM:226] Darkslick Shores +2 [M13:22] Oblivion Ring +SB: 1 [MBS:5] Divine Offering +SB: 1 [C14:298] Ghost Quarter +SB: 1 [BNG:25] Revoke Existence +SB: 1 [M15:51] Dissipate +SB: 3 [M12:11] Celestial Purge +SB: 1 [NPH:130] Batterskull +SB: 1 [M12:12] Day of Judgment +SB: 3 [C13:249] Nihil Spellbomb +SB: 1 [M15:71] Negate +SB: 2 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST May 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST May 2012.mwDeck.dck new file mode 100644 index 00000000000..6df9f32520a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST May 2012.mwDeck.dck @@ -0,0 +1,30 @@ +2 [M12:16] Gideon Jura +4 [M13:225] Glacial Fortress +1 [NPH:130] Batterskull +4 [ISD:55] Forbidden Alchemy +3 [C14:298] Ghost Quarter +1 [ISD:122] Unburial Rites +4 [ISD:242] Isolated Chapel +3 [M14:215] Ratchet Bomb +2 [C14:295] Evolving Wilds +4 [SOM:229] Seachrome Coast +1 [NPH:9] Elesh Norn, Grand Cenobite +3 [C14:91] Sun Titan +1 [SOM:226] Darkslick Shores +4 [DKA:12] Lingering Souls +3 [M13:22] Oblivion Ring +3 [M12:12] Day of Judgment +2 [ISD:96] Dead Weight +4 [UNH:136] Plains +4 [M12:72] Phantasmal Image +3 [UNH:137] Island +3 [M12:73] Ponder +1 [UNH:138] Swamp +SB: 1 [MBS:21] Consecrated Sphinx +SB: 2 [AVR:226] Cavern of Souls +SB: 2 [M12:11] Celestial Purge +SB: 1 [M12:12] Day of Judgment +SB: 3 [C13:249] Nihil Spellbomb +SB: 3 [M12:40] Timely Reinforcements +SB: 2 [M15:71] Negate +SB: 1 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..aeeee3c861d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,30 @@ +1 [MBS:21] Consecrated Sphinx +4 [M13:225] Glacial Fortress +3 [NPH:4] Blade Splicer +1 [M13:223] Drowned Catacomb +4 [ISD:55] Forbidden Alchemy +3 [C14:298] Ghost Quarter +2 [ISD:122] Unburial Rites +4 [ISD:242] Isolated Chapel +2 [M14:215] Ratchet Bomb +4 [SOM:229] Seachrome Coast +1 [C14:283] Wurmcoil Engine +3 [C14:91] Sun Titan +4 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +3 [M13:22] Oblivion Ring +3 [M12:12] Day of Judgment +3 [UNH:136] Plains +2 [M12:72] Phantasmal Image +2 [UNH:137] Island +2 [ISD:83] Think Twice +1 [UNH:138] Swamp +4 [M12:63] Mana Leak +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [C14:283] Wurmcoil Engine +SB: 2 [M15:51] Dissipate +SB: 2 [M12:11] Celestial Purge +SB: 1 [M13:22] Oblivion Ring +SB: 2 [C13:249] Nihil Spellbomb +SB: 3 [M12:40] Timely Reinforcements +SB: 2 [ISD:94] Curse of Death's Hold diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..38cfcdb9a18 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Solar Flare TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,31 @@ +1 [MBS:21] Consecrated Sphinx +4 [M13:225] Glacial Fortress +4 [M13:223] Drowned Catacomb +3 [ISD:78] Snapcaster Mage +4 [ISD:55] Forbidden Alchemy +2 [ISD:122] Unburial Rites +3 [ISD:242] Isolated Chapel +3 [SOM:229] Seachrome Coast +2 [C14:283] Wurmcoil Engine +2 [C14:91] Sun Titan +3 [M14:96] Doom Blade +2 [SOM:226] Darkslick Shores +4 [M13:22] Oblivion Ring +2 [M12:12] Day of Judgment +4 [UNH:136] Plains +2 [M12:72] Phantasmal Image +5 [UNH:137] Island +3 [ISD:83] Think Twice +3 [M12:40] Timely Reinforcements +1 [UNH:138] Swamp +3 [M12:63] Mana Leak +SB: 2 [NPH:74] Surgical Extraction +SB: 1 [MBS:5] Divine Offering +SB: 1 [M14:96] Doom Blade +SB: 2 [M15:51] Dissipate +SB: 3 [M12:11] Celestial Purge +SB: 1 [M12:12] Day of Judgment +SB: 1 [M12:40] Timely Reinforcements +SB: 1 [M15:71] Negate +SB: 2 [M12:52] Flashfreeze +SB: 1 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Spirit Delver TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Spirit Delver TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..41b30259ca4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Spirit Delver TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,33 @@ +2 [C13:42] Dungeon Geists +3 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +4 [DKA:136] Drogskol Captain +1 [MBS:5] Divine Offering +1 [NPH:86] Gut Shot +2 [C14:295] Evolving Wilds +4 [SOM:229] Seachrome Coast +1 [BNG:25] Revoke Existence +4 [NPH:35] Gitaxian Probe +4 [SOM:226] Darkslick Shores +4 [NPH:48] Vapor Snag +4 [DKA:12] Lingering Souls +2 [ISD:244] Moorland Haunt +1 [UNH:136] Plains +3 [M12:72] Phantasmal Image +4 [ISD:51] Delver of Secrets +5 [UNH:137] Island +4 [M12:73] Ponder +1 [UNH:138] Swamp +2 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 2 [NPH:74] Surgical Extraction +SB: 2 [C13:42] Dungeon Geists +SB: 2 [NPH:86] Gut Shot +SB: 1 [M12:13] Demystify +SB: 1 [BNG:25] Revoke Existence +SB: 1 [NPH:57] Dismember +SB: 1 [M15:51] Dissipate +SB: 1 [M12:11] Celestial Purge +SB: 1 [M12:72] Phantasmal Image +SB: 1 [M12:63] Mana Leak +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Apr 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Apr 2015.mwDeck.dck new file mode 100644 index 00000000000..e076e268073 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Apr 2015.mwDeck.dck @@ -0,0 +1,36 @@ +2 [DTK:180] Deathmist Raptor +3 [DTK:181] Den Protector +4 [UNH:140] Forest +3 [JOU:165] Temple of Malady +2 [THS:107] Thoughtseize +4 [M15:198] Satyr Wayfinder +4 [M15:244] Llanowar Wastes +1 [KTK:144] Rattleclaw Mystic +1 [DTK:124] Ultimate Price +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [M15:249] Yavimaya Coast +1 [DTK:120] Sidisi, Undead Vizier +1 [UNH:137] Island +4 [THS:180] Sylvan Caryatid +2 [UNH:138] Swamp +2 [THS:110] Whip of Erebos +1 [KTK:239] Polluted Delta +4 [KTK:238] Opulent Palace +1 [KTK:234] Frontier Bivouac +1 [DTK:216] Dragonlord Atarka +2 [M15:178] Hornet Queen +4 [KTK:199] Sidisi, Brood Tyrant +4 [BNG:119] Courser of Kruphix +3 [KTK:81] Murderous Cut +3 [THS:90] Hero's Downfall +1 [JOU:163] Mana Confluence +SB: 2 [BNG:61] Bile Blight +SB: 1 [DTK:216] Dragonlord Atarka +SB: 1 [DTK:70] Profaner of the Dead +SB: 1 [C14:213] Reclamation Sage +SB: 1 [M15:115] Soul of Innistrad +SB: 2 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [THS:167] Nylea's Disciple +SB: 2 [FRF:65] Crux of Fate +SB: 1 [THS:107] Thoughtseize +SB: 3 [KTK:37] Disdainful Stroke diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..f23ee79b2d2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,30 @@ +1 [THS:226] Temple of Mystery +3 [THS:110] Whip of Erebos +3 [UNH:140] Forest +2 [JOU:165] Temple of Malady +1 [JOU:154] Pharika, God of Affliction +3 [JOU:66] Doomwake Giant +2 [KTK:239] Polluted Delta +4 [KTK:238] Opulent Palace +3 [THS:107] Thoughtseize +4 [M15:198] Satyr Wayfinder +4 [M15:244] Llanowar Wastes +3 [M15:178] Hornet Queen +4 [KTK:199] Sidisi, Brood Tyrant +4 [BNG:119] Courser of Kruphix +4 [KTK:81] Murderous Cut +1 [M15:115] Soul of Innistrad +2 [M15:249] Yavimaya Coast +1 [C14:295] Evolving Wilds +3 [THS:90] Hero's Downfall +1 [JOU:163] Mana Confluence +1 [UNH:137] Island +4 [THS:180] Sylvan Caryatid +2 [UNH:138] Swamp +SB: 2 [M15:177] Hornet Nest +SB: 2 [C14:213] Reclamation Sage +SB: 3 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [JOU:154] Pharika, God of Affliction +SB: 2 [KTK:204] Sultai Charm +SB: 2 [BNG:65] Drown in Sorrow +SB: 3 [KTK:37] Disdainful Stroke diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Feb 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Feb 2015.mwDeck.dck new file mode 100644 index 00000000000..e7d60fa99a9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Feb 2015.mwDeck.dck @@ -0,0 +1,30 @@ +1 [THS:226] Temple of Mystery +3 [THS:110] Whip of Erebos +3 [UNH:140] Forest +2 [JOU:165] Temple of Malady +2 [JOU:66] Doomwake Giant +2 [KTK:239] Polluted Delta +1 [KTK:248] Windswept Heath +4 [KTK:238] Opulent Palace +4 [M15:198] Satyr Wayfinder +2 [BNG:61] Bile Blight +4 [M15:244] Llanowar Wastes +3 [M15:178] Hornet Queen +4 [KTK:199] Sidisi, Brood Tyrant +4 [BNG:119] Courser of Kruphix +4 [KTK:81] Murderous Cut +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [M15:249] Yavimaya Coast +3 [THS:90] Hero's Downfall +3 [FRF:87] Tasigur, the Golden Fang +1 [FRF:56] Torrent Elemental +1 [UNH:137] Island +3 [THS:180] Sylvan Caryatid +3 [UNH:138] Swamp +SB: 2 [BNG:61] Bile Blight +SB: 2 [C14:213] Reclamation Sage +SB: 2 [M15:117] Stain the Mind +SB: 3 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [FRF:56] Torrent Elemental +SB: 2 [BNG:65] Drown in Sorrow +SB: 3 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Jan 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Jan 2015.mwDeck.dck new file mode 100644 index 00000000000..a12c68806da --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Sultai Whip TDtB ST Jan 2015.mwDeck.dck @@ -0,0 +1,35 @@ +1 [THS:226] Temple of Mystery +3 [UNH:140] Forest +2 [JOU:165] Temple of Malady +2 [JOU:66] Doomwake Giant +3 [THS:107] Thoughtseize +4 [M15:198] Satyr Wayfinder +4 [M15:244] Llanowar Wastes +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [M15:249] Yavimaya Coast +1 [UNH:137] Island +4 [THS:180] Sylvan Caryatid +2 [UNH:138] Swamp +3 [THS:110] Whip of Erebos +1 [JOU:154] Pharika, God of Affliction +2 [KTK:239] Polluted Delta +4 [KTK:238] Opulent Palace +1 [C14:213] Reclamation Sage +2 [M15:178] Hornet Queen +4 [KTK:199] Sidisi, Brood Tyrant +4 [BNG:119] Courser of Kruphix +4 [KTK:81] Murderous Cut +1 [M15:115] Soul of Innistrad +1 [C14:295] Evolving Wilds +3 [THS:90] Hero's Downfall +1 [JOU:163] Mana Confluence +SB: 3 [BNG:61] Bile Blight +SB: 1 [C14:213] Reclamation Sage +SB: 1 [C14:158] Read the Bones +SB: 1 [M15:115] Soul of Innistrad +SB: 2 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [BNG:149] Kiora, the Crashing Wave +SB: 1 [BNG:65] Drown in Sorrow +SB: 1 [THS:107] Thoughtseize +SB: 2 [KTK:37] Disdainful Stroke +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..1df40b7a506 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,20 @@ +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +2 [SOM:10] Glint Hawk +4 [M11:214] Steel Overseer +2 [NPH:159] Spellskite +4 [M15:223] Ornithopter +4 [NPH:76] Vault Skirge +4 [NPH:7] Dispatch +4 [MBS:145] Inkmoth Nexus +4 [MBS:131] Signal Pest +12 [UNH:136] Plains +4 [SOM:179] Mox Opal +2 [MBS:144] Contested War Zone +6 [SOM:156] Glint Hawk Idol +SB: 2 [WWK:17] Refraction Trap +SB: 3 [NPH:78] Act of Aggression +SB: 4 [WWK:11] Kor Firewalker +SB: 3 [NPH:155] Shrine of Loyal Legions +SB: 3 [NPH:159] Spellskite +SB: 1 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..808ce67d003 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,23 @@ +2 [SOM:154] Etched Champion +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +3 [NPH:155] Shrine of Loyal Legions +2 [NPH:159] Spellskite +4 [NPH:76] Vault Skirge +4 [NPH:7] Dispatch +1 [NPH:57] Dismember +4 [MBS:145] Inkmoth Nexus +4 [MBS:131] Signal Pest +17 [UNH:136] Plains +3 [SOM:179] Mox Opal +4 [MBS:8] Hero of Bladehold +4 [SOM:156] Glint Hawk Idol +SB: 1 [SOM:154] Etched Champion +SB: 1 [M12:16] Gideon Jura +SB: 2 [NPH:57] Dismember +SB: 2 [BNG:25] Revoke Existence +SB: 1 [NPH:155] Shrine of Loyal Legions +SB: 1 [M12:11] Celestial Purge +SB: 3 [M13:22] Oblivion Ring +SB: 1 [NPH:159] Spellskite +SB: 3 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..808ce67d003 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,23 @@ +2 [SOM:154] Etched Champion +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +3 [NPH:155] Shrine of Loyal Legions +2 [NPH:159] Spellskite +4 [NPH:76] Vault Skirge +4 [NPH:7] Dispatch +1 [NPH:57] Dismember +4 [MBS:145] Inkmoth Nexus +4 [MBS:131] Signal Pest +17 [UNH:136] Plains +3 [SOM:179] Mox Opal +4 [MBS:8] Hero of Bladehold +4 [SOM:156] Glint Hawk Idol +SB: 1 [SOM:154] Etched Champion +SB: 1 [M12:16] Gideon Jura +SB: 2 [NPH:57] Dismember +SB: 2 [BNG:25] Revoke Existence +SB: 1 [NPH:155] Shrine of Loyal Legions +SB: 1 [M12:11] Celestial Purge +SB: 3 [M13:22] Oblivion Ring +SB: 1 [NPH:159] Spellskite +SB: 3 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..1b8217208c5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,19 @@ +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +3 [SOM:10] Glint Hawk +4 [M11:214] Steel Overseer +4 [M15:223] Ornithopter +4 [NPH:76] Vault Skirge +4 [NPH:7] Dispatch +4 [MBS:145] Inkmoth Nexus +4 [MBS:131] Signal Pest +11 [UNH:136] Plains +4 [SOM:179] Mox Opal +3 [MBS:144] Contested War Zone +3 [NPH:19] Porcelain Legionnaire +4 [SOM:156] Glint Hawk Idol +SB: 4 [WWK:11] Kor Firewalker +SB: 4 [NPH:155] Shrine of Loyal Legions +SB: 2 [M12:11] Celestial Purge +SB: 2 [NPH:38] Mental Misstep +SB: 3 [NPH:159] Spellskite diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..ec8cd221607 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,19 @@ +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +4 [M11:214] Steel Overseer +4 [NPH:137] Hex Parasite +4 [M15:223] Ornithopter +2 [M15:225] Phyrexian Revoker +4 [NPH:76] Vault Skirge +4 [MBS:145] Inkmoth Nexus +4 [MBS:131] Signal Pest +16 [UNH:136] Plains +3 [SOM:179] Mox Opal +3 [NPH:19] Porcelain Legionnaire +4 [SOM:156] Glint Hawk Idol +SB: 2 [MBS:10] Leonin Relic-Warder +SB: 2 [M15:225] Phyrexian Revoker +SB: 3 [CMD:17] Journey to Nowhere +SB: 2 [NPH:162] Torpor Orb +SB: 3 [SOM:218] Tumble Magnet +SB: 3 [WWK:11] Kor Firewalker diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Nov 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Nov 2011.mwDeck.dck new file mode 100644 index 00000000000..b17674026fe --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Nov 2011.mwDeck.dck @@ -0,0 +1,22 @@ +4 [SOM:154] Etched Champion +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +4 [SOM:10] Glint Hawk +1 [ISD:23] Mikaeus, the Lunarch +4 [NPH:76] Vault Skirge +4 [NPH:7] Dispatch +4 [SOM:229] Seachrome Coast +4 [MBS:145] Inkmoth Nexus +2 [ISD:244] Moorland Haunt +4 [MBS:131] Signal Pest +9 [UNH:136] Plains +4 [SOM:179] Mox Opal +4 [SOM:156] Glint Hawk Idol +4 [SOM:189] Origin Spellbomb +SB: 2 [NPH:57] Dismember +SB: 4 [NPH:155] Shrine of Loyal Legions +SB: 1 [M13:225] Glacial Fortress +SB: 1 [M13:22] Oblivion Ring +SB: 3 [NPH:159] Spellskite +SB: 3 [MBS:8] Hero of Bladehold +SB: 1 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..cf344f97f0b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,21 @@ +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +3 [NPH:155] Shrine of Loyal Legions +1 [NPH:159] Spellskite +4 [NPH:76] Vault Skirge +4 [NPH:7] Dispatch +2 [NPH:45] Spined Thopter +4 [MBS:145] Inkmoth Nexus +2 [M13:22] Oblivion Ring +4 [MBS:131] Signal Pest +17 [UNH:136] Plains +3 [SOM:179] Mox Opal +4 [MBS:8] Hero of Bladehold +4 [SOM:156] Glint Hawk Idol +SB: 2 [ISD:23] Mikaeus, the Lunarch +SB: 1 [M12:16] Gideon Jura +SB: 2 [NPH:57] Dismember +SB: 2 [BNG:25] Revoke Existence +SB: 4 [M12:11] Celestial Purge +SB: 1 [M13:22] Oblivion Ring +SB: 3 [NPH:159] Spellskite diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Sep 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Sep 2011.mwDeck.dck new file mode 100644 index 00000000000..28535e70f73 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tempered Steel TDtB ST Sep 2011.mwDeck.dck @@ -0,0 +1,19 @@ +4 [SOM:174] Memnite +4 [SOM:24] Tempered Steel +2 [SOM:10] Glint Hawk +4 [M11:214] Steel Overseer +4 [M15:223] Ornithopter +4 [NPH:76] Vault Skirge +4 [NPH:7] Dispatch +4 [MBS:145] Inkmoth Nexus +4 [MBS:131] Signal Pest +11 [UNH:136] Plains +4 [SOM:179] Mox Opal +3 [MBS:144] Contested War Zone +3 [NPH:19] Porcelain Legionnaire +5 [SOM:156] Glint Hawk Idol +SB: 2 [WWK:17] Refraction Trap +SB: 4 [WWK:11] Kor Firewalker +SB: 4 [NPH:155] Shrine of Loyal Legions +SB: 2 [UNH:136] Plains +SB: 3 [NPH:159] Spellskite diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Dec 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Dec 2014.mwDeck.dck new file mode 100644 index 00000000000..6fb5b07ee9a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Dec 2014.mwDeck.dck @@ -0,0 +1,31 @@ +1 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +3 [UNH:140] Forest +2 [KTK:208] Temur Charm +4 [KTK:249] Wooded Foothills +2 [KTK:56] Stubborn Denial +2 [KTK:106] Crater's Claws +4 [KTK:234] Frontier Bivouac +2 [UNH:139] Mountain +3 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +4 [KTK:144] Rattleclaw Mystic +1 [M15:246] Shivan Reef +4 [KTK:197] Savage Knuckleblade +4 [M15:249] Yavimaya Coast +2 [JOU:164] Temple of Epiphany +3 [JOU:163] Mana Confluence +4 [THS:172] Polukranos, World Eater +3 [THS:152] Boon Satyr +4 [C14:191] Elvish Mystic +SB: 2 [KTK:196] Sagu Mauler +SB: 1 [M15:135] Circle of Flame +SB: 1 [M15:169] Back to Nature +SB: 1 [KTK:208] Temur Charm +SB: 2 [THS:112] Anger of the Gods +SB: 1 [KTK:42] Icy Blast +SB: 1 [BNG:143] Unravel the AEther +SB: 1 [JOU:140] Setessan Tactics +SB: 2 [M15:75] Polymorphist's Jest +SB: 2 [KTK:37] Disdainful Stroke +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Nov 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Nov 2014.mwDeck.dck new file mode 100644 index 00000000000..55154046e54 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Temur Aggro TDtB ST Nov 2014.mwDeck.dck @@ -0,0 +1,29 @@ +1 [THS:226] Temple of Mystery +3 [UNH:140] Forest +2 [KTK:208] Temur Charm +1 [KTK:119] Sarkhan, the Dragonspeaker +4 [KTK:99] Ashcloud Phoenix +4 [KTK:249] Wooded Foothills +4 [KTK:106] Crater's Claws +4 [KTK:134] Heir of the Wilds +4 [KTK:234] Frontier Bivouac +2 [UNH:139] Mountain +3 [M15:155] Lightning Strike +4 [KTK:144] Rattleclaw Mystic +1 [M15:246] Shivan Reef +4 [KTK:197] Savage Knuckleblade +4 [M15:249] Yavimaya Coast +2 [JOU:164] Temple of Epiphany +3 [JOU:163] Mana Confluence +3 [THS:172] Polukranos, World Eater +4 [THS:152] Boon Satyr +3 [C14:191] Elvish Mystic +SB: 1 [M15:155] Lightning Strike +SB: 1 [KTK:100] Barrage of Boulders +SB: 3 [THS:159] Hunt the Hunter +SB: 2 [JOU:103] Magma Spray +SB: 1 [M15:169] Back to Nature +SB: 1 [KTK:208] Temur Charm +SB: 1 [KTK:97] Arc Lightning +SB: 3 [KTK:56] Stubborn Denial +SB: 2 [KTK:37] Disdainful Stroke diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Thalia WW TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Thalia WW TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..da61f5d5180 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Thalia WW TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,28 @@ +3 [MBS:10] Leonin Relic-Warder +2 [C13:11] Fiend Hunter +2 [NPH:161] Sword of War and Peace +1 [M12:3] Angelic Destiny +4 [M13:225] Glacial Fortress +4 [SOM:229] Seachrome Coast +3 [ISD:244] Moorland Haunt +2 [M13:22] Oblivion Ring +4 [M12:23] Honor of the Pure +12 [UNH:136] Plains +3 [MBS:14] Mirran Crusader +3 [DKA:24] Thalia, Guardian of Thraben +1 [UNH:137] Island +4 [ISD:6] Champion of the Parish +4 [MBS:8] Hero of Bladehold +4 [DKA:8] Gather the Townsfolk +4 [CNS:69] Doomed Traveler +SB: 1 [MBS:10] Leonin Relic-Warder +SB: 1 [C13:11] Fiend Hunter +SB: 2 [MBS:5] Divine Offering +SB: 1 [NPH:161] Sword of War and Peace +SB: 1 [M12:3] Angelic Destiny +SB: 1 [NPH:57] Dismember +SB: 2 [ISD:213] Geist of Saint Traft +SB: 1 [M13:22] Oblivion Ring +SB: 2 [M12:12] Day of Judgment +SB: 1 [MBS:14] Mirran Crusader +SB: 2 [M12:63] Mana Leak diff --git a/Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Feb 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Feb 2013.mwDeck.dck new file mode 100644 index 00000000000..f9763f12f51 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Feb 2013.mwDeck.dck @@ -0,0 +1,28 @@ +1 [AVR:32] Restoration Angel +2 [C14:88] Silverblade Paladin +4 [GTC:215] Boros Reckoner +4 [GTC:150] Cartel Aristocrat +1 [DKA:158] Vault of the Archangel +4 [RTR:238] Blood Crypt +4 [DKA:138] Falkenrath Aristocrat +3 [AVR:226] Cavern of Souls +4 [ISD:242] Isolated Chapel +2 [C14:163] Skirsdag High Priest +2 [AVR:166] Zealous Conscripts +3 [M13:96] Knight of Infamy +4 [GTC:245] Sacred Foundry +2 [DKA:12] Lingering Souls +3 [UNH:136] Plains +4 [GTC:242] Godless Shrine +1 [ISD:238] Clifftop Retreat +4 [ISD:6] Champion of the Parish +4 [GTC:185] Orzhov Charm +4 [CNS:69] Doomed Traveler +SB: 2 [GTC:182] Obzedat, Ghost Council +SB: 3 [C14:167] Tragic Slip +SB: 1 [C14:163] Skirsdag High Priest +SB: 2 [C14:172] Blasphemous Act +SB: 2 [DKA:12] Lingering Souls +SB: 2 [RTR:18] Rest in Peace +SB: 2 [DKA:142] Sorin, Lord of Innistrad +SB: 1 [C14:79] Mentor of the Meek diff --git a/Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..f9763f12f51 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/The Aristocrats TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,28 @@ +1 [AVR:32] Restoration Angel +2 [C14:88] Silverblade Paladin +4 [GTC:215] Boros Reckoner +4 [GTC:150] Cartel Aristocrat +1 [DKA:158] Vault of the Archangel +4 [RTR:238] Blood Crypt +4 [DKA:138] Falkenrath Aristocrat +3 [AVR:226] Cavern of Souls +4 [ISD:242] Isolated Chapel +2 [C14:163] Skirsdag High Priest +2 [AVR:166] Zealous Conscripts +3 [M13:96] Knight of Infamy +4 [GTC:245] Sacred Foundry +2 [DKA:12] Lingering Souls +3 [UNH:136] Plains +4 [GTC:242] Godless Shrine +1 [ISD:238] Clifftop Retreat +4 [ISD:6] Champion of the Parish +4 [GTC:185] Orzhov Charm +4 [CNS:69] Doomed Traveler +SB: 2 [GTC:182] Obzedat, Ghost Council +SB: 3 [C14:167] Tragic Slip +SB: 1 [C14:163] Skirsdag High Priest +SB: 2 [C14:172] Blasphemous Act +SB: 2 [DKA:12] Lingering Souls +SB: 2 [RTR:18] Rest in Peace +SB: 2 [DKA:142] Sorin, Lord of Innistrad +SB: 1 [C14:79] Mentor of the Meek diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Tokens TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Tokens TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..ff5977a4fed --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Tokens TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,33 @@ +2 [RTR:82] Ultimate Price +2 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +1 [RTR:150] Collective Blessing +2 [M13:174] Garruk, Primal Hunter +1 [DKA:158] Vault of the Archangel +4 [RTR:243] Overgrown Tomb +3 [C13:211] Selesnya Charm +3 [M13:160] Arbor Elf +4 [ISD:170] Avacyn's Pilgrim +4 [M13:193] Thragtusk +1 [ISD:181] Garruk Relentless +3 [ISD:242] Isolated Chapel +4 [RTR:248] Temple Garden +4 [CNS:72] Intangible Virtue +1 [ISD:115] Sever the Bloodline +3 [C14:80] Midnight Haunting +4 [DKA:12] Lingering Souls +3 [AVR:169] Borderland Ranger +1 [UNH:136] Plains +3 [ISD:239] Gavony Township +2 [DKA:142] Sorin, Lord of Innistrad +1 [UNH:138] Swamp +SB: 1 [RTR:82] Ultimate Price +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 2 [AVR:32] Restoration Angel +SB: 1 [ISD:32] Slayer of the Wicked +SB: 1 [ISD:181] Garruk Relentless +SB: 3 [RTR:148] Centaur Healer +SB: 1 [ISD:115] Sever the Bloodline +SB: 1 [AVR:210] Sigarda, Host of Herons +SB: 1 [M13:20] Intrepid Hero +SB: 3 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Torpor Tezz TDtB ST Jun 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Torpor Tezz TDtB ST Jun 2011.mwDeck.dck new file mode 100644 index 00000000000..2c0a5ad0d16 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Torpor Tezz TDtB ST Jun 2011.mwDeck.dck @@ -0,0 +1,30 @@ +3 [MBS:97] Tezzeret, Agent of Bolas +2 [M11:58] Jace Beleren +4 [WWK:134] Creeping Tar Pit +4 [NPH:162] Torpor Orb +4 [M13:223] Drowned Catacomb +3 [ROE:115] Inquisition of Kozilek +4 [C14:239] Everflowing Chalice +2 [KTK:69] Despise +1 [ROE:100] Consume the Meek +3 [C14:313] Tectonic Edge +1 [C14:136] Black Sun's Zenith +4 [M11:70] Preordain +2 [ZEN:87] Disfigure +3 [SOM:218] Tumble Magnet +1 [C14:283] Wurmcoil Engine +2 [MBS:145] Inkmoth Nexus +2 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +2 [WWK:31] Jace, the Mind Sculptor +4 [UNH:137] Island +3 [UNH:138] Swamp +2 [M12:63] Mana Leak +SB: 1 [C14:136] Black Sun's Zenith +SB: 2 [C14:145] Grave Titan +SB: 2 [M11:58] Jace Beleren +SB: 2 [ZEN:87] Disfigure +SB: 1 [ROE:115] Inquisition of Kozilek +SB: 1 [ROE:100] Consume the Meek +SB: 4 [M12:52] Flashfreeze +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Trinket UB Control TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Trinket UB Control TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..c856bb28ad5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Trinket UB Control TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,32 @@ +1 [SOM:69] Memoricide +3 [SOM:48] Trinket Mage +2 [M11:58] Jace Beleren +4 [WWK:134] Creeping Tar Pit +1 [SOM:46] Stoic Rebuttal +2 [ZEN:220] Misty Rainforest +1 [M11:202] Brittle Effigy +4 [M13:223] Drowned Catacomb +1 [ROE:101] Consuming Vapors +2 [C14:239] Everflowing Chalice +1 [ROE:100] Consume the Meek +3 [C14:313] Tectonic Edge +2 [C14:115] Into the Roil +1 [ZEN:229] Verdant Catacombs +4 [M11:70] Preordain +3 [C14:112] Frost Titan +4 [M14:96] Doom Blade +2 [SOM:226] Darkslick Shores +4 [WWK:31] Jace, the Mind Sculptor +1 [M14:209] Elixir of Immortality +6 [UNH:137] Island +3 [UNH:138] Swamp +1 [M15:71] Negate +4 [M12:63] Mana Leak +SB: 2 [ZEN:67] Spell Pierce +SB: 2 [SOM:69] Memoricide +SB: 1 [M11:58] Jace Beleren +SB: 4 [ZEN:87] Disfigure +SB: 1 [RTR:36] Dispel +SB: 1 [C13:249] Nihil Spellbomb +SB: 2 [M15:71] Negate +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Apr 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Apr 2011.mwDeck.dck new file mode 100644 index 00000000000..bbaf0fbdc67 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Apr 2011.mwDeck.dck @@ -0,0 +1,32 @@ +3 [MBS:43] Go for the Throat +1 [M11:58] Jace Beleren +4 [WWK:134] Creeping Tar Pit +1 [SOM:46] Stoic Rebuttal +2 [ZEN:70] Spreading Seas +4 [M13:223] Drowned Catacomb +3 [ROE:115] Inquisition of Kozilek +4 [C14:313] Tectonic Edge +2 [C14:115] Into the Roil +2 [C14:136] Black Sun's Zenith +4 [M11:70] Preordain +1 [ZEN:219] Marsh Flats +3 [C14:145] Grave Titan +1 [M15:103] Liliana Vess +1 [ZEN:223] Scalding Tarn +2 [SOM:218] Tumble Magnet +1 [C14:283] Wurmcoil Engine +4 [SOM:226] Darkslick Shores +2 [M14:97] Duress +4 [WWK:31] Jace, the Mind Sculptor +5 [UNH:137] Island +3 [UNH:138] Swamp +4 [M12:63] Mana Leak +SB: 1 [SOM:175] Mimic Vat +SB: 2 [SOM:69] Memoricide +SB: 1 [M11:58] Jace Beleren +SB: 2 [SOM:194] Precursor Golem +SB: 1 [SOM:46] Stoic Rebuttal +SB: 3 [ZEN:87] Disfigure +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [M14:96] Doom Blade +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..b9acd187fc7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,34 @@ +1 [MBS:43] Go for the Throat +2 [MBS:21] Consecrated Sphinx +4 [M11:58] Jace Beleren +4 [WWK:134] Creeping Tar Pit +1 [M11:226] Mystifying Maze +4 [M13:223] Drowned Catacomb +4 [ROE:115] Inquisition of Kozilek +1 [KTK:69] Despise +1 [ROE:100] Consume the Meek +1 [NPH:1] Karn Liberated +4 [C14:313] Tectonic Edge +1 [C14:115] Into the Roil +1 [C14:136] Black Sun's Zenith +4 [M11:70] Preordain +2 [C14:145] Grave Titan +1 [M15:103] Liliana Vess +1 [NPH:57] Dismember +3 [C14:271] Solemn Simulacrum +3 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +4 [UNH:137] Island +5 [UNH:138] Swamp +4 [M12:63] Mana Leak +SB: 1 [NPH:71] Praetor's Grasp +SB: 1 [C14:136] Black Sun's Zenith +SB: 1 [SOM:69] Memoricide +SB: 1 [NPH:74] Surgical Extraction +SB: 2 [ZEN:87] Disfigure +SB: 1 [C14:283] Wurmcoil Engine +SB: 1 [SOM:53] Volition Reins +SB: 2 [M14:97] Duress +SB: 1 [KTK:69] Despise +SB: 1 [CNS:201] Peace Strider +SB: 3 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..d2fafcbdcdb --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,32 @@ +1 [MBS:43] Go for the Throat +2 [M11:58] Jace Beleren +4 [WWK:134] Creeping Tar Pit +2 [SOM:46] Stoic Rebuttal +4 [ZEN:70] Spreading Seas +1 [ZEN:220] Misty Rainforest +4 [M13:223] Drowned Catacomb +4 [ROE:115] Inquisition of Kozilek +4 [C14:313] Tectonic Edge +2 [C14:136] Black Sun's Zenith +1 [ZEN:229] Verdant Catacombs +4 [M11:70] Preordain +3 [C14:145] Grave Titan +2 [M14:215] Ratchet Bomb +2 [ZEN:87] Disfigure +1 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +3 [WWK:31] Jace, the Mind Sculptor +5 [UNH:137] Island +3 [UNH:138] Swamp +4 [M12:63] Mana Leak +SB: 1 [ZEN:67] Spell Pierce +SB: 1 [C14:136] Black Sun's Zenith +SB: 1 [MBS:43] Go for the Throat +SB: 2 [SOM:69] Memoricide +SB: 1 [M11:58] Jace Beleren +SB: 2 [SOM:194] Precursor Golem +SB: 1 [ROE:59] Deprive +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [M14:97] Duress +SB: 1 [WWK:31] Jace, the Mind Sculptor +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2015.mwDeck.dck new file mode 100644 index 00000000000..4691909f7e0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Feb 2015.mwDeck.dck @@ -0,0 +1,29 @@ +4 [THS:225] Temple of Deceit +4 [THS:47] Dissolve +2 [THS:188] Ashiok, Nightmare Weaver +4 [KTK:239] Polluted Delta +4 [KTK:36] Dig Through Time +1 [KTK:233] Flooded Strand +4 [FRF:168] Dismal Backwater +4 [KTK:37] Disdainful Stroke +1 [KTK:49] Pearl Lake Ancient +4 [BNG:61] Bile Blight +3 [M15:245] Radiant Fountain +1 [KTK:230] Bloodstained Mire +1 [M15:224] Perilous Vault +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [FRF:1] Ugin, the Spirit Dragon +4 [THS:90] Hero's Downfall +2 [FRF:65] Crux of Fate +3 [M15:63] Jace's Ingenuity +1 [JOU:82] Silence the Believers +5 [UNH:137] Island +5 [UNH:138] Swamp +SB: 1 [M15:224] Perilous Vault +SB: 1 [KTK:81] Murderous Cut +SB: 1 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [FRF:65] Crux of Fate +SB: 2 [FRF:87] Tasigur, the Golden Fang +SB: 3 [BNG:65] Drown in Sorrow +SB: 4 [THS:107] Thoughtseize +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Mar 2015.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Mar 2015.mwDeck.dck new file mode 100644 index 00000000000..a538bd2a69a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Mar 2015.mwDeck.dck @@ -0,0 +1,31 @@ +4 [THS:225] Temple of Deceit +4 [THS:47] Dissolve +2 [THS:188] Ashiok, Nightmare Weaver +4 [KTK:239] Polluted Delta +1 [KTK:238] Opulent Palace +4 [KTK:36] Dig Through Time +1 [KTK:233] Flooded Strand +4 [FRF:168] Dismal Backwater +2 [KTK:37] Disdainful Stroke +1 [KTK:49] Pearl Lake Ancient +4 [BNG:61] Bile Blight +3 [M15:245] Radiant Fountain +1 [KTK:230] Bloodstained Mire +1 [M15:224] Perilous Vault +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [FRF:1] Ugin, the Spirit Dragon +4 [THS:90] Hero's Downfall +2 [FRF:65] Crux of Fate +3 [M15:63] Jace's Ingenuity +1 [JOU:82] Silence the Believers +5 [UNH:137] Island +4 [UNH:138] Swamp +2 [DTK:65] Negate +SB: 2 [M15:224] Perilous Vault +SB: 1 [M15:225] Phyrexian Revoker +SB: 1 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [THS:100] Pharika's Cure +SB: 2 [FRF:87] Tasigur, the Golden Fang +SB: 3 [BNG:65] Drown in Sorrow +SB: 4 [THS:107] Thoughtseize +SB: 1 [KTK:37] Disdainful Stroke diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..91cf13cbe9a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,27 @@ +3 [MBS:21] Consecrated Sphinx +4 [M13:223] Drowned Catacomb +4 [ISD:78] Snapcaster Mage +1 [NPH:61] Geth's Verdict +2 [M14:122] Wring Flesh +3 [ISD:55] Forbidden Alchemy +1 [C14:136] Black Sun's Zenith +1 [C14:145] Grave Titan +2 [C14:298] Ghost Quarter +1 [C14:283] Wurmcoil Engine +4 [M15:51] Dissipate +4 [M14:96] Doom Blade +2 [ISD:245] Nephalia Drownyard +4 [SOM:226] Darkslick Shores +9 [UNH:137] Island +4 [ISD:83] Think Twice +6 [UNH:138] Swamp +1 [M15:71] Negate +4 [M12:63] Mana Leak +SB: 1 [M14:122] Wring Flesh +SB: 1 [C14:136] Black Sun's Zenith +SB: 3 [M14:215] Ratchet Bomb +SB: 2 [ISD:245] Nephalia Drownyard +SB: 1 [C13:249] Nihil Spellbomb +SB: 3 [M12:72] Phantasmal Image +SB: 3 [NPH:159] Spellskite +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Sep 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Sep 2011.mwDeck.dck new file mode 100644 index 00000000000..bc1d20fa5a5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Control TDtB ST Sep 2011.mwDeck.dck @@ -0,0 +1,30 @@ +2 [MBS:21] Consecrated Sphinx +3 [MBS:43] Go for the Throat +4 [M11:58] Jace Beleren +4 [WWK:134] Creeping Tar Pit +4 [M13:223] Drowned Catacomb +4 [ROE:115] Inquisition of Kozilek +1 [KTK:69] Despise +1 [NPH:1] Karn Liberated +4 [C14:313] Tectonic Edge +2 [C14:115] Into the Roil +1 [C14:136] Black Sun's Zenith +4 [M11:70] Preordain +2 [C14:145] Grave Titan +1 [M15:103] Liliana Vess +1 [NPH:74] Surgical Extraction +3 [C14:271] Solemn Simulacrum +1 [M14:96] Doom Blade +4 [SOM:226] Darkslick Shores +5 [UNH:137] Island +5 [UNH:138] Swamp +4 [M12:63] Mana Leak +SB: 1 [SOM:69] Memoricide +SB: 1 [NPH:74] Surgical Extraction +SB: 2 [NPH:162] Torpor Orb +SB: 1 [ZEN:87] Disfigure +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [C14:283] Wurmcoil Engine +SB: 4 [ZEN:83] Bloodghast +SB: 1 [M14:97] Duress +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Infect TDtB ST Apr 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Infect TDtB ST Apr 2011.mwDeck.dck new file mode 100644 index 00000000000..4d4729b550a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Infect TDtB ST Apr 2011.mwDeck.dck @@ -0,0 +1,25 @@ +4 [SOM:185] Necropede +2 [M11:58] Jace Beleren +1 [ROE:59] Deprive +4 [WWK:134] Creeping Tar Pit +2 [SOM:79] Skithiryx, the Blight Dragon +4 [MBS:50] Phyrexian Crusader +4 [M13:223] Drowned Catacomb +4 [ROE:115] Inquisition of Kozilek +1 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [SOM:218] Tumble Magnet +4 [MBS:145] Inkmoth Nexus +4 [SOM:226] Darkslick Shores +4 [UNH:137] Island +6 [UNH:138] Swamp +4 [SOM:144] Contagion Clasp +4 [M12:63] Mana Leak +SB: 1 [C14:115] Into the Roil +SB: 1 [MBS:43] Go for the Throat +SB: 1 [M11:58] Jace Beleren +SB: 3 [ZEN:87] Disfigure +SB: 3 [MBS:52] Phyrexian Vatmother +SB: 2 [M14:96] Doom Blade +SB: 2 [M14:97] Duress +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UB Zombi TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UB Zombi TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..957df3909a9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UB Zombi TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,18 @@ +4 [M13:223] Drowned Catacomb +4 [DKA:135] Diregraf Captain +4 [NPH:61] Geth's Verdict +4 [ISD:97] Diregraf Ghoul +4 [C14:167] Tragic Slip +4 [DKA:63] Geralf's Messenger +4 [C14:163] Skirsdag High Priest +3 [SOM:63] Fume Spitter +4 [DKA:64] Gravecrawler +4 [SOM:226] Darkslick Shores +3 [MBS:115] Mortarpod +4 [M12:72] Phantasmal Image +12 [UNH:138] Swamp +2 [ISD:105] Liliana of the Veil +SB: 4 [NPH:107] Corrosive Gale +SB: 4 [NPH:74] Surgical Extraction +SB: 4 [NPH:48] Vapor Snag +SB: 3 [NPH:19] Porcelain Legionnaire diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UG Fauna TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UG Fauna TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..81b9bb3589b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UG Fauna TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,24 @@ +6 [UNH:140] Forest +3 [CMD:157] Garruk Wildspeaker +4 [ZEN:220] Misty Rainforest +2 [ROE:201] Nest Invader +4 [M12:165] Birds of Paradise +4 [ROE:212] Vengevine +3 [C14:313] Tectonic Edge +4 [M11:172] Fauna Shaman +4 [ZEN:229] Verdant Catacombs +3 [C14:124] Sea Gate Oracle +3 [C14:112] Frost Titan +2 [ZEN:223] Scalding Tarn +4 [ZEN:168] Lotus Cobra +3 [WWK:31] Jace, the Mind Sculptor +6 [UNH:137] Island +1 [SOM:177] Molten-Tail Masticore +4 [M12:63] Mana Leak +SB: 1 [C13:134] Acidic Slime +SB: 2 [M13:67] Sleep +SB: 4 [ZEN:70] Spreading Seas +SB: 2 [SOM:53] Volition Reins +SB: 3 [M11:188] Obstinate Baloth +SB: 1 [ROE:211] Tajuru Preserver +SB: 2 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UR Exarch Twin TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UR Exarch Twin TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..6f82b89fc6c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UR Exarch Twin TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,26 @@ +2 [WWK:137] Halimar Depths +2 [ZEN:220] Misty Rainforest +2 [ZEN:211] Arid Mesa +4 [C13:37] Deceiver Exarch +4 [NPH:156] Shrine of Piercing Vision +4 [ROE:165] Splinter Twin +5 [UNH:139] Mountain +2 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +2 [NPH:57] Dismember +4 [NPH:35] Gitaxian Probe +4 [RTR:36] Dispel +1 [SOM:50] Twisted Image +2 [NPH:38] Mental Misstep +8 [UNH:137] Island +4 [M12:73] Ponder +2 [M12:63] Mana Leak +SB: 2 [NPH:116] Mutagenic Growth +SB: 2 [C14:98] Azure Mage +SB: 1 [KTK:120] Shatter +SB: 1 [NPH:38] Mental Misstep +SB: 3 [M12:145] Grim Lavamancer +SB: 2 [NPH:159] Spellskite +SB: 2 [M11:154] Pyroclasm +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..f338e415a7d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,24 @@ +2 [M11:58] Jace Beleren +2 [WWK:137] Halimar Depths +2 [NPH:159] Spellskite +2 [C14:315] Terramorphic Expanse +4 [C13:37] Deceiver Exarch +3 [NPH:156] Shrine of Piercing Vision +4 [ROE:165] Splinter Twin +6 [UNH:139] Mountain +3 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +4 [NPH:35] Gitaxian Probe +3 [RTR:36] Dispel +9 [UNH:137] Island +4 [M12:73] Ponder +4 [M12:63] Mana Leak +SB: 1 [C14:115] Into the Roil +SB: 2 [ZEN:67] Spell Pierce +SB: 1 [M11:58] Jace Beleren +SB: 1 [ROE:59] Deprive +SB: 1 [MBS:61] Crush +SB: 4 [NPH:38] Mental Misstep +SB: 1 [NPH:159] Spellskite +SB: 4 [M12:52] Flashfreeze diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jun 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jun 2011.mwDeck.dck new file mode 100644 index 00000000000..0cc139005dc --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Jun 2011.mwDeck.dck @@ -0,0 +1,28 @@ +2 [M11:58] Jace Beleren +4 [C13:37] Deceiver Exarch +4 [ROE:165] Splinter Twin +4 [C14:313] Tectonic Edge +8 [UNH:139] Mountain +1 [C13:114] Inferno Titan +2 [ZEN:67] Spell Pierce +3 [C14:115] Into the Roil +1 [C14:124] Sea Gate Oracle +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +1 [NPH:57] Dismember +3 [NPH:35] Gitaxian Probe +4 [WWK:31] Jace, the Mind Sculptor +1 [NPH:38] Mental Misstep +10 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 1 [M12:151] Manic Vandal +SB: 1 [MBS:21] Consecrated Sphinx +SB: 1 [KTK:120] Shatter +SB: 2 [M12:128] Combust +SB: 1 [NPH:2] Apostle's Blessing +SB: 1 [C14:283] Wurmcoil Engine +SB: 1 [RTR:36] Dispel +SB: 1 [M15:63] Jace's Ingenuity +SB: 4 [M11:154] Pyroclasm +SB: 1 [M15:71] Negate +SB: 1 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Sep 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Sep 2011.mwDeck.dck new file mode 100644 index 00000000000..cb131d47bfe --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UR ExarchTwin TDtB ST Sep 2011.mwDeck.dck @@ -0,0 +1,24 @@ +4 [WWK:137] Halimar Depths +3 [ZEN:220] Misty Rainforest +3 [ZEN:211] Arid Mesa +3 [M12:145] Grim Lavamancer +4 [C13:37] Deceiver Exarch +4 [NPH:156] Shrine of Piercing Vision +4 [ROE:165] Splinter Twin +5 [UNH:139] Mountain +2 [C14:115] Into the Roil +2 [ZEN:67] Spell Pierce +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +2 [NPH:35] Gitaxian Probe +4 [RTR:36] Dispel +3 [SOM:50] Twisted Image +5 [UNH:137] Island +4 [M12:73] Ponder +SB: 3 [NPH:116] Mutagenic Growth +SB: 1 [MBS:67] Into the Core +SB: 3 [WWK:81] Dragonmaster Outcast +SB: 1 [M12:145] Grim Lavamancer +SB: 2 [NPH:38] Mental Misstep +SB: 3 [ROE:146] Forked Bolt +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UR Snap-Burn TDtB ST Dec 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UR Snap-Burn TDtB ST Dec 2011.mwDeck.dck new file mode 100644 index 00000000000..c36eacaa251 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UR Snap-Burn TDtB ST Dec 2011.mwDeck.dck @@ -0,0 +1,24 @@ +3 [CNS:138] Brimstone Volley +2 [M12:146] Incinerate +3 [M12:145] Grim Lavamancer +4 [UNH:139] Mountain +4 [ISD:78] Snapcaster Mage +3 [M14:134] Chandra's Phoenix +2 [C13:242] Druidic Satchel +4 [NPH:86] Gut Shot +2 [NPH:43] Psychic Barrier +4 [SOM:225] Copperline Gorge +4 [ISD:51] Delver of Secrets +10 [UNH:137] Island +3 [ISD:139] Desperate Ravings +4 [M12:73] Ponder +4 [ISD:248] Sulfur Falls +4 [M12:63] Mana Leak +SB: 2 [NPH:88] Moltensteel Dragon +SB: 2 [NPH:38] Mental Misstep +SB: 2 [SOM:81] Arc Trail +SB: 1 [C14:229] Bonehoard +SB: 2 [NPH:159] Spellskite +SB: 1 [M15:71] Negate +SB: 3 [M12:52] Flashfreeze +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Blade TDtB ST Oct 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Blade TDtB ST Oct 2011.mwDeck.dck new file mode 100644 index 00000000000..53a2fc717bd --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Blade TDtB ST Oct 2011.mwDeck.dck @@ -0,0 +1,28 @@ +1 [NPH:161] Sword of War and Peace +4 [M13:225] Glacial Fortress +4 [NPH:4] Blade Splicer +2 [C14:298] Ghost Quarter +2 [MBS:138] Sword of Feast and Famine +4 [SOM:229] Seachrome Coast +4 [MBS:145] Inkmoth Nexus +3 [ISD:213] Geist of Saint Traft +1 [M15:51] Dissipate +4 [M13:22] Oblivion Ring +2 [M12:12] Day of Judgment +6 [UNH:136] Plains +3 [MBS:14] Mirran Crusader +5 [UNH:137] Island +1 [MBS:8] Hero of Bladehold +4 [ISD:83] Think Twice +2 [M12:40] Timely Reinforcements +4 [M12:73] Ponder +4 [M12:63] Mana Leak +SB: 1 [C14:298] Ghost Quarter +SB: 3 [ISD:27] Purify the Grave +SB: 1 [M12:16] Gideon Jura +SB: 2 [M12:11] Celestial Purge +SB: 1 [M12:12] Day of Judgment +SB: 2 [ISD:40] Urgent Exorcism +SB: 1 [NPH:159] Spellskite +SB: 2 [M12:72] Phantasmal Image +SB: 2 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Aug 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Aug 2014.mwDeck.dck new file mode 100644 index 00000000000..366ee2642f5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Aug 2014.mwDeck.dck @@ -0,0 +1,32 @@ +1 [JOU:38] Font of Fortunes +4 [THS:47] Dissolve +2 [RTR:54] Syncopate +2 [M14:68] Quicken +2 [THS:227] Temple of Silence +4 [RTR:241] Hallowed Fountain +4 [RTR:201] Supreme Verdict +3 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +1 [C13:275] Azorius Guildgate +2 [JOU:164] Temple of Epiphany +3 [M14:228] Mutavault +3 [RTR:44] Jace, Architect of Thought +1 [M15:63] Jace's Ingenuity +2 [M15:52] Divination +1 [M14:209] Elixir of Immortality +5 [UNH:136] Plains +1 [THS:9] Elspeth, Sun's Champion +1 [BNG:11] Fated Retribution +5 [UNH:137] Island +2 [THS:22] Last Breath +4 [BNG:163] Temple of Enlightenment +SB: 4 [JOU:18] Nyx-Fleece Ram +SB: 1 [GTC:6] Blind Obedience +SB: 1 [RTR:231] Pithing Needle +SB: 1 [JOU:7] Deicide +SB: 2 [BNG:5] Brimaz, King of Oreskos +SB: 1 [THS:49] Gainsay +SB: 2 [M14:5] Archangel of Thune +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..49d9e7644bf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,23 @@ +4 [WWK:133] Celestial Colonnade +3 [M11:58] Jace Beleren +4 [M13:225] Glacial Fortress +3 [M11:7] Baneslayer Angel +4 [CMD:37] Wall of Omens +4 [C14:69] Condemn +4 [C14:313] Tectonic Edge +2 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [SOM:229] Seachrome Coast +1 [C14:91] Sun Titan +2 [SOM:53] Volition Reins +2 [WWK:31] Jace, the Mind Sculptor +3 [M12:12] Day of Judgment +6 [UNH:136] Plains +4 [UNH:137] Island +2 [M15:71] Negate +4 [M12:63] Mana Leak +SB: 4 [SOM:14] Leonin Arbiter +SB: 4 [ZEN:25] Luminarch Ascension +SB: 1 [M14:215] Ratchet Bomb +SB: 4 [WWK:11] Kor Firewalker +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2013.mwDeck.dck new file mode 100644 index 00000000000..3b8170f83c1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Dec 2013.mwDeck.dck @@ -0,0 +1,25 @@ +4 [THS:47] Dissolve +2 [RTR:54] Syncopate +2 [M14:68] Quicken +4 [RTR:241] Hallowed Fountain +4 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +4 [C13:275] Azorius Guildgate +1 [M14:215] Ratchet Bomb +2 [M14:228] Mutavault +3 [RTR:44] Jace, Architect of Thought +4 [M15:52] Divination +1 [M14:209] Elixir of Immortality +8 [UNH:136] Plains +1 [THS:9] Elspeth, Sun's Champion +8 [UNH:137] Island +SB: 1 [GTC:6] Blind Obedience +SB: 1 [RTR:231] Pithing Needle +SB: 3 [M14:18] Fiendslayer Paladin +SB: 3 [THS:49] Gainsay +SB: 1 [M14:215] Ratchet Bomb +SB: 3 [THS:22] Last Breath +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Feb 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Feb 2014.mwDeck.dck new file mode 100644 index 00000000000..d8adbe4c367 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Feb 2014.mwDeck.dck @@ -0,0 +1,22 @@ +4 [THS:225] Temple of Deceit +4 [THS:47] Dissolve +3 [RTR:54] Syncopate +2 [THS:227] Temple of Silence +4 [RTR:241] Hallowed Fountain +4 [RTR:201] Supreme Verdict +2 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +4 [C13:275] Azorius Guildgate +1 [DGM:11] AEtherling +3 [M14:228] Mutavault +4 [RTR:44] Jace, Architect of Thought +5 [UNH:136] Plains +3 [THS:9] Elspeth, Sun's Champion +5 [UNH:137] Island +4 [THS:22] Last Breath +SB: 3 [THS:49] Gainsay +SB: 4 [M14:5] Archangel of Thune +SB: 1 [C13:51] Opportunity +SB: 3 [THS:83] Dark Betrayal +SB: 4 [THS:32] Soldier of the Pantheon diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jan 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jan 2014.mwDeck.dck new file mode 100644 index 00000000000..17e8d66503d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jan 2014.mwDeck.dck @@ -0,0 +1,27 @@ +4 [THS:47] Dissolve +2 [RTR:54] Syncopate +2 [M14:68] Quicken +4 [RTR:241] Hallowed Fountain +4 [RTR:201] Supreme Verdict +3 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +4 [C13:275] Azorius Guildgate +1 [M14:215] Ratchet Bomb +2 [M14:228] Mutavault +3 [RTR:44] Jace, Architect of Thought +4 [M15:52] Divination +1 [M14:209] Elixir of Immortality +8 [UNH:136] Plains +1 [THS:9] Elspeth, Sun's Champion +8 [UNH:137] Island +1 [THS:22] Last Breath +SB: 1 [GTC:6] Blind Obedience +SB: 1 [THS:15] Glare of Heresy +SB: 1 [RTR:231] Pithing Needle +SB: 2 [M14:12] Celestial Flare +SB: 3 [THS:49] Gainsay +SB: 1 [M14:215] Ratchet Bomb +SB: 3 [THS:22] Last Breath +SB: 2 [M14:60] Jace, Memory Adept +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..6290861ac78 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,30 @@ +4 [WWK:133] Celestial Colonnade +2 [M11:58] Jace Beleren +1 [SOM:46] Stoic Rebuttal +2 [C14:95] White Sun's Zenith +2 [ZEN:70] Spreading Seas +4 [M13:225] Glacial Fortress +3 [CMD:37] Wall of Omens +1 [NPH:130] Batterskull +2 [KTK:33] Cancel +2 [C14:69] Condemn +1 [NPH:1] Karn Liberated +4 [C14:313] Tectonic Edge +2 [C14:115] Into the Roil +4 [M11:70] Preordain +4 [SOM:229] Seachrome Coast +1 [C14:271] Solemn Simulacrum +2 [M15:63] Jace's Ingenuity +3 [M13:22] Oblivion Ring +2 [M12:12] Day of Judgment +4 [UNH:136] Plains +5 [UNH:137] Island +1 [M15:71] Negate +4 [M12:63] Mana Leak +SB: 2 [ZEN:25] Luminarch Ascension +SB: 2 [MBS:5] Divine Offering +SB: 1 [C14:74] Grand Abolisher +SB: 3 [M11:21] Leyline of Sanctity +SB: 4 [M12:11] Celestial Purge +SB: 2 [M12:12] Day of Judgment +SB: 1 [C14:69] Condemn diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2014.mwDeck.dck new file mode 100644 index 00000000000..dc0dd37ad41 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jul 2014.mwDeck.dck @@ -0,0 +1,27 @@ +4 [THS:47] Dissolve +2 [M14:12] Celestial Flare +2 [RTR:54] Syncopate +1 [M14:68] Quicken +4 [RTR:241] Hallowed Fountain +4 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [RTR:155] Detention Sphere +3 [C13:275] Azorius Guildgate +2 [M14:228] Mutavault +3 [RTR:44] Jace, Architect of Thought +4 [M15:52] Divination +1 [M14:209] Elixir of Immortality +6 [UNH:136] Plains +1 [THS:9] Elspeth, Sun's Champion +7 [UNH:137] Island +4 [BNG:163] Temple of Enlightenment +SB: 1 [GTC:6] Blind Obedience +SB: 2 [M14:18] Fiendslayer Paladin +SB: 1 [THS:49] Gainsay +SB: 2 [JOU:7] Deicide +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [JOU:23] Reprisal +SB: 3 [THS:22] Last Breath +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jun 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jun 2014.mwDeck.dck new file mode 100644 index 00000000000..ac66890ec47 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST Jun 2014.mwDeck.dck @@ -0,0 +1,27 @@ +4 [THS:47] Dissolve +3 [M14:29] Planar Cleansing +1 [JOU:7] Deicide +2 [RTR:54] Syncopate +3 [M14:68] Quicken +4 [RTR:241] Hallowed Fountain +4 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +3 [C13:275] Azorius Guildgate +3 [M14:228] Mutavault +3 [RTR:44] Jace, Architect of Thought +4 [M15:52] Divination +1 [M14:209] Elixir of Immortality +6 [UNH:136] Plains +6 [UNH:137] Island +4 [BNG:163] Temple of Enlightenment +1 [M15:71] Negate +SB: 2 [GTC:6] Blind Obedience +SB: 1 [M14:18] Fiendslayer Paladin +SB: 1 [RTR:231] Pithing Needle +SB: 1 [JOU:7] Deicide +SB: 3 [THS:49] Gainsay +SB: 2 [M14:12] Celestial Flare +SB: 2 [THS:9] Elspeth, Sun's Champion +SB: 2 [THS:22] Last Breath +SB: 1 [M14:60] Jace, Memory Adept diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST May 2014.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST May 2014.mwDeck.dck new file mode 100644 index 00000000000..aa98f81bf10 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Control TDtB ST May 2014.mwDeck.dck @@ -0,0 +1,30 @@ +4 [THS:47] Dissolve +2 [M14:29] Planar Cleansing +1 [JOU:7] Deicide +2 [M14:12] Celestial Flare +2 [RTR:54] Syncopate +4 [RTR:241] Hallowed Fountain +4 [RTR:201] Supreme Verdict +3 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [C13:275] Azorius Guildgate +1 [DGM:11] AEtherling +4 [M14:228] Mutavault +3 [RTR:44] Jace, Architect of Thought +4 [M15:52] Divination +1 [M14:209] Elixir of Immortality +5 [UNH:136] Plains +1 [THS:9] Elspeth, Sun's Champion +5 [UNH:137] Island +2 [THS:22] Last Breath +4 [BNG:163] Temple of Enlightenment +SB: 3 [JOU:18] Nyx-Fleece Ram +SB: 1 [RTR:155] Detention Sphere +SB: 1 [RTR:231] Pithing Needle +SB: 1 [JOU:7] Deicide +SB: 3 [THS:49] Gainsay +SB: 1 [JOU:5] Banishing Light +SB: 1 [RTR:36] Dispel +SB: 2 [THS:9] Elspeth, Sun's Champion +SB: 1 [M14:60] Jace, Memory Adept +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Apr 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Apr 2012.mwDeck.dck new file mode 100644 index 00000000000..47f3a5caf03 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Apr 2012.mwDeck.dck @@ -0,0 +1,29 @@ +2 [NPH:161] Sword of War and Peace +4 [M13:225] Glacial Fortress +1 [NPH:130] Batterskull +4 [ISD:78] Snapcaster Mage +2 [NPH:86] Gut Shot +1 [ISD:231] Runechanter's Pike +2 [DKA:52] Thought Scour +4 [SOM:229] Seachrome Coast +1 [NPH:57] Dismember +4 [NPH:35] Gitaxian Probe +4 [ISD:213] Geist of Saint Traft +4 [NPH:48] Vapor Snag +3 [ISD:244] Moorland Haunt +1 [UNH:136] Plains +4 [ISD:51] Delver of Secrets +9 [UNH:137] Island +4 [M12:73] Ponder +2 [ISD:60] Invisible Stalker +4 [M12:63] Mana Leak +SB: 2 [NPH:107] Corrosive Gale +SB: 1 [MBS:5] Divine Offering +SB: 1 [BNG:25] Revoke Existence +SB: 2 [M15:51] Dissipate +SB: 2 [M12:11] Celestial Purge +SB: 1 [NPH:130] Batterskull +SB: 2 [M12:72] Phantasmal Image +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M12:40] Timely Reinforcements +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Aug 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Aug 2012.mwDeck.dck new file mode 100644 index 00000000000..46f4b8bb856 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Aug 2012.mwDeck.dck @@ -0,0 +1,25 @@ +3 [AVR:32] Restoration Angel +3 [C13:30] Augur of Bolas +4 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +4 [NPH:86] Gut Shot +3 [ISD:231] Runechanter's Pike +4 [DKA:52] Thought Scour +4 [SOM:229] Seachrome Coast +4 [NPH:35] Gitaxian Probe +2 [ISD:213] Geist of Saint Traft +4 [NPH:48] Vapor Snag +2 [ISD:244] Moorland Haunt +4 [ISD:51] Delver of Secrets +8 [UNH:137] Island +4 [M12:73] Ponder +3 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [MBS:138] Sword of Feast and Famine +SB: 1 [NPH:57] Dismember +SB: 1 [M15:51] Dissipate +SB: 3 [M12:11] Celestial Purge +SB: 1 [M13:22] Oblivion Ring +SB: 3 [NPH:38] Mental Misstep +SB: 3 [M12:72] Phantasmal Image +SB: 1 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Feb 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Feb 2012.mwDeck.dck new file mode 100644 index 00000000000..6498036b314 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Feb 2012.mwDeck.dck @@ -0,0 +1,28 @@ +4 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +3 [NPH:86] Gut Shot +3 [ISD:231] Runechanter's Pike +2 [DKA:52] Thought Scour +4 [SOM:229] Seachrome Coast +4 [NPH:35] Gitaxian Probe +3 [ISD:213] Geist of Saint Traft +3 [C14:80] Midnight Haunting +4 [NPH:48] Vapor Snag +3 [ISD:244] Moorland Haunt +1 [UNH:136] Plains +2 [M12:72] Phantasmal Image +4 [ISD:51] Delver of Secrets +8 [UNH:137] Island +4 [M12:73] Ponder +4 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [NPH:86] Gut Shot +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [BNG:25] Revoke Existence +SB: 1 [M15:51] Dissipate +SB: 2 [M13:22] Oblivion Ring +SB: 2 [M12:12] Day of Judgment +SB: 1 [M12:72] Phantasmal Image +SB: 2 [M14:60] Jace, Memory Adept +SB: 2 [M12:40] Timely Reinforcements +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Jul 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Jul 2012.mwDeck.dck new file mode 100644 index 00000000000..c5893d3a7de --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST Jul 2012.mwDeck.dck @@ -0,0 +1,27 @@ +3 [AVR:32] Restoration Angel +4 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +1 [NPH:116] Mutagenic Growth +3 [NPH:86] Gut Shot +3 [ISD:231] Runechanter's Pike +4 [DKA:52] Thought Scour +4 [SOM:229] Seachrome Coast +4 [NPH:35] Gitaxian Probe +4 [ISD:213] Geist of Saint Traft +4 [NPH:48] Vapor Snag +2 [ISD:244] Moorland Haunt +1 [UNH:136] Plains +4 [ISD:51] Delver of Secrets +8 [UNH:137] Island +4 [M12:73] Ponder +3 [M12:63] Mana Leak +SB: 1 [NPH:116] Mutagenic Growth +SB: 1 [NPH:86] Gut Shot +SB: 1 [NPH:161] Sword of War and Peace +SB: 1 [ISD:79] Spectral Flight +SB: 1 [M15:51] Dissipate +SB: 3 [M12:11] Celestial Purge +SB: 2 [NPH:38] Mental Misstep +SB: 2 [M12:72] Phantasmal Image +SB: 2 [M12:40] Timely Reinforcements +SB: 1 [M12:63] Mana Leak diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST May 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST May 2012.mwDeck.dck new file mode 100644 index 00000000000..abb87980233 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Delver TDtB ST May 2012.mwDeck.dck @@ -0,0 +1,30 @@ +2 [NPH:161] Sword of War and Peace +4 [M13:225] Glacial Fortress +4 [ISD:78] Snapcaster Mage +1 [NPH:86] Gut Shot +1 [MBS:138] Sword of Feast and Famine +2 [DKA:52] Thought Scour +4 [SOM:229] Seachrome Coast +1 [NPH:57] Dismember +4 [NPH:35] Gitaxian Probe +4 [ISD:213] Geist of Saint Traft +4 [NPH:48] Vapor Snag +3 [ISD:244] Moorland Haunt +1 [UNH:136] Plains +2 [M12:72] Phantasmal Image +4 [ISD:51] Delver of Secrets +2 [DKA:7] Faith's Shield +9 [UNH:137] Island +4 [M12:73] Ponder +4 [M12:63] Mana Leak +SB: 1 [MBS:21] Consecrated Sphinx +SB: 1 [MBS:5] Divine Offering +SB: 1 [NPH:74] Surgical Extraction +SB: 1 [C13:42] Dungeon Geists +SB: 2 [NPH:78] Act of Aggression +SB: 1 [BNG:25] Revoke Existence +SB: 1 [M15:51] Dissipate +SB: 2 [M12:11] Celestial Purge +SB: 1 [NPH:130] Batterskull +SB: 1 [M13:22] Oblivion Ring +SB: 3 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Flash TDtB ST Jul 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Flash TDtB ST Jul 2013.mwDeck.dck new file mode 100644 index 00000000000..960af27ae51 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Flash TDtB ST Jul 2013.mwDeck.dck @@ -0,0 +1,29 @@ +4 [AVR:32] Restoration Angel +4 [C13:30] Augur of Bolas +2 [RTR:54] Syncopate +4 [M13:225] Glacial Fortress +4 [RTR:241] Hallowed Fountain +3 [ISD:78] Snapcaster Mage +3 [RTR:201] Supreme Verdict +2 [RTR:145] Azorius Charm +3 [RTR:200] Sphinx's Revelation +2 [DGM:5] Renounce the Guilds +2 [ISD:231] Runechanter's Pike +3 [DKA:52] Thought Scour +1 [M13:75] Unsummon +2 [M15:51] Dissipate +2 [M13:65] Rewind +2 [ISD:244] Moorland Haunt +5 [UNH:136] Plains +10 [UNH:137] Island +2 [ISD:83] Think Twice +SB: 1 [RTR:201] Supreme Verdict +SB: 2 [AVR:34] Righteous Blow +SB: 2 [ISD:27] Purify the Grave +SB: 1 [DGM:5] Renounce the Guilds +SB: 1 [DGM:11] AEtherling +SB: 2 [RTR:36] Dispel +SB: 1 [RTR:44] Jace, Architect of Thought +SB: 1 [M13:22] Oblivion Ring +SB: 3 [AVR:38] Terminus +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UW Human TDtB ST Apr 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UW Human TDtB ST Apr 2012.mwDeck.dck new file mode 100644 index 00000000000..0ba723c4fd4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UW Human TDtB ST Apr 2012.mwDeck.dck @@ -0,0 +1,20 @@ +4 [M13:225] Glacial Fortress +4 [SOM:229] Seachrome Coast +3 [ISD:244] Moorland Haunt +4 [M12:23] Honor of the Pure +4 [M13:22] Oblivion Ring +13 [UNH:136] Plains +3 [DKA:24] Thalia, Guardian of Thraben +4 [DKA:13] Loyal Cathar +4 [MBS:14] Mirran Crusader +4 [ISD:6] Champion of the Parish +4 [MBS:8] Hero of Bladehold +1 [DKA:8] Gather the Townsfolk +4 [CNS:69] Doomed Traveler +4 [M12:63] Mana Leak +SB: 2 [NPH:161] Sword of War and Peace +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 2 [BNG:25] Revoke Existence +SB: 4 [M12:12] Day of Judgment +SB: 1 [SOM:135] Venser, the Sojourner +SB: 4 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWR Midrange TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWR Midrange TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..09ecec03363 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWR Midrange TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,30 @@ +4 [AVR:32] Restoration Angel +2 [M14:55] Essence Scatter +4 [M13:225] Glacial Fortress +3 [M13:147] Searing Spear +4 [RTR:241] Hallowed Fountain +1 [UNH:139] Mountain +4 [ISD:78] Snapcaster Mage +3 [RTR:145] Azorius Charm +3 [M13:150] Thundermaw Hellkite +2 [ISD:231] Runechanter's Pike +2 [AVR:149] Pillar of Flame +4 [RTR:247] Steam Vents +4 [DKA:52] Thought Scour +4 [ISD:213] Geist of Saint Traft +2 [M15:51] Dissipate +2 [M13:75] Unsummon +2 [ISD:244] Moorland Haunt +4 [ISD:238] Clifftop Retreat +2 [ISD:139] Desperate Ravings +4 [ISD:248] Sulfur Falls +SB: 1 [RTR:155] Detention Sphere +SB: 1 [AVR:79] Tamiyo, the Moon Sage +SB: 1 [C13:42] Dungeon Geists +SB: 2 [AVR:149] Pillar of Flame +SB: 2 [M14:47] Clone +SB: 2 [AVR:166] Zealous Conscripts +SB: 2 [M15:51] Dissipate +SB: 1 [RTR:36] Dispel +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWr Control TDtB ST Oct 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWr Control TDtB ST Oct 2012.mwDeck.dck new file mode 100644 index 00000000000..ce47869b1dd --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWr Control TDtB ST Oct 2012.mwDeck.dck @@ -0,0 +1,26 @@ +2 [AVR:79] Tamiyo, the Moon Sage +2 [RTR:54] Syncopate +3 [AVR:20] Entreat the Angels +4 [M13:225] Glacial Fortress +4 [RTR:241] Hallowed Fountain +2 [ISD:78] Snapcaster Mage +1 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:155] Detention Sphere +4 [AVR:149] Pillar of Flame +1 [AVR:227] Desolate Lighthouse +4 [RTR:247] Steam Vents +4 [RTR:44] Jace, Architect of Thought +4 [UNH:136] Plains +2 [UNH:137] Island +4 [ISD:238] Clifftop Retreat +4 [ISD:83] Think Twice +4 [AVR:38] Terminus +3 [ISD:248] Sulfur Falls +SB: 2 [RTR:201] Supreme Verdict +SB: 2 [RTR:223] Sundering Growth +SB: 2 [ISD:27] Purify the Grave +SB: 3 [ISD:213] Geist of Saint Traft +SB: 2 [M15:51] Dissipate +SB: 2 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Apr 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Apr 2013.mwDeck.dck new file mode 100644 index 00000000000..bbac01a541b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Apr 2013.mwDeck.dck @@ -0,0 +1,31 @@ +3 [AVR:32] Restoration Angel +1 [RTR:93] Electrickery +2 [C13:30] Augur of Bolas +4 [GTC:215] Boros Reckoner +4 [M13:225] Glacial Fortress +1 [M13:147] Searing Spear +4 [RTR:241] Hallowed Fountain +1 [UNH:139] Mountain +3 [ISD:78] Snapcaster Mage +2 [RTR:201] Supreme Verdict +3 [RTR:200] Sphinx's Revelation +4 [RTR:145] Azorius Charm +2 [AVR:149] Pillar of Flame +4 [RTR:247] Steam Vents +4 [DKA:52] Thought Scour +3 [M15:51] Dissipate +2 [GTC:245] Sacred Foundry +1 [ISD:146] Harvest Pyre +1 [UNH:136] Plains +1 [UNH:137] Island +4 [ISD:238] Clifftop Retreat +2 [ISD:83] Think Twice +4 [ISD:248] Sulfur Falls +SB: 1 [RTR:201] Supreme Verdict +SB: 1 [RTR:93] Electrickery +SB: 3 [M14:47] Clone +SB: 1 [ISD:236] Witchbane Orb +SB: 2 [RTR:36] Dispel +SB: 3 [RTR:18] Rest in Peace +SB: 2 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jan 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jan 2013.mwDeck.dck new file mode 100644 index 00000000000..9716b7fc776 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jan 2013.mwDeck.dck @@ -0,0 +1,33 @@ +4 [AVR:32] Restoration Angel +3 [C13:30] Augur of Bolas +4 [M13:225] Glacial Fortress +1 [M13:147] Searing Spear +4 [RTR:241] Hallowed Fountain +2 [RTR:153] Counterflux +1 [RTR:172] Izzet Charm +1 [UNH:139] Mountain +4 [ISD:78] Snapcaster Mage +1 [RTR:201] Supreme Verdict +3 [RTR:200] Sphinx's Revelation +4 [RTR:145] Azorius Charm +1 [RTR:101] Mizzium Mortars +2 [ISD:231] Runechanter's Pike +3 [AVR:149] Pillar of Flame +4 [RTR:247] Steam Vents +4 [DKA:52] Thought Scour +1 [M13:65] Rewind +1 [ISD:244] Moorland Haunt +1 [UNH:136] Plains +2 [UNH:137] Island +4 [ISD:238] Clifftop Retreat +1 [ISD:83] Think Twice +4 [ISD:248] Sulfur Falls +SB: 2 [RTR:201] Supreme Verdict +SB: 1 [RTR:155] Detention Sphere +SB: 2 [ISD:27] Purify the Grave +SB: 1 [RTR:36] Dispel +SB: 1 [ISD:29] Rebuke +SB: 1 [M13:22] Oblivion Ring +SB: 3 [M14:60] Jace, Memory Adept +SB: 2 [RTR:173] Izzet Staticaster +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jun 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jun 2013.mwDeck.dck new file mode 100644 index 00000000000..7f2a6b90b60 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Jun 2013.mwDeck.dck @@ -0,0 +1,31 @@ +3 [AVR:32] Restoration Angel +3 [C13:30] Augur of Bolas +1 [RTR:54] Syncopate +4 [M13:225] Glacial Fortress +3 [M13:147] Searing Spear +4 [RTR:241] Hallowed Fountain +3 [ISD:78] Snapcaster Mage +2 [RTR:201] Supreme Verdict +3 [RTR:200] Sphinx's Revelation +4 [RTR:145] Azorius Charm +2 [DGM:5] Renounce the Guilds +1 [AVR:149] Pillar of Flame +1 [AVR:227] Desolate Lighthouse +4 [RTR:247] Steam Vents +1 [DGM:116] Warleader's Helix +3 [M15:51] Dissipate +3 [GTC:245] Sacred Foundry +1 [ISD:244] Moorland Haunt +2 [DGM:134] Turn // Burn +2 [UNH:137] Island +3 [ISD:238] Clifftop Retreat +2 [ISD:83] Think Twice +4 [ISD:248] Sulfur Falls +1 [GTC:142] Assemble the Legion +SB: 1 [RTR:201] Supreme Verdict +SB: 3 [AVR:149] Pillar of Flame +SB: 2 [RTR:36] Dispel +SB: 3 [RTR:18] Rest in Peace +SB: 2 [RTR:173] Izzet Staticaster +SB: 2 [M14:60] Jace, Memory Adept +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Mar 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Mar 2013.mwDeck.dck new file mode 100644 index 00000000000..495275caebf --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWr Midrange TDtB ST Mar 2013.mwDeck.dck @@ -0,0 +1,32 @@ +4 [AVR:32] Restoration Angel +1 [RTR:54] Syncopate +3 [M13:225] Glacial Fortress +2 [M13:147] Searing Spear +4 [RTR:241] Hallowed Fountain +2 [RTR:172] Izzet Charm +4 [ISD:78] Snapcaster Mage +4 [RTR:145] Azorius Charm +3 [RTR:101] Mizzium Mortars +3 [M13:150] Thundermaw Hellkite +2 [AVR:149] Pillar of Flame +1 [AVR:227] Desolate Lighthouse +4 [RTR:247] Steam Vents +4 [DKA:52] Thought Scour +4 [ISD:213] Geist of Saint Traft +1 [M13:75] Unsummon +2 [M15:51] Dissipate +3 [GTC:245] Sacred Foundry +2 [ISD:244] Moorland Haunt +3 [ISD:238] Clifftop Retreat +4 [ISD:248] Sulfur Falls +SB: 1 [RTR:201] Supreme Verdict +SB: 1 [AVR:149] Pillar of Flame +SB: 1 [ISD:231] Runechanter's Pike +SB: 2 [C13:30] Augur of Bolas +SB: 1 [RTR:203] Thoughtflare +SB: 4 [GTC:215] Boros Reckoner +SB: 1 [RTR:36] Dispel +SB: 1 [M13:147] Searing Spear +SB: 1 [RTR:153] Counterflux +SB: 1 [M15:71] Negate +SB: 1 [GTC:142] Assemble the Legion diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Aug 2013.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Aug 2013.mwDeck.dck new file mode 100644 index 00000000000..91871ec82e6 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Aug 2013.mwDeck.dck @@ -0,0 +1,29 @@ +4 [AVR:32] Restoration Angel +3 [C13:30] Augur of Bolas +3 [RTR:54] Syncopate +4 [M13:225] Glacial Fortress +4 [RTR:241] Hallowed Fountain +1 [RTR:172] Izzet Charm +3 [ISD:78] Snapcaster Mage +2 [RTR:201] Supreme Verdict +3 [RTR:145] Azorius Charm +3 [RTR:200] Sphinx's Revelation +3 [AVR:149] Pillar of Flame +4 [RTR:247] Steam Vents +2 [M15:51] Dissipate +2 [DGM:116] Warleader's Helix +4 [GTC:245] Sacred Foundry +2 [ISD:244] Moorland Haunt +1 [DGM:134] Turn // Burn +1 [UNH:137] Island +3 [ISD:238] Clifftop Retreat +4 [ISD:83] Think Twice +4 [ISD:248] Sulfur Falls +SB: 3 [M13:150] Thundermaw Hellkite +SB: 2 [RTR:155] Detention Sphere +SB: 2 [M14:12] Celestial Flare +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [RTR:36] Dispel +SB: 1 [DGM:134] Turn // Burn +SB: 2 [RTR:173] Izzet Staticaster +SB: 3 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..301a37552e7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/UWx Midrange TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,22 @@ +4 [AVR:32] Restoration Angel +4 [C13:30] Augur of Bolas +4 [M13:225] Glacial Fortress +4 [RTR:241] Hallowed Fountain +4 [ISD:78] Snapcaster Mage +3 [RTR:200] Sphinx's Revelation +4 [RTR:145] Azorius Charm +1 [AVR:226] Cavern of Souls +2 [ISD:14] Feeling of Dread +4 [DKA:52] Thought Scour +4 [ISD:213] Geist of Saint Traft +2 [M15:51] Dissipate +4 [M13:75] Unsummon +3 [ISD:244] Moorland Haunt +4 [UNH:136] Plains +8 [UNH:137] Island +1 [ISD:83] Think Twice +SB: 3 [RTR:201] Supreme Verdict +SB: 3 [ISD:27] Purify the Grave +SB: 3 [RTR:36] Dispel +SB: 3 [M13:21] Knight of Glory +SB: 3 [M14:60] Jace, Memory Adept diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Unsolar Flare TDtB ST Jan 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Unsolar Flare TDtB ST Jan 2012.mwDeck.dck new file mode 100644 index 00000000000..1f9e7c97285 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Unsolar Flare TDtB ST Jan 2012.mwDeck.dck @@ -0,0 +1,38 @@ +1 [MBS:21] Consecrated Sphinx +2 [MBS:43] Go for the Throat +1 [SOM:6] Elspeth Tirel +2 [C14:95] White Sun's Zenith +1 [M12:16] Gideon Jura +4 [M13:225] Glacial Fortress +2 [M13:223] Drowned Catacomb +1 [ISD:78] Snapcaster Mage +3 [ISD:55] Forbidden Alchemy +1 [C14:145] Grave Titan +2 [ISD:242] Isolated Chapel +3 [C14:264] Pristine Talisman +1 [NPH:9] Elesh Norn, Grand Cenobite +2 [M14:96] Doom Blade +3 [M15:51] Dissipate +4 [M12:12] Day of Judgment +4 [UNH:136] Plains +4 [UNH:137] Island +1 [UNH:138] Swamp +1 [NPH:130] Batterskull +2 [C14:298] Ghost Quarter +4 [SOM:229] Seachrome Coast +2 [SOM:226] Darkslick Shores +3 [M13:22] Oblivion Ring +3 [ISD:83] Think Twice +3 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [C13:32] Blue Sun's Zenith +SB: 1 [C14:298] Ghost Quarter +SB: 1 [BNG:25] Revoke Existence +SB: 1 [M15:51] Dissipate +SB: 1 [M12:11] Celestial Purge +SB: 1 [M13:22] Oblivion Ring +SB: 1 [C13:249] Nihil Spellbomb +SB: 2 [M12:72] Phantasmal Image +SB: 3 [M12:40] Timely Reinforcements +SB: 1 [M15:71] Negate +SB: 1 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..714c7bd9b14 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,25 @@ +1 [WWK:141] Raging Ravine +2 [CNS:171] Nature's Claim +4 [UNH:140] Forest +2 [M11:149] Lightning Bolt +3 [ZEN:167] Khalni Heart Expedition +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +4 [ZEN:172] Oracle of Mul Daya +3 [C14:315] Terramorphic Expanse +3 [ZEN:184] Summoning Trap +11 [UNH:139] Mountain +3 [C13:114] Inferno Titan +4 [ZEN:228] Valakut, the Molten Pinnacle +1 [C13:135] Avenger of Zendikar +3 [ZEN:229] Verdant Catacombs +4 [M12:190] Rampant Growth +2 [C14:295] Evolving Wilds +4 [WWK:99] Explore +SB: 1 [C13:134] Acidic Slime +SB: 1 [CNS:171] Nature's Claim +SB: 2 [NPH:57] Dismember +SB: 3 [M11:188] Obstinate Baloth +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 4 [M11:154] Pyroclasm +SB: 2 [M11:174] Gaea's Revenge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Dec 2010.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Dec 2010.mwDeck.dck new file mode 100644 index 00000000000..f695f092330 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Dec 2010.mwDeck.dck @@ -0,0 +1,21 @@ +5 [UNH:140] Forest +4 [M11:149] Lightning Bolt +4 [ZEN:167] Khalni Heart Expedition +4 [M12:188] Primeval Titan +2 [ZEN:172] Oracle of Mul Daya +4 [C13:139] Cultivate +3 [C14:315] Terramorphic Expanse +2 [ZEN:184] Summoning Trap +1 [M11:174] Gaea's Revenge +13 [UNH:139] Mountain +4 [ZEN:228] Valakut, the Molten Pinnacle +3 [C13:135] Avenger of Zendikar +4 [C14:199] Harrow +3 [C14:295] Evolving Wilds +4 [WWK:99] Explore +SB: 3 [KTK:142] Naturalize +SB: 2 [KTK:95] Act of Treason +SB: 2 [WWK:87] Ricochet Trap +SB: 3 [M11:188] Obstinate Baloth +SB: 4 [M11:154] Pyroclasm +SB: 1 [M11:174] Gaea's Revenge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Feb 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Feb 2011.mwDeck.dck new file mode 100644 index 00000000000..c804c50e30a --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Feb 2011.mwDeck.dck @@ -0,0 +1,21 @@ +5 [UNH:140] Forest +4 [ZEN:220] Misty Rainforest +4 [ROE:203] Overgrown Battlement +4 [ZEN:167] Khalni Heart Expedition +4 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +4 [C13:139] Cultivate +4 [C14:315] Terramorphic Expanse +11 [UNH:139] Mountain +4 [ZEN:228] Valakut, the Molten Pinnacle +2 [C13:135] Avenger of Zendikar +4 [ZEN:168] Lotus Cobra +3 [C14:199] Harrow +3 [WWK:99] Explore +SB: 1 [C13:134] Acidic Slime +SB: 2 [CNS:171] Nature's Claim +SB: 2 [SOM:218] Tumble Magnet +SB: 1 [M11:188] Obstinate Baloth +SB: 2 [SOM:94] Koth of the Hammer +SB: 3 [MBS:92] Thrun, the Last Troll +SB: 4 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Jul 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Jul 2011.mwDeck.dck new file mode 100644 index 00000000000..6084a8118f2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Jul 2011.mwDeck.dck @@ -0,0 +1,28 @@ +1 [WWK:141] Raging Ravine +5 [UNH:140] Forest +2 [M11:149] Lightning Bolt +3 [ROE:203] Overgrown Battlement +4 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +4 [ZEN:172] Oracle of Mul Daya +4 [C13:139] Cultivate +2 [C14:315] Terramorphic Expanse +1 [ZEN:184] Summoning Trap +10 [UNH:139] Mountain +4 [ZEN:228] Valakut, the Molten Pinnacle +2 [C13:135] Avenger of Zendikar +2 [ZEN:229] Verdant Catacombs +4 [M12:190] Rampant Growth +4 [C14:295] Evolving Wilds +1 [SOM:218] Tumble Magnet +2 [WWK:99] Explore +SB: 3 [SOM:69] Memoricide +SB: 2 [MBS:78] Creeping Corrosion +SB: 1 [M15:169] Back to Nature +SB: 1 [SOM:218] Tumble Magnet +SB: 1 [M11:188] Obstinate Baloth +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 4 [M11:154] Pyroclasm +SB: 1 [UNH:138] Swamp +SB: 1 [M11:174] Gaea's Revenge diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Mar 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Mar 2011.mwDeck.dck new file mode 100644 index 00000000000..4c987ce2b4b --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Mar 2011.mwDeck.dck @@ -0,0 +1,24 @@ +1 [MBS:75] Slagstorm +7 [UNH:140] Forest +4 [ROE:203] Overgrown Battlement +4 [ZEN:167] Khalni Heart Expedition +3 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +2 [ZEN:172] Oracle of Mul Daya +2 [C13:139] Cultivate +3 [M11:154] Pyroclasm +2 [C14:315] Terramorphic Expanse +11 [UNH:139] Mountain +4 [ZEN:228] Valakut, the Molten Pinnacle +2 [C13:135] Avenger of Zendikar +1 [C13:134] Acidic Slime +4 [C14:199] Harrow +2 [C14:295] Evolving Wilds +4 [WWK:99] Explore +SB: 1 [MBS:75] Slagstorm +SB: 2 [M13:141] Mark of Mutiny +SB: 1 [C13:134] Acidic Slime +SB: 2 [CNS:171] Nature's Claim +SB: 3 [M11:188] Obstinate Baloth +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 4 [ZEN:184] Summoning Trap diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST May 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST May 2011.mwDeck.dck new file mode 100644 index 00000000000..6a97ddafb61 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST May 2011.mwDeck.dck @@ -0,0 +1,22 @@ +2 [WWK:141] Raging Ravine +4 [ROE:186] Growth Spasm +4 [CNS:171] Nature's Claim +5 [UNH:140] Forest +4 [ROE:203] Overgrown Battlement +4 [M12:188] Primeval Titan +4 [C13:139] Cultivate +4 [C14:315] Terramorphic Expanse +4 [ZEN:184] Summoning Trap +11 [UNH:139] Mountain +2 [C13:114] Inferno Titan +4 [ZEN:228] Valakut, the Molten Pinnacle +2 [C13:135] Avenger of Zendikar +2 [C14:295] Evolving Wilds +4 [WWK:99] Explore +SB: 2 [MBS:75] Slagstorm +SB: 2 [M12:128] Combust +SB: 3 [WWK:87] Ricochet Trap +SB: 3 [M11:188] Obstinate Baloth +SB: 1 [MBS:81] Green Sun's Zenith +SB: 1 [C14:218] Terastodon +SB: 3 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Sep 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Sep 2011.mwDeck.dck new file mode 100644 index 00000000000..4c8285c283c --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Valakut Ramp TDtB ST Sep 2011.mwDeck.dck @@ -0,0 +1,24 @@ +1 [WWK:141] Raging Ravine +2 [CNS:171] Nature's Claim +4 [UNH:140] Forest +2 [M11:149] Lightning Bolt +3 [ZEN:167] Khalni Heart Expedition +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +4 [ZEN:172] Oracle of Mul Daya +3 [C14:315] Terramorphic Expanse +3 [ZEN:184] Summoning Trap +11 [UNH:139] Mountain +4 [C13:114] Inferno Titan +4 [ZEN:228] Valakut, the Molten Pinnacle +3 [ZEN:229] Verdant Catacombs +4 [M12:190] Rampant Growth +2 [C14:295] Evolving Wilds +4 [WWK:99] Explore +SB: 1 [C13:135] Avenger of Zendikar +SB: 1 [C13:134] Acidic Slime +SB: 2 [CNS:171] Nature's Claim +SB: 2 [NPH:57] Dismember +SB: 3 [M11:188] Obstinate Baloth +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 4 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Vampires Br TDtB ST Aug 2011.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Vampires Br TDtB ST Aug 2011.mwDeck.dck new file mode 100644 index 00000000000..ee4774b5cd7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Vampires Br TDtB ST Aug 2011.mwDeck.dck @@ -0,0 +1,26 @@ +1 [MBS:43] Go for the Throat +3 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +2 [M12:145] Grim Lavamancer +3 [ROE:115] Inquisition of Kozilek +4 [M13:222] Dragonskull Summit +4 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +3 [ZEN:229] Verdant Catacombs +2 [ZEN:219] Marsh Flats +3 [WWK:62] Pulse Tracker +4 [ZEN:115] Vampire Lacerator +3 [NPH:57] Dismember +2 [M14:96] Doom Blade +4 [SOM:224] Blackcleave Cliffs +4 [WWK:59] Kalastria Highborn +6 [UNH:138] Swamp +SB: 4 [M12:151] Manic Vandal +SB: 1 [MBS:43] Go for the Throat +SB: 3 [M11:92] Demon of Death's Gate +SB: 2 [NPH:78] Act of Aggression +SB: 1 [M14:97] Duress +SB: 1 [M12:145] Grim Lavamancer +SB: 1 [KTK:69] Despise +SB: 2 [M12:110] Sorin's Thirst diff --git a/Mage.Client/release/sample-decks/Decks to Beat/WR Humans TDtB ST May 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/WR Humans TDtB ST May 2012.mwDeck.dck new file mode 100644 index 00000000000..4ed9860691e --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/WR Humans TDtB ST May 2012.mwDeck.dck @@ -0,0 +1,23 @@ +3 [C14:88] Silverblade Paladin +2 [C13:11] Fiend Hunter +3 [NPH:161] Sword of War and Peace +3 [M12:156] Stormblood Berserker +1 [AVR:229] Slayers' Stronghold +3 [UNH:139] Mountain +4 [AVR:226] Cavern of Souls +4 [AVR:144] Lightning Mauler +3 [M12:23] Honor of the Pure +12 [UNH:136] Plains +3 [MBS:14] Mirran Crusader +3 [DKA:24] Thalia, Guardian of Thraben +4 [ISD:238] Clifftop Retreat +4 [ISD:6] Champion of the Parish +4 [MBS:8] Hero of Bladehold +2 [DKA:8] Gather the Townsfolk +2 [CNS:69] Doomed Traveler +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [BNG:25] Revoke Existence +SB: 3 [AVR:166] Zealous Conscripts +SB: 3 [M12:11] Celestial Purge +SB: 3 [M13:22] Oblivion Ring +SB: 3 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Weenie White TDtB ST Dec 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Weenie White TDtB ST Dec 2012.mwDeck.dck new file mode 100644 index 00000000000..5c0837c838d --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Weenie White TDtB ST Dec 2012.mwDeck.dck @@ -0,0 +1,23 @@ +4 [M13:38] War Falcon +2 [AVR:33] Riders of Gavony +4 [C14:88] Silverblade Paladin +4 [AVR:83] Wingcrafter +4 [M13:225] Glacial Fortress +4 [ISD:28] Rally the Peasants +4 [RTR:241] Hallowed Fountain +4 [AVR:226] Cavern of Souls +2 [RTR:247] Steam Vents +4 [ISD:213] Geist of Saint Traft +4 [M13:21] Knight of Glory +2 [ISD:244] Moorland Haunt +4 [RTR:17] Precinct Captain +6 [UNH:136] Plains +3 [DKA:24] Thalia, Guardian of Thraben +1 [ISD:238] Clifftop Retreat +4 [ISD:6] Champion of the Parish +SB: 2 [RTR:155] Detention Sphere +SB: 2 [M14:1] Ajani, Caller of the Pride +SB: 3 [RTR:214] Dryad Militant +SB: 3 [AVR:18] Divine Deflection +SB: 4 [ISD:5] Bonds of Faith +SB: 1 [M13:22] Oblivion Ring diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Zombie Pod TDtB ST Jul 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Zombie Pod TDtB ST Jul 2012.mwDeck.dck new file mode 100644 index 00000000000..5dcee4085b9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Zombie Pod TDtB ST Jul 2012.mwDeck.dck @@ -0,0 +1,27 @@ +2 [MBS:43] Go for the Throat +1 [AVR:89] Butcher Ghoul +3 [AVR:86] Blood Artist +4 [M13:222] Dragonskull Summit +3 [NPH:104] Birthing Pod +4 [ISD:97] Diregraf Ghoul +2 [C14:167] Tragic Slip +2 [DKA:138] Falkenrath Aristocrat +3 [AVR:104] Gloom Surgeon +3 [NPH:42] Phyrexian Metamorph +4 [DKA:63] Geralf's Messenger +1 [NPH:68] Phyrexian Obliterator +1 [AVR:166] Zealous Conscripts +2 [SOM:63] Fume Spitter +4 [DKA:64] Gravecrawler +2 [MBS:115] Mortarpod +4 [SOM:224] Blackcleave Cliffs +3 [ISD:249] Woodland Cemetery +12 [UNH:138] Swamp +SB: 1 [M12:151] Manic Vandal +SB: 2 [NPH:74] Surgical Extraction +SB: 2 [NPH:78] Act of Aggression +SB: 2 [AVR:129] Bonfire of the Damned +SB: 1 [NPH:68] Phyrexian Obliterator +SB: 2 [M14:96] Doom Blade +SB: 3 [KTK:69] Despise +SB: 2 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Zombies G TDtB ST Nov 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Zombies G TDtB ST Nov 2012.mwDeck.dck new file mode 100644 index 00000000000..a98c3ed1705 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Zombies G TDtB ST Nov 2012.mwDeck.dck @@ -0,0 +1,21 @@ +4 [RTR:82] Ultimate Price +4 [M13:185] Rancor +4 [RTR:243] Overgrown Tomb +4 [RTR:177] Lotleth Troll +4 [ISD:97] Diregraf Ghoul +3 [AVR:226] Cavern of Souls +4 [DKA:63] Geralf's Messenger +2 [RTR:213] Deathrite Shaman +4 [RTR:158] Dreg Mangler +2 [M13:96] Knight of Infamy +4 [DKA:64] Gravecrawler +2 [C14:161] Sign in Blood +2 [C13:290] Golgari Guildgate +4 [ISD:249] Woodland Cemetery +4 [M15:92] Crippling Blight +9 [UNH:138] Swamp +SB: 4 [C13:97] Vampire Nighthawk +SB: 2 [RTR:213] Deathrite Shaman +SB: 2 [M13:96] Knight of Infamy +SB: 4 [M14:97] Duress +SB: 3 [RTR:164] Golgari Charm diff --git a/Mage.Client/release/sample-decks/Decks to Beat/Zombies TDtB ST Apr 2012.mwDeck.dck b/Mage.Client/release/sample-decks/Decks to Beat/Zombies TDtB ST Apr 2012.mwDeck.dck new file mode 100644 index 00000000000..294284643a2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Decks to Beat/Zombies TDtB ST Apr 2012.mwDeck.dck @@ -0,0 +1,22 @@ +3 [MBS:43] Go for the Throat +4 [M13:223] Drowned Catacomb +4 [DKA:135] Diregraf Captain +2 [NPH:61] Geth's Verdict +4 [ISD:97] Diregraf Ghoul +4 [C14:167] Tragic Slip +4 [DKA:63] Geralf's Messenger +2 [M12:86] Cemetery Reaper +2 [SOM:63] Fume Spitter +4 [DKA:64] Gravecrawler +4 [SOM:226] Darkslick Shores +3 [MBS:115] Mortarpod +4 [DKA:68] Highborn Ghoul +4 [M12:72] Phantasmal Image +12 [UNH:138] Swamp +SB: 2 [NPH:107] Corrosive Gale +SB: 1 [NPH:61] Geth's Verdict +SB: 4 [NPH:74] Surgical Extraction +SB: 3 [M14:215] Ratchet Bomb +SB: 1 [M14:96] Doom Blade +SB: 2 [ISD:96] Dead Weight +SB: 2 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Control 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Control 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..9e68cd03f6f --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Control 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,30 @@ +2 [UNH:140] Forest +4 [JOU:165] Temple of Malady +4 [KTK:248] Windswept Heath +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +2 [M15:241] Caves of Koilos +4 [KTK:200] Siege Rhino +2 [BNG:61] Bile Blight +3 [M15:244] Llanowar Wastes +2 [KTK:210] Utter End +4 [BNG:119] Courser of Kruphix +4 [KTK:241] Sandsteppe Citadel +1 [M15:103] Liliana Vess +2 [DTK:124] Ultimate Price +4 [KTK:161] Abzan Charm +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [KTK:8] End Hostilities +1 [FRF:1] Ugin, the Spirit Dragon +4 [THS:90] Hero's Downfall +2 [FRF:87] Tasigur, the Golden Fang +2 [UNH:136] Plains +3 [THS:9] Elspeth, Sun's Champion +SB: 1 [BNG:61] Bile Blight +SB: 2 [C14:158] Read the Bones +SB: 1 [KTK:9] Erase +SB: 1 [KTK:8] End Hostilities +SB: 3 [THS:193] Fleecemane Lion +SB: 3 [BNG:65] Drown in Sorrow +SB: 2 [M15:187] Nissa, Worldwaker +SB: 2 [DTK:98] Duress diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange 1 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange 1 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..5eb461c2df0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange 1 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,31 @@ +2 [JOU:145] Ajani, Mentor of Heroes +3 [UNH:140] Forest +4 [JOU:165] Temple of Malady +2 [KTK:31] Wingmate Roc +4 [KTK:248] Windswept Heath +1 [THS:227] Temple of Silence +2 [KTK:202] Sorin, Solemn Visitor +4 [THS:107] Thoughtseize +2 [M15:241] Caves of Koilos +4 [KTK:200] Siege Rhino +2 [M15:244] Llanowar Wastes +2 [KTK:210] Utter End +4 [BNG:119] Courser of Kruphix +4 [KTK:241] Sandsteppe Citadel +4 [KTK:161] Abzan Charm +1 [M15:248] Urborg, Tomb of Yawgmoth +3 [THS:90] Hero's Downfall +1 [JOU:163] Mana Confluence +2 [C14:191] Elvish Mystic +2 [UNH:136] Plains +3 [THS:9] Elspeth, Sun's Champion +4 [THS:180] Sylvan Caryatid +SB: 3 [BNG:61] Bile Blight +SB: 1 [KTK:174] Duneblast +SB: 1 [M15:103] Liliana Vess +SB: 2 [KTK:81] Murderous Cut +SB: 1 [KTK:8] End Hostilities +SB: 1 [BNG:143] Unravel the AEther +SB: 3 [BNG:65] Drown in Sorrow +SB: 1 [M15:18] Mass Calcify +SB: 2 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(1) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(1) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..5c98d3a2820 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(1) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,33 @@ +1 [THS:110] Whip of Erebos +2 [UNH:140] Forest +1 [JOU:165] Temple of Malady +4 [KTK:31] Wingmate Roc +4 [KTK:248] Windswept Heath +4 [THS:227] Temple of Silence +2 [KTK:202] Sorin, Solemn Visitor +1 [THS:107] Thoughtseize +4 [KTK:200] Siege Rhino +2 [BNG:61] Bile Blight +4 [M15:244] Llanowar Wastes +1 [KTK:163] Anafenza, the Foremost +4 [BNG:119] Courser of Kruphix +4 [KTK:241] Sandsteppe Citadel +3 [KTK:161] Abzan Charm +1 [M15:248] Urborg, Tomb of Yawgmoth +4 [THS:90] Hero's Downfall +4 [THS:193] Fleecemane Lion +1 [JOU:163] Mana Confluence +1 [BNG:165] Temple of Plenty +1 [BNG:65] Drown in Sorrow +2 [UNH:136] Plains +4 [THS:180] Sylvan Caryatid +1 [UNH:138] Swamp +SB: 1 [KTK:210] Utter End +SB: 1 [KTK:163] Anafenza, the Foremost +SB: 1 [JOU:59] Agent of Erebos +SB: 1 [M15:169] Back to Nature +SB: 1 [KTK:9] Erase +SB: 4 [KTK:8] End Hostilities +SB: 1 [M15:117] Stain the Mind +SB: 3 [THS:107] Thoughtseize +SB: 2 [THS:9] Elspeth, Sun's Champion diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(2) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(2) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..63966c2a499 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Abzan Midrange(2) 34 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,28 @@ +2 [UNH:140] Forest +4 [JOU:165] Temple of Malady +4 [KTK:248] Windswept Heath +1 [THS:227] Temple of Silence +3 [KTK:202] Sorin, Solemn Visitor +4 [THS:107] Thoughtseize +4 [M15:241] Caves of Koilos +2 [KTK:134] Heir of the Wilds +4 [KTK:200] Siege Rhino +2 [M15:244] Llanowar Wastes +3 [KTK:163] Anafenza, the Foremost +4 [KTK:241] Sandsteppe Citadel +3 [KTK:161] Abzan Charm +2 [M15:248] Urborg, Tomb of Yawgmoth +4 [KTK:192] Rakshasa Deathdealer +4 [THS:90] Hero's Downfall +4 [THS:193] Fleecemane Lion +1 [M15:119] Ulcerate +1 [UNH:136] Plains +4 [BNG:75] Herald of Torment +SB: 3 [BNG:61] Bile Blight +SB: 2 [KTK:9] Erase +SB: 1 [THS:110] Whip of Erebos +SB: 1 [JOU:145] Ajani, Mentor of Heroes +SB: 2 [KTK:31] Wingmate Roc +SB: 3 [BNG:65] Drown in Sorrow +SB: 2 [KTK:69] Despise +SB: 1 [JOU:82] Silence the Believers diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(1) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(1) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck new file mode 100644 index 00000000000..914a8d00c13 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(1) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck @@ -0,0 +1,37 @@ +1 [ATQ:88] Atog +2 [MRD:283] Seat of the Synod +3 [MMA:198] Arcbound Ravager +1 [HOP:136] Seat of the Synod +4 [MRD:62] Disciple of the Vault +4 [DST:91] AEther Vial +2 [MRD:286] Vault of Whispers +1 [FNMP:105] Myr Enforcer +1 [DDF:40] Arcbound Worker +3 [HOP:110] Cranial Plating +2 [MRD:86] Atog +1 [MM2:206] Cranial Plating +3 [INV:299] Chromatic Sphere +1 [MRD:151] Chromatic Sphere +2 [DST:163] Blinkmoth Nexus +1 [DST:100] Arcbound Ravager +1 [MMA:220] Blinkmoth Nexus +1 [MM2:64] Thoughtcast +1 [MMA:223] Glimmervoid +3 [MMA:201] Arcbound Worker +4 [C14:299] Great Furnace +1 [C14:255] Myr Retriever +1 [MMA:207] Frogmite +1 [MM2:236] Blinkmoth Nexus +2 [MMA:209] Myr Enforcer +1 [MRD:211] Myr Enforcer +3 [C14:290] Darksteel Citadel +1 [DDF:51] Frogmite +1 [DDF:74] Seat of the Synod +2 [MM2:215] Frogmite +3 [MRD:54] Thoughtcast +2 [HOP:141] Vault of Whispers +SB: 2 [C14:255] Myr Retriever +SB: 1 [MRD:281] Glimmervoid +SB: 4 [5DN:147] Relic Barrier +SB: 1 [MRD:51] Somber Hoverguard +SB: 3 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(2) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(2) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck new file mode 100644 index 00000000000..431d4219fa2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Affinity(2) 58 World Championship 2004 (San Francisco) ST 9-5-04.dck @@ -0,0 +1,37 @@ +4 [MMA:198] Arcbound Ravager +2 [HOP:136] Seat of the Synod +1 [DDM:68] Night's Whisper +1 [MM2:57] Somber Hoverguard +2 [5DN:55] Night's Whisper +4 [MRD:62] Disciple of the Vault +1 [MRD:286] Vault of Whispers +1 [ME4:243] City of Brass +1 [DDF:40] Arcbound Worker +2 [HOP:110] Cranial Plating +1 [MM2:206] Cranial Plating +2 [7ED:327] City of Brass +1 [MRD:172] Frogmite +2 [INV:299] Chromatic Sphere +2 [GPX:3] Chrome Mox +1 [MRD:151] Chromatic Sphere +1 [MRD:152] Chrome Mox +1 [5DN:113] Cranial Plating +1 [DST:163] Blinkmoth Nexus +3 [M15:161] Shrapnel Blast +1 [MMA:220] Blinkmoth Nexus +1 [MMA:221] City of Brass +1 [MM2:64] Thoughtcast +3 [MMA:201] Arcbound Worker +2 [C14:299] Great Furnace +3 [MMA:207] Frogmite +3 [MRD:51] Somber Hoverguard +1 [MM2:236] Blinkmoth Nexus +2 [DDF:74] Seat of the Synod +1 [MRD:54] Thoughtcast +3 [HOP:141] Vault of Whispers +2 [DDF:71] Thoughtcast +3 [M12:63] Mana Leak +SB: 2 [10E:182] Terror +SB: 4 [THS:38] Annul +SB: 4 [M11:154] Pyroclasm +SB: 3 [DST:69] Slobad, Goblin Tinkerer diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 1 World Championship 2004 (San Francisco) ST 9-5-04.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 1 World Championship 2004 (San Francisco) ST 9-5-04.dck new file mode 100644 index 00000000000..96997d1ec60 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 1 World Championship 2004 (San Francisco) ST 9-5-04.dck @@ -0,0 +1,27 @@ +4 [C13:10] Eternal Dragon +2 [C14:97] Wing Shards +1 [UDS:117] Plow Under +4 [CMD:152] Eternal Witness +7 [UNH:140] Forest +2 [CMD:3] Akroma's Vengeance +1 [FNMP:76] Astral Slide +4 [KTK:248] Windswept Heath +4 [C14:316] Tranquil Thicket +4 [C13:27] Wrath of God +2 [ONS:50] Renewed Faith +4 [C14:310] Secluded Steppe +3 [VMA:13] Astral Slide +4 [M12:190] Rampant Growth +4 [10E:308] Viridian Shaman +2 [VMA:42] Renewed Faith +2 [C14:70] Decree of Justice +6 [UNH:136] Plains +SB: 2 [DST:79] Oxidize +SB: 1 [5DN:92] Rude Awakening +SB: 2 [UDS:117] Plow Under +SB: 2 [MPRP:7] Oxidize +SB: 2 [5ED:296] Circle of Protection: Red +SB: 1 [MMA:160] Rude Awakening +SB: 1 [9ED:11] Circle of Protection: Red +SB: 1 [8ED:272] Plow Under +SB: 3 [MRD:237] Scrabbling Claws diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 58 World Championship 2004 (San Francisco) ST 9-5-04.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 58 World Championship 2004 (San Francisco) ST 9-5-04.dck new file mode 100644 index 00000000000..31dc11bd2c3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Astral Slide 58 World Championship 2004 (San Francisco) ST 9-5-04.dck @@ -0,0 +1,31 @@ +1 [INV:327] Shivan Oasis +4 [C13:10] Eternal Dragon +4 [CMD:152] Eternal Witness +1 [ONS:4] Astral Slide +5 [UNH:140] Forest +2 [FNMP:76] Astral Slide +1 [KTK:249] Wooded Foothills +2 [C13:119] Slice and Dice +4 [C14:316] Tranquil Thicket +4 [C13:27] Wrath of God +1 [UNH:139] Mountain +1 [ONS:50] Renewed Faith +4 [C14:310] Secluded Steppe +1 [VMA:13] Astral Slide +3 [C13:154] Krosan Tusker +3 [VMA:178] Lightning Rift +2 [10E:308] Viridian Shaman +3 [VMA:42] Renewed Faith +4 [C14:271] Solemn Simulacrum +1 [DDE:65] Shivan Oasis +1 [8ED:326] Shivan Oasis +8 [UNH:136] Plains +SB: 1 [DST:79] Oxidize +SB: 2 [UDS:117] Plow Under +SB: 2 [MPRP:7] Oxidize +SB: 1 [LEG:237] Relic Barrier +SB: 2 [5DN:147] Relic Barrier +SB: 2 [SCG:23] Silver Knight +SB: 2 [DST:146] Sundering Titan +SB: 2 [8ED:272] Plow Under +SB: 1 [FNMP:46] Silver Knight diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/BGW Angels 58 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/BGW Angels 58 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..6ffd8e665a5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/BGW Angels 58 PT San Diego ST 2-21-10.dck @@ -0,0 +1,31 @@ +2 [C14:77] Marshal's Anthem +1 [MM2:151] Noble Hierarch +3 [WWK:144] Stirring Wildwood +1 [M13:229] Sunpetal Grove +1 [WWK:142] Sejiri Steppe +4 [UNH:140] Forest +4 [M11:7] Baneslayer Angel +4 [CMD:25] Path to Exile +1 [MMA:178] Knight of the Reliquary +4 [ZEN:229] Verdant Catacombs +4 [ZEN:168] Lotus Cobra +2 [DDG:1] Knight of the Reliquary +2 [AVR:169] Borderland Ranger +4 [UNH:136] Plains +2 [ALA:9] Elspeth, Knight-Errant +2 [UNH:138] Swamp +1 [CON:113] Knight of the Reliquary +1 [JR:66] Noble Hierarch +1 [CON:95] Thornling +1 [C14:313] Tectonic Edge +4 [ARB:92] Maelstrom Pulse +4 [ZEN:219] Marsh Flats +1 [M10:191] Master of the Wild Hunt +2 [CON:87] Noble Hierarch +4 [ZEN:11] Emeria Angel +SB: 3 [ARB:81] Identity Crisis +SB: 1 [C14:77] Marshal's Anthem +SB: 4 [ZEN:25] Luminarch Ascension +SB: 4 [M12:11] Celestial Purge +SB: 1 [CON:95] Thornling +SB: 2 [ZEN:39] World Queller diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bant 58 World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bant 58 World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..61de3d15032 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bant 58 World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,31 @@ +4 [ALA:198] Steward of Valeron +1 [CON:113] Knight of the Reliquary +4 [ALA:188] Rhox War Monk +4 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +2 [M11:1] Ajani Goldmane +4 [ZEN:220] Misty Rainforest +4 [M11:7] Baneslayer Angel +4 [CMD:25] Path to Exile +3 [C13:318] Seaside Citadel +1 [M13:8] Captain of the Watch +1 [ZEN:211] Arid Mesa +2 [M12:165] Birds of Paradise +1 [ZEN:216] Kabira Crossroads +1 [MMA:178] Knight of the Reliquary +1 [ZEN:229] Verdant Catacombs +2 [ZEN:219] Marsh Flats +4 [CON:87] Noble Hierarch +2 [DDG:1] Knight of the Reliquary +4 [ZEN:11] Emeria Angel +1 [AVR:169] Borderland Ranger +3 [M12:23] Honor of the Pure +2 [UNH:136] Plains +1 [UNH:137] Island +SB: 3 [C14:66] Brave the Elements +SB: 3 [ZEN:25] Luminarch Ascension +SB: 1 [C14:297] Gargoyle Castle +SB: 1 [M13:8] Captain of the Watch +SB: 1 [AVR:169] Borderland Ranger +SB: 2 [ZEN:39] World Queller +SB: 4 [ARB:69] Grizzled Leotau diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Black Kessig 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Black Kessig 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..e44f222a050 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Black Kessig 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,32 @@ +1 [MBS:43] Go for the Throat +6 [UNH:140] Forest +1 [MBS:96] Glissa, the Traitor +2 [MBS:81] Green Sun's Zenith +1 [M13:222] Dragonskull Summit +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +1 [UNH:139] Mountain +3 [C14:136] Black Sun's Zenith +2 [C13:134] Acidic Slime +4 [C14:145] Grave Titan +1 [C14:298] Ghost Quarter +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +2 [M14:215] Ratchet Bomb +2 [C14:295] Evolving Wilds +4 [MBS:145] Inkmoth Nexus +4 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +3 [M14:96] Doom Blade +4 [ISD:249] Woodland Cemetery +4 [UNH:138] Swamp +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 1 [C14:136] Black Sun's Zenith +SB: 1 [MBS:94] Viridian Corrupter +SB: 2 [NPH:130] Batterskull +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 1 [ISD:207] Tree of Redemption +SB: 2 [C13:249] Nihil Spellbomb +SB: 2 [ISD:94] Curse of Death's Hold +SB: 2 [ISD:127] Ancient Grudge +SB: 1 [ISD:105] Liliana of the Veil diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros 34 World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros 34 World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..78e52189407 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros 34 World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,25 @@ +4 [ALA:21] Ranger of Eos +3 [M12:15] Elite Vanguard +4 [M11:149] Lightning Bolt +4 [CMD:25] Path to Exile +4 [ZEN:211] Arid Mesa +4 [ZEN:141] Plated Geopede +4 [UNH:139] Mountain +3 [ZEN:23] Kor Skyfisher +4 [ZEN:36] Steppe Lynx +2 [ZEN:119] Burst Lightning +4 [ZEN:219] Marsh Flats +4 [ZEN:223] Scalding Tarn +2 [ZEN:125] Goblin Bushwhacker +4 [ZEN:126] Goblin Guide +2 [ZEN:226] Teetering Peaks +6 [UNH:136] Plains +2 [ALA:9] Elspeth, Knight-Errant +SB: 3 [M12:150] Manabarbs +SB: 1 [ZEN:119] Burst Lightning +SB: 2 [CMD:17] Journey to Nowhere +SB: 2 [M11:7] Baneslayer Angel +SB: 1 [M12:11] Celestial Purge +SB: 2 [M13:22] Oblivion Ring +SB: 3 [M10:14] Harm's Way +SB: 1 [ALA:9] Elspeth, Knight-Errant diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 2 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 2 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..11d07714d3a --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 2 PT Paris ST 2-13-11.dck @@ -0,0 +1,28 @@ +2 [MBS:66] Hero of Oxid Ridge +3 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +2 [ZEN:195] Adventuring Gear +4 [ZEN:141] Plated Geopede +5 [UNH:139] Mountain +4 [ZEN:36] Steppe Lynx +4 [ZEN:219] Marsh Flats +4 [ZEN:223] Scalding Tarn +2 [CMD:17] Journey to Nowhere +1 [MBS:138] Sword of Feast and Famine +4 [ZEN:126] Goblin Guide +1 [SOM:208] Sword of Body and Mind +1 [ZEN:226] Teetering Peaks +3 [C14:295] Evolving Wilds +4 [M11:33] Squadron Hawk +1 [SOM:94] Koth of the Hammer +1 [SOM:104] Spikeshot Elder +3 [WWK:20] Stoneforge Mystic +5 [UNH:136] Plains +2 [MBS:14] Mirran Crusader +SB: 1 [M13:141] Mark of Mutiny +SB: 1 [WWK:122] Basilisk Collar +SB: 3 [WWK:11] Kor Firewalker +SB: 1 [SOM:94] Koth of the Hammer +SB: 4 [SOM:81] Arc Trail +SB: 1 [MBS:14] Mirran Crusader +SB: 4 [WWK:79] Cunning Sparkmage diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 34 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 34 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..c2318660699 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boros Landfall 34 PT Paris ST 2-13-11.dck @@ -0,0 +1,27 @@ +2 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +1 [C14:229] Bonehoard +2 [C14:315] Terramorphic Expanse +2 [ZEN:195] Adventuring Gear +3 [ZEN:141] Plated Geopede +3 [UNH:139] Mountain +4 [ZEN:36] Steppe Lynx +4 [ZEN:219] Marsh Flats +4 [ZEN:223] Scalding Tarn +3 [CMD:17] Journey to Nowhere +4 [ZEN:126] Goblin Guide +1 [SOM:208] Sword of Body and Mind +2 [ZEN:226] Teetering Peaks +4 [M11:33] Squadron Hawk +1 [SOM:94] Koth of the Hammer +4 [WWK:20] Stoneforge Mystic +2 [SOM:81] Arc Trail +6 [UNH:136] Plains +4 [MBS:14] Mirran Crusader +SB: 2 [M13:141] Mark of Mutiny +SB: 3 [ZEN:25] Luminarch Ascension +SB: 1 [CMD:17] Journey to Nowhere +SB: 1 [MBS:138] Sword of Feast and Famine +SB: 4 [WWK:11] Kor Firewalker +SB: 2 [SOM:94] Koth of the Hammer +SB: 2 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boss Naya 34 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boss Naya 34 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..6005b7cf266 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Boss Naya 34 PT San Diego ST 2-21-10.dck @@ -0,0 +1,37 @@ +1 [WWK:141] Raging Ravine +2 [MM2:151] Noble Hierarch +4 [ALA:21] Ranger of Eos +2 [WWK:144] Stirring Wildwood +1 [WWK:122] Basilisk Collar +1 [M13:228] Rootbound Crag +1 [WWK:142] Sejiri Steppe +5 [UNH:140] Forest +3 [M11:149] Lightning Bolt +3 [ZEN:220] Misty Rainforest +1 [CMD:25] Path to Exile +1 [ZEN:182] Scute Mob +2 [UNH:139] Mountain +1 [C13:178] Behemoth Sledge +1 [DDG:1] Knight of the Reliquary +2 [WWK:20] Stoneforge Mystic +2 [UNH:136] Plains +1 [ALA:9] Elspeth, Knight-Errant +4 [ALA:152] Wild Nacatl +2 [ALA:154] Ajani Vengeant +3 [CON:113] Knight of the Reliquary +2 [JR:66] Noble Hierarch +4 [ZEN:211] Arid Mesa +2 [M12:165] Birds of Paradise +2 [C14:315] Terramorphic Expanse +1 [C14:313] Tectonic Edge +4 [ARB:50] Bloodbraid Elf +2 [M13:22] Oblivion Ring +SB: 2 [M12:150] Manabarbs +SB: 1 [C13:178] Behemoth Sledge +SB: 1 [WWK:122] Basilisk Collar +SB: 1 [ZEN:126] Goblin Guide +SB: 2 [ARB:67] Dauntless Escort +SB: 2 [M11:7] Baneslayer Angel +SB: 1 [M13:22] Oblivion Ring +SB: 1 [WWK:20] Stoneforge Mystic +SB: 4 [WWK:79] Cunning Sparkmage diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Br Vampires 58 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Br Vampires 58 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..47947370be7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Br Vampires 58 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,22 @@ +3 [C13:99] Viscera Seer +4 [M11:149] Lightning Bolt +4 [ZEN:83] Bloodghast +4 [M13:222] Dragonskull Summit +3 [WWK:139] Lavaclaw Reaches +4 [ZEN:89] Gatekeeper of Malakir +3 [M11:90] Dark Tutelage +2 [C14:168] Vampire Hexmage +2 [ZEN:119] Burst Lightning +4 [ZEN:219] Marsh Flats +4 [WWK:62] Pulse Tracker +4 [ZEN:115] Vampire Lacerator +4 [SOM:224] Blackcleave Cliffs +3 [SOM:81] Arc Trail +4 [WWK:59] Kalastria Highborn +8 [UNH:138] Swamp +SB: 4 [M11:92] Demon of Death's Gate +SB: 4 [SOM:78] Skinrender +SB: 2 [C13:97] Vampire Nighthawk +SB: 1 [ZEN:88] Feast of Blood +SB: 3 [M14:97] Duress +SB: 1 [ROE:214] Sarkhan the Mad diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bug Critical 58 World Championship 2005 (Yokohama) ST 12-4-05.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bug Critical 58 World Championship 2005 (Yokohama) ST 12-4-05.dck new file mode 100644 index 00000000000..c8a29d90766 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Bug Critical 58 World Championship 2005 (Yokohama) ST 12-4-05.dck @@ -0,0 +1,26 @@ +1 [CHK:279] Minamo, School at Water's Edge +4 [RAV:201] Dimir Cutpurse +4 [UNH:140] Forest +4 [GTC:249] Watery Grave +1 [CHK:280] Okina, Temple to the Grandfathers +4 [M10:100] Hypnotic Specter +3 [BOK:163] Umezawa's Jitte +4 [RAV:161] Elves of Deep Shadow +4 [M12:165] Birds of Paradise +2 [CHK:74] Meloku the Clouded Mirror +4 [RTR:243] Overgrown Tomb +4 [M15:249] Yavimaya Coast +3 [CHK:65] Hinder +3 [BOK:56] Threads of Disloyalty +4 [BOK:44] Ninja of the Deep Hours +3 [DGM:93] Putrefy +1 [UNH:136] Plains +1 [SOK:164] Oboro, Palace in the Clouds +2 [UNH:137] Island +4 [M12:63] Mana Leak +SB: 2 [CMD:163] Kodama's Reach +SB: 4 [RAV:214] Loxodon Hierarch +SB: 1 [9ED:11] Circle of Protection: Red +SB: 1 [8ED:13] Circle of Protection: Red +SB: 3 [RAV:16] Faith's Fetters +SB: 4 [CNS:177] Sakura-Tribe Elder diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Critical Mass 58 World Championship 2005 (Yokohama) ST 12-4-05.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Critical Mass 58 World Championship 2005 (Yokohama) ST 12-4-05.dck new file mode 100644 index 00000000000..f7ebc9d56dc --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Critical Mass 58 World Championship 2005 (Yokohama) ST 12-4-05.dck @@ -0,0 +1,24 @@ +1 [CHK:279] Minamo, School at Water's Edge +3 [CHK:268] Sensei's Divining Top +1 [SOK:163] Miren, the Moaning Well +4 [CHK:222] Kodama of the North Tree +5 [UNH:140] Forest +4 [BOK:165] Tendo Ice Bridge +1 [CHK:280] Okina, Temple to the Grandfathers +4 [BOK:163] Umezawa's Jitte +4 [C14:204] Llanowar Elves +4 [CNS:177] Sakura-Tribe Elder +4 [C14:226] Wood Elves +4 [CHK:74] Meloku the Clouded Mirror +1 [RTR:243] Overgrown Tomb +3 [CHK:72] Keiga, the Tide Star +4 [M15:249] Yavimaya Coast +4 [CHK:65] Hinder +1 [SOK:164] Oboro, Palace in the Clouds +5 [UNH:137] Island +3 [M12:63] Mana Leak +SB: 3 [KTK:142] Naturalize +SB: 4 [BOK:56] Threads of Disloyalty +SB: 3 [CHK:70] Jushi Apprentice +SB: 3 [CHK:105] Cranial Extraction +SB: 2 [SOK:121] Arashi, the Sky Asunder diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dark Exalted 34 PT Kyoto ST 3-1-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dark Exalted 34 PT Kyoto ST 3-1-09.dck new file mode 100644 index 00000000000..ade6c6d193f --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dark Exalted 34 PT Kyoto ST 3-1-09.dck @@ -0,0 +1,32 @@ +3 [ALA:185] Rafiq of the Many +1 [MM2:151] Noble Hierarch +4 [ALA:188] Rhox War Monk +2 [UNH:140] Forest +4 [ALA:202] Tidehollow Sculler +2 [CMD:25] Path to Exile +3 [10E:361] Treetop Village +2 [10E:349] Brushland +1 [C14:247] Loxodon Warhammer +1 [M15:244] Llanowar Wastes +1 [10E:347] Adarkar Wastes +2 [M15:249] Yavimaya Coast +4 [LRW:247] Doran, the Siege Tower +3 [LRW:248] Gaddock Teeg +3 [LRW:128] Nameless Inversion +1 [UNH:136] Plains +2 [SHM:229] Kitchen Finks +2 [CON:141] Ancient Ziggurat +1 [UNH:138] Swamp +4 [MOR:147] Murmuring Bosk +4 [SHM:245] Wilt-Leaf Liege +1 [JR:66] Noble Hierarch +4 [M12:165] Birds of Paradise +1 [M15:241] Caves of Koilos +2 [CON:87] Noble Hierarch +2 [FNMP:118] Ancient Ziggurat +SB: 2 [10E:182] Terror +SB: 2 [CMD:25] Path to Exile +SB: 2 [ALA:218] Relic of Progenitus +SB: 4 [CON:90] Scattershot Archer +SB: 2 [SHM:229] Kitchen Finks +SB: 3 [SHM:208] Guttural Response diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Black 58 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Black 58 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..f2523f433eb --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Black 58 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,21 @@ +1 [THS:223] Nykthos, Shrine to Nyx +4 [RTR:83] Underworld Connections +2 [THS:110] Whip of Erebos +2 [RTR:73] Pack Rat +4 [RTR:63] Desecration Demon +4 [THS:227] Temple of Silence +4 [THS:107] Thoughtseize +4 [C14:146] Gray Merchant of Asphodel +4 [M14:101] Lifebane Zombie +4 [THS:90] Hero's Downfall +4 [M14:228] Mutavault +4 [M14:96] Doom Blade +2 [GTC:63] Devour Flesh +1 [THS:85] Erebos, God of the Dead +16 [UNH:138] Swamp +SB: 4 [M14:123] Xathrid Necromancer +SB: 1 [RTR:231] Pithing Needle +SB: 4 [THS:100] Pharika's Cure +SB: 4 [M14:97] Duress +SB: 1 [GTC:63] Devour Flesh +SB: 1 [THS:85] Erebos, God of the Dead diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 1 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 1 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..99901edebbb --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 1 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,22 @@ +2 [THS:57] Omenspeaker +2 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +3 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [M14:51] Disperse +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +2 [RTR:44] Jace, Architect of Thought +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +1 [THS:42] Bident of Thassa +21 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [RTR:231] Pithing Needle +SB: 2 [DGM:11] AEtherling +SB: 2 [M14:215] Ratchet Bomb +SB: 1 [THS:71] Triton Tactics +SB: 3 [M15:83] Wall of Frost +SB: 1 [M14:228] Mutavault +SB: 2 [RTR:44] Jace, Architect of Thought +SB: 3 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 2 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 2 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..f4eab2cbb21 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 2 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,22 @@ +2 [THS:57] Omenspeaker +2 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +3 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +1 [GTC:44] Rapid Hybridization +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +1 [RTR:44] Jace, Architect of Thought +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +2 [THS:42] Bident of Thassa +21 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [RTR:231] Pithing Needle +SB: 2 [M14:215] Ratchet Bomb +SB: 3 [M15:83] Wall of Frost +SB: 1 [THS:71] Triton Tactics +SB: 1 [M14:228] Mutavault +SB: 3 [RTR:44] Jace, Architect of Thought +SB: 1 [M14:60] Jace, Memory Adept +SB: 3 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 34 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 34 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..d9c3c4c10c0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Blue 34 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,21 @@ +1 [THS:223] Nykthos, Shrine to Nyx +1 [THS:57] Omenspeaker +2 [C14:104] Cyclonic Rift +4 [RTR:215] Frostburn Weird +4 [M14:228] Mutavault +4 [M14:73] Tidebinder Mage +4 [GTC:32] Cloudfin Raptor +4 [RTR:218] Judge's Familiar +1 [RTR:44] Jace, Architect of Thought +4 [GTC:222] Nightveil Specter +4 [THS:53] Master of Waves +3 [THS:42] Bident of Thassa +20 [UNH:137] Island +4 [THS:66] Thassa, God of the Sea +SB: 1 [THS:57] Omenspeaker +SB: 1 [THS:47] Dissolve +SB: 3 [THS:49] Gainsay +SB: 2 [DGM:11] AEtherling +SB: 3 [GTC:44] Rapid Hybridization +SB: 3 [RTR:44] Jace, Architect of Thought +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Green 34 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Green 34 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..53681412e85 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Green 34 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,25 @@ +4 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +9 [UNH:140] Forest +2 [THS:166] Nylea, God of the Hunt +4 [GTC:216] Burning-Tree Emissary +2 [THS:209] Xenagos, the Reveler +4 [M14:172] Garruk, Caller of Beasts +3 [M14:195] Scavenging Ooze +2 [UNH:139] Mountain +4 [GTC:247] Stomping Ground +4 [THS:182] Voyaging Satyr +3 [THS:150] Arbor Colossus +4 [THS:172] Polukranos, World Eater +3 [GTC:156] Domri Rade +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 2 [M15:134] Chandra, Pyromaster +SB: 3 [RTR:101] Mizzium Mortars +SB: 2 [GTC:139] Wasteland Viper +SB: 2 [THS:167] Nylea's Disciple +SB: 1 [THS:209] Xenagos, the Reveler +SB: 1 [GTC:136] Sylvan Primordial +SB: 1 [THS:162] Mistcutter Hydra +SB: 2 [M14:130] Burning Earth +SB: 1 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..c5d8e22bb08 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,21 @@ +3 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +10 [UNH:140] Forest +2 [KTK:248] Windswept Heath +4 [KTK:149] See the Unwritten +4 [KTK:249] Wooded Foothills +4 [FRF:145] Whisperwood Elemental +1 [UNH:139] Mountain +4 [DTK:216] Dragonlord Atarka +4 [KTK:144] Rattleclaw Mystic +4 [BNG:119] Courser of Kruphix +4 [THS:172] Polukranos, World Eater +2 [DTK:210] Surrak, the Hunt Caller +2 [THS:152] Boon Satyr +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 4 [THS:167] Nylea's Disciple +SB: 3 [THS:209] Xenagos, the Reveler +SB: 1 [THS:182] Voyaging Satyr +SB: 3 [THS:150] Arbor Colossus +SB: 4 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..546ee6069a5 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Gruul 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,25 @@ +4 [THS:223] Nykthos, Shrine to Nyx +4 [THS:224] Temple of Abandon +10 [UNH:140] Forest +2 [THS:209] Xenagos, the Reveler +4 [KTK:249] Wooded Foothills +4 [M15:176] Genesis Hydra +4 [FRF:145] Whisperwood Elemental +1 [UNH:139] Mountain +3 [DTK:216] Dragonlord Atarka +1 [M15:178] Hornet Queen +4 [BNG:119] Courser of Kruphix +2 [DTK:204] Shaman of Forgotten Ways +4 [THS:182] Voyaging Satyr +1 [THS:150] Arbor Colossus +4 [THS:172] Polukranos, World Eater +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 1 [M15:177] Hornet Nest +SB: 2 [C14:213] Reclamation Sage +SB: 1 [FRF:1] Ugin, the Spirit Dragon +SB: 4 [THS:167] Nylea's Disciple +SB: 2 [THS:209] Xenagos, the Reveler +SB: 1 [THS:150] Arbor Colossus +SB: 1 [DTK:156] Seismic Rupture +SB: 3 [M15:187] Nissa, Worldwaker diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Red 58 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Red 58 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..51049877a70 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Devotion to Red 58 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,21 @@ +4 [THS:223] Nykthos, Shrine to Nyx +3 [THS:135] Purphoros, God of the Forge +2 [THS:124] Hammer of Purphoros +3 [THS:120] Ember Swallower +4 [RTR:86] Ash Zealot +4 [THS:143] Stormbreath Dragon +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [THS:128] Magma Jet +21 [UNH:139] Mountain +1 [M15:134] Chandra, Pyromaster +1 [RTR:101] Mizzium Mortars +4 [RTR:215] Frostburn Weird +1 [M14:228] Mutavault +SB: 1 [THS:124] Hammer of Purphoros +SB: 1 [M15:134] Chandra, Pyromaster +SB: 3 [RTR:101] Mizzium Mortars +SB: 2 [M14:134] Chandra's Phoenix +SB: 3 [THS:132] Peak Eruption +SB: 3 [THS:112] Anger of the Gods +SB: 2 [M14:130] Burning Earth diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran 58 PT Hollywood ST 5-25-08.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran 58 PT Hollywood ST 5-25-08.dck new file mode 100644 index 00000000000..ce7adcc13cf --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran 58 PT Hollywood ST 5-25-08.dck @@ -0,0 +1,28 @@ +4 [MOR:147] Murmuring Bosk +3 [MOR:116] Chameleon Colossus +3 [FUT:78] Slaughter Pact +3 [FUT:136] Riftsweeper +4 [10E:361] Treetop Village +1 [FUT:177] Horizon Canopy +1 [TSB:120] Pendelhaven +4 [M12:165] Birds of Paradise +4 [FUT:153] Tarmogoyf +4 [THS:107] Thoughtseize +2 [CNS:210] Reflecting Pool +2 [SHM:281] Wooded Bastion +2 [C14:204] Llanowar Elves +1 [10E:349] Brushland +3 [M15:244] Llanowar Wastes +3 [C14:156] Profane Command +1 [M15:248] Urborg, Tomb of Yawgmoth +4 [LRW:247] Doran, the Siege Tower +3 [LRW:128] Nameless Inversion +4 [SHM:229] Kitchen Finks +4 [LRW:268] Gilt-Leaf Palace +SB: 3 [LRW:48] Wispmare +SB: 2 [MOR:58] Bitterblossom +SB: 3 [M10:106] Mind Shatter +SB: 1 [C14:160] Shriekmaw +SB: 3 [M13:22] Oblivion Ring +SB: 2 [LRW:233] Primal Command +SB: 1 [SHM:192] Murderous Redcap diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran Rock 1 World Championship 2007 (New York) ST 12-6-07.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran Rock 1 World Championship 2007 (New York) ST 12-6-07.dck new file mode 100644 index 00000000000..2d885c39fed --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Doran Rock 1 World Championship 2007 (New York) ST 12-6-07.dck @@ -0,0 +1,32 @@ +2 [LRW:110] Eyeblight's Ending +1 [UNH:140] Forest +3 [CMD:157] Garruk Wildspeaker +4 [10E:361] Treetop Village +1 [FUT:177] Horizon Canopy +1 [TSB:120] Pendelhaven +1 [M10:100] Hypnotic Specter +4 [M12:165] Birds of Paradise +4 [FUT:153] Tarmogoyf +4 [THS:107] Thoughtseize +3 [M15:241] Caves of Koilos +3 [C14:204] Llanowar Elves +1 [10E:349] Brushland +2 [TSB:119] Gemstone Mine +4 [M15:244] Llanowar Wastes +4 [DDM:57] Ohran Viper +1 [M15:103] Liliana Vess +2 [C14:156] Profane Command +2 [M15:248] Urborg, Tomb of Yawgmoth +4 [LRW:247] Doran, the Siege Tower +3 [C14:160] Shriekmaw +2 [LRW:128] Nameless Inversion +4 [LRW:268] Gilt-Leaf Palace +SB: 2 [C14:247] Loxodon Warhammer +SB: 2 [LRW:250] Nath of the Gilt-Leaf +SB: 1 [HML:135] Serrated Arrows +SB: 2 [TSB:48] Stupor +SB: 1 [TSB:114] Serrated Arrows +SB: 3 [FUT:136] Riftsweeper +SB: 1 [C14:160] Shriekmaw +SB: 1 [M13:22] Oblivion Ring +SB: 2 [LRW:202] Cloudthresher diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dragonstorm 1 World Championship 2006 (Paris) ST 12-3-06.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dragonstorm 1 World Championship 2006 (Paris) ST 12-3-06.dck new file mode 100644 index 00000000000..002549392a0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Dragonstorm 1 World Championship 2006 (Paris) ST 12-3-06.dck @@ -0,0 +1,28 @@ +2 [RAV:131] Hunted Dragon +4 [GPT:26] Gigadrowse +1 [CMD:271] Dreadship Reef +4 [RAV:63] Remand +4 [TSP:259] Lotus Bloom +4 [CSP:96] Rite of Flame +1 [ARC:46] Seething Song +4 [10E:114] Telling Time +4 [UNH:139] Mountain +1 [7ED:98] Sleight of Hand +4 [M15:246] Shivan Reef +4 [RTR:247] Steam Vents +1 [TSP:270] Calciform Pools +4 [C14:173] Bogardan Hellkite +1 [PO2:46] Sleight of Hand +2 [TSB:60] Dragonstorm +2 [9ED:99] Sleight of Hand +8 [UNH:137] Island +3 [DDG:70] Seething Song +2 [SCG:90] Dragonstorm +SB: 2 [CMD:271] Dreadship Reef +SB: 1 [MM2:56] Repeal +SB: 1 [GPT:32] Repeal +SB: 1 [TSP:270] Calciform Pools +SB: 2 [DDN:72] Repeal +SB: 1 [TSP:88] Trickbind +SB: 1 [TSP:83] Teferi, Mage of Zhalfir +SB: 3 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Eldrazi Green 34 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Eldrazi Green 34 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..5bb8ba1fbcc --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Eldrazi Green 34 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,24 @@ +2 [ROE:12] Ulamog, the Infinite Gyre +4 [ROE:186] Growth Spasm +12 [UNH:140] Forest +4 [ROE:190] Joraga Treespeaker +1 [M11:226] Mystifying Maze +4 [ROE:227] Eldrazi Temple +1 [ROE:4] Emrakul, the Aeons Torn +1 [WWK:136] Eye of Ugin +4 [ROE:203] Overgrown Battlement +1 [C14:218] Terastodon +4 [M12:188] Primeval Titan +3 [C14:239] Everflowing Chalice +1 [C13:139] Cultivate +4 [ZEN:184] Summoning Trap +4 [C13:302] Khalni Garden +4 [C14:313] Tectonic Edge +1 [C13:135] Avenger of Zendikar +1 [C14:283] Wurmcoil Engine +4 [WWK:99] Explore +SB: 4 [C13:134] Acidic Slime +SB: 4 [M14:215] Ratchet Bomb +SB: 3 [M11:188] Obstinate Baloth +SB: 1 [WWK:136] Eye of Ugin +SB: 3 [ZEN:172] Oracle of Mul Daya diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(1) 58 World Championship 2007 (New York) ST 12-6-07.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(1) 58 World Championship 2007 (New York) ST 12-6-07.dck new file mode 100644 index 00000000000..2979e4b1be7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(1) 58 World Championship 2007 (New York) ST 12-6-07.dck @@ -0,0 +1,30 @@ +2 [LRW:110] Eyeblight's Ending +5 [UNH:140] Forest +3 [CMD:176] Troll Ascetic +2 [CMD:157] Garruk Wildspeaker +4 [10E:361] Treetop Village +1 [TSB:120] Pendelhaven +1 [10E:255] Civic Wayfinder +2 [C14:206] Masked Admirers +3 [FUT:153] Tarmogoyf +4 [THS:107] Thoughtseize +4 [C14:227] Wren's Run Packmaster +1 [PLC:75] Mirri the Cursed +4 [C14:204] Llanowar Elves +1 [C14:247] Loxodon Warhammer +4 [M15:244] Llanowar Wastes +4 [C14:202] Imperious Perfect +4 [C14:156] Profane Command +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [LRW:128] Nameless Inversion +1 [CSP:105] Boreal Druid +4 [LRW:268] Gilt-Leaf Palace +4 [UNH:138] Swamp +SB: 1 [C14:247] Loxodon Warhammer +SB: 2 [TSP:261] Phyrexian Totem +SB: 3 [M15:103] Liliana Vess +SB: 2 [FUT:78] Slaughter Pact +SB: 1 [C13:153] Krosan Grip +SB: 2 [10E:308] Viridian Shaman +SB: 2 [10E:340] Razormane Masticore +SB: 2 [LRW:202] Cloudthresher diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(2) 58 World Championship 2007 (New York) ST 12-6-07.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(2) 58 World Championship 2007 (New York) ST 12-6-07.dck new file mode 100644 index 00000000000..11573e6b20e --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Elves(2) 58 World Championship 2007 (New York) ST 12-6-07.dck @@ -0,0 +1,28 @@ +3 [LRW:110] Eyeblight's Ending +5 [UNH:140] Forest +3 [CMD:176] Troll Ascetic +2 [CMD:157] Garruk Wildspeaker +4 [10E:361] Treetop Village +1 [TSB:120] Pendelhaven +2 [10E:255] Civic Wayfinder +3 [C14:206] Masked Admirers +4 [FUT:153] Tarmogoyf +3 [THS:107] Thoughtseize +4 [C14:227] Wren's Run Packmaster +4 [C14:204] Llanowar Elves +4 [M15:244] Llanowar Wastes +3 [C14:202] Imperious Perfect +4 [C14:156] Profane Command +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [LRW:128] Nameless Inversion +1 [CSP:105] Boreal Druid +4 [LRW:268] Gilt-Leaf Palace +4 [UNH:138] Swamp +SB: 2 [C14:247] Loxodon Warhammer +SB: 3 [M15:103] Liliana Vess +SB: 2 [FUT:78] Slaughter Pact +SB: 1 [C13:153] Krosan Grip +SB: 2 [C14:152] Nekrataal +SB: 2 [10E:308] Viridian Shaman +SB: 1 [THS:107] Thoughtseize +SB: 2 [LRW:202] Cloudthresher diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Enduring Ideal 34 World Championship 2005 (Yokohama) ST 12-4-05.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Enduring Ideal 34 World Championship 2005 (Yokohama) ST 12-4-05.dck new file mode 100644 index 00000000000..9cd00958c53 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Enduring Ideal 34 World Championship 2005 (Yokohama) ST 12-4-05.dck @@ -0,0 +1,29 @@ +2 [SCG:93] Form of the Dragon +1 [S99:51] Sleight of Hand +1 [CHK:273] Boseiju, Who Shelters All +4 [CMD:243] Boros Signet +1 [9ED:187] Form of the Dragon +4 [BOK:165] Tendo Ice Bridge +4 [SOK:9] Enduring Ideal +4 [CMD:248] Fellwar Stone +4 [C13:27] Wrath of God +4 [RAV:16] Faith's Fetters +1 [8ED:69] Confiscate +4 [10E:114] Telling Time +4 [10E:347] Adarkar Wastes +1 [MMQ:24] Ivory Mask +1 [7ED:65] Confiscate +1 [C14:102] Compulsive Research +4 [GTC:245] Sacred Foundry +3 [9ED:99] Sleight of Hand +3 [UNH:136] Plains +1 [USG:66] Confiscate +7 [UNH:137] Island +1 [5ED:138] Zur's Weirding +SB: 1 [8ED:296] Defense Grid +SB: 1 [BOK:151] Genju of the Realm +SB: 1 [9ED:23] Ivory Mask +SB: 4 [M11:154] Pyroclasm +SB: 1 [RAV:251] Privileged Position +SB: 3 [ULG:125] Defense Grid +SB: 4 [M12:63] Mana Leak diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 34 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 34 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..f80b7f844d9 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 34 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,30 @@ +3 [AVR:32] Restoration Angel +1 [RTR:82] Ultimate Price +2 [M14:29] Planar Cleansing +4 [C13:30] Augur of Bolas +2 [GTC:249] Watery Grave +4 [M13:225] Glacial Fortress +4 [M13:223] Drowned Catacomb +4 [RTR:241] Hallowed Fountain +2 [ISD:78] Snapcaster Mage +4 [RTR:201] Supreme Verdict +1 [RTR:156] Dramatic Rescue +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +4 [ISD:242] Isolated Chapel +2 [M15:51] Dissipate +4 [ISD:245] Nephalia Drownyard +2 [GTC:63] Devour Flesh +1 [UNH:136] Plains +2 [GTC:242] Godless Shrine +2 [UNH:137] Island +4 [ISD:83] Think Twice +SB: 3 [AVR:104] Gloom Surgeon +SB: 2 [RTR:1] Angel of Serenity +SB: 2 [ISD:236] Witchbane Orb +SB: 1 [RTR:36] Dispel +SB: 1 [RTR:47] Psychic Spiral +SB: 2 [M14:97] Duress +SB: 1 [RTR:18] Rest in Peace +SB: 2 [M14:60] Jace, Memory Adept +SB: 1 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 58 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 58 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..ca6badb6c3b --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Esper Control 58 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,27 @@ +4 [THS:225] Temple of Deceit +3 [THS:47] Dissolve +4 [GTC:249] Watery Grave +4 [RTR:241] Hallowed Fountain +4 [THS:227] Temple of Silence +2 [THS:107] Thoughtseize +4 [RTR:201] Supreme Verdict +3 [RTR:200] Sphinx's Revelation +4 [RTR:145] Azorius Charm +1 [RTR:155] Detention Sphere +1 [DGM:11] AEtherling +4 [THS:90] Hero's Downfall +4 [M14:96] Doom Blade +4 [RTR:44] Jace, Architect of Thought +2 [M15:52] Divination +2 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [THS:9] Elspeth, Sun's Champion +4 [UNH:137] Island +SB: 2 [RTR:155] Detention Sphere +SB: 2 [DGM:57] Blood Baron of Vizkopa +SB: 1 [THS:49] Gainsay +SB: 1 [DGM:11] AEtherling +SB: 1 [THS:107] Thoughtseize +SB: 2 [M15:71] Negate +SB: 2 [DGM:103] Sin Collector +SB: 4 [THS:32] Soldier of the Pantheon diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Faeries 58 PT Hollywood ST 5-25-08.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Faeries 58 PT Hollywood ST 5-25-08.dck new file mode 100644 index 00000000000..150ce6b0183 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Faeries 58 PT Hollywood ST 5-25-08.dck @@ -0,0 +1,23 @@ +4 [10E:182] Terror +4 [LRW:271] Secluded Glen +4 [LRW:89] Spellstutter Sprite +4 [LRW:56] Cryptic Command +3 [FUT:179] River of Tears +1 [FNMP:96] Pendelhaven +1 [TSB:120] Pendelhaven +4 [10E:362] Underground River +2 [SHM:280] Sunken Ruins +4 [MOR:58] Bitterblossom +2 [C13:288] Faerie Conclave +3 [MOR:55] Vendilion Clique +4 [TSP:48] Ancestral Vision +4 [CSP:46] Rune Snag +4 [M14:228] Mutavault +4 [LRW:83] Scion of Oona +4 [LRW:75] Mistbind Clique +4 [UNH:137] Island +SB: 3 [C14:231] Bottle Gnomes +SB: 3 [10E:340] Razormane Masticore +SB: 4 [THS:107] Thoughtseize +SB: 3 [PLC:85] Damnation +SB: 2 [SHM:192] Murderous Redcap diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Fauna Quest 58 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Fauna Quest 58 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..8591438ab1e --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Fauna Quest 58 PT Paris ST 2-13-11.dck @@ -0,0 +1,26 @@ +4 [SOM:174] Memnite +3 [WWK:144] Stirring Wildwood +4 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +2 [SOM:10] Glint Hawk +4 [ROE:212] Vengevine +2 [C14:228] Argentum Armor +4 [ZEN:23] Kor Skyfisher +4 [M11:172] Fauna Shaman +4 [M15:223] Ornithopter +1 [ZEN:21] Kor Outfitter +1 [SOM:208] Sword of Body and Mind +4 [ZEN:33] Quest for the Holy Relic +4 [SOM:228] Razorverge Thicket +4 [M11:33] Squadron Hawk +1 [WWK:20] Stoneforge Mystic +8 [UNH:136] Plains +2 [SOM:156] Glint Hawk Idol +SB: 1 [ROE:33] Linvala, Keeper of Silence +SB: 1 [MBS:10] Leonin Relic-Warder +SB: 1 [M13:39] War Priest of Thune +SB: 4 [SOM:14] Leonin Arbiter +SB: 2 [WWK:17] Refraction Trap +SB: 4 [ZEN:10] Devout Lightcaster +SB: 1 [M11:7] Baneslayer Angel +SB: 1 [WWK:11] Kor Firewalker diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GB Elves 34 PT Hollywood ST 5-25-08.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GB Elves 34 PT Hollywood ST 5-25-08.dck new file mode 100644 index 00000000000..6865f55ee9f --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GB Elves 34 PT Hollywood ST 5-25-08.dck @@ -0,0 +1,24 @@ +1 [LEG:250] Pendelhaven +3 [UNH:140] Forest +4 [CMD:157] Garruk Wildspeaker +4 [10E:361] Treetop Village +1 [TSB:120] Pendelhaven +3 [10E:255] Civic Wayfinder +4 [FUT:153] Tarmogoyf +4 [THS:107] Thoughtseize +4 [C14:204] Llanowar Elves +4 [M15:244] Llanowar Wastes +4 [C14:202] Imperious Perfect +4 [C14:156] Profane Command +1 [M15:248] Urborg, Tomb of Yawgmoth +4 [M14:228] Mutavault +3 [LRW:128] Nameless Inversion +2 [CSP:105] Boreal Druid +4 [LRW:245] Wren's Run Vanquisher +2 [UNH:138] Swamp +4 [LRW:268] Gilt-Leaf Palace +SB: 4 [MOR:58] Bitterblossom +SB: 2 [SHM:70] Incremental Blight +SB: 2 [10E:182] Terror +SB: 4 [C14:160] Shriekmaw +SB: 3 [LRW:233] Primal Command diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GW Aggro 2 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GW Aggro 2 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..f9eee806beb --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/GW Aggro 2 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,24 @@ +3 [SOM:6] Elspeth Tirel +4 [M13:229] Sunpetal Grove +8 [UNH:140] Forest +1 [C14:72] Geist-Honored Monk +4 [NPH:4] Blade Splicer +4 [M12:165] Birds of Paradise +4 [ISD:170] Avacyn's Pilgrim +4 [ISD:181] Garruk Relentless +2 [NPH:86] Gut Shot +4 [SOM:228] Razorverge Thicket +3 [MBS:115] Mortarpod +4 [M13:22] Oblivion Ring +4 [ISD:239] Gavony Township +5 [UNH:136] Plains +2 [MBS:14] Mirran Crusader +4 [MBS:8] Hero of Bladehold +SB: 1 [ISD:23] Mikaeus, the Lunarch +SB: 2 [KTK:142] Naturalize +SB: 2 [NPH:86] Gut Shot +SB: 1 [NPH:161] Sword of War and Peace +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 2 [M12:11] Celestial Purge +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 3 [M12:40] Timely Reinforcements diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Greater Gift 2 World Championship 2005 (Yokohama) ST 12-4-05.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Greater Gift 2 World Championship 2005 (Yokohama) ST 12-4-05.dck new file mode 100644 index 00000000000..76629698819 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Greater Gift 2 World Championship 2005 (Yokohama) ST 12-4-05.dck @@ -0,0 +1,42 @@ +3 [CHK:268] Sensei's Divining Top +1 [SOK:163] Miren, the Moaning Well +1 [RAV:93] Last Gasp +2 [CHK:122] Kokusho, the Evening Star +4 [UNH:140] Forest +1 [CHK:283] Shizo, Death's Storehouse +2 [BOK:165] Tendo Ice Bridge +1 [CHK:280] Okina, Temple to the Grandfathers +1 [10E:289] Recollect +4 [CNS:177] Sakura-Tribe Elder +2 [10E:349] Brushland +3 [CHK:62] Gifts Ungiven +2 [RTR:243] Overgrown Tomb +2 [M13:170] Farseek +2 [RTR:248] Temple Garden +3 [BOK:67] Goryo's Vengeance +1 [DGM:93] Putrefy +3 [UNH:136] Plains +1 [UNH:137] Island +3 [UNH:138] Swamp +1 [JR:81] Greater Good +4 [CMD:163] Kodama's Reach +1 [GTC:249] Watery Grave +4 [C13:27] Wrath of God +4 [CHK:50] Yosei, the Morning Star +1 [M12:191] Reclaim +2 [USG:257] Greater Good +1 [SOK:73] Kagemaro, First to Suffer +SB: 1 [CHK:115] Hideous Laughter +SB: 1 [CHK:211] Hana Kami +SB: 1 [8ED:296] Defense Grid +SB: 1 [RAV:93] Last Gasp +SB: 1 [9ED:293] Defense Grid +SB: 1 [CHK:144] Soulless Revival +SB: 1 [RAV:214] Loxodon Hierarch +SB: 1 [CHK:74] Meloku the Clouded Mirror +SB: 1 [SOK:63] Death Denied +SB: 1 [CHK:105] Cranial Extraction +SB: 2 [ULG:125] Defense Grid +SB: 1 [CHK:205] Dosan the Falling Leaf +SB: 1 [BOK:71] Ink-Eyes, Servant of Oni +SB: 1 [SOK:143] Rending Vines diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Deck Wins 1 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Deck Wins 1 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..347d041b361 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Deck Wins 1 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,25 @@ +1 [THS:224] Temple of Abandon +1 [UNH:140] Forest +4 [KTK:118] Monastery Swiftspear +4 [FRF:118] Wild Slash +4 [KTK:249] Wooded Foothills +4 [M15:141] Foundry Street Denizen +1 [M15:142] Frenzied Goblin +4 [M15:164] Stoke the Flames +10 [UNH:139] Mountain +4 [M15:155] Lightning Strike +2 [M15:145] Goblin Rabblemaster +4 [KTK:111] Hordeling Outburst +1 [KTK:130] Become Immense +1 [DTK:146] Lightning Berserker +4 [DTK:135] Dragon Fodder +3 [DTK:169] Zurgo Bellstriker +4 [DTK:213] Atarka's Command +4 [JOU:163] Mana Confluence +SB: 2 [M15:145] Goblin Rabblemaster +SB: 1 [BNG:110] Scouring Sands +SB: 2 [JOU:162] Hall of Triumph +SB: 4 [JOU:94] Eidolon of the Great Revel +SB: 1 [FRF:102] Goblin Heelcutter +SB: 4 [DTK:151] Roast +SB: 1 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Dragons 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Dragons 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..c2c0d413f52 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Gruul Dragons 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,25 @@ +4 [THS:224] Temple of Abandon +4 [THS:143] Stormbreath Dragon +6 [UNH:140] Forest +1 [FRF:170] Rugged Highlands +4 [KTK:249] Wooded Foothills +4 [KTK:106] Crater's Claws +3 [KTK:134] Heir of the Wilds +1 [DTK:249] Haven of the Spirit Dragon +5 [UNH:139] Mountain +4 [M15:145] Goblin Rabblemaster +4 [KTK:144] Rattleclaw Mystic +2 [JOU:163] Mana Confluence +3 [DTK:210] Surrak, the Hunt Caller +4 [THS:152] Boon Satyr +2 [DTK:134] Draconic Roar +4 [C14:191] Elvish Mystic +4 [DTK:162] Thunderbreak Regent +1 [DTK:151] Roast +SB: 3 [M15:177] Hornet Nest +SB: 3 [THS:209] Xenagos, the Reveler +SB: 2 [KTK:97] Arc Lightning +SB: 3 [FRF:118] Wild Slash +SB: 1 [M15:192] Plummet +SB: 1 [DTK:151] Roast +SB: 2 [THS:192] Destructive Revelry diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Heartbeat 58 PT Honolulu ST 3-5-06.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Heartbeat 58 PT Honolulu ST 3-5-06.dck new file mode 100644 index 00000000000..c012292208f --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Heartbeat 58 PT Honolulu ST 3-5-06.dck @@ -0,0 +1,27 @@ +4 [CHK:268] Sensei's Divining Top +4 [CHK:212] Heartbeat of Spring +4 [RAV:60] Muddle the Mixture +1 [9ED:282] Weird Harvest +4 [CMD:163] Kodama's Reach +10 [UNH:140] Forest +1 [7ED:237] Early Harvest +4 [RAV:63] Remand +4 [RAV:46] Drift of Phantasms +1 [9ED:235] Early Harvest +1 [10E:289] Recollect +4 [CNS:177] Sakura-Tribe Elder +1 [UNH:139] Mountain +1 [C14:102] Compulsive Research +2 [MIR:111] Early Harvest +1 [10E:70] Boomerang +1 [DDJ:31] Invoke the Firemind +10 [UNH:137] Island +1 [SOK:81] Maga, Traitor to Mortals +1 [UNH:138] Swamp +SB: 2 [CHK:74] Meloku the Clouded Mirror +SB: 4 [RAV:189] Vinelasher Kudzu +SB: 1 [CHK:72] Keiga, the Tide Star +SB: 3 [C13:208] Savage Twister +SB: 3 [BOK:130] Iwamori of the Open Fist +SB: 1 [BOK:163] Umezawa's Jitte +SB: 1 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Izzetron 58 PT Honolulu ST 3-5-06.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Izzetron 58 PT Honolulu ST 3-5-06.dck new file mode 100644 index 00000000000..0ffe78a74ab --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Izzetron 58 PT Honolulu ST 3-5-06.dck @@ -0,0 +1,34 @@ +4 [CMD:252] Izzet Signet +4 [CMD:197] Electrolyze +2 [BOK:165] Tendo Ice Bridge +1 [9ED:327] Urza's Mine +1 [9ED:329] Urza's Tower +4 [C14:102] Compulsive Research +4 [M15:246] Shivan Reef +4 [RTR:247] Steam Vents +2 [9ED:68] Confiscate +1 [CHK:279] Minamo, School at Water's Edge +2 [8ED:330] Urza's Tower +1 [10E:190] Blaze +4 [RAV:63] Remand +1 [ATQ:75] Urza's Mine +2 [M11:154] Pyroclasm +2 [10E:114] Telling Time +2 [ME4:258] Urza's Power Plant +1 [ME4:257] Urza's Mine +4 [CHK:74] Meloku the Clouded Mirror +1 [10E:116] Tidings +1 [ME4:259] Urza's Tower +4 [CHK:72] Keiga, the Tide Star +1 [DDJ:31] Invoke the Firemind +2 [5ED:448] Urza's Power Plant +1 [8ED:328] Urza's Mine +4 [M12:63] Mana Leak +SB: 4 [GPT:143] Giant Solifuge +SB: 1 [GPT:32] Repeal +SB: 1 [CHK:185] Ryusei, The Falling Star +SB: 1 [DDN:72] Repeal +SB: 2 [ONS:63] Annex +SB: 2 [M11:154] Pyroclasm +SB: 2 [9ED:59] Annex +SB: 2 [10E:235] Smash diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Ascendancy 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Ascendancy 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..8fc729be8c2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Ascendancy 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,29 @@ +2 [THS:224] Temple of Abandon +2 [JOU:115] Twinflame +2 [THS:226] Temple of Mystery +1 [UNH:140] Forest +4 [BNG:49] Retraction Helix +4 [THS:155] Commune with the Gods +2 [KTK:217] Briber's Purse +2 [KTK:249] Wooded Foothills +3 [KTK:36] Dig Through Time +2 [KTK:233] Flooded Strand +4 [THS:119] Dragon Mantle +3 [KTK:123] Tormenting Voice +2 [KTK:234] Frontier Bivouac +1 [M15:187] Nissa, Worldwaker +1 [UNH:139] Mountain +4 [KTK:144] Rattleclaw Mystic +2 [M15:249] Yavimaya Coast +2 [BNG:165] Temple of Plenty +4 [JOU:163] Mana Confluence +4 [KTK:180] Jeskai Ascendancy +1 [UNH:136] Plains +3 [BNG:150] Kiora's Follower +1 [UNH:137] Island +4 [THS:180] Sylvan Caryatid +SB: 3 [M15:155] Lightning Strike +SB: 4 [KTK:197] Savage Knuckleblade +SB: 3 [KTK:97] Arc Lightning +SB: 2 [THS:172] Polukranos, World Eater +SB: 3 [THS:65] Swan Song diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo 2 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo 2 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..5f0b63eb464 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo 2 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,28 @@ +2 [JOU:5] Banishing Light +2 [THS:112] Anger of the Gods +2 [KTK:119] Sarkhan, the Dragonspeaker +1 [KTK:22] Seeker of the Way +4 [THS:128] Magma Jet +1 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +4 [KTK:36] Dig Through Time +4 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +3 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +2 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +4 [KTK:181] Jeskai Charm +4 [JOU:164] Temple of Epiphany +1 [UNH:136] Plains +2 [UNH:137] Island +SB: 3 [THS:47] Dissolve +SB: 1 [M15:225] Phyrexian Revoker +SB: 2 [KTK:9] Erase +SB: 2 [KTK:8] End Hostilities +SB: 2 [THS:112] Anger of the Gods +SB: 2 [JOU:151] Keranos, God of Storms +SB: 1 [KTK:37] Disdainful Stroke +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(1) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(1) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..7c943a501d4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(1) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,25 @@ +3 [BNG:5] Brimaz, King of Oreskos +2 [THS:16] Gods Willing +3 [KTK:119] Sarkhan, the Dragonspeaker +4 [KTK:22] Seeker of the Way +4 [THS:128] Magma Jet +3 [M15:240] Battlefield Forge +4 [KTK:236] Mystic Monastery +4 [THS:228] Temple of Triumph +3 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +3 [UNH:139] Mountain +4 [M15:155] Lightning Strike +4 [M15:145] Goblin Rabblemaster +3 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +4 [KTK:181] Jeskai Charm +2 [UNH:136] Plains +2 [UNH:137] Island +SB: 1 [M15:134] Chandra, Pyromaster +SB: 3 [JOU:103] Magma Spray +SB: 1 [THS:16] Gods Willing +SB: 2 [THS:60] Prognostic Sphinx +SB: 4 [KTK:25] Suspension Field +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 3 [KTK:37] Disdainful Stroke diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(2) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(2) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..e70b3c3eaf1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jeskai Tempo(2) 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,25 @@ +4 [M15:15] Hushwing Gryff +2 [THS:143] Stormbreath Dragon +3 [JOU:5] Banishing Light +3 [KTK:99] Ashcloud Phoenix +4 [KTK:22] Seeker of the Way +4 [THS:128] Magma Jet +3 [M15:240] Battlefield Forge +3 [THS:228] Temple of Triumph +4 [KTK:236] Mystic Monastery +3 [KTK:233] Flooded Strand +4 [M15:164] Stoke the Flames +3 [UNH:139] Mountain +4 [M15:155] Lightning Strike +3 [M15:246] Shivan Reef +4 [KTK:184] Mantis Rider +4 [KTK:181] Jeskai Charm +2 [JOU:164] Temple of Epiphany +1 [UNH:136] Plains +2 [UNH:137] Island +SB: 3 [JOU:103] Magma Spray +SB: 1 [THS:49] Gainsay +SB: 2 [THS:112] Anger of the Gods +SB: 3 [THS:60] Prognostic Sphinx +SB: 3 [KTK:25] Suspension Field +SB: 3 [KTK:37] Disdainful Stroke diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 1 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 1 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..08f27a9ce86 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 1 PT San Diego ST 2-21-10.dck @@ -0,0 +1,25 @@ +4 [WWK:141] Raging Ravine +4 [ALA:156] Blightning +1 [M13:228] Rootbound Crag +4 [UNH:140] Forest +4 [M11:149] Lightning Bolt +2 [CMD:157] Garruk Wildspeaker +3 [M10:157] Siege-Gang Commander +4 [C13:219] Sprouting Thrinax +4 [C13:317] Savage Lands +2 [M13:222] Dragonskull Summit +3 [ALA:160] Broodmate Dragon +2 [WWK:139] Lavaclaw Reaches +3 [UNH:139] Mountain +3 [ARB:92] Maelstrom Pulse +4 [ZEN:229] Verdant Catacombs +2 [M12:190] Rampant Growth +4 [ARB:50] Bloodbraid Elf +4 [ARB:95] Putrid Leech +3 [UNH:138] Swamp +SB: 1 [ARB:92] Maelstrom Pulse +SB: 4 [M12:90] Deathmark +SB: 3 [M10:191] Master of the Wild Hunt +SB: 1 [RTR:231] Pithing Needle +SB: 2 [CMD:231] Terminate +SB: 4 [M10:186] Great Sable Stag diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..29b66e022cf --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 PT San Diego ST 2-21-10.dck @@ -0,0 +1,27 @@ +4 [WWK:141] Raging Ravine +4 [ALA:156] Blightning +2 [M13:228] Rootbound Crag +3 [UNH:140] Forest +2 [CMD:231] Terminate +4 [M11:149] Lightning Bolt +3 [CMD:157] Garruk Wildspeaker +2 [M10:157] Siege-Gang Commander +4 [C13:219] Sprouting Thrinax +4 [C13:317] Savage Lands +3 [M13:222] Dragonskull Summit +2 [ALA:160] Broodmate Dragon +3 [UNH:139] Mountain +3 [ARB:92] Maelstrom Pulse +4 [ZEN:229] Verdant Catacombs +4 [ARB:50] Bloodbraid Elf +4 [ARB:95] Putrid Leech +2 [WWK:99] Explore +3 [UNH:138] Swamp +SB: 2 [M12:90] Deathmark +SB: 1 [M15:104] Mind Rot +SB: 1 [CMD:231] Terminate +SB: 4 [ZEN:127] Goblin Ruinblaster +SB: 1 [ARB:34] Bituminous Blast +SB: 3 [M14:97] Duress +SB: 1 [ZEN:100] Malakir Bloodwitch +SB: 2 [M10:186] Great Sable Stag diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..1ccc3a28234 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 2 World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,26 @@ +4 [ALA:156] Blightning +2 [UNH:140] Forest +4 [M13:228] Rootbound Crag +2 [CMD:231] Terminate +4 [M11:149] Lightning Bolt +2 [CMD:157] Garruk Wildspeaker +3 [ARB:34] Bituminous Blast +4 [C13:219] Sprouting Thrinax +4 [C13:317] Savage Lands +3 [M13:222] Dragonskull Summit +2 [C14:305] Oran-Rief, the Vastwood +2 [ALA:160] Broodmate Dragon +3 [UNH:139] Mountain +3 [ARB:92] Maelstrom Pulse +4 [ZEN:229] Verdant Catacombs +1 [ZEN:119] Burst Lightning +2 [M10:191] Master of the Wild Hunt +4 [ARB:50] Bloodbraid Elf +4 [ARB:95] Putrid Leech +3 [UNH:138] Swamp +SB: 1 [ARB:92] Maelstrom Pulse +SB: 2 [C13:195] Jund Charm +SB: 4 [ZEN:127] Goblin Ruinblaster +SB: 3 [M14:97] Duress +SB: 3 [M10:186] Great Sable Stag +SB: 2 [ARB:47] Thought Hemorrhage diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 34 PT Magic 2015 (Portland) ST 8-3-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 34 PT Magic 2015 (Portland) ST 8-3-14.dck new file mode 100644 index 00000000000..58cf8b52a21 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 34 PT Magic 2015 (Portland) ST 8-3-14.dck @@ -0,0 +1,32 @@ +3 [THS:224] Temple of Abandon +1 [UNH:140] Forest +2 [JOU:165] Temple of Malady +3 [THS:209] Xenagos, the Reveler +2 [RTR:164] Golgari Charm +1 [RTR:141] Abrupt Decay +2 [RTR:157] Dreadbore +4 [M15:244] Llanowar Wastes +3 [M15:134] Chandra, Pyromaster +3 [RTR:101] Mizzium Mortars +4 [C14:158] Read the Bones +2 [RTR:243] Overgrown Tomb +4 [BNG:119] Courser of Kruphix +2 [RTR:188] Rakdos's Return +2 [RTR:238] Blood Crypt +1 [THS:90] Hero's Downfall +1 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +4 [BNG:164] Temple of Malice +3 [RTR:208] Vraska the Unseen +2 [DGM:93] Putrefy +3 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 1 [RTR:101] Mizzium Mortars +SB: 1 [RTR:188] Rakdos's Return +SB: 4 [JOU:103] Magma Spray +SB: 1 [RTR:231] Pithing Needle +SB: 2 [M14:97] Duress +SB: 2 [RTR:197] Slaughter Games +SB: 1 [RTR:164] Golgari Charm +SB: 2 [THS:107] Thoughtseize +SB: 1 [RTR:141] Abrupt Decay diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT Magic 2015 (Portland) ST 8-3-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT Magic 2015 (Portland) ST 8-3-14.dck new file mode 100644 index 00000000000..d99bdf0a783 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT Magic 2015 (Portland) ST 8-3-14.dck @@ -0,0 +1,32 @@ +2 [RTR:82] Ultimate Price +4 [THS:224] Temple of Abandon +3 [UNH:140] Forest +4 [THS:209] Xenagos, the Reveler +1 [RTR:164] Golgari Charm +1 [RTR:141] Abrupt Decay +2 [THS:107] Thoughtseize +4 [M15:187] Nissa, Worldwaker +2 [RTR:157] Dreadbore +3 [M15:244] Llanowar Wastes +2 [M15:134] Chandra, Pyromaster +3 [RTR:101] Mizzium Mortars +2 [RTR:243] Overgrown Tomb +4 [BNG:119] Courser of Kruphix +1 [RTR:188] Rakdos's Return +1 [RTR:238] Blood Crypt +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [M14:228] Mutavault +4 [GTC:247] Stomping Ground +4 [BNG:164] Temple of Malice +1 [RTR:208] Vraska the Unseen +1 [DGM:93] Putrefy +4 [C14:191] Elvish Mystic +4 [THS:180] Sylvan Caryatid +SB: 1 [RTR:101] Mizzium Mortars +SB: 1 [RTR:188] Rakdos's Return +SB: 2 [JOU:103] Magma Spray +SB: 2 [M14:96] Doom Blade +SB: 4 [THS:162] Mistcutter Hydra +SB: 1 [RTR:164] Golgari Charm +SB: 2 [M14:195] Scavenging Ooze +SB: 2 [THS:107] Thoughtseize diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..8884498cb03 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund 58 PT San Diego ST 2-21-10.dck @@ -0,0 +1,23 @@ +4 [WWK:141] Raging Ravine +4 [ALA:156] Blightning +3 [UNH:140] Forest +3 [CMD:231] Terminate +4 [M11:149] Lightning Bolt +3 [ARB:34] Bituminous Blast +3 [M10:157] Siege-Gang Commander +4 [C13:219] Sprouting Thrinax +4 [C13:317] Savage Lands +4 [M13:222] Dragonskull Summit +2 [ALA:160] Broodmate Dragon +4 [UNH:139] Mountain +3 [ARB:92] Maelstrom Pulse +4 [ZEN:229] Verdant Catacombs +4 [ARB:50] Bloodbraid Elf +4 [ARB:95] Putrid Leech +3 [UNH:138] Swamp +SB: 1 [ARB:92] Maelstrom Pulse +SB: 3 [M10:191] Master of the Wild Hunt +SB: 1 [M15:103] Liliana Vess +SB: 2 [M15:104] Mind Rot +SB: 4 [ZEN:127] Goblin Ruinblaster +SB: 4 [M14:97] Duress diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(1) 58 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(1) 58 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..d89a80d4c4d --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(1) 58 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,32 @@ +1 [RTR:82] Ultimate Price +1 [M13:228] Rootbound Crag +3 [UNH:140] Forest +3 [M13:222] Dragonskull Summit +1 [M13:101] Murder +2 [RTR:141] Abrupt Decay +2 [M13:174] Garruk, Primal Hunter +1 [RTR:157] Dreadbore +4 [RTR:243] Overgrown Tomb +2 [RTR:188] Rakdos's Return +3 [M13:160] Arbor Elf +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +2 [AVR:149] Pillar of Flame +4 [AVR:129] Bonfire of the Damned +4 [GTC:247] Stomping Ground +4 [DKA:140] Huntmaster of the Fells +4 [ISD:249] Woodland Cemetery +2 [ISD:215] Olivia Voldaren +3 [ISD:105] Liliana of the Veil +SB: 2 [RTR:83] Underworld Connections +SB: 1 [RTR:188] Rakdos's Return +SB: 1 [C14:167] Tragic Slip +SB: 2 [DKA:149] Grafdigger's Cage +SB: 2 [DKA:127] Strangleroot Geist +SB: 1 [AVR:149] Pillar of Flame +SB: 2 [M13:217] Staff of Nin +SB: 2 [M14:97] Duress +SB: 1 [M13:101] Murder +SB: 1 [ISD:215] Olivia Voldaren diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(2) 58 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(2) 58 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..95e709d4bf1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund Control(2) 58 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,30 @@ +2 [C13:97] Vampire Nighthawk +1 [UNH:140] Forest +4 [M13:228] Rootbound Crag +4 [M13:222] Dragonskull Summit +2 [RTR:141] Abrupt Decay +2 [M13:174] Garruk, Primal Hunter +2 [RTR:157] Dreadbore +3 [RTR:101] Mizzium Mortars +4 [RTR:243] Overgrown Tomb +2 [RTR:188] Rakdos's Return +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [RTR:238] Blood Crypt +4 [M13:170] Farseek +1 [GTC:247] Stomping Ground +2 [ISD:124] Victim of Night +4 [DKA:140] Huntmaster of the Fells +2 [ISD:96] Dead Weight +4 [ISD:249] Woodland Cemetery +1 [UNH:138] Swamp +3 [ISD:215] Olivia Voldaren +3 [ISD:105] Liliana of the Veil +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 2 [RTR:83] Underworld Connections +SB: 1 [DKA:149] Grafdigger's Cage +SB: 2 [AVR:85] Barter in Blood +SB: 3 [RTR:213] Deathrite Shaman +SB: 2 [M14:97] Duress +SB: 2 [ISD:96] Dead Weight +SB: 2 [RTR:197] Slaughter Games diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(1) 58 World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(1) 58 World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..d5fc2d2c3d3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(1) 58 World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,24 @@ +4 [ALA:156] Blightning +3 [UNH:140] Forest +4 [M13:228] Rootbound Crag +2 [CMD:231] Terminate +4 [M11:149] Lightning Bolt +3 [CMD:157] Garruk Wildspeaker +3 [ARB:34] Bituminous Blast +4 [C13:219] Sprouting Thrinax +4 [C13:317] Savage Lands +3 [M13:222] Dragonskull Summit +3 [ALA:160] Broodmate Dragon +3 [UNH:139] Mountain +3 [ARB:92] Maelstrom Pulse +4 [ZEN:229] Verdant Catacombs +4 [ARB:50] Bloodbraid Elf +4 [ARB:95] Putrid Leech +1 [AVR:169] Borderland Ranger +4 [UNH:138] Swamp +SB: 3 [M15:104] Mind Rot +SB: 2 [ALA:95] Caldera Hellion +SB: 3 [ZEN:127] Goblin Ruinblaster +SB: 3 [C13:195] Jund Charm +SB: 2 [CMD:231] Terminate +SB: 2 [ARB:47] Thought Hemorrhage diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(2) 58 World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(2) 58 World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..a5cf22fdf4a --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Jund(2) 58 World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,25 @@ +4 [ALA:156] Blightning +2 [UNH:140] Forest +3 [M13:228] Rootbound Crag +2 [CMD:231] Terminate +4 [M11:149] Lightning Bolt +3 [CMD:157] Garruk Wildspeaker +3 [ARB:34] Bituminous Blast +4 [C13:219] Sprouting Thrinax +4 [C13:317] Savage Lands +3 [M13:222] Dragonskull Summit +1 [C14:305] Oran-Rief, the Vastwood +3 [ALA:160] Broodmate Dragon +4 [UNH:139] Mountain +4 [ARB:92] Maelstrom Pulse +4 [ZEN:229] Verdant Catacombs +1 [C13:298] Jund Panorama +4 [ARB:50] Bloodbraid Elf +4 [ARB:95] Putrid Leech +3 [UNH:138] Swamp +SB: 2 [M15:104] Mind Rot +SB: 4 [ZEN:127] Goblin Ruinblaster +SB: 3 [C13:195] Jund Charm +SB: 1 [ARB:34] Bituminous Blast +SB: 3 [M14:97] Duress +SB: 2 [ARB:47] Thought Hemorrhage diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Bant 58 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Bant 58 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..05f7a34a8b4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Bant 58 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,31 @@ +4 [AVR:32] Restoration Angel +2 [M13:229] Sunpetal Grove +3 [C13:30] Augur of Bolas +1 [RTR:54] Syncopate +3 [M13:225] Glacial Fortress +4 [RTR:241] Hallowed Fountain +3 [RTR:201] Supreme Verdict +4 [RTR:145] Azorius Charm +4 [RTR:200] Sphinx's Revelation +1 [RTR:155] Detention Sphere +4 [M13:193] Thragtusk +2 [ISD:243] Kessig Wolf Run +4 [M13:170] Farseek +3 [RTR:248] Temple Garden +1 [RTR:247] Steam Vents +4 [ISD:241] Hinterland Harbor +3 [RTR:148] Centaur Healer +1 [GTC:247] Stomping Ground +2 [M15:51] Dissipate +1 [GTC:245] Sacred Foundry +2 [ISD:83] Think Twice +4 [GTC:240] Breeding Pool +SB: 1 [RTR:201] Supreme Verdict +SB: 1 [RTR:155] Detention Sphere +SB: 1 [AVR:209] Gisela, Blade of Goldnight +SB: 3 [M13:29] Rhox Faithmender +SB: 2 [ISD:181] Garruk Relentless +SB: 1 [RTR:148] Centaur Healer +SB: 2 [ISD:236] Witchbane Orb +SB: 2 [RTR:18] Rest in Peace +SB: 2 [M15:71] Negate diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..1ebda5ca46d --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,28 @@ +4 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +6 [UNH:139] Mountain +2 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +1 [C14:184] Whipflare +4 [MBS:145] Inkmoth Nexus +3 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +4 [SOM:91] Galvanic Blast +SB: 1 [M13:174] Garruk, Primal Hunter +SB: 2 [KTK:142] Naturalize +SB: 2 [M12:128] Combust +SB: 1 [C14:184] Whipflare +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 2 [NPH:103] Beast Within +SB: 1 [M12:164] Autumn's Veil +SB: 2 [ISD:127] Ancient Grudge +SB: 2 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..f93361f80cf --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 1 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,26 @@ +3 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +6 [UNH:139] Mountain +4 [C13:114] Inferno Titan +2 [ISD:140] Devil's Play +1 [M14:155] Shock +3 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +4 [MBS:145] Inkmoth Nexus +4 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [SOM:91] Galvanic Blast +SB: 1 [MBS:75] Slagstorm +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 1 [MBS:94] Viridian Corrupter +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 1 [NPH:103] Beast Within +SB: 2 [ISD:207] Tree of Redemption +SB: 4 [M12:164] Autumn's Veil +SB: 2 [ISD:127] Ancient Grudge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 2 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 2 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..cf3700a7a16 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kessig Titan 2 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,28 @@ +4 [MBS:75] Slagstorm +4 [M13:228] Rootbound Crag +5 [UNH:140] Forest +1 [MBS:92] Thrun, the Last Troll +2 [MBS:81] Green Sun's Zenith +4 [M12:188] Primeval Titan +1 [M12:165] Birds of Paradise +6 [UNH:139] Mountain +2 [C13:114] Inferno Titan +1 [C13:134] Acidic Slime +2 [ISD:243] Kessig Wolf Run +4 [M12:190] Rampant Growth +1 [C14:184] Whipflare +4 [MBS:145] Inkmoth Nexus +3 [C14:271] Solemn Simulacrum +4 [MBS:134] Sphere of the Suns +4 [SOM:225] Copperline Gorge +4 [DKA:140] Huntmaster of the Fells +4 [SOM:91] Galvanic Blast +SB: 2 [M13:174] Garruk, Primal Hunter +SB: 2 [KTK:142] Naturalize +SB: 1 [M12:128] Combust +SB: 1 [C14:184] Whipflare +SB: 2 [MBS:92] Thrun, the Last Troll +SB: 2 [NPH:103] Beast Within +SB: 1 [M12:164] Autumn's Veil +SB: 2 [ISD:127] Ancient Grudge +SB: 2 [NPH:1] Karn Liberated diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kithkins 34 World Championship 2008 (Memphis) ST 12-14-08.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kithkins 34 World Championship 2008 (Memphis) ST 12-14-08.dck new file mode 100644 index 00000000000..c0575fdd578 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Kithkins 34 World Championship 2008 (Memphis) ST 12-14-08.dck @@ -0,0 +1,21 @@ +3 [ALA:21] Ranger of Eos +4 [LRW:28] Knight of Meadowgrain +4 [LRW:49] Wizened Cenn +1 [LRW:7] Burrenton Forge-Tender +4 [LRW:10] Cloudgoat Ranger +4 [EVE:96] Unmake +4 [LRW:281] Windbrisk Heights +1 [M11:1] Ajani Goldmane +4 [LRW:18] Goldmeadow Stalwart +4 [MOR:150] Rustic Clachan +4 [EVE:139] Figure of Destiny +4 [C14:90] Spectral Procession +17 [UNH:136] Plains +2 [ALA:9] Elspeth, Knight-Errant +SB: 3 [MOR:22] Reveillark +SB: 4 [EVE:95] Stillmoon Cavalier +SB: 2 [LRW:7] Burrenton Forge-Tender +SB: 1 [SHM:245] Wilt-Leaf Liege +SB: 1 [M11:1] Ajani Goldmane +SB: 2 [M13:22] Oblivion Ring +SB: 2 [ALA:16] Knight of the White Orchid diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono Red Aggro 58 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono Red Aggro 58 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..3121ad3ad36 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono Red Aggro 58 PT San Diego ST 2-21-10.dck @@ -0,0 +1,22 @@ +4 [WWK:90] Searing Blaze +4 [M10:125] Ball Lightning +2 [DDK:46] Hellspark Elemental +4 [M11:149] Lightning Bolt +4 [ZEN:211] Arid Mesa +4 [ALA:103] Hell's Thunder +1 [GRC:25] Hellspark Elemental +13 [UNH:139] Mountain +3 [CMD:121] Earthquake +1 [CON:65] Hellspark Elemental +4 [ZEN:141] Plated Geopede +2 [CON:70] Quenchable Fire +3 [ZEN:119] Burst Lightning +4 [ZEN:126] Goblin Guide +4 [ZEN:223] Scalding Tarn +3 [ZEN:226] Teetering Peaks +SB: 4 [ZEN:153] Unstable Footing +SB: 2 [CON:70] Quenchable Fire +SB: 2 [ZEN:131] Hellkite Charger +SB: 2 [M12:150] Manabarbs +SB: 2 [CMD:131] Punishing Fire +SB: 3 [M12:206] Dragon's Claw diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono W Tokens World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono W Tokens World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..3a9811d7ebe --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mono W Tokens World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,23 @@ +2 [ZEN:11] Emeria Angel +2 [M11:39] White Knight +4 [ALA:21] Ranger of Eos +14 [UNH:136] Plains +4 [ZEN:211] Arid Mesa +4 [ALA:16] Knight of the White Orchid +4 [ZEN:8] Conqueror's Pledge +1 [C14:78] Martial Coup +3 [M13:22] Oblivion Ring +4 [ZEN:219] Marsh Flats +4 [ZEN:36] Steppe Lynx +2 [C14:66] Brave the Elements +4 [CMD:25] Path to Exile +4 [M12:23] Honor of the Pure +2 [C14:297] Gargoyle Castle +2 [M10:34] Soul Warden +SB: 3 [ZEN:25] Luminarch Ascension +SB: 4 [ZEN:10] Devout Lightcaster +SB: 1 [C14:66] Brave the Elements +SB: 1 [CMD:17] Journey to Nowhere +SB: 2 [M10:34] Soul Warden +SB: 2 [ALA:9] Elspeth, Knight-Errant +SB: 2 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 1 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 1 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..2ccf3591b4c --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 1 PT Paris ST 2-13-11.dck @@ -0,0 +1,26 @@ +4 [WWK:133] Celestial Colonnade +3 [M12:16] Gideon Jura +1 [ZEN:220] Misty Rainforest +5 [UNH:137] Island +4 [UNH:136] Plains +4 [WWK:31] Jace, the Mind Sculptor +3 [M12:63] Mana Leak +1 [ROE:59] Deprive +1 [MBS:138] Sword of Feast and Famine +1 [SOM:46] Stoic Rebuttal +1 [SOM:209] Sylvok Lifestaff +4 [SOM:229] Seachrome Coast +4 [C14:313] Tectonic Edge +4 [M13:225] Glacial Fortress +4 [M11:70] Preordain +4 [ZEN:67] Spell Pierce +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +4 [M12:12] Day of Judgment +SB: 1 [SOM:208] Sword of Body and Mind +SB: 1 [M15:71] Negate +SB: 2 [M11:7] Baneslayer Angel +SB: 2 [M12:52] Flashfreeze +SB: 4 [ROE:40] Oust +SB: 3 [M14:215] Ratchet Bomb +SB: 2 [MBS:5] Divine Offering diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 34 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 34 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..ca5cf0e9912 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go 34 PT Paris ST 2-13-11.dck @@ -0,0 +1,30 @@ +4 [WWK:133] Celestial Colonnade +2 [ZEN:70] Spreading Seas +2 [M12:16] Gideon Jura +4 [UNH:137] Island +3 [WWK:31] Jace, the Mind Sculptor +5 [UNH:136] Plains +2 [CMD:17] Journey to Nowhere +1 [ROE:59] Deprive +1 [MBS:138] Sword of Feast and Famine +1 [SOM:135] Venser, the Sojourner +1 [C14:115] Into the Roil +1 [SOM:208] Sword of Body and Mind +2 [C14:91] Sun Titan +1 [ZEN:219] Marsh Flats +4 [SOM:229] Seachrome Coast +4 [C14:313] Tectonic Edge +2 [SOM:218] Tumble Magnet +4 [M13:225] Glacial Fortress +4 [M11:70] Preordain +2 [WWK:20] Stoneforge Mystic +4 [M11:33] Squadron Hawk +2 [SOM:6] Elspeth Tirel +4 [M12:12] Day of Judgment +SB: 2 [BNG:25] Revoke Existence +SB: 4 [ZEN:25] Luminarch Ascension +SB: 2 [ZEN:70] Spreading Seas +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [C14:76] Kor Sanctifiers +SB: 2 [C14:69] Condemn +SB: 3 [M11:21] Leyline of Sanctity diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(1) 58 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(1) 58 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..c70eba85b04 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(1) 58 PT Paris ST 2-13-11.dck @@ -0,0 +1,26 @@ +4 [WWK:133] Celestial Colonnade +3 [M12:16] Gideon Jura +5 [UNH:137] Island +4 [UNH:136] Plains +4 [WWK:31] Jace, the Mind Sculptor +3 [M12:63] Mana Leak +1 [ROE:59] Deprive +1 [ZEN:211] Arid Mesa +1 [MBS:138] Sword of Feast and Famine +1 [SOM:46] Stoic Rebuttal +1 [SOM:209] Sylvok Lifestaff +4 [SOM:229] Seachrome Coast +4 [C14:313] Tectonic Edge +4 [M13:225] Glacial Fortress +4 [M11:70] Preordain +4 [ZEN:67] Spell Pierce +4 [M11:33] Squadron Hawk +4 [WWK:20] Stoneforge Mystic +4 [M12:12] Day of Judgment +SB: 1 [SOM:208] Sword of Body and Mind +SB: 1 [M11:7] Baneslayer Angel +SB: 2 [M12:52] Flashfreeze +SB: 3 [M14:215] Ratchet Bomb +SB: 4 [ROE:40] Oust +SB: 2 [MBS:5] Divine Offering +SB: 2 [SOM:6] Elspeth Tirel diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(2) 58 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(2) 58 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..dff94e849fb --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Mystic Caw Go(2) 58 PT Paris ST 2-13-11.dck @@ -0,0 +1,27 @@ +4 [WWK:133] Celestial Colonnade +3 [UNH:137] Island +4 [ROE:40] Oust +4 [UNH:136] Plains +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:63] Mana Leak +2 [CMD:17] Journey to Nowhere +1 [ZEN:211] Arid Mesa +4 [ROE:47] Student of Warfare +1 [MBS:138] Sword of Feast and Famine +2 [SOM:208] Sword of Body and Mind +3 [MBS:14] Mirran Crusader +4 [SOM:229] Seachrome Coast +4 [C14:313] Tectonic Edge +4 [M13:225] Glacial Fortress +4 [M11:70] Preordain +1 [ZEN:223] Scalding Tarn +3 [ZEN:67] Spell Pierce +4 [WWK:20] Stoneforge Mystic +SB: 1 [WWK:17] Refraction Trap +SB: 2 [M11:7] Baneslayer Angel +SB: 1 [M12:52] Flashfreeze +SB: 3 [M14:215] Ratchet Bomb +SB: 1 [C14:76] Kor Sanctifiers +SB: 4 [M11:33] Squadron Hawk +SB: 2 [C14:124] Sea Gate Oracle +SB: 1 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya 34 World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya 34 World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..97d8461373d --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya 34 World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,28 @@ +3 [CMD:190] Colossal Might +2 [CON:141] Ancient Ziggurat +2 [ALA:21] Ranger of Eos +2 [ZEN:220] Misty Rainforest +4 [M11:149] Lightning Bolt +1 [UNH:136] Plains +3 [ZEN:211] Arid Mesa +4 [ALA:209] Woolly Thoctar +4 [M10:186] Great Sable Stag +2 [UNH:139] Mountain +4 [ARB:50] Bloodbraid Elf +2 [MM2:151] Noble Hierarch +2 [FNMP:118] Ancient Ziggurat +4 [ZEN:168] Lotus Cobra +1 [ALA:154] Ajani Vengeant +4 [ZEN:126] Goblin Guide +2 [M13:228] Rootbound Crag +4 [CMD:25] Path to Exile +4 [UNH:140] Forest +2 [JR:66] Noble Hierarch +4 [C13:299] Jungle Shrine +SB: 2 [M13:22] Oblivion Ring +SB: 1 [ALA:154] Ajani Vengeant +SB: 3 [M11:7] Baneslayer Angel +SB: 2 [C13:26] Wall of Reverence +SB: 2 [ARB:124] Uril, the Miststalker +SB: 2 [ZEN:127] Goblin Ruinblaster +SB: 3 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Aggro 58 PT Magic 2015 (Portland) ST 8-3-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Aggro 58 PT Magic 2015 (Portland) ST 8-3-14.dck new file mode 100644 index 00000000000..fa6bc20a032 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Aggro 58 PT Magic 2015 (Portland) ST 8-3-14.dck @@ -0,0 +1,25 @@ +4 [RTR:214] Dryad Militant +2 [M15:240] Battlefield Forge +4 [GTC:167] Ghor-Clan Rampager +4 [JOU:163] Mana Confluence +4 [RTR:248] Temple Garden +1 [C13:179] Boros Charm +4 [THS:32] Soldier of the Pantheon +4 [BNG:165] Temple of Plenty +4 [C13:211] Selesnya Charm +4 [GTC:247] Stomping Ground +4 [GTC:245] Sacred Foundry +2 [RTR:17] Precinct Captain +3 [M14:1] Ajani, Caller of the Pride +4 [THS:193] Fleecemane Lion +4 [C14:66] Brave the Elements +4 [DGM:114] Voice of Resurgence +4 [GTC:215] Boros Reckoner +SB: 1 [M15:169] Back to Nature +SB: 1 [M15:1] Ajani Steadfast +SB: 3 [JOU:140] Setessan Tactics +SB: 1 [THS:209] Xenagos, the Reveler +SB: 3 [C13:179] Boros Charm +SB: 2 [JOU:5] Banishing Light +SB: 2 [DGM:51] Advent of the Wurm +SB: 2 [RTR:101] Mizzium Mortars diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Lightsaber 1 World Championship 2009 (Rome) ST 11-19-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Lightsaber 1 World Championship 2009 (Rome) ST 11-19-09.dck new file mode 100644 index 00000000000..baa537df4e3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Lightsaber 1 World Championship 2009 (Rome) ST 11-19-09.dck @@ -0,0 +1,23 @@ +4 [M11:7] Baneslayer Angel +4 [ALA:21] Ranger of Eos +4 [M11:149] Lightning Bolt +4 [UNH:136] Plains +1 [C14:305] Oran-Rief, the Vastwood +4 [ZEN:211] Arid Mesa +4 [ALA:209] Woolly Thoctar +2 [CON:87] Noble Hierarch +3 [UNH:139] Mountain +4 [ARB:50] Bloodbraid Elf +2 [MM2:151] Noble Hierarch +3 [ALA:154] Ajani Vengeant +4 [ALA:152] Wild Nacatl +4 [M13:228] Rootbound Crag +1 [ZEN:182] Scute Mob +4 [CMD:25] Path to Exile +4 [M13:229] Sunpetal Grove +4 [UNH:140] Forest +SB: 1 [ALA:154] Ajani Vengeant +SB: 2 [ZEN:119] Burst Lightning +SB: 4 [ZEN:127] Goblin Ruinblaster +SB: 4 [M10:186] Great Sable Stag +SB: 4 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Pod 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Pod 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..c27a8f1c370 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Naya Pod 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,36 @@ +1 [UNH:136] Plains +1 [MBS:95] Viridian Emissary +3 [ISD:239] Gavony Township +1 [UNH:139] Mountain +2 [M13:22] Oblivion Ring +1 [C14:271] Solemn Simulacrum +6 [UNH:140] Forest +2 [MBS:115] Mortarpod +4 [NPH:104] Birthing Pod +4 [M12:165] Birds of Paradise +1 [C14:72] Geist-Honored Monk +1 [NPH:9] Elesh Norn, Grand Cenobite +1 [C13:114] Inferno Titan +4 [NPH:4] Blade Splicer +1 [C14:283] Wurmcoil Engine +3 [ISD:170] Avacyn's Pilgrim +1 [C14:204] Llanowar Elves +2 [M13:228] Rootbound Crag +4 [SOM:225] Copperline Gorge +4 [SOM:228] Razorverge Thicket +1 [C13:11] Fiend Hunter +3 [M13:229] Sunpetal Grove +4 [DKA:140] Huntmaster of the Fells +4 [DKA:127] Strangleroot Geist +1 [C13:134] Acidic Slime +SB: 1 [M12:164] Autumn's Veil +SB: 1 [M13:22] Oblivion Ring +SB: 1 [DKA:17] Ray of Revelation +SB: 3 [NPH:38] Mental Misstep +SB: 2 [MBS:8] Hero of Bladehold +SB: 1 [MBS:92] Thrun, the Last Troll +SB: 1 [NPH:42] Phyrexian Metamorph +SB: 1 [ISD:127] Ancient Grudge +SB: 2 [MBS:138] Sword of Feast and Famine +SB: 1 [NPH:97] Tormentor Exarch +SB: 1 [C13:134] Acidic Slime diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Open Filigree 58 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Open Filigree 58 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..2e76cf0a412 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Open Filigree 58 PT San Diego ST 2-21-10.dck @@ -0,0 +1,30 @@ +2 [WWK:133] Celestial Colonnade +4 [ZEN:70] Spreading Seas +1 [UNH:138] Swamp +4 [ARB:7] Glassdust Hulk +4 [UNH:137] Island +2 [ARB:5] Fieldmist Borderpost +2 [WWK:31] Jace, the Mind Sculptor +3 [UNH:136] Plains +4 [C13:189] Filigree Angel +2 [CMD:17] Journey to Nowhere +2 [C14:315] Terramorphic Expanse +3 [ALA:37] Courier's Capsule +1 [C13:212] Sharuum the Hegemon +3 [M13:22] Oblivion Ring +2 [ZEN:219] Marsh Flats +2 [ZEN:216] Kabira Crossroads +4 [M10:21] Open the Vaults +4 [M13:225] Glacial Fortress +4 [ARB:17] Architects of Will +4 [ZEN:69] Sphinx of Lost Truths +1 [ARB:27] Mistvein Borderpost +3 [M12:12] Day of Judgment +SB: 2 [ALA:173] Hindering Light +SB: 1 [M13:22] Oblivion Ring +SB: 4 [M15:71] Negate +SB: 3 [M12:52] Flashfreeze +SB: 1 [WWK:31] Jace, the Mind Sculptor +SB: 2 [CMD:17] Journey to Nowhere +SB: 1 [C13:92] Sanguine Bond +SB: 1 [M12:12] Day of Judgment diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 34 PT Magic 2015 (Portland) ST 8-3-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 34 PT Magic 2015 (Portland) ST 8-3-14.dck new file mode 100644 index 00000000000..9493de41db2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 34 PT Magic 2015 (Portland) ST 8-3-14.dck @@ -0,0 +1,28 @@ +3 [RTR:63] Desecration Demon +1 [RTR:82] Ultimate Price +4 [M15:241] Caves of Koilos +4 [RTR:73] Pack Rat +3 [BNG:61] Bile Blight +3 [RTR:83] Underworld Connections +8 [UNH:138] Swamp +1 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [JOU:5] Banishing Light +2 [GTC:63] Devour Flesh +3 [DGM:57] Blood Baron of Vizkopa +1 [GTC:182] Obzedat, Ghost Council +4 [THS:107] Thoughtseize +3 [THS:90] Hero's Downfall +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [THS:9] Elspeth, Sun's Champion +3 [M14:101] Lifebane Zombie +4 [M14:228] Mutavault +4 [THS:227] Temple of Silence +SB: 3 [M14:96] Doom Blade +SB: 1 [THS:85] Erebos, God of the Dead +SB: 1 [RTR:83] Underworld Connections +SB: 3 [M14:97] Duress +SB: 1 [DGM:103] Sin Collector +SB: 2 [THS:22] Last Breath +SB: 2 [JOU:7] Deicide +SB: 2 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 58 PT Magic 2015 (Portland) ST 8-3-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 58 PT Magic 2015 (Portland) ST 8-3-14.dck new file mode 100644 index 00000000000..9493de41db2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Control 58 PT Magic 2015 (Portland) ST 8-3-14.dck @@ -0,0 +1,28 @@ +3 [RTR:63] Desecration Demon +1 [RTR:82] Ultimate Price +4 [M15:241] Caves of Koilos +4 [RTR:73] Pack Rat +3 [BNG:61] Bile Blight +3 [RTR:83] Underworld Connections +8 [UNH:138] Swamp +1 [UNH:136] Plains +4 [GTC:242] Godless Shrine +2 [JOU:5] Banishing Light +2 [GTC:63] Devour Flesh +3 [DGM:57] Blood Baron of Vizkopa +1 [GTC:182] Obzedat, Ghost Council +4 [THS:107] Thoughtseize +3 [THS:90] Hero's Downfall +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [THS:9] Elspeth, Sun's Champion +3 [M14:101] Lifebane Zombie +4 [M14:228] Mutavault +4 [THS:227] Temple of Silence +SB: 3 [M14:96] Doom Blade +SB: 1 [THS:85] Erebos, God of the Dead +SB: 1 [RTR:83] Underworld Connections +SB: 3 [M14:97] Duress +SB: 1 [DGM:103] Sin Collector +SB: 2 [THS:22] Last Breath +SB: 2 [JOU:7] Deicide +SB: 2 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Midrange 58 PT Theros (Dublin) ST 10-13-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Midrange 58 PT Theros (Dublin) ST 10-13-13.dck new file mode 100644 index 00000000000..acbda970f61 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Orzhov Midrange 58 PT Theros (Dublin) ST 10-13-13.dck @@ -0,0 +1,29 @@ +4 [RTR:63] Desecration Demon +6 [UNH:138] Swamp +7 [UNH:136] Plains +4 [THS:32] Soldier of the Pantheon +4 [GTC:242] Godless Shrine +4 [RTR:17] Precinct Captain +3 [M14:96] Doom Blade +1 [DGM:57] Blood Baron of Vizkopa +3 [GTC:182] Obzedat, Ghost Council +2 [DGM:103] Sin Collector +3 [C14:158] Read the Bones +4 [THS:107] Thoughtseize +1 [THS:110] Whip of Erebos +4 [THS:90] Hero's Downfall +1 [THS:9] Elspeth, Sun's Champion +4 [C13:312] Orzhov Guildgate +1 [M14:228] Mutavault +4 [THS:227] Temple of Silence +SB: 1 [DGM:57] Blood Baron of Vizkopa +SB: 1 [M14:96] Doom Blade +SB: 1 [RTR:231] Pithing Needle +SB: 1 [RTR:83] Underworld Connections +SB: 2 [DGM:103] Sin Collector +SB: 1 [THS:22] Last Breath +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 2 [M14:101] Lifebane Zombie +SB: 1 [GTC:63] Devour Flesh +SB: 3 [M14:18] Fiendslayer Paladin +SB: 1 [THS:100] Pharika's Cure diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Owling Mine 34 PT Honolulu ST 3-5-06.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Owling Mine 34 PT Honolulu ST 3-5-06.dck new file mode 100644 index 00000000000..8e3c8f2cdd4 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Owling Mine 34 PT Honolulu ST 3-5-06.dck @@ -0,0 +1,25 @@ +4 [CMD:251] Howling Mine +4 [CHK:59] Eye of Nowhere +10 [UNH:137] Island +2 [10E:83] Evacuation +4 [RTR:247] Steam Vents +2 [PTK:42] Exhaustion +2 [UNH:139] Mountain +1 [POR:42] Balance of Power +2 [SOK:162] Mikokoro, Center of the Sea +4 [SOK:154] Ebony Owl Netsuke +4 [RAV:63] Remand +4 [10E:70] Boomerang +4 [SOK:42] Kami of the Crescent Moon +3 [ME4:62] Sleight of Hand +4 [10E:241] Sudden Impact +1 [USG:74] Exhaustion +4 [M15:246] Shivan Reef +1 [PO2:46] Sleight of Hand +SB: 4 [BOK:56] Threads of Disloyalty +SB: 1 [DRK:57] Blood Moon +SB: 1 [9ED:176] Blood Moon +SB: 3 [M12:63] Mana Leak +SB: 2 [CHK:74] Meloku the Clouded Mirror +SB: 1 [8ED:178] Blood Moon +SB: 3 [M11:154] Pyroclasm diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Quick n Toast 2 World Championship 2008 (Memphis) ST 12-14-08.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Quick n Toast 2 World Championship 2008 (Memphis) ST 12-14-08.dck new file mode 100644 index 00000000000..5487fdd89bf --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Quick n Toast 2 World Championship 2008 (Memphis) ST 12-14-08.dck @@ -0,0 +1,32 @@ +2 [M15:71] Negate +2 [LRW:202] Cloudthresher +2 [C13:195] Jund Charm +4 [C13:334] Vivid Creek +1 [10E:116] Tidings +1 [M11:154] Pyroclasm +1 [C13:182] Cruel Ultimatum +1 [EVE:177] Flooded Grove +1 [SHM:280] Sunken Ruins +4 [LRW:56] Cryptic Command +4 [CNS:210] Reflecting Pool +4 [C14:118] Mulldrifter +1 [SHM:172] Oona, Queen of the Fae +3 [ALA:167] Esper Charm +2 [SHM:271] Fire-Lit Thicket +4 [10E:100] Remove Soul +3 [C13:27] Wrath of God +2 [C14:69] Condemn +1 [M15:249] Yavimaya Coast +4 [C13:335] Vivid Grove +4 [SHM:277] Mystic Gate +4 [CMD:297] Vivid Meadow +4 [ALA:188] Rhox War Monk +1 [10E:362] Underground River +SB: 1 [RTR:231] Pithing Needle +SB: 1 [CMD:8] Austere Command +SB: 1 [C13:27] Wrath of God +SB: 1 [EVE:22] Glen Elendra Archmage +SB: 2 [C14:69] Condemn +SB: 2 [M11:154] Pyroclasm +SB: 4 [MOR:58] Bitterblossom +SB: 3 [SHM:208] Guttural Response diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/RB Sauce 34 World Championship 2008 (Memphis) ST 12-14-08.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/RB Sauce 34 World Championship 2008 (Memphis) ST 12-14-08.dck new file mode 100644 index 00000000000..fdeddbc2f39 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/RB Sauce 34 World Championship 2008 (Memphis) ST 12-14-08.dck @@ -0,0 +1,21 @@ +4 [M12:146] Incinerate +4 [10E:359] Sulfurous Springs +4 [M10:157] Siege-Gang Commander +6 [UNH:139] Mountain +4 [MOR:58] Bitterblossom +3 [CNS:210] Reflecting Pool +3 [SHM:192] Murderous Redcap +4 [SHM:203] Boggart Ram-Gang +4 [JOU:103] Magma Spray +4 [SHM:272] Graven Cairns +4 [ALA:156] Blightning +4 [LRW:267] Auntie's Hovel +4 [EVE:139] Figure of Destiny +4 [SHM:92] Flame Javelin +4 [10E:353] Ghitu Encampment +SB: 3 [SHM:180] Ashenmoor Gouger +SB: 1 [C14:247] Loxodon Warhammer +SB: 2 [C14:160] Shriekmaw +SB: 2 [C13:233] Spiteful Visions +SB: 4 [ALA:120] Vithian Stinger +SB: 3 [C13:81] Infest diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Red Deck Wins 34 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Red Deck Wins 34 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..cd2c99accf8 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Red Deck Wins 34 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,19 @@ +2 [M12:146] Incinerate +3 [M12:145] Grim Lavamancer +4 [M14:134] Chandra's Phoenix +4 [M12:139] Goblin Fireslinger +4 [M12:156] Stormblood Berserker +4 [NPH:100] Volt Charge +3 [SOM:91] Galvanic Blast +21 [UNH:139] Mountain +2 [SOM:81] Arc Trail +4 [NPH:86] Gut Shot +1 [SOM:104] Spikeshot Elder +4 [ISD:164] Stromkirk Noble +4 [NPH:153] Shrine of Burning Rage +SB: 2 [ISD:166] Traitorous Blood +SB: 4 [NPH:101] Vulshok Refugee +SB: 4 [NPH:57] Dismember +SB: 1 [M12:151] Manic Vandal +SB: 2 [SOM:94] Koth of the Hammer +SB: 2 [SOM:81] Arc Trail diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(1) 58 World Championship 2007 (New York) ST 12-6-07.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(1) 58 World Championship 2007 (New York) ST 12-6-07.dck new file mode 100644 index 00000000000..d238b630ef7 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(1) 58 World Championship 2007 (New York) ST 12-6-07.dck @@ -0,0 +1,31 @@ +1 [C14:247] Loxodon Warhammer +2 [M12:165] Birds of Paradise +1 [LEG:250] Pendelhaven +2 [CSP:153] Snow-Covered Swamp +1 [ME2:243] Snow-Covered Swamp +3 [M15:103] Liliana Vess +1 [FUT:177] Horizon Canopy +3 [LRW:128] Nameless Inversion +4 [FUT:153] Tarmogoyf +2 [C14:206] Masked Admirers +1 [LRW:110] Eyeblight's Ending +4 [THS:107] Thoughtseize +4 [C14:204] Llanowar Elves +3 [C14:156] Profane Command +3 [C14:160] Shriekmaw +1 [M15:248] Urborg, Tomb of Yawgmoth +4 [LRW:268] Gilt-Leaf Palace +4 [DDM:57] Ohran Viper +5 [UNH:140] Forest +3 [CMD:157] Garruk Wildspeaker +4 [M15:244] Llanowar Wastes +4 [10E:361] Treetop Village +SB: 1 [RTR:231] Pithing Needle +SB: 1 [LRW:128] Nameless Inversion +SB: 1 [PLC:85] Damnation +SB: 4 [LRW:210] Eyes of the Wisent +SB: 1 [C14:160] Shriekmaw +SB: 3 [10E:308] Viridian Shaman +SB: 1 [FUT:136] Riftsweeper +SB: 2 [10E:145] Graveborn Muse +SB: 1 [PLC:71] Extirpate diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(2) 58 World Championship 2007 (New York) ST 12-6-07.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(2) 58 World Championship 2007 (New York) ST 12-6-07.dck new file mode 100644 index 00000000000..f43c1aeb5d2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Rock(2) 58 World Championship 2007 (New York) ST 12-6-07.dck @@ -0,0 +1,32 @@ +2 [C14:247] Loxodon Warhammer +1 [LRW:250] Nath of the Gilt-Leaf +4 [M12:165] Birds of Paradise +3 [UNH:138] Swamp +1 [LEG:250] Pendelhaven +1 [FUT:91] Tombstalker +1 [LRW:128] Nameless Inversion +4 [FUT:153] Tarmogoyf +3 [LRW:110] Eyeblight's Ending +3 [CMD:176] Troll Ascetic +4 [THS:107] Thoughtseize +4 [C14:204] Llanowar Elves +2 [C14:160] Shriekmaw +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [CSP:115] Ohran Viper +3 [LRW:268] Gilt-Leaf Palace +3 [DDM:57] Ohran Viper +7 [UNH:140] Forest +4 [CMD:157] Garruk Wildspeaker +4 [M15:244] Llanowar Wastes +4 [10E:361] Treetop Village +SB: 1 [PLC:85] Damnation +SB: 1 [UNH:138] Swamp +SB: 1 [LRW:202] Cloudthresher +SB: 1 [CMD:176] Troll Ascetic +SB: 1 [LRW:110] Eyeblight's Ending +SB: 2 [LRW:210] Eyes of the Wisent +SB: 1 [C14:156] Profane Command +SB: 2 [C14:160] Shriekmaw +SB: 1 [FUT:91] Tombstalker +SB: 2 [C13:153] Krosan Grip +SB: 2 [M15:103] Liliana Vess diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saint WW with Leaks 58 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saint WW with Leaks 58 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..6a67a5a6f2a --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saint WW with Leaks 58 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,27 @@ +1 [MBS:115] Mortarpod +4 [ISD:244] Moorland Haunt +4 [CNS:69] Doomed Traveler +1 [UNH:137] Island +3 [M12:18] Gideon's Lawkeeper +11 [UNH:136] Plains +3 [M12:63] Mana Leak +3 [ISD:213] Geist of Saint Traft +2 [MBS:10] Leonin Relic-Warder +2 [M13:22] Oblivion Ring +4 [MBS:14] Mirran Crusader +4 [MBS:8] Hero of Bladehold +2 [NPH:57] Dismember +4 [SOM:229] Seachrome Coast +4 [M13:225] Glacial Fortress +4 [C13:11] Fiend Hunter +4 [M12:23] Honor of the Pure +SB: 2 [BNG:25] Revoke Existence +SB: 1 [M13:22] Oblivion Ring +SB: 4 [M12:40] Timely Reinforcements +SB: 2 [NPH:57] Dismember +SB: 1 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [ISD:213] Geist of Saint Traft +SB: 1 [M12:3] Angelic Destiny +SB: 1 [M12:12] Day of Judgment +SB: 1 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saito Naya 34 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saito Naya 34 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..582b0fb20a2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Saito Naya 34 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,25 @@ +4 [M13:171] Flinthoof Boar +4 [GTC:156] Domri Rade +4 [RTR:248] Temple Garden +1 [M13:193] Thragtusk +4 [GTC:123] Gyre Sage +4 [RTR:178] Loxodon Smiter +3 [ISD:238] Clifftop Retreat +2 [UNH:139] Mountain +4 [GTC:247] Stomping Ground +4 [GTC:245] Sacred Foundry +4 [DKA:93] Hellrider +4 [GTC:216] Burning-Tree Emissary +4 [GTC:215] Boros Reckoner +4 [M13:228] Rootbound Crag +3 [M13:229] Sunpetal Grove +3 [M13:150] Thundermaw Hellkite +4 [RTR:101] Mizzium Mortars +SB: 2 [AVR:31] Nearheath Pilgrim +SB: 2 [ISD:181] Garruk Relentless +SB: 1 [GTC:143] Aurelia, the Warleader +SB: 1 [M13:193] Thragtusk +SB: 3 [C13:179] Boros Charm +SB: 2 [M14:25] Pacifism +SB: 2 [AVR:198] Triumph of Ferocity +SB: 2 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Selesnya Aggro 2 PT Magic 2015 (Portland) ST 8-3-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Selesnya Aggro 2 PT Magic 2015 (Portland) ST 8-3-14.dck new file mode 100644 index 00000000000..c1584b1bc65 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Selesnya Aggro 2 PT Magic 2015 (Portland) ST 8-3-14.dck @@ -0,0 +1,20 @@ +4 [JOU:163] Mana Confluence +4 [RTR:248] Temple Garden +8 [UNH:136] Plains +2 [M15:202] Sunblade Elf +3 [THS:32] Soldier of the Pantheon +3 [JOU:5] Banishing Light +3 [RTR:178] Loxodon Smiter +3 [C13:211] Selesnya Charm +3 [THS:152] Boon Satyr +3 [M14:1] Ajani, Caller of the Pride +4 [THS:193] Fleecemane Lion +4 [GTC:119] Experiment One +4 [DGM:114] Voice of Resurgence +4 [DGM:51] Advent of the Wurm +8 [UNH:140] Forest +SB: 4 [JOU:140] Setessan Tactics +SB: 1 [M15:1] Ajani Steadfast +SB: 4 [DGM:49] Skylasher +SB: 4 [DGM:111] Unflinching Courage +SB: 2 [JOU:2] Ajani's Presence diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Snow Mana Ramp 58 PT Hollywood ST 5-25-08.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Snow Mana Ramp 58 PT Hollywood ST 5-25-08.dck new file mode 100644 index 00000000000..075f8f6ada0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Snow Mana Ramp 58 PT Hollywood ST 5-25-08.dck @@ -0,0 +1,27 @@ +2 [LRW:233] Primal Command +4 [C13:148] Harmonize +1 [ME2:244] Snow-Covered Mountain +3 [LRW:202] Cloudthresher +5 [ME2:245] Snow-Covered Forest +2 [FUT:144] Edge of Autumn +4 [SHM:229] Kitchen Finks +2 [FNMP:98] Wall of Roots +1 [MIR:151] Wall of Roots +3 [CSP:148] Mouth of Ronom +2 [CSP:147] Highland Weald +1 [SHM:252] Grim Poppet +1 [ARC:73] Wall of Roots +4 [FUT:176] Grove of the Burnwillows +3 [ICE:347] Snow-Covered Forest +2 [CSP:155] Snow-Covered Forest +4 [CMD:199] Firespout +4 [MOR:116] Chameleon Colossus +4 [CSP:97] Skred +4 [10E:361] Treetop Village +4 [CSP:111] Into the North +SB: 4 [FUT:101] Magus of the Moon +SB: 4 [FUT:153] Tarmogoyf +SB: 1 [LRW:202] Cloudthresher +SB: 2 [M11:154] Pyroclasm +SB: 1 [SHM:66] Faerie Macabre +SB: 3 [CMD:157] Garruk Wildspeaker diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel 34 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel 34 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..3b544c79177 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel 34 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,22 @@ +2 [ISD:244] Moorland Haunt +6 [SOM:156] Glint Hawk Idol +4 [MBS:131] Signal Pest +4 [SOM:189] Origin Spellbomb +9 [UNH:136] Plains +4 [MBS:145] Inkmoth Nexus +4 [SOM:179] Mox Opal +4 [NPH:76] Vault Skirge +1 [ISD:23] Mikaeus, the Lunarch +4 [NPH:7] Dispatch +4 [SOM:154] Etched Champion +4 [SOM:229] Seachrome Coast +2 [SOM:10] Glint Hawk +4 [SOM:24] Tempered Steel +4 [SOM:174] Memnite +SB: 1 [M13:22] Oblivion Ring +SB: 1 [M12:40] Timely Reinforcements +SB: 3 [NPH:159] Spellskite +SB: 3 [MBS:8] Hero of Bladehold +SB: 2 [NPH:57] Dismember +SB: 4 [NPH:155] Shrine of Loyal Legions +SB: 1 [M13:225] Glacial Fortress diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(1) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(1) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..2331fc987e2 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(1) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,22 @@ +2 [ISD:244] Moorland Haunt +4 [SOM:156] Glint Hawk Idol +4 [MBS:131] Signal Pest +4 [SOM:189] Origin Spellbomb +9 [UNH:136] Plains +4 [MBS:145] Inkmoth Nexus +4 [SOM:179] Mox Opal +4 [NPH:76] Vault Skirge +1 [ISD:23] Mikaeus, the Lunarch +4 [NPH:7] Dispatch +4 [SOM:154] Etched Champion +4 [SOM:229] Seachrome Coast +4 [SOM:10] Glint Hawk +4 [SOM:24] Tempered Steel +4 [SOM:174] Memnite +SB: 1 [M13:22] Oblivion Ring +SB: 1 [M12:40] Timely Reinforcements +SB: 3 [NPH:159] Spellskite +SB: 3 [MBS:8] Hero of Bladehold +SB: 2 [NPH:57] Dismember +SB: 4 [NPH:155] Shrine of Loyal Legions +SB: 1 [M13:225] Glacial Fortress diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(2) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(2) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..5273130f8ef --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(2) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,22 @@ +2 [ISD:244] Moorland Haunt +5 [SOM:156] Glint Hawk Idol +4 [MBS:131] Signal Pest +4 [SOM:189] Origin Spellbomb +9 [UNH:136] Plains +4 [MBS:145] Inkmoth Nexus +4 [SOM:179] Mox Opal +4 [NPH:76] Vault Skirge +1 [ISD:23] Mikaeus, the Lunarch +4 [NPH:7] Dispatch +4 [SOM:154] Etched Champion +4 [SOM:229] Seachrome Coast +3 [SOM:10] Glint Hawk +4 [SOM:24] Tempered Steel +4 [SOM:174] Memnite +SB: 1 [M13:22] Oblivion Ring +SB: 1 [M12:40] Timely Reinforcements +SB: 3 [NPH:159] Spellskite +SB: 3 [MBS:8] Hero of Bladehold +SB: 2 [NPH:57] Dismember +SB: 4 [NPH:155] Shrine of Loyal Legions +SB: 1 [M13:225] Glacial Fortress diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(3) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(3) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck new file mode 100644 index 00000000000..3b544c79177 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tempered Steel(3) 58 World Championship 2011 (San Francisco) ST 11-20-11.dck @@ -0,0 +1,22 @@ +2 [ISD:244] Moorland Haunt +6 [SOM:156] Glint Hawk Idol +4 [MBS:131] Signal Pest +4 [SOM:189] Origin Spellbomb +9 [UNH:136] Plains +4 [MBS:145] Inkmoth Nexus +4 [SOM:179] Mox Opal +4 [NPH:76] Vault Skirge +1 [ISD:23] Mikaeus, the Lunarch +4 [NPH:7] Dispatch +4 [SOM:154] Etched Champion +4 [SOM:229] Seachrome Coast +2 [SOM:10] Glint Hawk +4 [SOM:24] Tempered Steel +4 [SOM:174] Memnite +SB: 1 [M13:22] Oblivion Ring +SB: 1 [M12:40] Timely Reinforcements +SB: 3 [NPH:159] Spellskite +SB: 3 [MBS:8] Hero of Bladehold +SB: 2 [NPH:57] Dismember +SB: 4 [NPH:155] Shrine of Loyal Legions +SB: 1 [M13:225] Glacial Fortress diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tezzeret Control 58 PT Paris ST 2-13-11.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tezzeret Control 58 PT Paris ST 2-13-11.dck new file mode 100644 index 00000000000..b935fbdfd67 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Tezzeret Control 58 PT Paris ST 2-13-11.dck @@ -0,0 +1,31 @@ +4 [WWK:134] Creeping Tar Pit +3 [MBS:134] Sphere of the Suns +4 [MBS:97] Tezzeret, Agent of Bolas +2 [MBS:75] Slagstorm +3 [UNH:137] Island +3 [WWK:31] Jace, the Mind Sculptor +2 [SOM:179] Mox Opal +2 [MBS:145] Inkmoth Nexus +2 [SOM:91] Galvanic Blast +2 [M11:154] Pyroclasm +2 [UNH:139] Mountain +4 [GTC:234] Prophetic Prism +1 [MBS:34] Treasure Mage +2 [SOM:46] Stoic Rebuttal +1 [C14:283] Wurmcoil Engine +3 [C14:313] Tectonic Edge +3 [SOM:218] Tumble Magnet +3 [SOM:226] Darkslick Shores +4 [M11:70] Preordain +4 [ZEN:223] Scalding Tarn +4 [C14:239] Everflowing Chalice +1 [SOM:176] Mindslaver +1 [SOM:224] Blackcleave Cliffs +SB: 4 [ZEN:70] Spreading Seas +SB: 2 [SOM:46] Stoic Rebuttal +SB: 3 [M14:97] Duress +SB: 1 [M12:52] Flashfreeze +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [WWK:31] Jace, the Mind Sculptor +SB: 2 [M11:154] Pyroclasm +SB: 1 [SOM:96] Kuldotha Rebirth diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/The Aristocrats 1 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/The Aristocrats 1 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..e6f0d83a1d0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/The Aristocrats 1 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,28 @@ +4 [CNS:69] Doomed Traveler +1 [AVR:32] Restoration Angel +3 [UNH:136] Plains +4 [RTR:238] Blood Crypt +3 [M13:96] Knight of Infamy +4 [GTC:242] Godless Shrine +4 [GTC:150] Cartel Aristocrat +2 [C14:88] Silverblade Paladin +1 [ISD:238] Clifftop Retreat +2 [DKA:12] Lingering Souls +4 [ISD:242] Isolated Chapel +4 [GTC:245] Sacred Foundry +4 [ISD:6] Champion of the Parish +2 [C14:163] Skirsdag High Priest +2 [AVR:166] Zealous Conscripts +4 [GTC:215] Boros Reckoner +1 [DKA:158] Vault of the Archangel +4 [DKA:138] Falkenrath Aristocrat +4 [GTC:185] Orzhov Charm +3 [AVR:226] Cavern of Souls +SB: 3 [C14:167] Tragic Slip +SB: 2 [GTC:182] Obzedat, Ghost Council +SB: 1 [C14:79] Mentor of the Meek +SB: 1 [C14:163] Skirsdag High Priest +SB: 2 [C14:172] Blasphemous Act +SB: 2 [DKA:142] Sorin, Lord of Innistrad +SB: 2 [DKA:12] Lingering Souls +SB: 2 [RTR:18] Rest in Peace diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Trinity 34 World Championship 2000 (Brussels) ST 8-6-00.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Trinity 34 World Championship 2000 (Brussels) ST 8-6-00.dck new file mode 100644 index 00000000000..82458d9d4d6 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/Trinity 34 World Championship 2000 (Brussels) ST 8-6-00.dck @@ -0,0 +1,27 @@ +3 [USG:321] Gaea's Cradle +2 [8ED:272] Plow Under +1 [UDS:118] Rofellos, Llanowar Emissary +4 [M12:165] Birds of Paradise +4 [NMS:119] Skyshroud Poacher +2 [UDS:117] Plow Under +4 [NMS:139] Tangle Wire +1 [UDS:134] Masticore +2 [JR:18] Deranged Hermit +4 [C14:210] Priest of Titania +1 [USG:306] Phyrexian Processor +4 [C14:204] Llanowar Elves +2 [VMA:229] Rofellos, Llanowar Emissary +4 [MMQ:324] Rishadan Port +3 [VMA:275] Masticore +1 [USG:248] Elvish Lyrist +14 [UNH:140] Forest +2 [10E:361] Treetop Village +2 [ULG:101] Deranged Hermit +SB: 1 [USG:306] Phyrexian Processor +SB: 4 [UDS:140] Thran Foundry +SB: 2 [BOK:146] Splinter +SB: 1 [DDE:29] Phyrexian Processor +SB: 1 [UNH:140] Forest +SB: 2 [VIS:73] Uktabi Orangutan +SB: 1 [MIR:153] Worldly Tutor +SB: 2 [NMS:111] Reverent Silence diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 1 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 1 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..c7f768bb7ae --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 1 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,29 @@ +3 [ROE:115] Inquisition of Kozilek +4 [WWK:134] Creeping Tar Pit +4 [ZEN:70] Spreading Seas +3 [UNH:138] Swamp +1 [ZEN:220] Misty Rainforest +5 [UNH:137] Island +2 [ROE:100] Consume the Meek +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:63] Mana Leak +2 [M11:58] Jace Beleren +2 [C14:124] Sea Gate Oracle +2 [M14:96] Doom Blade +1 [M14:97] Duress +4 [M13:223] Drowned Catacomb +3 [C14:145] Grave Titan +4 [C14:313] Tectonic Edge +4 [SOM:226] Darkslick Shores +4 [M11:70] Preordain +2 [ZEN:87] Disfigure +1 [KTK:33] Cancel +1 [ZEN:229] Verdant Catacombs +SB: 1 [M12:109] Sorin Markov +SB: 1 [M14:96] Doom Blade +SB: 3 [SOM:69] Memoricide +SB: 2 [M14:97] Duress +SB: 2 [M12:52] Flashfreeze +SB: 3 [M14:215] Ratchet Bomb +SB: 1 [ROE:59] Deprive +SB: 2 [ZEN:87] Disfigure diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 2 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 2 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..df5a4447626 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 2 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,31 @@ +2 [ROE:115] Inquisition of Kozilek +4 [WWK:134] Creeping Tar Pit +4 [ZEN:70] Spreading Seas +3 [UNH:138] Swamp +1 [ZEN:220] Misty Rainforest +5 [UNH:137] Island +2 [ROE:100] Consume the Meek +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:63] Mana Leak +2 [M11:58] Jace Beleren +2 [C14:124] Sea Gate Oracle +2 [M14:96] Doom Blade +1 [SOM:46] Stoic Rebuttal +2 [M14:97] Duress +4 [M13:223] Drowned Catacomb +3 [C14:145] Grave Titan +2 [M14:215] Ratchet Bomb +4 [C14:313] Tectonic Edge +4 [SOM:226] Darkslick Shores +4 [M11:70] Preordain +1 [ZEN:229] Verdant Catacombs +SB: 1 [M12:109] Sorin Markov +SB: 1 [ROE:115] Inquisition of Kozilek +SB: 1 [M14:96] Doom Blade +SB: 3 [SOM:69] Memoricide +SB: 1 [SOM:46] Stoic Rebuttal +SB: 1 [M14:97] Duress +SB: 2 [M12:52] Flashfreeze +SB: 1 [M14:215] Ratchet Bomb +SB: 3 [ZEN:87] Disfigure +SB: 1 [M11:58] Jace Beleren diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 34 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 34 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..d2e75124e40 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 34 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,32 @@ +4 [ROE:115] Inquisition of Kozilek +4 [WWK:134] Creeping Tar Pit +4 [ZEN:70] Spreading Seas +3 [UNH:138] Swamp +1 [ZEN:220] Misty Rainforest +4 [UNH:137] Island +1 [ROE:100] Consume the Meek +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:63] Mana Leak +1 [M11:58] Jace Beleren +3 [C14:124] Sea Gate Oracle +3 [M14:96] Doom Blade +4 [M13:223] Drowned Catacomb +3 [C14:145] Grave Titan +4 [C14:313] Tectonic Edge +4 [SOM:226] Darkslick Shores +4 [M11:70] Preordain +2 [ZEN:87] Disfigure +1 [M11:226] Mystifying Maze +1 [KTK:33] Cancel +1 [ZEN:229] Verdant Catacombs +SB: 1 [SOM:46] Stoic Rebuttal +SB: 1 [M14:97] Duress +SB: 1 [ZEN:57] Mindbreak Trap +SB: 1 [M12:52] Flashfreeze +SB: 1 [M14:215] Ratchet Bomb +SB: 2 [SOM:78] Skinrender +SB: 1 [ROE:59] Deprive +SB: 2 [ZEN:87] Disfigure +SB: 1 [M11:58] Jace Beleren +SB: 1 [ZEN:67] Spell Pierce +SB: 3 [C13:97] Vampire Nighthawk diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck new file mode 100644 index 00000000000..55b9f03df19 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 PT Khans of Tarkir (Honolulu) ST 10-12-14.dck @@ -0,0 +1,30 @@ +4 [KTK:239] Polluted Delta +3 [BNG:61] Bile Blight +4 [UNH:138] Swamp +4 [THS:47] Dissolve +4 [UNH:137] Island +2 [KTK:233] Flooded Strand +4 [KTK:69] Despise +1 [JOU:165] Temple of Malady +2 [BNG:65] Drown in Sorrow +1 [THS:226] Temple of Mystery +4 [THS:225] Temple of Deceit +2 [THS:107] Thoughtseize +4 [KTK:232] Dismal Backwater +4 [THS:90] Hero's Downfall +4 [KTK:37] Disdainful Stroke +4 [THS:60] Prognostic Sphinx +4 [KTK:36] Dig Through Time +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [KTK:230] Bloodstained Mire +2 [JOU:82] Silence the Believers +SB: 2 [M15:71] Negate +SB: 1 [KTK:49] Pearl Lake Ancient +SB: 1 [BNG:61] Bile Blight +SB: 1 [KTK:54] Set Adrift +SB: 1 [THS:107] Thoughtseize +SB: 2 [THS:104] Returned Phalanx +SB: 1 [JOU:82] Silence the Believers +SB: 3 [KTK:34] Clever Impersonator +SB: 1 [THS:100] Pharika's Cure +SB: 2 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 World Championship 2005 (Yokohama) ST 12-4-05.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 World Championship 2005 (Yokohama) ST 12-4-05.dck new file mode 100644 index 00000000000..9b35dba9a2c --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control 58 World Championship 2005 (Yokohama) ST 12-4-05.dck @@ -0,0 +1,29 @@ +2 [RTR:231] Pithing Needle +4 [UNH:138] Swamp +1 [CHK:279] Minamo, School at Water's Edge +9 [UNH:137] Island +3 [M12:63] Mana Leak +3 [CHK:74] Meloku the Clouded Mirror +1 [CHK:72] Keiga, the Tide Star +2 [CHK:115] Hideous Laughter +4 [CHK:65] Hinder +3 [M13:65] Rewind +1 [SOK:163] Miren, the Moaning Well +1 [CHK:283] Shizo, Death's Storehouse +3 [RAV:93] Last Gasp +1 [SOK:164] Oboro, Palace in the Clouds +3 [10E:70] Boomerang +4 [CHK:70] Jushi Apprentice +1 [BOK:71] Ink-Eyes, Servant of Oni +3 [BOK:33] Disrupting Shoal +3 [C13:31] Azami, Lady of Scrolls +4 [GTC:249] Watery Grave +4 [10E:362] Underground River +SB: 1 [RTR:231] Pithing Needle +SB: 2 [RAV:82] Darkblast +SB: 2 [CHK:273] Boseiju, Who Shelters All +SB: 4 [BOK:56] Threads of Disloyalty +SB: 2 [7ED:154] Persecute +SB: 1 [8ED:151] Persecute +SB: 2 [SOK:51] Overwhelming Intellect +SB: 1 [CHK:115] Hideous Laughter diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragon 2 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragon 2 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..39275a907ca --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragon 2 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,32 @@ +3 [FRF:65] Crux of Fate +4 [KTK:239] Polluted Delta +3 [DTK:58] Icefall Regent +3 [M15:63] Jace's Ingenuity +2 [BNG:61] Bile Blight +2 [KTK:238] Opulent Palace +3 [UNH:138] Swamp +2 [THS:47] Dissolve +6 [UNH:137] Island +4 [DTK:78] Silumgar's Scorn +2 [DTK:220] Dragonlord Silumgar +1 [DTK:249] Haven of the Spirit Dragon +4 [THS:225] Temple of Deceit +2 [DTK:124] Ultimate Price +2 [THS:107] Thoughtseize +1 [FRF:157] Silumgar, the Drifting Death +3 [THS:90] Hero's Downfall +3 [KTK:36] Dig Through Time +1 [KTK:81] Murderous Cut +2 [M15:248] Urborg, Tomb of Yawgmoth +4 [FRF:168] Dismal Backwater +1 [FRF:1] Ugin, the Spirit Dragon +2 [DTK:102] Foul-Tongue Invocation +SB: 1 [DTK:125] Virulent Plague +SB: 1 [DTK:124] Ultimate Price +SB: 1 [BNG:61] Bile Blight +SB: 1 [DTK:65] Negate +SB: 1 [DTK:52] Dragonlord's Prerogative +SB: 2 [KTK:37] Disdainful Stroke +SB: 3 [DTK:98] Duress +SB: 2 [DTK:80] Stratus Dancer +SB: 3 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragonless 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragonless 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..265c316d9c6 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control Dragonless 34 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,37 @@ +1 [M15:51] Dissipate +4 [UNH:138] Swamp +3 [UNH:137] Island +4 [THS:47] Dissolve +1 [JOU:165] Temple of Malady +1 [M15:103] Liliana Vess +4 [THS:225] Temple of Deceit +4 [THS:90] Hero's Downfall +3 [KTK:36] Dig Through Time +4 [KTK:239] Polluted Delta +1 [FRF:65] Crux of Fate +2 [M15:63] Jace's Ingenuity +2 [KTK:238] Opulent Palace +4 [BNG:61] Bile Blight +1 [DTK:52] Dragonlord's Prerogative +2 [THS:188] Ashiok, Nightmare Weaver +1 [BNG:163] Temple of Enlightenment +1 [BNG:65] Drown in Sorrow +1 [M15:44] AEtherspouts +1 [DTK:124] Ultimate Price +3 [M15:224] Perilous Vault +4 [FRF:168] Dismal Backwater +1 [M15:248] Urborg, Tomb of Yawgmoth +2 [FRF:1] Ugin, the Spirit Dragon +2 [JOU:82] Silence the Believers +3 [M15:245] Radiant Fountain +SB: 1 [JOU:43] Interpret the Signs +SB: 1 [M15:44] AEtherspouts +SB: 1 [KTK:49] Pearl Lake Ancient +SB: 1 [FRF:87] Tasigur, the Golden Fang +SB: 1 [KTK:218] Cranial Archive +SB: 2 [THS:107] Thoughtseize +SB: 2 [DTK:65] Negate +SB: 2 [KTK:37] Disdainful Stroke +SB: 1 [THS:188] Ashiok, Nightmare Weaver +SB: 1 [THS:100] Pharika's Cure +SB: 2 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(1) 58 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(1) 58 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..0ec4fb72e92 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(1) 58 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,27 @@ +4 [WWK:134] Creeping Tar Pit +3 [UNH:138] Swamp +2 [ZEN:220] Misty Rainforest +5 [UNH:137] Island +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:63] Mana Leak +3 [M11:58] Jace Beleren +3 [C14:124] Sea Gate Oracle +3 [M14:96] Doom Blade +2 [SOM:46] Stoic Rebuttal +2 [M14:97] Duress +4 [M13:223] Drowned Catacomb +3 [C14:145] Grave Titan +4 [C14:313] Tectonic Edge +3 [M14:215] Ratchet Bomb +4 [SOM:226] Darkslick Shores +4 [M11:70] Preordain +3 [ZEN:87] Disfigure +SB: 1 [M14:96] Doom Blade +SB: 3 [M15:71] Negate +SB: 1 [M14:97] Duress +SB: 1 [WWK:68] Smother +SB: 2 [ZEN:57] Mindbreak Trap +SB: 3 [M12:52] Flashfreeze +SB: 2 [ROE:100] Consume the Meek +SB: 1 [M14:215] Ratchet Bomb +SB: 1 [ZEN:87] Disfigure diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(2) 58 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(2) 58 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..20780135be8 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UB Control(2) 58 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,27 @@ +4 [ROE:115] Inquisition of Kozilek +4 [WWK:134] Creeping Tar Pit +4 [ZEN:70] Spreading Seas +3 [UNH:138] Swamp +1 [ZEN:220] Misty Rainforest +5 [UNH:137] Island +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:63] Mana Leak +2 [M11:58] Jace Beleren +3 [C14:124] Sea Gate Oracle +3 [M14:96] Doom Blade +4 [M13:223] Drowned Catacomb +3 [C14:145] Grave Titan +1 [M14:215] Ratchet Bomb +4 [C14:313] Tectonic Edge +4 [SOM:226] Darkslick Shores +4 [M11:70] Preordain +2 [ZEN:87] Disfigure +1 [ZEN:229] Verdant Catacombs +SB: 2 [M15:71] Negate +SB: 2 [SOM:69] Memoricide +SB: 1 [SOM:46] Stoic Rebuttal +SB: 1 [M14:97] Duress +SB: 3 [M12:52] Flashfreeze +SB: 1 [M14:215] Ratchet Bomb +SB: 2 [ZEN:87] Disfigure +SB: 3 [C13:97] Vampire Nighthawk diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UBw Control Dragon 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UBw Control Dragon 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck new file mode 100644 index 00000000000..1d5577cdce0 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UBw Control Dragon 58 PT Dragons of Tarkir (Brussels) ST 4-12-15.dck @@ -0,0 +1,35 @@ +2 [FRF:65] Crux of Fate +4 [KTK:239] Polluted Delta +2 [DTK:58] Icefall Regent +3 [UNH:138] Swamp +3 [UNH:137] Island +4 [DTK:78] Silumgar's Scorn +1 [DTK:52] Dragonlord's Prerogative +2 [DTK:219] Dragonlord Ojutai +2 [DTK:220] Dragonlord Silumgar +4 [DTK:45] Anticipate +3 [BNG:163] Temple of Enlightenment +2 [DTK:249] Haven of the Spirit Dragon +4 [THS:225] Temple of Deceit +2 [DTK:124] Ultimate Price +3 [THS:107] Thoughtseize +2 [FRF:157] Silumgar, the Drifting Death +3 [THS:90] Hero's Downfall +2 [KTK:36] Dig Through Time +1 [M15:248] Urborg, Tomb of Yawgmoth +4 [FRF:168] Dismal Backwater +1 [C14:161] Sign in Blood +1 [FRF:1] Ugin, the Spirit Dragon +3 [DTK:102] Foul-Tongue Invocation +2 [THS:227] Temple of Silence +SB: 1 [DTK:125] Virulent Plague +SB: 1 [BNG:61] Bile Blight +SB: 2 [DTK:65] Negate +SB: 1 [THS:107] Thoughtseize +SB: 1 [M15:224] Perilous Vault +SB: 1 [THS:90] Hero's Downfall +SB: 1 [DTK:80] Stratus Dancer +SB: 1 [THS:188] Ashiok, Nightmare Weaver +SB: 2 [M15:65] Jorubai Murk Lurker +SB: 1 [DTK:102] Foul-Tongue Invocation +SB: 3 [BNG:65] Drown in Sorrow diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 1 PT Magic 2015 (Portland) ST 8-3-14.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 1 PT Magic 2015 (Portland) ST 8-3-14.dck new file mode 100644 index 00000000000..41dca3a2037 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 1 PT Magic 2015 (Portland) ST 8-3-14.dck @@ -0,0 +1,27 @@ +3 [M15:52] Divination +4 [RTR:145] Azorius Charm +3 [RTR:44] Jace, Architect of Thought +1 [JOU:164] Temple of Epiphany +2 [THS:22] Last Breath +4 [THS:47] Dissolve +6 [UNH:137] Island +2 [C13:275] Azorius Guildgate +6 [UNH:136] Plains +4 [RTR:200] Sphinx's Revelation +4 [RTR:201] Supreme Verdict +4 [BNG:163] Temple of Enlightenment +4 [M14:68] Quicken +1 [M14:209] Elixir of Immortality +1 [THS:228] Temple of Triumph +2 [M14:228] Mutavault +2 [RTR:54] Syncopate +3 [M14:29] Planar Cleansing +4 [RTR:241] Hallowed Fountain +SB: 4 [JOU:18] Nyx-Fleece Ram +SB: 2 [THS:49] Gainsay +SB: 2 [THS:22] Last Breath +SB: 2 [M14:5] Archangel of Thune +SB: 2 [RTR:36] Dispel +SB: 1 [M14:60] Jace, Memory Adept +SB: 1 [THS:9] Elspeth, Sun's Champion +SB: 1 [JOU:7] Deicide diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 58 World Championship 2010 (Chiba) ST 12-12-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 58 World Championship 2010 (Chiba) ST 12-12-10.dck new file mode 100644 index 00000000000..583d37c4abd --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Control 58 World Championship 2010 (Chiba) ST 12-12-10.dck @@ -0,0 +1,26 @@ +2 [M15:71] Negate +4 [WWK:133] Celestial Colonnade +4 [ZEN:70] Spreading Seas +3 [M11:7] Baneslayer Angel +2 [M12:16] Gideon Jura +2 [ZEN:220] Misty Rainforest +5 [UNH:137] Island +4 [ROE:40] Oust +3 [UNH:136] Plains +4 [WWK:31] Jace, the Mind Sculptor +4 [M12:63] Mana Leak +2 [M11:58] Jace Beleren +1 [SOM:46] Stoic Rebuttal +4 [SOM:229] Seachrome Coast +4 [C14:313] Tectonic Edge +4 [M13:225] Glacial Fortress +4 [M11:70] Preordain +2 [SOM:6] Elspeth Tirel +2 [M12:12] Day of Judgment +SB: 2 [M15:71] Negate +SB: 1 [M11:7] Baneslayer Angel +SB: 1 [ZEN:57] Mindbreak Trap +SB: 3 [M12:52] Flashfreeze +SB: 3 [M14:215] Ratchet Bomb +SB: 4 [SOM:14] Leonin Arbiter +SB: 1 [SOM:135] Venser, the Sojourner diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..f6239aa78c1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,28 @@ +3 [ISD:244] Moorland Haunt +1 [ISD:231] Runechanter's Pike +9 [UNH:137] Island +1 [UNH:136] Plains +4 [ISD:51] Delver of Secrets +4 [ISD:78] Snapcaster Mage +4 [M12:63] Mana Leak +2 [DKA:52] Thought Scour +4 [M12:73] Ponder +4 [ISD:213] Geist of Saint Traft +2 [ISD:60] Invisible Stalker +2 [NPH:86] Gut Shot +4 [NPH:35] Gitaxian Probe +4 [NPH:48] Vapor Snag +4 [SOM:229] Seachrome Coast +1 [NPH:57] Dismember +4 [M13:225] Glacial Fortress +3 [NPH:161] Sword of War and Peace +SB: 2 [BNG:25] Revoke Existence +SB: 1 [M13:22] Oblivion Ring +SB: 3 [M12:40] Timely Reinforcements +SB: 1 [NPH:116] Mutagenic Growth +SB: 2 [M15:51] Dissipate +SB: 1 [NPH:57] Dismember +SB: 1 [MBS:5] Divine Offering +SB: 2 [M12:72] Phantasmal Image +SB: 1 [M12:12] Day of Judgment +SB: 1 [MBS:21] Consecrated Sphinx diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Human Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Human Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..66e30a9138e --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UW Human Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,30 @@ +3 [DKA:8] Gather the Townsfolk +2 [ISD:244] Moorland Haunt +2 [MBS:115] Mortarpod +2 [CNS:69] Doomed Traveler +1 [DKA:7] Faith's Shield +5 [UNH:137] Island +5 [UNH:136] Plains +4 [ISD:51] Delver of Secrets +4 [ISD:78] Snapcaster Mage +4 [M12:63] Mana Leak +4 [M12:73] Ponder +2 [ISD:213] Geist of Saint Traft +1 [BNG:25] Revoke Existence +4 [NPH:35] Gitaxian Probe +4 [ISD:6] Champion of the Parish +1 [C14:80] Midnight Haunting +4 [NPH:48] Vapor Snag +4 [SOM:229] Seachrome Coast +4 [M13:225] Glacial Fortress +SB: 2 [M13:22] Oblivion Ring +SB: 2 [M15:71] Negate +SB: 1 [M12:40] Timely Reinforcements +SB: 1 [NPH:38] Mental Misstep +SB: 1 [DKA:7] Faith's Shield +SB: 1 [M14:215] Ratchet Bomb +SB: 2 [MBS:5] Divine Offering +SB: 1 [ISD:14] Feeling of Dread +SB: 1 [C13:42] Dungeon Geists +SB: 2 [NPH:86] Gut Shot +SB: 1 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 2 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 2 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..2ec24b94388 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 2 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,30 @@ +4 [RTR:145] Azorius Charm +4 [ISD:248] Sulfur Falls +3 [M13:147] Searing Spear +1 [UNH:137] Island +3 [AVR:32] Restoration Angel +1 [UNH:136] Plains +4 [RTR:247] Steam Vents +3 [ISD:78] Snapcaster Mage +4 [C13:179] Boros Charm +3 [RTR:200] Sphinx's Revelation +4 [ISD:238] Clifftop Retreat +1 [M13:75] Unsummon +1 [CNS:74] Moment of Heroism +4 [GTC:245] Sacred Foundry +4 [GTC:215] Boros Reckoner +2 [M13:225] Glacial Fortress +4 [C13:30] Augur of Bolas +2 [C14:172] Blasphemous Act +2 [RTR:172] Izzet Charm +2 [AVR:226] Cavern of Souls +2 [AVR:149] Pillar of Flame +2 [RTR:241] Hallowed Fountain +SB: 1 [RTR:47] Psychic Spiral +SB: 2 [M15:71] Negate +SB: 2 [RTR:201] Supreme Verdict +SB: 4 [ISD:213] Geist of Saint Traft +SB: 1 [M14:60] Jace, Memory Adept +SB: 2 [M13:150] Thundermaw Hellkite +SB: 2 [C14:278] Tormod's Crypt +SB: 1 [AVR:149] Pillar of Flame diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 58 PT Gatecrash (Montreal) ST 2-17-13.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 58 PT Gatecrash (Montreal) ST 2-17-13.dck new file mode 100644 index 00000000000..97de7c74b2d --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWR Midrange 58 PT Gatecrash (Montreal) ST 2-17-13.dck @@ -0,0 +1,31 @@ +4 [RTR:145] Azorius Charm +4 [ISD:248] Sulfur Falls +3 [M13:147] Searing Spear +1 [UNH:137] Island +3 [AVR:32] Restoration Angel +1 [UNH:136] Plains +4 [RTR:247] Steam Vents +3 [ISD:78] Snapcaster Mage +4 [DKA:52] Thought Scour +3 [RTR:200] Sphinx's Revelation +1 [RTR:201] Supreme Verdict +3 [ISD:238] Clifftop Retreat +2 [UNH:139] Mountain +1 [ISD:146] Harvest Pyre +1 [ISD:83] Think Twice +1 [M13:65] Rewind +2 [GTC:245] Sacred Foundry +4 [GTC:215] Boros Reckoner +4 [M13:225] Glacial Fortress +4 [C13:30] Augur of Bolas +1 [RTR:153] Counterflux +2 [RTR:101] Mizzium Mortars +4 [RTR:241] Hallowed Fountain +SB: 2 [M13:22] Oblivion Ring +SB: 2 [M15:71] Negate +SB: 2 [DKA:149] Grafdigger's Cage +SB: 2 [M14:55] Essence Scatter +SB: 2 [RTR:36] Dispel +SB: 1 [M13:29] Rhox Faithmender +SB: 3 [M14:60] Jace, Memory Adept +SB: 1 [M14:29] Planar Cleansing diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..a2e7ff04921 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 34 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,33 @@ +2 [ISD:244] Moorland Haunt +1 [UNH:138] Swamp +5 [UNH:137] Island +4 [ISD:78] Snapcaster Mage +1 [UNH:136] Plains +4 [ISD:51] Delver of Secrets +2 [M12:63] Mana Leak +4 [M12:73] Ponder +3 [M12:72] Phantasmal Image +1 [NPH:86] Gut Shot +4 [DKA:12] Lingering Souls +1 [BNG:25] Revoke Existence +4 [NPH:35] Gitaxian Probe +4 [NPH:48] Vapor Snag +4 [SOM:229] Seachrome Coast +3 [M13:225] Glacial Fortress +4 [SOM:226] Darkslick Shores +1 [MBS:5] Divine Offering +4 [DKA:136] Drogskol Captain +2 [C13:42] Dungeon Geists +2 [C14:295] Evolving Wilds +SB: 1 [M12:13] Demystify +SB: 1 [BNG:25] Revoke Existence +SB: 1 [M15:71] Negate +SB: 1 [M15:51] Dissipate +SB: 1 [NPH:57] Dismember +SB: 1 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [M12:72] Phantasmal Image +SB: 2 [C13:42] Dungeon Geists +SB: 2 [NPH:86] Gut Shot +SB: 2 [NPH:74] Surgical Extraction +SB: 1 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck new file mode 100644 index 00000000000..e9cac761e3f --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWb Delver 58 PT Dark Ascension (Honolulu) ST 2-12-12.dck @@ -0,0 +1,33 @@ +2 [ISD:244] Moorland Haunt +1 [UNH:138] Swamp +5 [UNH:137] Island +4 [ISD:78] Snapcaster Mage +1 [UNH:136] Plains +4 [ISD:51] Delver of Secrets +2 [M12:63] Mana Leak +4 [M12:73] Ponder +3 [M12:72] Phantasmal Image +4 [DKA:12] Lingering Souls +1 [BNG:25] Revoke Existence +4 [NPH:35] Gitaxian Probe +1 [NPH:116] Mutagenic Growth +4 [NPH:48] Vapor Snag +4 [SOM:229] Seachrome Coast +3 [M13:225] Glacial Fortress +4 [SOM:226] Darkslick Shores +1 [MBS:5] Divine Offering +4 [DKA:136] Drogskol Captain +2 [C13:42] Dungeon Geists +2 [C14:295] Evolving Wilds +SB: 1 [BNG:25] Revoke Existence +SB: 1 [M15:71] Negate +SB: 1 [M12:40] Timely Reinforcements +SB: 1 [M15:51] Dissipate +SB: 1 [NPH:57] Dismember +SB: 2 [M14:215] Ratchet Bomb +SB: 2 [M12:63] Mana Leak +SB: 1 [MBS:5] Divine Offering +SB: 1 [C13:42] Dungeon Geists +SB: 2 [NPH:86] Gut Shot +SB: 1 [NPH:74] Surgical Extraction +SB: 1 [M12:11] Celestial Purge diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWr Control 58 World Championship 2006 (Paris) ST 12-3-06.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWr Control 58 World Championship 2006 (Paris) ST 12-3-06.dck new file mode 100644 index 00000000000..d2546d923be --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/UWr Control 58 World Championship 2006 (Paris) ST 12-3-06.dck @@ -0,0 +1,30 @@ +4 [CMD:43] Court Hussar +2 [C13:279] Boros Garrison +2 [10E:347] Adarkar Wastes +1 [C13:331] Urza's Factory +3 [CMD:243] Boros Signet +3 [UNH:137] Island +1 [UNH:136] Plains +2 [RTR:247] Steam Vents +1 [APC:108] Lightning Angel +4 [RAV:213] Lightning Helix +1 [C14:86] Sacred Mesa +4 [DIS:60] Demonfire +1 [TSB:94] Lightning Angel +4 [C14:102] Compulsive Research +3 [GTC:245] Sacred Foundry +3 [DIS:159] Azorius Signet +4 [RAV:63] Remand +4 [C13:27] Wrath of God +2 [C13:296] Izzet Boilerworks +2 [C14:173] Bogardan Hellkite +2 [DDN:56] Lightning Angel +2 [M15:246] Shivan Reef +2 [TSP:272] Flagstones of Trokair +3 [RTR:241] Hallowed Fountain +SB: 4 [9ED:59] Annex +SB: 3 [C14:69] Condemn +SB: 1 [C14:86] Sacred Mesa +SB: 2 [9ED:23] Ivory Mask +SB: 2 [GPT:143] Giant Solifuge +SB: 3 [RAV:16] Faith's Fetters diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WB Tokens 58 PT Kyoto ST 3-1-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WB Tokens 58 PT Kyoto ST 3-1-09.dck new file mode 100644 index 00000000000..66a4fded056 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WB Tokens 58 PT Kyoto ST 3-1-09.dck @@ -0,0 +1,25 @@ +4 [LRW:281] Windbrisk Heights +4 [M15:241] Caves of Koilos +2 [C13:273] Arcane Sanctum +2 [UNH:138] Swamp +3 [UNH:136] Plains +2 [M11:1] Ajani Goldmane +4 [MOR:58] Bitterblossom +4 [EVE:176] Fetid Heath +1 [ALA:9] Elspeth, Knight-Errant +4 [CNS:210] Reflecting Pool +4 [C14:90] Spectral Procession +4 [LRW:28] Knight of Meadowgrain +4 [THS:107] Thoughtseize +4 [10E:17] Glorious Anthem +4 [CMD:25] Path to Exile +4 [LRW:10] Cloudgoat Ranger +4 [ALA:202] Tidehollow Sculler +2 [M14:228] Mutavault +SB: 3 [LRW:48] Wispmare +SB: 3 [C13:27] Wrath of God +SB: 4 [LRW:7] Burrenton Forge-Tender +SB: 1 [C14:78] Martial Coup +SB: 2 [CON:53] Scepter of Fugue +SB: 1 [M11:1] Ajani Goldmane +SB: 1 [ALA:9] Elspeth, Knight-Errant diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Kithkins 58 PT Kyoto ST 3-1-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Kithkins 58 PT Kyoto ST 3-1-09.dck new file mode 100644 index 00000000000..eb7043664b1 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Kithkins 58 PT Kyoto ST 3-1-09.dck @@ -0,0 +1,21 @@ +4 [M15:240] Battlefield Forge +4 [LRW:281] Windbrisk Heights +9 [UNH:136] Plains +2 [MOR:150] Rustic Clachan +4 [EVE:178] Rugged Prairie +4 [ALA:154] Ajani Vengeant +4 [C14:90] Spectral Procession +4 [LRW:18] Goldmeadow Stalwart +4 [LRW:28] Knight of Meadowgrain +4 [LRW:49] Wizened Cenn +3 [10E:17] Glorious Anthem +4 [EVE:139] Figure of Destiny +4 [CMD:25] Path to Exile +4 [LRW:10] Cloudgoat Ranger +2 [M14:228] Mutavault +SB: 2 [ALA:21] Ranger of Eos +SB: 4 [MOR:22] Reveillark +SB: 4 [LRW:7] Burrenton Forge-Tender +SB: 1 [CON:58] Banefire +SB: 1 [DDN:31] Banefire +SB: 3 [ALA:9] Elspeth, Knight-Errant diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 34 PT Kyoto ST 3-1-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 34 PT Kyoto ST 3-1-09.dck new file mode 100644 index 00000000000..c28577e7f5a --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 34 PT Kyoto ST 3-1-09.dck @@ -0,0 +1,26 @@ +4 [M15:240] Battlefield Forge +4 [LRW:281] Windbrisk Heights +3 [10E:219] Mogg Fanatic +3 [ALA:21] Ranger of Eos +3 [UNH:136] Plains +3 [MOR:22] Reveillark +4 [ALA:16] Knight of the White Orchid +3 [M10:157] Siege-Gang Commander +4 [C14:250] Mind Stone +3 [UNH:139] Mountain +4 [EVE:178] Rugged Prairie +4 [ALA:154] Ajani Vengeant +4 [CNS:210] Reflecting Pool +4 [C14:90] Spectral Procession +2 [C13:27] Wrath of God +4 [EVE:139] Figure of Destiny +3 [CMD:25] Path to Exile +1 [LRW:167] Flamekin Harbinger +SB: 4 [EVE:95] Stillmoon Cavalier +SB: 2 [LRW:7] Burrenton Forge-Tender +SB: 2 [C13:27] Wrath of God +SB: 1 [CON:58] Banefire +SB: 1 [CMD:25] Path to Exile +SB: 1 [MM2:104] Banefire +SB: 2 [SHM:66] Faerie Macabre +SB: 2 [ALA:9] Elspeth, Knight-Errant diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 58 PT Kyoto ST 3-1-09.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 58 PT Kyoto ST 3-1-09.dck new file mode 100644 index 00000000000..475382caaa6 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/WR Vengeant 58 PT Kyoto ST 3-1-09.dck @@ -0,0 +1,23 @@ +4 [M15:240] Battlefield Forge +4 [LRW:281] Windbrisk Heights +4 [10E:219] Mogg Fanatic +4 [ALA:21] Ranger of Eos +5 [UNH:136] Plains +1 [LRW:7] Burrenton Forge-Tender +3 [MOR:22] Reveillark +4 [ALA:16] Knight of the White Orchid +3 [M10:157] Siege-Gang Commander +4 [UNH:139] Mountain +4 [EVE:178] Rugged Prairie +4 [ALA:154] Ajani Vengeant +3 [CNS:210] Reflecting Pool +4 [C14:90] Spectral Procession +4 [EVE:139] Figure of Destiny +3 [CMD:25] Path to Exile +2 [DDN:31] Banefire +SB: 4 [EVE:95] Stillmoon Cavalier +SB: 3 [LRW:7] Burrenton Forge-Tender +SB: 1 [MOR:22] Reveillark +SB: 1 [CON:58] Banefire +SB: 2 [M10:141] Ignite Disorder +SB: 4 [CON:9] Lapse of Certainty diff --git a/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/White Weenie 34 PT San Diego ST 2-21-10.dck b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/White Weenie 34 PT San Diego ST 2-21-10.dck new file mode 100644 index 00000000000..92bce03f941 --- /dev/null +++ b/Mage.Client/release/sample-decks/Top8 PT and Worlds decks (Standard)/White Weenie 34 PT San Diego ST 2-21-10.dck @@ -0,0 +1,23 @@ +4 [M11:39] White Knight +12 [UNH:136] Plains +4 [ZEN:211] Arid Mesa +1 [ALA:219] Sigil of Distinction +4 [WWK:135] Dread Statuary +4 [ALA:9] Elspeth, Knight-Errant +2 [M13:22] Oblivion Ring +1 [C14:293] Emeria, the Sky Ruin +4 [ZEN:219] Marsh Flats +4 [ZEN:23] Kor Skyfisher +4 [ZEN:36] Steppe Lynx +4 [CMD:25] Path to Exile +4 [WWK:11] Kor Firewalker +4 [WWK:20] Stoneforge Mystic +1 [ZEN:209] Trusty Machete +1 [WWK:122] Basilisk Collar +2 [M12:12] Day of Judgment +SB: 2 [ZEN:25] Luminarch Ascension +SB: 2 [M13:22] Oblivion Ring +SB: 4 [ZEN:10] Devout Lightcaster +SB: 3 [C14:76] Kor Sanctifiers +SB: 2 [ALA:218] Relic of Progenitus +SB: 2 [M12:12] Day of Judgment From 6698d5519b32600fe54a18d9fcb8e09552a7e856 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 16:37:44 +0200 Subject: [PATCH 297/375] * Lotus Vale - Fixed that it produced one instead of three mana of any one color. --- .../src/mage/sets/weatherlight/LotusVale.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/weatherlight/LotusVale.java b/Mage.Sets/src/mage/sets/weatherlight/LotusVale.java index 9183f46d57c..dd7447e37ef 100644 --- a/Mage.Sets/src/mage/sets/weatherlight/LotusVale.java +++ b/Mage.Sets/src/mage/sets/weatherlight/LotusVale.java @@ -30,8 +30,10 @@ package mage.sets.weatherlight; import java.util.UUID; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.AddManaOfAnyColorEffect; import mage.abilities.effects.common.EnterBattlefieldPayCostOrPutGraveyardEffect; -import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; @@ -43,11 +45,12 @@ import mage.target.common.TargetControlledPermanent; /** * - * @author anonymous + * @author Luna Skyrise */ public class LotusVale extends CardImpl { - + private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("two untapped lands"); + static { filter.add(Predicates.not(new TappedPredicate())); } @@ -57,10 +60,11 @@ public class LotusVale extends CardImpl { this.expansionSetCode = "WTH"; // If Lotus Vale would enter the battlefield, sacrifice two untapped lands instead. If you do, put Lotus Vale onto the battlefield. If you don't, put it into its owner's graveyard. - this.addAbility(new SimpleStaticAbility(Zone.ALL, new EnterBattlefieldPayCostOrPutGraveyardEffect(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, false))))); + this.addAbility(new SimpleStaticAbility(Zone.ALL, new EnterBattlefieldPayCostOrPutGraveyardEffect( + new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, false))))); // {tap}: Add three mana of any one color to your mana pool. - this.addAbility(new AnyColorManaAbility()); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new TapSourceCost())); } public LotusVale(final LotusVale card) { From 49fe489c0f78b6c86b20acdda8bc04c1bf937176 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 16:46:45 +0200 Subject: [PATCH 298/375] * Natural Affinity - Fixed that the effect did not end on end of turn. --- .../mage/sets/ninthedition/NaturalAffinity.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/Mage.Sets/src/mage/sets/ninthedition/NaturalAffinity.java b/Mage.Sets/src/mage/sets/ninthedition/NaturalAffinity.java index c5a7804b97c..208cd0eba78 100644 --- a/Mage.Sets/src/mage/sets/ninthedition/NaturalAffinity.java +++ b/Mage.Sets/src/mage/sets/ninthedition/NaturalAffinity.java @@ -55,7 +55,6 @@ public class NaturalAffinity extends CardImpl { super(ownerId, 256, "Natural Affinity", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{G}"); this.expansionSetCode = "9ED"; - // All lands become 2/2 creatures until end of turn. They're still lands. this.getSpellAbility().addEffect(new BecomesCreatureAllEffect()); } @@ -72,9 +71,8 @@ public class NaturalAffinity extends CardImpl { class BecomesCreatureAllEffect extends ContinuousEffectImpl { - public BecomesCreatureAllEffect() { - super(Duration.WhileOnBattlefield, Outcome.BecomeCreature); + super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "All lands become 2/2 creatures until end of turn. They're still lands"; } @@ -86,12 +84,12 @@ class BecomesCreatureAllEffect extends ContinuousEffectImpl { public BecomesCreatureAllEffect copy() { return new BecomesCreatureAllEffect(this); } - + @Override public void init(Ability source, Game game) { super.init(source, game); this.affectedObjectsSet = true; - for (Permanent perm: game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), source.getSourceId(), game)) { + for (Permanent perm : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), source.getSourceId(), game)) { affectedObjectList.add(new MageObjectReference(perm, game)); } } @@ -101,9 +99,9 @@ class BecomesCreatureAllEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - for (Iterator it = affectedObjectList.iterator(); it.hasNext();) { + for (Iterator it = affectedObjectList.iterator(); it.hasNext();) { Permanent permanent = it.next().getPermanent(game); - if(permanent != null){ + if (permanent != null) { permanent.getCardType().add(CardType.CREATURE); } else { it.remove(); @@ -116,7 +114,7 @@ class BecomesCreatureAllEffect extends ContinuousEffectImpl { if (sublayer == SubLayer.SetPT_7b) { for (Iterator it = affectedObjectList.iterator(); it.hasNext();) { Permanent permanent = it.next().getPermanent(game); - if(permanent != null){ + if (permanent != null) { permanent.getPower().setValue(2); permanent.getToughness().setValue(2); } else { @@ -133,7 +131,6 @@ class BecomesCreatureAllEffect extends ContinuousEffectImpl { return false; } - @Override public boolean hasLayer(Layer layer) { return layer == Layer.PTChangingEffects_7 || layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.ColorChangingEffects_5 || layer == Layer.TypeChangingEffects_4; From 9d3aefe05bc1c7d29b1bf526f3e872031bd88058 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 16:52:11 +0200 Subject: [PATCH 299/375] * Persecute - Fixed that the discard was done for the controller of Persecute instead of the target player. --- Mage.Sets/src/mage/sets/urzassaga/Persecute.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/urzassaga/Persecute.java b/Mage.Sets/src/mage/sets/urzassaga/Persecute.java index f5526bad35e..78326067aa1 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Persecute.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Persecute.java @@ -89,7 +89,8 @@ class PersecuteEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { + Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (controller != null && sourceObject != null && targetPlayer != null) { ChoiceColor choice = new ChoiceColor(); while (!choice.isChosen()) { controller.choose(outcome, choice, game); @@ -100,12 +101,12 @@ class PersecuteEffect extends OneShotEffect { if (choice.getColor() == null) { return false; } - Cards hand = controller.getHand(); - controller.revealCards(sourceObject.getIdName(), hand, game); + Cards hand = targetPlayer.getHand(); + targetPlayer.revealCards(sourceObject.getIdName(), hand, game); Set cards = hand.getCards(game); for (Card card : cards) { if (card != null && card.getColor(game).shares(choice.getColor())) { - controller.discard(card, source, game); + targetPlayer.discard(card, source, game); } } return true; From af7bb617468b4bb30e9f0172ee1bb57c9d855a83 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Thu, 6 Aug 2015 09:46:23 -0700 Subject: [PATCH 300/375] updated Urborg Justice to use CardsPutIntoGraveyardWatcher --- .../mage/sets/weatherlight/UrborgJustice.java | 68 +++++++------------ 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java b/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java index 92b876666df..0043300a17e 100644 --- a/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java +++ b/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java @@ -27,14 +27,19 @@ */ package mage.sets.weatherlight; +import java.util.Set; import java.util.UUID; +import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.effects.common.SacrificeEffect; +import mage.cards.Card; import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.WatcherScope; @@ -45,9 +50,11 @@ import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; +import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetOpponent; import mage.watchers.Watcher; +import mage.watchers.common.CardsPutIntoGraveyardWatcher; /** * @@ -60,7 +67,7 @@ public class UrborgJustice extends CardImpl { this.expansionSetCode = "WTH"; // Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn. - this.getSpellAbility().addWatcher(new UrborgJusticeWatcher()); + this.getSpellAbility().addWatcher(new CardsPutIntoGraveyardWatcher()); SacrificeEffect sacrificeEffect = new SacrificeEffect(new FilterCreaturePermanent(), new UrborgJusticeDynamicValue(), ""); sacrificeEffect.setText("Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn"); @@ -78,46 +85,6 @@ public class UrborgJustice extends CardImpl { } } -class UrborgJusticeWatcher extends Watcher { - - private int creaturesCount = 0; - - public UrborgJusticeWatcher() { - super("YourCreaturesDied", WatcherScope.PLAYER); - condition = true; - } - - public UrborgJusticeWatcher(final UrborgJusticeWatcher watcher) { - super(watcher); - this.creaturesCount = watcher.creaturesCount; - } - - @Override - public UrborgJusticeWatcher copy() { - return new UrborgJusticeWatcher(this); - } - - public int getCreaturesCount() { - return creaturesCount; - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).isDiesEvent()) { - Permanent card = (Permanent)game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (card != null && card.getOwnerId().equals(this.controllerId) && card.getCardType().contains(CardType.CREATURE)) { - creaturesCount++; - } - } - } - - @Override - public void reset() { - super.reset(); - creaturesCount = 0; - } -} - class UrborgJusticeDynamicValue implements DynamicValue { @Override public UrborgJusticeDynamicValue copy() { @@ -136,10 +103,21 @@ class UrborgJusticeDynamicValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - UrborgJusticeWatcher watcher = (UrborgJusticeWatcher) game.getState().getWatchers().get("YourCreaturesDied", sourceAbility.getControllerId()); - if (watcher != null) { - return watcher.getCreaturesCount(); + CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get("CardsPutIntoGraveyardWatcher"); + + int count = 0; + Player controller = game.getPlayer(sourceAbility.getControllerId()); + if (controller != null && watcher != null) { + Set cardsInGraveyard = watcher.getCardsPutToGraveyardFromBattlefield(); + for (MageObjectReference mor : cardsInGraveyard) { + if (game.getState().getZoneChangeCounter(mor.getSourceId()) == mor.getZoneChangeCounter()) { + Card card = game.getCard(mor.getSourceId()); + if (card != null && card.getOwnerId().equals(sourceAbility.getControllerId()) && card.getCardType().contains(CardType.CREATURE)) { + count++; + } + } + } } - return 0; + return count; } } From 5c9705c06b65d43dde8fd631ff8b1e8c78baf0ed Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 19:07:02 +0200 Subject: [PATCH 301/375] * Teferi's Realm - Fixed that not only the permanents of the choosing player where phased out but all permanents in range of Teferi's Realm controller. --- .../src/mage/sets/visions/TeferisRealm.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Mage.Sets/src/mage/sets/visions/TeferisRealm.java b/Mage.Sets/src/mage/sets/visions/TeferisRealm.java index 170ffe82422..d66cc24eace 100644 --- a/Mage.Sets/src/mage/sets/visions/TeferisRealm.java +++ b/Mage.Sets/src/mage/sets/visions/TeferisRealm.java @@ -74,41 +74,43 @@ public class TeferisRealm extends CardImpl { } class TeferisRealmEffect extends OneShotEffect { - + private static final String ARTIFACT = "Artifact"; private static final String CREATURE = "Creature"; private static final String LAND = "Land"; - private static final String NON_AURA_ENCHANTMENT = "Non-Aura enchantment"; + private static final String NON_AURA_ENCHANTMENT = "Non-Aura enchantment"; private static final HashSet choices = new HashSet<>(); - static{ + + static { choices.add(ARTIFACT); choices.add(CREATURE); choices.add(LAND); - choices.add(NON_AURA_ENCHANTMENT); - } - + choices.add(NON_AURA_ENCHANTMENT); + } + public TeferisRealmEffect() { super(Outcome.Detriment); this.staticText = "that player chooses artifact, creature, land, or non-Aura enchantment. All nontoken permanents of that type phase out"; } - + public TeferisRealmEffect(final TeferisRealmEffect effect) { super(effect); } - + @Override public TeferisRealmEffect copy() { return new TeferisRealmEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); - if (player != null) { + Player controller = game.getPlayer(source.getControllerId()); + if (player != null && controller != null) { Choice choiceImpl = new ChoiceImpl(true); choiceImpl.setMessage("Phase out which kind of permanents?"); choiceImpl.setChoices(choices); - while(!player.choose(outcome, choiceImpl, game)) { + while (!player.choose(outcome, choiceImpl, game)) { if (player.canRespond()) { return false; } @@ -116,7 +118,7 @@ class TeferisRealmEffect extends OneShotEffect { String choosenType = choiceImpl.getChoice(); FilterPermanent filter = new FilterPermanent(); filter.add(Predicates.not(new TokenPredicate())); - switch(choosenType) { + switch (choosenType) { case ARTIFACT: filter.add(new CardTypePredicate(CardType.ARTIFACT)); break; @@ -133,11 +135,11 @@ class TeferisRealmEffect extends OneShotEffect { default: return false; } - game.informPlayers(player.getLogName() + " chooses " + choosenType +"s to phase out"); - for(Permanent permanent: game.getBattlefield().getAllActivePermanents(filter, player.getId(), game)) { + game.informPlayers(player.getLogName() + " chooses " + choosenType + "s to phase out"); + for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, controller.getId(), game)) { permanent.phaseOut(game); } - return true; + return true; } return false; } From 297ab8cdad7be06bdea96908387953f1ac15b346 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 19:41:00 +0200 Subject: [PATCH 302/375] * Kicker - Fixed that {X} Kicker costs with generic mana costs where added to the spells costs correctly (e.g. Kangee, Aerie Keeper). --- Mage.Sets/src/mage/sets/lorwyn/WortBoggartAuntie.java | 10 +++++----- Mage/src/mage/abilities/keyword/KickerAbility.java | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/lorwyn/WortBoggartAuntie.java b/Mage.Sets/src/mage/sets/lorwyn/WortBoggartAuntie.java index 2d319bc0743..05c93371dfd 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/WortBoggartAuntie.java +++ b/Mage.Sets/src/mage/sets/lorwyn/WortBoggartAuntie.java @@ -27,21 +27,20 @@ */ package mage.sets.lorwyn; -import mage.constants.CardType; -import mage.constants.Rarity; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.FearAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.TargetController; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetCardInYourGraveyard; -import java.util.UUID; - /** * * @author Loki @@ -61,10 +60,11 @@ public class WortBoggartAuntie extends CardImpl { this.subtype.add("Goblin"); this.subtype.add("Shaman"); - this.power = new MageInt(3); this.toughness = new MageInt(3); + this.addAbility(FearAbility.getInstance()); + // At the beginning of your upkeep, you may return target Goblin card from your graveyard to your hand. Ability ability = new BeginningOfUpkeepTriggeredAbility(new ReturnToHandTargetEffect(), TargetController.YOU, true); ability.addTarget(new TargetCardInYourGraveyard(filter)); diff --git a/Mage/src/mage/abilities/keyword/KickerAbility.java b/Mage/src/mage/abilities/keyword/KickerAbility.java index 3753632b553..d28edb5307c 100644 --- a/Mage/src/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/mage/abilities/keyword/KickerAbility.java @@ -42,6 +42,7 @@ import mage.abilities.costs.OptionalAdditionalCost; import mage.abilities.costs.OptionalAdditionalCostImpl; import mage.abilities.costs.OptionalAdditionalSourceCosts; import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; import mage.constants.AbilityType; @@ -261,6 +262,12 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo game.informPlayers(game.getPlayer(this.controllerId).getLogName() + " announced a value of " + xManaValue + " for " + " kicker X "); } ability.getManaCostsToPay().add(new GenericManaCost(xManaValue)); + ManaCostsImpl kickerManaCosts = (ManaCostsImpl) cost; + for (ManaCost manaCost : kickerManaCosts) { + if (!(manaCost instanceof VariableManaCost)) { + ability.getManaCostsToPay().add(manaCost.copy()); + } + } } else { ability.getManaCostsToPay().add((ManaCostsImpl) cost.copy()); } From b5f583abb4ceb957814a927568e7ada8147e2887 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 19:45:11 +0200 Subject: [PATCH 303/375] * Collapsing Borders - Fixed that the domain value was calculated from controller instead of active player. --- Mage.Sets/src/mage/sets/invasion/CollapsingBorders.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/invasion/CollapsingBorders.java b/Mage.Sets/src/mage/sets/invasion/CollapsingBorders.java index 81e3f9c120c..323704a268c 100644 --- a/Mage.Sets/src/mage/sets/invasion/CollapsingBorders.java +++ b/Mage.Sets/src/mage/sets/invasion/CollapsingBorders.java @@ -42,7 +42,7 @@ import mage.constants.TargetController; /** * * @author LoneFox - + * */ public class CollapsingBorders extends CardImpl { @@ -51,7 +51,7 @@ public class CollapsingBorders extends CardImpl { this.expansionSetCode = "INV"; // Domain - At the beginning of each player's upkeep, that player gains 1 life for each basic land type among lands he or she controls. Then Collapsing Borders deals 3 damage to him or her. - Effect effect = new GainLifeTargetEffect(new DomainValue()); + Effect effect = new GainLifeTargetEffect(new DomainValue(true)); effect.setText("that player gains 1 life for each basic land type among lands he or she controls."); Ability ability = new BeginningOfUpkeepTriggeredAbility(effect, TargetController.ANY, false); effect = new DamageTargetEffect(3); From 596237bf3935e30a53d0786348f3ed17809bda93 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 19:58:29 +0200 Subject: [PATCH 304/375] * Athreos, God of Passage - Fixed that cards returned to hand with the triggered ability werer alaso schown wrongly in graveyard after the effect resolved. --- Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java b/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java index 46f26f68d52..788102604eb 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/AthreosGodOfPassage.java @@ -138,7 +138,7 @@ class AthreosGodOfPassageReturnEffect extends OneShotEffect { } if (opponent == null || !paid) { if (game.getState().getZone(creature.getId()).equals(Zone.GRAVEYARD)) { - controller.moveCards(creature, null, Zone.HAND, source, game); + controller.moveCards(game.getCard(creatureId), null, Zone.HAND, source, game); } } } From 5de4637d9c7967612c207d3cf915c2861d922029 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 20:13:01 +0200 Subject: [PATCH 305/375] Removed not used import statements. --- .../src/mage/sets/weatherlight/UrborgJustice.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java b/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java index 0043300a17e..03384120f2b 100644 --- a/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java +++ b/Mage.Sets/src/mage/sets/weatherlight/UrborgJustice.java @@ -34,26 +34,15 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.effects.common.SacrificeEffect; import mage.cards.Card; import mage.cards.CardImpl; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.WatcherScope; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; -import mage.game.permanent.PermanentToken; import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetOpponent; -import mage.watchers.Watcher; import mage.watchers.common.CardsPutIntoGraveyardWatcher; /** @@ -86,6 +75,7 @@ public class UrborgJustice extends CardImpl { } class UrborgJusticeDynamicValue implements DynamicValue { + @Override public UrborgJusticeDynamicValue copy() { return new UrborgJusticeDynamicValue(); From 044db331f49829a3e4c33ea5da1efec278c72ae0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 22:16:12 +0200 Subject: [PATCH 306/375] Changed Overide for Mirrordin set. --- .../mage/sets/mirrodin/AEtherSpellbomb.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/AlphaMyr.java | 2 +- .../src/mage/sets/mirrodin/AltarsLight.java | 2 +- .../src/mage/sets/mirrodin/AncientDen.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Annul.java | 2 +- .../src/mage/sets/mirrodin/ArcSlogger.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Arrest.java | 2 +- .../mage/sets/mirrodin/AssertAuthority.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Atog.java | 2 +- .../mage/sets/mirrodin/AuriokBladewarden.java | 2 +- .../mage/sets/mirrodin/AuriokSteelshaper.java | 8 ++++---- .../mage/sets/mirrodin/AuriokTransfixer.java | 2 +- .../src/mage/sets/mirrodin/BansheesBlade.java | 10 +++++----- .../src/mage/sets/mirrodin/BarterInBlood.java | 2 +- .../src/mage/sets/mirrodin/Battlegrowth.java | 2 +- .../mage/sets/mirrodin/BetrayalOfFlesh.java | 2 +- .../src/mage/sets/mirrodin/BlindingBeam.java | 2 +- .../src/mage/sets/mirrodin/BlinkmothUrn.java | 6 +++--- .../src/mage/sets/mirrodin/BlinkmothWell.java | 2 +- .../src/mage/sets/mirrodin/Bloodscent.java | 2 +- .../src/mage/sets/mirrodin/Bonesplitter.java | 2 +- .../src/mage/sets/mirrodin/BoshIronGolem.java | 2 +- .../src/mage/sets/mirrodin/BottleGnomes.java | 2 +- .../src/mage/sets/mirrodin/Broodstar.java | 2 +- .../src/mage/sets/mirrodin/Cathodion.java | 2 +- .../mage/sets/mirrodin/ChaliceOfTheVoid.java | 18 +++++++++--------- .../mage/sets/mirrodin/ChromaticSphere.java | 2 +- .../src/mage/sets/mirrodin/ChromeMox.java | 12 ++++++------ .../mage/sets/mirrodin/ClockworkBeetle.java | 6 +++--- .../mage/sets/mirrodin/ClockworkCondor.java | 6 +++--- .../mage/sets/mirrodin/ClockworkDragon.java | 6 +++--- .../mage/sets/mirrodin/ClockworkVorrac.java | 6 +++--- .../src/mage/sets/mirrodin/Cloudpost.java | 2 +- .../src/mage/sets/mirrodin/CobaltGolem.java | 2 +- .../src/mage/sets/mirrodin/ConsumeSpirit.java | 2 +- .../mage/sets/mirrodin/ContaminatedBond.java | 2 +- .../src/mage/sets/mirrodin/CopperMyr.java | 2 +- .../src/mage/sets/mirrodin/CreepingMold.java | 2 +- .../src/mage/sets/mirrodin/CrystalShard.java | 6 +++--- .../src/mage/sets/mirrodin/DampingMatrix.java | 10 +++++----- .../src/mage/sets/mirrodin/Deconstruct.java | 2 +- .../mage/sets/mirrodin/DiscipleOfTheVault.java | 2 +- .../src/mage/sets/mirrodin/DragonBlood.java | 2 +- .../src/mage/sets/mirrodin/DreamsGrip.java | 2 +- .../src/mage/sets/mirrodin/DrossProwler.java | 2 +- .../src/mage/sets/mirrodin/Duplicant.java | 16 ++++++++-------- .../src/mage/sets/mirrodin/Duskworker.java | 2 +- .../src/mage/sets/mirrodin/ElfReplica.java | 2 +- .../src/mage/sets/mirrodin/EmpyrialPlate.java | 2 +- .../mage/sets/mirrodin/ExtraplanarLens.java | 14 +++++++------- .../src/mage/sets/mirrodin/Fabricate.java | 2 +- .../src/mage/sets/mirrodin/FangrenHunter.java | 2 +- .../src/mage/sets/mirrodin/FarsightMask.java | 12 ++++++------ .../src/mage/sets/mirrodin/FieryGambit.java | 6 +++--- .../src/mage/sets/mirrodin/Fireshrieker.java | 2 +- .../mage/sets/mirrodin/FistsOfTheAnvil.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Forest1.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Forest2.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Forest3.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Forest4.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Frogmite.java | 2 +- .../src/mage/sets/mirrodin/GalvanicKey.java | 2 +- .../src/mage/sets/mirrodin/GildedLotus.java | 2 +- .../src/mage/sets/mirrodin/Glimmervoid.java | 10 +++++----- .../mage/sets/mirrodin/GlissaSunseeker.java | 6 +++--- .../mage/sets/mirrodin/GoblinCharbelcher.java | 6 +++--- .../src/mage/sets/mirrodin/GoblinReplica.java | 2 +- .../src/mage/sets/mirrodin/GoblinStriker.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/GoldMyr.java | 2 +- .../mage/sets/mirrodin/GolemSkinGauntlets.java | 10 +++++----- .../src/mage/sets/mirrodin/GrabTheReins.java | 6 +++--- .../src/mage/sets/mirrodin/GreatFurnace.java | 2 +- .../src/mage/sets/mirrodin/HematiteGolem.java | 2 +- .../src/mage/sets/mirrodin/IcyManipulator.java | 2 +- .../src/mage/sets/mirrodin/InciteWar.java | 6 +++--- Mage.Sets/src/mage/sets/mirrodin/IronMyr.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Island1.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Island2.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Island3.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Island4.java | 2 +- .../mage/sets/mirrodin/IsochronScepter.java | 10 +++++----- .../mage/sets/mirrodin/JourneyOfDiscovery.java | 2 +- .../src/mage/sets/mirrodin/KrarkClanGrunt.java | 2 +- .../mage/sets/mirrodin/KrarkClanShaman.java | 2 +- .../src/mage/sets/mirrodin/KrarksThumb.java | 12 ++++++------ .../src/mage/sets/mirrodin/LeadenMyr.java | 2 +- .../src/mage/sets/mirrodin/LeoninAbunas.java | 2 +- .../mage/sets/mirrodin/LeoninBladetrap.java | 2 +- .../src/mage/sets/mirrodin/LeoninDenGuard.java | 2 +- .../src/mage/sets/mirrodin/LeoninElder.java | 2 +- .../src/mage/sets/mirrodin/LeoninScimitar.java | 2 +- .../mage/sets/mirrodin/LeoninSkyhunter.java | 2 +- .../mage/sets/mirrodin/LeoninSunStandard.java | 2 +- .../mage/sets/mirrodin/LifesparkSpellbomb.java | 2 +- .../mage/sets/mirrodin/LightningGreaves.java | 2 +- .../src/mage/sets/mirrodin/LivingHive.java | 6 +++--- .../src/mage/sets/mirrodin/LodestoneMyr.java | 2 +- .../mage/sets/mirrodin/LoomingHoverguard.java | 2 +- .../src/mage/sets/mirrodin/LoxodonMender.java | 2 +- .../mage/sets/mirrodin/LoxodonPunisher.java | 2 +- .../mage/sets/mirrodin/LoxodonWarhammer.java | 2 +- .../mage/sets/mirrodin/LumengridWarden.java | 2 +- .../src/mage/sets/mirrodin/LuminousAngel.java | 2 +- .../src/mage/sets/mirrodin/MalachiteGolem.java | 2 +- .../mage/sets/mirrodin/MarchOfTheMachines.java | 2 +- .../src/mage/sets/mirrodin/MaskOfMemory.java | 2 +- .../src/mage/sets/mirrodin/MassHysteria.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Megatog.java | 2 +- .../src/mage/sets/mirrodin/MesmericOrb.java | 10 +++++----- Mage.Sets/src/mage/sets/mirrodin/MindsEye.java | 2 +- .../src/mage/sets/mirrodin/Mindslaver.java | 2 +- .../src/mage/sets/mirrodin/MolderSlug.java | 2 +- .../src/mage/sets/mirrodin/MoltenRain.java | 6 +++--- .../src/mage/sets/mirrodin/Mountain1.java | 2 +- .../src/mage/sets/mirrodin/Mountain2.java | 2 +- .../src/mage/sets/mirrodin/Mountain3.java | 2 +- .../src/mage/sets/mirrodin/Mountain4.java | 2 +- .../src/mage/sets/mirrodin/MyrAdapter.java | 2 +- .../src/mage/sets/mirrodin/MyrEnforcer.java | 2 +- .../src/mage/sets/mirrodin/MyrRetriever.java | 2 +- .../src/mage/sets/mirrodin/NecrogenMists.java | 2 +- .../mage/sets/mirrodin/NecrogenSpellbomb.java | 2 +- .../src/mage/sets/mirrodin/Needlebug.java | 2 +- .../mage/sets/mirrodin/NeurokHoversail.java | 2 +- .../src/mage/sets/mirrodin/NeurokSpy.java | 2 +- .../src/mage/sets/mirrodin/NightmareLash.java | 2 +- .../src/mage/sets/mirrodin/NimDevourer.java | 6 +++--- .../src/mage/sets/mirrodin/NimLasher.java | 2 +- .../src/mage/sets/mirrodin/NimReplica.java | 2 +- .../src/mage/sets/mirrodin/NimShambler.java | 2 +- .../src/mage/sets/mirrodin/NimShrieker.java | 2 +- .../src/mage/sets/mirrodin/NuisanceEngine.java | 2 +- .../src/mage/sets/mirrodin/OblivionStone.java | 6 +++--- Mage.Sets/src/mage/sets/mirrodin/OmegaMyr.java | 2 +- .../src/mage/sets/mirrodin/OneDozenEyes.java | 2 +- .../src/mage/sets/mirrodin/Ornithopter.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Pentavus.java | 2 +- .../src/mage/sets/mirrodin/PewterGolem.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Plains1.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Plains2.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Plains3.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Plains4.java | 2 +- .../src/mage/sets/mirrodin/PlatedSlagwurm.java | 2 +- .../src/mage/sets/mirrodin/PlatinumAngel.java | 2 +- .../mage/sets/mirrodin/PredatorsStrike.java | 2 +- .../src/mage/sets/mirrodin/PromiseOfPower.java | 2 +- .../src/mage/sets/mirrodin/ProteusStaff.java | 6 +++--- .../mage/sets/mirrodin/PsychicMembrane.java | 2 +- .../mage/sets/mirrodin/PsychogenicProbe.java | 10 +++++----- .../mage/sets/mirrodin/PyriteSpellbomb.java | 2 +- .../src/mage/sets/mirrodin/RaiseTheAlarm.java | 2 +- .../src/mage/sets/mirrodin/RazorBarrier.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Regress.java | 2 +- .../src/mage/sets/mirrodin/ReiverDemon.java | 2 +- .../src/mage/sets/mirrodin/RoarOfTheKha.java | 2 +- .../src/mage/sets/mirrodin/RuleOfLaw.java | 2 +- .../src/mage/sets/mirrodin/RustmouthOgre.java | 10 +++++----- .../src/mage/sets/mirrodin/RustsporeRam.java | 2 +- .../mage/sets/mirrodin/ScaleOfChissGoria.java | 2 +- .../mage/sets/mirrodin/ScrabblingClaws.java | 6 +++--- .../src/mage/sets/mirrodin/SculptingSteel.java | 2 +- .../sets/mirrodin/ScytheOfTheWretched.java | 14 +++++++------- .../src/mage/sets/mirrodin/SeatOfTheSynod.java | 2 +- .../src/mage/sets/mirrodin/SecondSunrise.java | 12 ++++++------ .../src/mage/sets/mirrodin/SeethingSong.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Shatter.java | 2 +- .../src/mage/sets/mirrodin/ShrapnelBlast.java | 2 +- .../src/mage/sets/mirrodin/SilverMyr.java | 2 +- .../src/mage/sets/mirrodin/SkeletonShard.java | 2 +- .../mage/sets/mirrodin/SkyhunterPatrol.java | 2 +- .../src/mage/sets/mirrodin/SlagwurmArmor.java | 2 +- .../src/mage/sets/mirrodin/SlithAscendant.java | 2 +- .../mage/sets/mirrodin/SlithBloodletter.java | 2 +- .../mage/sets/mirrodin/SlithFirewalker.java | 2 +- .../src/mage/sets/mirrodin/SlithPredator.java | 2 +- .../src/mage/sets/mirrodin/SlithStrider.java | 2 +- .../src/mage/sets/mirrodin/SolarTide.java | 2 +- .../src/mage/sets/mirrodin/SoldierReplica.java | 2 +- .../mage/sets/mirrodin/SolemnSimulacrum.java | 2 +- .../mage/sets/mirrodin/SomberHoverguard.java | 2 +- .../src/mage/sets/mirrodin/SoulFoundry.java | 12 ++++++------ .../mage/sets/mirrodin/SpikeshotGoblin.java | 6 +++--- .../mage/sets/mirrodin/SpoilsOfTheVault.java | 6 +++--- .../src/mage/sets/mirrodin/StalkingStones.java | 2 +- .../src/mage/sets/mirrodin/SteelWall.java | 2 +- .../src/mage/sets/mirrodin/SunDroplet.java | 2 +- .../mage/sets/mirrodin/SunbeamSpellbomb.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Swamp1.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Swamp2.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Swamp3.java | 2 +- Mage.Sets/src/mage/sets/mirrodin/Swamp4.java | 2 +- .../src/mage/sets/mirrodin/SwordOfKaldra.java | 10 +++++----- .../src/mage/sets/mirrodin/SylvanScrying.java | 2 +- .../mage/sets/mirrodin/TajNarSwordsmith.java | 6 +++--- .../sets/mirrodin/TalismanOfDominance.java | 2 +- .../mage/sets/mirrodin/TalismanOfImpulse.java | 2 +- .../sets/mirrodin/TalismanOfIndulgence.java | 2 +- .../mage/sets/mirrodin/TalismanOfProgress.java | 2 +- .../mage/sets/mirrodin/TalismanOfUnity.java | 2 +- .../src/mage/sets/mirrodin/Tanglebloom.java | 2 +- .../mage/sets/mirrodin/TelJiladArchers.java | 2 +- .../src/mage/sets/mirrodin/TelJiladChosen.java | 2 +- .../src/mage/sets/mirrodin/TelJiladExile.java | 2 +- .../src/mage/sets/mirrodin/TelJiladStylus.java | 2 +- .../src/mage/sets/mirrodin/TempestOfLight.java | 2 +- .../mage/sets/mirrodin/TemporalCascade.java | 10 +++++----- Mage.Sets/src/mage/sets/mirrodin/Terror.java | 2 +- .../mage/sets/mirrodin/ThirstForKnowledge.java | 2 +- .../src/mage/sets/mirrodin/Thoughtcast.java | 2 +- .../src/mage/sets/mirrodin/TitaniumGolem.java | 2 +- .../src/mage/sets/mirrodin/ToothAndNail.java | 2 +- .../mage/sets/mirrodin/ToothOfChissGoria.java | 2 +- .../mage/sets/mirrodin/TowerOfChampions.java | 2 +- .../src/mage/sets/mirrodin/TowerOfEons.java | 2 +- .../mage/sets/mirrodin/TowerOfFortunes.java | 2 +- .../src/mage/sets/mirrodin/TowerOfMurmurs.java | 2 +- .../mage/sets/mirrodin/TrashForTreasure.java | 2 +- .../src/mage/sets/mirrodin/TreeOfTales.java | 2 +- .../src/mage/sets/mirrodin/Triskelion.java | 2 +- .../src/mage/sets/mirrodin/TrollAscetic.java | 2 +- .../mage/sets/mirrodin/TrollsOfTelJilad.java | 2 +- .../src/mage/sets/mirrodin/TurnToDust.java | 2 +- .../mage/sets/mirrodin/VaultOfWhispers.java | 2 +- .../mage/sets/mirrodin/VedalkenArchmage.java | 2 +- .../src/mage/sets/mirrodin/ViridianJoiner.java | 2 +- .../src/mage/sets/mirrodin/ViridianShaman.java | 2 +- .../mage/sets/mirrodin/VorracBattlehorns.java | 10 +++++----- .../mage/sets/mirrodin/VulshokBattlegear.java | 2 +- .../mage/sets/mirrodin/VulshokBerserker.java | 2 +- .../mage/sets/mirrodin/VulshokGauntlets.java | 10 +++++----- .../src/mage/sets/mirrodin/WailOfTheNim.java | 2 +- .../src/mage/sets/mirrodin/WallOfBlood.java | 2 +- .../mage/sets/mirrodin/WanderguardSentry.java | 2 +- .../src/mage/sets/mirrodin/WeldingJar.java | 2 +- .../src/mage/sets/mirrodin/WizardReplica.java | 2 +- .../src/mage/sets/mirrodin/Worldslayer.java | 2 +- .../src/mage/sets/mirrodin/WrenchMind.java | 6 +++--- .../src/mage/sets/mirrodin/YotianSoldier.java | 2 +- 238 files changed, 383 insertions(+), 383 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mirrodin/AEtherSpellbomb.java b/Mage.Sets/src/mage/sets/mirrodin/AEtherSpellbomb.java index f13888a6974..c27b2d019f5 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AEtherSpellbomb.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AEtherSpellbomb.java @@ -45,7 +45,7 @@ public class AEtherSpellbomb extends mage.sets.elspethvstezzeret.AEtherSpellbomb super(card); } - @Override + @java.lang.Override public AEtherSpellbomb copy() { return new AEtherSpellbomb(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/AlphaMyr.java b/Mage.Sets/src/mage/sets/mirrodin/AlphaMyr.java index 613bb3e4333..8928b1b1576 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AlphaMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AlphaMyr.java @@ -52,7 +52,7 @@ public class AlphaMyr extends CardImpl { super(card); } - @Override + @java.lang.Override public AlphaMyr copy() { return new AlphaMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/AltarsLight.java b/Mage.Sets/src/mage/sets/mirrodin/AltarsLight.java index 4bc72f29f63..adc976a3857 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AltarsLight.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AltarsLight.java @@ -63,7 +63,7 @@ public class AltarsLight extends CardImpl { super(card); } - @Override + @java.lang.Override public AltarsLight copy() { return new AltarsLight(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/AncientDen.java b/Mage.Sets/src/mage/sets/mirrodin/AncientDen.java index 8093e62ee86..6d813331cc8 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AncientDen.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AncientDen.java @@ -50,7 +50,7 @@ public class AncientDen extends CardImpl { super(card); } - @Override + @java.lang.Override public AncientDen copy() { return new AncientDen(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Annul.java b/Mage.Sets/src/mage/sets/mirrodin/Annul.java index 9399d38cfeb..c24d2101e2c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Annul.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Annul.java @@ -63,7 +63,7 @@ public class Annul extends CardImpl { super(card); } - @Override + @java.lang.Override public Annul copy() { return new Annul(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ArcSlogger.java b/Mage.Sets/src/mage/sets/mirrodin/ArcSlogger.java index 55669920259..a69747adbeb 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ArcSlogger.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ArcSlogger.java @@ -65,7 +65,7 @@ public class ArcSlogger extends CardImpl { super(card); } - @Override + @java.lang.Override public ArcSlogger copy() { return new ArcSlogger(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Arrest.java b/Mage.Sets/src/mage/sets/mirrodin/Arrest.java index aaf206d24f5..6cd9dafc0ca 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Arrest.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Arrest.java @@ -70,7 +70,7 @@ public class Arrest extends CardImpl { super(card); } - @Override + @java.lang.Override public Arrest copy() { return new Arrest(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/AssertAuthority.java b/Mage.Sets/src/mage/sets/mirrodin/AssertAuthority.java index a392b15f731..3651291548e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AssertAuthority.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AssertAuthority.java @@ -58,7 +58,7 @@ public class AssertAuthority extends CardImpl { super(card); } - @Override + @java.lang.Override public AssertAuthority copy() { return new AssertAuthority(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Atog.java b/Mage.Sets/src/mage/sets/mirrodin/Atog.java index 5a31d2ef6ec..5d9f5f00368 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Atog.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Atog.java @@ -68,7 +68,7 @@ public class Atog extends CardImpl { super(card); } - @Override + @java.lang.Override public Atog copy() { return new Atog(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/AuriokBladewarden.java b/Mage.Sets/src/mage/sets/mirrodin/AuriokBladewarden.java index cc710102337..0c0565c3884 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AuriokBladewarden.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AuriokBladewarden.java @@ -67,7 +67,7 @@ public class AuriokBladewarden extends CardImpl { super(card); } - @Override + @java.lang.Override public AuriokBladewarden copy() { return new AuriokBladewarden(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/AuriokSteelshaper.java b/Mage.Sets/src/mage/sets/mirrodin/AuriokSteelshaper.java index bc0d94da411..fdd7ffdd470 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AuriokSteelshaper.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AuriokSteelshaper.java @@ -82,7 +82,7 @@ public class AuriokSteelshaper extends CardImpl { super(card); } - @Override + @java.lang.Override public AuriokSteelshaper copy() { return new AuriokSteelshaper(this); } @@ -99,18 +99,18 @@ class AuriokSteelshaperCostReductionEffect extends CostModificationEffectImpl { super(effect); } - @Override + @java.lang.Override public AuriokSteelshaperCostReductionEffect copy() { return new AuriokSteelshaperCostReductionEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source, Ability abilityToModify) { CardUtil.reduceCost(abilityToModify, 1); return true; } - @Override + @java.lang.Override public boolean applies(Ability abilityToModify, Ability source, Game game) { return abilityToModify.getControllerId().equals(source.getControllerId()) && (abilityToModify instanceof EquipAbility); diff --git a/Mage.Sets/src/mage/sets/mirrodin/AuriokTransfixer.java b/Mage.Sets/src/mage/sets/mirrodin/AuriokTransfixer.java index f2cf65be8f3..2c0ee1ec022 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/AuriokTransfixer.java +++ b/Mage.Sets/src/mage/sets/mirrodin/AuriokTransfixer.java @@ -73,7 +73,7 @@ public class AuriokTransfixer extends CardImpl { super(card); } - @Override + @java.lang.Override public AuriokTransfixer copy() { return new AuriokTransfixer(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java b/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java index 896454e6952..f3fe9728c3b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java @@ -71,7 +71,7 @@ public class BansheesBlade extends CardImpl { super(card); } - @Override + @java.lang.Override public BansheesBlade copy() { return new BansheesBlade(this); } @@ -91,12 +91,12 @@ class BansheesBladeAbility extends TriggeredAbilityImpl { this.usedInPhase = ability.usedInPhase; } - @Override + @java.lang.Override public BansheesBladeAbility copy() { return new BansheesBladeAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.DAMAGED_PLAYER || event.getType() == EventType.DAMAGED_CREATURE @@ -104,7 +104,7 @@ class BansheesBladeAbility extends TriggeredAbilityImpl { || event.getType() == EventType.COMBAT_DAMAGE_STEP_PRE; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { if (event instanceof DamagedEvent && ((DamagedEvent) event).isCombatDamage() && !usedInPhase) { Permanent permanent = game.getPermanent(event.getSourceId()); @@ -119,7 +119,7 @@ class BansheesBladeAbility extends TriggeredAbilityImpl { return false; } - @Override + @java.lang.Override public String getRule() { return "Whenever equipped creature deals combat damage, put a charge counter on {this}."; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/BarterInBlood.java b/Mage.Sets/src/mage/sets/mirrodin/BarterInBlood.java index 7ffb3d2db32..b4b2d060adf 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BarterInBlood.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BarterInBlood.java @@ -45,7 +45,7 @@ public class BarterInBlood extends mage.sets.avacynrestored.BarterInBlood { super(card); } - @Override + @java.lang.Override public BarterInBlood copy() { return new BarterInBlood(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Battlegrowth.java b/Mage.Sets/src/mage/sets/mirrodin/Battlegrowth.java index 266267c2f83..cb5efc7db18 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Battlegrowth.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Battlegrowth.java @@ -53,7 +53,7 @@ public class Battlegrowth extends CardImpl { super(card); } - @Override + @java.lang.Override public Battlegrowth copy() { return new Battlegrowth(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/BetrayalOfFlesh.java b/Mage.Sets/src/mage/sets/mirrodin/BetrayalOfFlesh.java index 50d0a33d43e..c03a0219135 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BetrayalOfFlesh.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BetrayalOfFlesh.java @@ -73,7 +73,7 @@ public class BetrayalOfFlesh extends CardImpl { super(card); } - @Override + @java.lang.Override public BetrayalOfFlesh copy() { return new BetrayalOfFlesh(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/BlindingBeam.java b/Mage.Sets/src/mage/sets/mirrodin/BlindingBeam.java index b762ddbc0c6..18f2b179b66 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BlindingBeam.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BlindingBeam.java @@ -45,7 +45,7 @@ public class BlindingBeam extends mage.sets.elspethvstezzeret.BlindingBeam { super(card); } - @Override + @java.lang.Override public BlindingBeam copy() { return new BlindingBeam(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/BlinkmothUrn.java b/Mage.Sets/src/mage/sets/mirrodin/BlinkmothUrn.java index 5eea8cdfb57..a5ac16b9a1c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BlinkmothUrn.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BlinkmothUrn.java @@ -41,7 +41,7 @@ public class BlinkmothUrn extends CardImpl { super(card); } - @Override + @java.lang.Override public BlinkmothUrn copy() { return new BlinkmothUrn(this); } @@ -59,12 +59,12 @@ class BlinkmothUrnEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public BlinkmothUrnEffect copy() { return new BlinkmothUrnEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(game.getActivePlayerId()); FilterArtifactPermanent filter = new FilterArtifactPermanent("artifacts you control"); diff --git a/Mage.Sets/src/mage/sets/mirrodin/BlinkmothWell.java b/Mage.Sets/src/mage/sets/mirrodin/BlinkmothWell.java index cd023737f93..894222dbb6f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BlinkmothWell.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BlinkmothWell.java @@ -72,7 +72,7 @@ public class BlinkmothWell extends CardImpl { super(card); } - @Override + @java.lang.Override public BlinkmothWell copy() { return new BlinkmothWell(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Bloodscent.java b/Mage.Sets/src/mage/sets/mirrodin/Bloodscent.java index 8fc50760428..2780de6bd8f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Bloodscent.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Bloodscent.java @@ -55,7 +55,7 @@ public class Bloodscent extends CardImpl { super(card); } - @Override + @java.lang.Override public Bloodscent copy() { return new Bloodscent(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Bonesplitter.java b/Mage.Sets/src/mage/sets/mirrodin/Bonesplitter.java index ccf8f2c157c..b2d4c29045e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Bonesplitter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Bonesplitter.java @@ -58,7 +58,7 @@ public class Bonesplitter extends CardImpl { super(card); } - @Override + @java.lang.Override public Bonesplitter copy() { return new Bonesplitter(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/BoshIronGolem.java b/Mage.Sets/src/mage/sets/mirrodin/BoshIronGolem.java index cd6d64cc785..051bd6d3b9c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BoshIronGolem.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BoshIronGolem.java @@ -45,7 +45,7 @@ public class BoshIronGolem extends mage.sets.planechase.BoshIronGolem { super(card); } - @Override + @java.lang.Override public BoshIronGolem copy() { return new BoshIronGolem(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/BottleGnomes.java b/Mage.Sets/src/mage/sets/mirrodin/BottleGnomes.java index df238073ae0..cf8f159ef17 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BottleGnomes.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BottleGnomes.java @@ -45,7 +45,7 @@ public class BottleGnomes extends mage.sets.tempest.BottleGnomes { super(card); } - @Override + @java.lang.Override public BottleGnomes copy() { return new BottleGnomes(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Broodstar.java b/Mage.Sets/src/mage/sets/mirrodin/Broodstar.java index 47d749000fe..ae4662db8bb 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Broodstar.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Broodstar.java @@ -45,7 +45,7 @@ public class Broodstar extends mage.sets.planechase.Broodstar { super(card); } - @Override + @java.lang.Override public Broodstar copy() { return new Broodstar(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Cathodion.java b/Mage.Sets/src/mage/sets/mirrodin/Cathodion.java index 8f38f129a8b..6ca82d31e62 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Cathodion.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Cathodion.java @@ -55,7 +55,7 @@ public class Cathodion extends CardImpl { super(card); } - @Override + @java.lang.Override public Cathodion copy() { return new Cathodion(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java b/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java index 92255a1111e..9547ef0150b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java @@ -68,7 +68,7 @@ public class ChaliceOfTheVoid extends CardImpl { super(card); } - @Override + @java.lang.Override public ChaliceOfTheVoid copy() { return new ChaliceOfTheVoid(this); } @@ -84,7 +84,7 @@ class ChaliceOfTheVoidEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { @@ -101,7 +101,7 @@ class ChaliceOfTheVoidEffect extends OneShotEffect { return true; } - @Override + @java.lang.Override public ChaliceOfTheVoidEffect copy() { return new ChaliceOfTheVoidEffect(this); } @@ -119,17 +119,17 @@ class ChaliceOfTheVoidTriggeredAbility extends TriggeredAbilityImpl { super(abiltity); } - @Override + @java.lang.Override public ChaliceOfTheVoidTriggeredAbility copy() { return new ChaliceOfTheVoidTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.SPELL_CAST; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { Permanent chalice = game.getPermanent(getSourceId()); Spell spell = game.getStack().getSpell(event.getTargetId()); @@ -142,7 +142,7 @@ class ChaliceOfTheVoidTriggeredAbility extends TriggeredAbilityImpl { return false; } - @Override + @java.lang.Override public String getRule() { return "Whenever a player casts a spell with converted mana cost equal to the number of charge counters on {this}, counter that spell."; } @@ -159,12 +159,12 @@ class CounterEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public CounterEffect copy() { return new CounterEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { return game.getStack().counter(this.getTargetPointer().getFirst(game, source), source.getSourceId(), game); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ChromaticSphere.java b/Mage.Sets/src/mage/sets/mirrodin/ChromaticSphere.java index 0d8ee852342..1b9b2c20aee 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ChromaticSphere.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ChromaticSphere.java @@ -61,7 +61,7 @@ public class ChromaticSphere extends CardImpl { super(card); } - @Override + @java.lang.Override public ChromaticSphere copy() { return new ChromaticSphere(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ChromeMox.java b/Mage.Sets/src/mage/sets/mirrodin/ChromeMox.java index 00e8256abb9..af94a37a999 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ChromeMox.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ChromeMox.java @@ -73,7 +73,7 @@ public class ChromeMox extends CardImpl { super(card); } - @Override + @java.lang.Override public ChromeMox copy() { return new ChromeMox(this); } @@ -94,7 +94,7 @@ class ChromeMoxEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player.getHand().size() > 0) { @@ -113,7 +113,7 @@ class ChromeMoxEffect extends OneShotEffect { return true; } - @Override + @java.lang.Override public ChromeMoxEffect copy() { return new ChromeMoxEffect(this); } @@ -135,12 +135,12 @@ class ChromeMoxManaEffect extends ManaEffect { - @Override + @java.lang.Override public ChromeMoxManaEffect copy() { return new ChromeMoxManaEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); Player player = game.getPlayer(source.getControllerId()); @@ -197,7 +197,7 @@ class ChromeMoxManaEffect extends ManaEffect { return true; } - @Override + @java.lang.Override public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ClockworkBeetle.java b/Mage.Sets/src/mage/sets/mirrodin/ClockworkBeetle.java index 7f91eb2f87d..f544032e83b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ClockworkBeetle.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ClockworkBeetle.java @@ -65,7 +65,7 @@ public class ClockworkBeetle extends CardImpl { super(card); } - @Override + @java.lang.Override public ClockworkBeetle copy() { return new ClockworkBeetle(this); } @@ -81,7 +81,7 @@ class ClockworkBeetleEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent p = game.getPermanent(source.getSourceId()); if (p != null) { @@ -93,7 +93,7 @@ class ClockworkBeetleEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public ClockworkBeetleEffect copy() { return new ClockworkBeetleEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ClockworkCondor.java b/Mage.Sets/src/mage/sets/mirrodin/ClockworkCondor.java index 6a01b421d45..d995f968486 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ClockworkCondor.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ClockworkCondor.java @@ -68,7 +68,7 @@ public class ClockworkCondor extends CardImpl { super(card); } - @Override + @java.lang.Override public ClockworkCondor copy() { return new ClockworkCondor(this); } @@ -84,7 +84,7 @@ class ClockworkCondorEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent p = game.getPermanent(source.getSourceId()); if (p != null) { @@ -96,7 +96,7 @@ class ClockworkCondorEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public ClockworkCondorEffect copy() { return new ClockworkCondorEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ClockworkDragon.java b/Mage.Sets/src/mage/sets/mirrodin/ClockworkDragon.java index 89edef7ff4d..d478eb1a378 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ClockworkDragon.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ClockworkDragon.java @@ -72,7 +72,7 @@ public class ClockworkDragon extends CardImpl { super(card); } - @Override + @java.lang.Override public ClockworkDragon copy() { return new ClockworkDragon(this); } @@ -88,7 +88,7 @@ class ClockworkDragonEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent p = game.getPermanent(source.getSourceId()); if (p != null) { @@ -100,7 +100,7 @@ class ClockworkDragonEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public ClockworkDragonEffect copy() { return new ClockworkDragonEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ClockworkVorrac.java b/Mage.Sets/src/mage/sets/mirrodin/ClockworkVorrac.java index f51b7517beb..e783cbcbbb4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ClockworkVorrac.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ClockworkVorrac.java @@ -72,7 +72,7 @@ public class ClockworkVorrac extends CardImpl { super(card); } - @Override + @java.lang.Override public ClockworkVorrac copy() { return new ClockworkVorrac(this); } @@ -88,7 +88,7 @@ class ClockworkVorracEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent p = game.getPermanent(source.getSourceId()); if (p != null) { @@ -100,7 +100,7 @@ class ClockworkVorracEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public ClockworkVorracEffect copy() { return new ClockworkVorracEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Cloudpost.java b/Mage.Sets/src/mage/sets/mirrodin/Cloudpost.java index 2de82786bbe..ea6e278bc9e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Cloudpost.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Cloudpost.java @@ -65,7 +65,7 @@ public class Cloudpost extends CardImpl { super(card); } - @Override + @java.lang.Override public Cloudpost copy() { return new Cloudpost(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/CobaltGolem.java b/Mage.Sets/src/mage/sets/mirrodin/CobaltGolem.java index 01c3b87feee..af9c86341d7 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/CobaltGolem.java +++ b/Mage.Sets/src/mage/sets/mirrodin/CobaltGolem.java @@ -59,7 +59,7 @@ public class CobaltGolem extends CardImpl { super(card); } - @Override + @java.lang.Override public CobaltGolem copy() { return new CobaltGolem(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ConsumeSpirit.java b/Mage.Sets/src/mage/sets/mirrodin/ConsumeSpirit.java index c0bea16de08..6c5da656565 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ConsumeSpirit.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ConsumeSpirit.java @@ -47,7 +47,7 @@ public class ConsumeSpirit extends mage.sets.magic2010.ConsumeSpirit { super(card); } - @Override + @java.lang.Override public ConsumeSpirit copy() { return new ConsumeSpirit(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ContaminatedBond.java b/Mage.Sets/src/mage/sets/mirrodin/ContaminatedBond.java index e38e9aa0c8c..b89a4f8a8f0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ContaminatedBond.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ContaminatedBond.java @@ -45,7 +45,7 @@ public class ContaminatedBond extends mage.sets.ninthedition.ContaminatedBond { super(card); } - @Override + @java.lang.Override public ContaminatedBond copy() { return new ContaminatedBond(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/CopperMyr.java b/Mage.Sets/src/mage/sets/mirrodin/CopperMyr.java index 6891e88e69f..395c564520f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/CopperMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/CopperMyr.java @@ -54,7 +54,7 @@ public class CopperMyr extends CardImpl { super(card); } - @Override + @java.lang.Override public CopperMyr copy() { return new CopperMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/CreepingMold.java b/Mage.Sets/src/mage/sets/mirrodin/CreepingMold.java index a6400e102f9..307d6dfea73 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/CreepingMold.java +++ b/Mage.Sets/src/mage/sets/mirrodin/CreepingMold.java @@ -45,7 +45,7 @@ public class CreepingMold extends mage.sets.tenthedition.CreepingMold { super(card); } - @Override + @java.lang.Override public CreepingMold copy() { return new CreepingMold(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/CrystalShard.java b/Mage.Sets/src/mage/sets/mirrodin/CrystalShard.java index 5b6e779b376..5068a42903b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/CrystalShard.java +++ b/Mage.Sets/src/mage/sets/mirrodin/CrystalShard.java @@ -70,7 +70,7 @@ public class CrystalShard extends CardImpl { super(card); } - @Override + @java.lang.Override public CrystalShard copy() { return new CrystalShard(this); } @@ -91,12 +91,12 @@ class CrystalShardEffect extends OneShotEffect { this.cost = effect.cost.copy(); } - @Override + @java.lang.Override public CrystalShardEffect copy() { return new CrystalShardEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/DampingMatrix.java b/Mage.Sets/src/mage/sets/mirrodin/DampingMatrix.java index 491766f4fd2..fb7dfb0f0da 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/DampingMatrix.java +++ b/Mage.Sets/src/mage/sets/mirrodin/DampingMatrix.java @@ -65,7 +65,7 @@ public class DampingMatrix extends CardImpl { super(card); } - @Override + @java.lang.Override public DampingMatrix copy() { return new DampingMatrix(this); } @@ -89,22 +89,22 @@ class DampingMatrixEffect extends ReplacementEffectImpl { super(effect); } - @Override + @java.lang.Override public DampingMatrixEffect copy() { return new DampingMatrixEffect(this); } - @Override + @java.lang.Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { return true; } - @Override + @java.lang.Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == EventType.ACTIVATE_ABILITY; } - @Override + @java.lang.Override public boolean applies(GameEvent event, Ability source, Game game) { MageObject object = game.getObject(event.getSourceId()); if (object instanceof Permanent && filter.match((Permanent)object, game)) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/Deconstruct.java b/Mage.Sets/src/mage/sets/mirrodin/Deconstruct.java index 1e6eef3d172..9ee62a3fbbd 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Deconstruct.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Deconstruct.java @@ -63,7 +63,7 @@ public class Deconstruct extends CardImpl { super(card); } - @Override + @java.lang.Override public Deconstruct copy() { return new Deconstruct(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/DiscipleOfTheVault.java b/Mage.Sets/src/mage/sets/mirrodin/DiscipleOfTheVault.java index 223f4b99aae..6355d354512 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/DiscipleOfTheVault.java +++ b/Mage.Sets/src/mage/sets/mirrodin/DiscipleOfTheVault.java @@ -69,7 +69,7 @@ public class DiscipleOfTheVault extends CardImpl { super(card); } - @Override + @java.lang.Override public DiscipleOfTheVault copy() { return new DiscipleOfTheVault(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/DragonBlood.java b/Mage.Sets/src/mage/sets/mirrodin/DragonBlood.java index e3c6c1015c2..fb9cfeb570c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/DragonBlood.java +++ b/Mage.Sets/src/mage/sets/mirrodin/DragonBlood.java @@ -60,7 +60,7 @@ public class DragonBlood extends CardImpl { super(card); } - @Override + @java.lang.Override public DragonBlood copy() { return new DragonBlood(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/DreamsGrip.java b/Mage.Sets/src/mage/sets/mirrodin/DreamsGrip.java index 1f539e867ee..228e76e2d75 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/DreamsGrip.java +++ b/Mage.Sets/src/mage/sets/mirrodin/DreamsGrip.java @@ -74,7 +74,7 @@ public class DreamsGrip extends CardImpl { super(card); } - @Override + @java.lang.Override public DreamsGrip copy() { return new DreamsGrip(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/DrossProwler.java b/Mage.Sets/src/mage/sets/mirrodin/DrossProwler.java index 060d0a0484a..36fe5a79a4d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/DrossProwler.java +++ b/Mage.Sets/src/mage/sets/mirrodin/DrossProwler.java @@ -55,7 +55,7 @@ public class DrossProwler extends CardImpl { super(card); } - @Override + @java.lang.Override public DrossProwler copy() { return new DrossProwler(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java b/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java index 097ad9b5bbb..97e6c4811d5 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java @@ -81,7 +81,7 @@ public class Duplicant extends CardImpl { super(card); } - @Override + @java.lang.Override public Duplicant copy() { return new Duplicant(this); } @@ -97,12 +97,12 @@ class ExileTargetEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public ExileTargetEffect copy() { return new ExileTargetEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); Permanent sourcePermananent = game.getPermanent(source.getSourceId()); @@ -117,7 +117,7 @@ class ExileTargetEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public String getText(Mode mode) { return "you may exile target nontoken creature"; } @@ -135,12 +135,12 @@ class DuplicantContinuousEffect extends ContinuousEffectImpl { super(effect); } - @Override + @java.lang.Override public DuplicantContinuousEffect copy() { return new DuplicantContinuousEffect(this); } - @Override + @java.lang.Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { @@ -172,12 +172,12 @@ class DuplicantContinuousEffect extends ContinuousEffectImpl { return false; } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { return false; } - @Override + @java.lang.Override public boolean hasLayer(Layer layer) { return layer == Layer.PTChangingEffects_7 || layer == Layer.TypeChangingEffects_4; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Duskworker.java b/Mage.Sets/src/mage/sets/mirrodin/Duskworker.java index 5a0c14ff4d2..a3e8b1dcf53 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Duskworker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Duskworker.java @@ -61,7 +61,7 @@ public class Duskworker extends CardImpl { super(card); } - @Override + @java.lang.Override public Duskworker copy() { return new Duskworker(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ElfReplica.java b/Mage.Sets/src/mage/sets/mirrodin/ElfReplica.java index 13842387642..c7a006aa34a 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ElfReplica.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ElfReplica.java @@ -71,7 +71,7 @@ public class ElfReplica extends CardImpl { super(card); } - @Override + @java.lang.Override public ElfReplica copy() { return new ElfReplica(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/EmpyrialPlate.java b/Mage.Sets/src/mage/sets/mirrodin/EmpyrialPlate.java index 8e670b1954b..f4f896cb3d9 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/EmpyrialPlate.java +++ b/Mage.Sets/src/mage/sets/mirrodin/EmpyrialPlate.java @@ -61,7 +61,7 @@ public class EmpyrialPlate extends CardImpl { super(card); } - @Override + @java.lang.Override public EmpyrialPlate copy() { return new EmpyrialPlate(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ExtraplanarLens.java b/Mage.Sets/src/mage/sets/mirrodin/ExtraplanarLens.java index b019f5c0196..343798c557b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ExtraplanarLens.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ExtraplanarLens.java @@ -73,7 +73,7 @@ public class ExtraplanarLens extends CardImpl { super(card); } - @Override + @java.lang.Override public ExtraplanarLens copy() { return new ExtraplanarLens(this); } @@ -96,7 +96,7 @@ class ExtraplanarLensImprintEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Permanent extraplanarLens = game.getPermanentOrLKIBattlefield(source.getSourceId()); @@ -118,7 +118,7 @@ class ExtraplanarLensImprintEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public ExtraplanarLensImprintEffect copy() { return new ExtraplanarLensImprintEffect(this); } @@ -135,12 +135,12 @@ class ExtraplanarLensTriggeredAbility extends TriggeredManaAbility { super(ability); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.TAPPED_FOR_MANA; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { Permanent landTappedForMana = game.getPermanentOrLKIBattlefield(event.getSourceId()); Permanent extraplanarLens = game.getPermanent(getSourceId()); @@ -164,12 +164,12 @@ class ExtraplanarLensTriggeredAbility extends TriggeredManaAbility { return false; } - @Override + @java.lang.Override public String getRule() { return new StringBuilder("Whenever a land with the same name as the exiled card is tapped for mana, ").append(super.getRule()).toString(); } - @Override + @java.lang.Override public ExtraplanarLensTriggeredAbility copy() { return new ExtraplanarLensTriggeredAbility(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Fabricate.java b/Mage.Sets/src/mage/sets/mirrodin/Fabricate.java index 17ae471d3d6..f188f69da3f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Fabricate.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Fabricate.java @@ -45,7 +45,7 @@ public class Fabricate extends mage.sets.magic2010.Fabricate { super(card); } - @Override + @java.lang.Override public Fabricate copy() { return new Fabricate(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/FangrenHunter.java b/Mage.Sets/src/mage/sets/mirrodin/FangrenHunter.java index fcda78ed975..a50ce1baf3c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/FangrenHunter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/FangrenHunter.java @@ -55,7 +55,7 @@ public class FangrenHunter extends CardImpl { super(card); } - @Override + @java.lang.Override public FangrenHunter copy() { return new FangrenHunter(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/FarsightMask.java b/Mage.Sets/src/mage/sets/mirrodin/FarsightMask.java index 7aa5166950c..3638e18895e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/FarsightMask.java +++ b/Mage.Sets/src/mage/sets/mirrodin/FarsightMask.java @@ -56,7 +56,7 @@ public class FarsightMask extends CardImpl { super(card); } - @Override + @java.lang.Override public FarsightMask copy() { return new FarsightMask(this); } @@ -72,23 +72,23 @@ class FarsightMaskTriggeredAbility extends TriggeredAbilityImpl { super(ability); } - @Override + @java.lang.Override public FarsightMaskTriggeredAbility copy() { return new FarsightMaskTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType().equals(GameEvent.EventType.DAMAGED_PLAYER); } - @Override + @java.lang.Override public boolean checkInterveningIfClause(Game game) { Permanent permanent = game.getPermanent(getSourceId()); return permanent != null && !permanent.isTapped(); } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getTargetId().equals(controllerId)) { UUID sourceControllerId = game.getControllerId(event.getSourceId()); @@ -99,7 +99,7 @@ class FarsightMaskTriggeredAbility extends TriggeredAbilityImpl { return false; } - @Override + @java.lang.Override public String getRule() { return "Whenever a source an opponent controls deals damage to you, if {this} is untapped, you may draw a card."; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/FieryGambit.java b/Mage.Sets/src/mage/sets/mirrodin/FieryGambit.java index 25be1b7f876..c95dbad0ffe 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/FieryGambit.java +++ b/Mage.Sets/src/mage/sets/mirrodin/FieryGambit.java @@ -63,7 +63,7 @@ public class FieryGambit extends CardImpl { super(card); } - @Override + @java.lang.Override public FieryGambit copy() { return new FieryGambit(this); } @@ -81,12 +81,12 @@ class FieryGambitEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public FieryGambitEffect copy() { return new FieryGambitEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/Fireshrieker.java b/Mage.Sets/src/mage/sets/mirrodin/Fireshrieker.java index 5371b7da9b4..1e3504d4718 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Fireshrieker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Fireshrieker.java @@ -45,7 +45,7 @@ public class Fireshrieker extends mage.sets.magic2014.Fireshrieker { super(card); } - @Override + @java.lang.Override public Fireshrieker copy() { return new Fireshrieker(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/FistsOfTheAnvil.java b/Mage.Sets/src/mage/sets/mirrodin/FistsOfTheAnvil.java index 2f42a1b0885..c091e6f2b64 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/FistsOfTheAnvil.java +++ b/Mage.Sets/src/mage/sets/mirrodin/FistsOfTheAnvil.java @@ -45,7 +45,7 @@ public class FistsOfTheAnvil extends mage.sets.tenthedition.FistsOfTheAnvil { super(card); } - @Override + @java.lang.Override public FistsOfTheAnvil copy() { return new FistsOfTheAnvil(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Forest1.java b/Mage.Sets/src/mage/sets/mirrodin/Forest1.java index d3c05ea5c41..417118b11a5 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Forest1.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Forest1.java @@ -44,7 +44,7 @@ public class Forest1 extends mage.cards.basiclands.Forest { super(card); } - @Override + @java.lang.Override public Forest1 copy() { return new Forest1(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Forest2.java b/Mage.Sets/src/mage/sets/mirrodin/Forest2.java index ff6380dca76..fd9f4b3e5f8 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Forest2.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Forest2.java @@ -44,7 +44,7 @@ public class Forest2 extends mage.cards.basiclands.Forest { super(card); } - @Override + @java.lang.Override public Forest2 copy() { return new Forest2(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Forest3.java b/Mage.Sets/src/mage/sets/mirrodin/Forest3.java index 3b443dff6ea..5bc9d69b785 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Forest3.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Forest3.java @@ -44,7 +44,7 @@ public class Forest3 extends mage.cards.basiclands.Forest { super(card); } - @Override + @java.lang.Override public Forest3 copy() { return new Forest3(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Forest4.java b/Mage.Sets/src/mage/sets/mirrodin/Forest4.java index 676ccafb7c4..12bfcb4ed7d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Forest4.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Forest4.java @@ -44,7 +44,7 @@ public class Forest4 extends mage.cards.basiclands.Forest { super(card); } - @Override + @java.lang.Override public Forest4 copy() { return new Forest4(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Frogmite.java b/Mage.Sets/src/mage/sets/mirrodin/Frogmite.java index e5bf48cfe45..e4de69dba56 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Frogmite.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Frogmite.java @@ -45,7 +45,7 @@ public class Frogmite extends mage.sets.elspethvstezzeret.Frogmite { super(card); } - @Override + @java.lang.Override public Frogmite copy() { return new Frogmite(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GalvanicKey.java b/Mage.Sets/src/mage/sets/mirrodin/GalvanicKey.java index 57fba23da17..31cf76f1fa3 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GalvanicKey.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GalvanicKey.java @@ -69,7 +69,7 @@ public class GalvanicKey extends CardImpl { super(card); } - @Override + @java.lang.Override public GalvanicKey copy() { return new GalvanicKey(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GildedLotus.java b/Mage.Sets/src/mage/sets/mirrodin/GildedLotus.java index b3a9670c521..afd3842ee6c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GildedLotus.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GildedLotus.java @@ -45,7 +45,7 @@ public class GildedLotus extends mage.sets.magic2013.GildedLotus { super(card); } - @Override + @java.lang.Override public GildedLotus copy() { return new GildedLotus(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Glimmervoid.java b/Mage.Sets/src/mage/sets/mirrodin/Glimmervoid.java index f8f27d33be2..75ab8e50f04 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Glimmervoid.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Glimmervoid.java @@ -60,7 +60,7 @@ public class Glimmervoid extends CardImpl { super(card); } - @Override + @java.lang.Override public Glimmervoid copy() { return new Glimmervoid(this); } @@ -76,17 +76,17 @@ class GlimmervoidTriggeredAbility extends TriggeredAbilityImpl { super(ability); } - @Override + @java.lang.Override public GlimmervoidTriggeredAbility copy() { return new GlimmervoidTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.END_TURN_STEP_PRE; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { FilterArtifactPermanent filter = new FilterArtifactPermanent(); if (!game.getBattlefield().contains(filter, controllerId, 1, game)) { @@ -95,7 +95,7 @@ class GlimmervoidTriggeredAbility extends TriggeredAbilityImpl { return false; } - @Override + @java.lang.Override public String getRule() { return "At the beginning of the end step, if you control no artifacts, sacrifice {this}."; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java b/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java index f4520e50e54..4e6bc4c5fe6 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GlissaSunseeker.java @@ -72,7 +72,7 @@ public class GlissaSunseeker extends CardImpl { super(card); } - @Override + @java.lang.Override public GlissaSunseeker copy() { return new GlissaSunseeker(this); } @@ -89,12 +89,12 @@ class GlissaSunseekerEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public GlissaSunseekerEffect copy() { return new GlissaSunseekerEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); ManaPool pool = controller.getManaPool(); diff --git a/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java b/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java index 4d592923a78..654c4e4dcf4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java @@ -68,7 +68,7 @@ public class GoblinCharbelcher extends CardImpl { super(card); } - @Override + @java.lang.Override public GoblinCharbelcher copy() { return new GoblinCharbelcher(this); } @@ -85,12 +85,12 @@ class GoblinCharbelcherEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public GoblinCharbelcherEffect copy() { return new GoblinCharbelcherEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { boolean isMountain = false; MageObject sourceObject = game.getObject(source.getSourceId()); diff --git a/Mage.Sets/src/mage/sets/mirrodin/GoblinReplica.java b/Mage.Sets/src/mage/sets/mirrodin/GoblinReplica.java index d5b315d609b..aeffd5c109f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GoblinReplica.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GoblinReplica.java @@ -71,7 +71,7 @@ public class GoblinReplica extends CardImpl { super(card); } - @Override + @java.lang.Override public GoblinReplica copy() { return new GoblinReplica(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GoblinStriker.java b/Mage.Sets/src/mage/sets/mirrodin/GoblinStriker.java index 51ad002083e..e0944b2ca6e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GoblinStriker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GoblinStriker.java @@ -58,7 +58,7 @@ public class GoblinStriker extends CardImpl { super(card); } - @Override + @java.lang.Override public GoblinStriker copy() { return new GoblinStriker(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GoldMyr.java b/Mage.Sets/src/mage/sets/mirrodin/GoldMyr.java index 843a45b4361..6f1fd69cb86 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GoldMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GoldMyr.java @@ -54,7 +54,7 @@ public class GoldMyr extends CardImpl { super(card); } - @Override + @java.lang.Override public GoldMyr copy() { return new GoldMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java b/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java index bfbead38c77..b5beeb571e4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java @@ -62,7 +62,7 @@ public class GolemSkinGauntlets extends CardImpl { super(card); } - @Override + @java.lang.Override public GolemSkinGauntlets copy() { return new GolemSkinGauntlets(this); } @@ -78,7 +78,7 @@ class GolemSkinGauntletsAttachedCount implements DynamicValue { public GolemSkinGauntletsAttachedCount(final GolemSkinGauntletsAttachedCount dynamicValue) { } - @Override + @java.lang.Override public int calculate(Game game, Ability source, Effect effect) { int count = 0; Permanent equipment = game.getPermanent(source.getSourceId()); @@ -98,17 +98,17 @@ class GolemSkinGauntletsAttachedCount implements DynamicValue { return count; } - @Override + @java.lang.Override public DynamicValue copy() { return new GolemSkinGauntletsAttachedCount(this); } - @Override + @java.lang.Override public String toString() { return "1"; } - @Override + @java.lang.Override public String getMessage() { return "Equipment attached to it"; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GrabTheReins.java b/Mage.Sets/src/mage/sets/mirrodin/GrabTheReins.java index 905ef340f27..1cbdbdbb751 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GrabTheReins.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GrabTheReins.java @@ -89,7 +89,7 @@ public class GrabTheReins extends CardImpl { super(card); } - @Override + @java.lang.Override public GrabTheReins copy() { return new GrabTheReins(this); } @@ -106,7 +106,7 @@ class GrabTheReinsEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { UUID controllerId = source.getControllerId(); Target target = new TargetCreaturePermanent(); @@ -142,7 +142,7 @@ class GrabTheReinsEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public GrabTheReinsEffect copy() { return new GrabTheReinsEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/GreatFurnace.java b/Mage.Sets/src/mage/sets/mirrodin/GreatFurnace.java index 5a759d25d87..abe44d7765b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GreatFurnace.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GreatFurnace.java @@ -50,7 +50,7 @@ public class GreatFurnace extends CardImpl { super(card); } - @Override + @java.lang.Override public GreatFurnace copy() { return new GreatFurnace(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/HematiteGolem.java b/Mage.Sets/src/mage/sets/mirrodin/HematiteGolem.java index c35522ba369..0e8e54ad99f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/HematiteGolem.java +++ b/Mage.Sets/src/mage/sets/mirrodin/HematiteGolem.java @@ -58,7 +58,7 @@ public class HematiteGolem extends CardImpl { super(card); } - @Override + @java.lang.Override public HematiteGolem copy() { return new HematiteGolem(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/IcyManipulator.java b/Mage.Sets/src/mage/sets/mirrodin/IcyManipulator.java index 20129833d89..5a453583f16 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/IcyManipulator.java +++ b/Mage.Sets/src/mage/sets/mirrodin/IcyManipulator.java @@ -45,7 +45,7 @@ public class IcyManipulator extends mage.sets.tenthedition.IcyManipulator { super(card); } - @Override + @java.lang.Override public IcyManipulator copy() { return new IcyManipulator(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java b/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java index aecd8e02906..b7635f2125e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java +++ b/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java @@ -82,7 +82,7 @@ public class InciteWar extends CardImpl { super(card); } - @Override + @java.lang.Override public InciteWar copy() { return new InciteWar(this); } @@ -99,12 +99,12 @@ class InciteWarMustAttackEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public InciteWarMustAttackEffect copy() { return new InciteWarMustAttackEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); if (player != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/IronMyr.java b/Mage.Sets/src/mage/sets/mirrodin/IronMyr.java index b8b92d7c430..713188380d4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/IronMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/IronMyr.java @@ -54,7 +54,7 @@ public class IronMyr extends CardImpl { super(card); } - @Override + @java.lang.Override public IronMyr copy() { return new IronMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Island1.java b/Mage.Sets/src/mage/sets/mirrodin/Island1.java index 40c253b9aa8..5465691330f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Island1.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Island1.java @@ -45,7 +45,7 @@ public class Island1 extends mage.cards.basiclands.Island { super(card); } - @Override + @java.lang.Override public Island1 copy() { return new Island1(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Island2.java b/Mage.Sets/src/mage/sets/mirrodin/Island2.java index c4493783a81..882a0f8fe8b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Island2.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Island2.java @@ -45,7 +45,7 @@ public class Island2 extends mage.cards.basiclands.Island { super(card); } - @Override + @java.lang.Override public Island2 copy() { return new Island2(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Island3.java b/Mage.Sets/src/mage/sets/mirrodin/Island3.java index 09a395efda9..56ff70d0132 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Island3.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Island3.java @@ -45,7 +45,7 @@ public class Island3 extends mage.cards.basiclands.Island { super(card); } - @Override + @java.lang.Override public Island3 copy() { return new Island3(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Island4.java b/Mage.Sets/src/mage/sets/mirrodin/Island4.java index 2a43af0bf73..a6f457c94d0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Island4.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Island4.java @@ -45,7 +45,7 @@ public class Island4 extends mage.cards.basiclands.Island { super(card); } - @Override + @java.lang.Override public Island4 copy() { return new Island4(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/IsochronScepter.java b/Mage.Sets/src/mage/sets/mirrodin/IsochronScepter.java index c66fe327f6a..182669babf1 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/IsochronScepter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/IsochronScepter.java @@ -75,7 +75,7 @@ public class IsochronScepter extends CardImpl { super(card); } - @Override + @java.lang.Override public IsochronScepter copy() { return new IsochronScepter(this); } @@ -98,7 +98,7 @@ class IsochronScepterImprintEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); @@ -124,7 +124,7 @@ class IsochronScepterImprintEffect extends OneShotEffect { } - @Override + @java.lang.Override public IsochronScepterImprintEffect copy() { return new IsochronScepterImprintEffect(this); } @@ -142,12 +142,12 @@ class IsochronScepterCopyEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public IsochronScepterCopyEffect copy() { return new IsochronScepterCopyEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java b/Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java index 9c0820954d9..40a8f5ee9b9 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java +++ b/Mage.Sets/src/mage/sets/mirrodin/JourneyOfDiscovery.java @@ -65,7 +65,7 @@ public class JourneyOfDiscovery extends CardImpl { super(card); } - @Override + @java.lang.Override public JourneyOfDiscovery copy() { return new JourneyOfDiscovery(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/KrarkClanGrunt.java b/Mage.Sets/src/mage/sets/mirrodin/KrarkClanGrunt.java index 94ffdedb221..aae26d6f7c5 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/KrarkClanGrunt.java +++ b/Mage.Sets/src/mage/sets/mirrodin/KrarkClanGrunt.java @@ -74,7 +74,7 @@ public class KrarkClanGrunt extends CardImpl { super(card); } - @Override + @java.lang.Override public KrarkClanGrunt copy() { return new KrarkClanGrunt(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/KrarkClanShaman.java b/Mage.Sets/src/mage/sets/mirrodin/KrarkClanShaman.java index a7c8e9e14a8..a146a28a62e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/KrarkClanShaman.java +++ b/Mage.Sets/src/mage/sets/mirrodin/KrarkClanShaman.java @@ -74,7 +74,7 @@ public class KrarkClanShaman extends CardImpl { super(card); } - @Override + @java.lang.Override public KrarkClanShaman copy() { return new KrarkClanShaman(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/KrarksThumb.java b/Mage.Sets/src/mage/sets/mirrodin/KrarksThumb.java index 36535622b0e..0cdacc0dde0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/KrarksThumb.java +++ b/Mage.Sets/src/mage/sets/mirrodin/KrarksThumb.java @@ -61,7 +61,7 @@ public class KrarksThumb extends CardImpl { super(card); } - @Override + @java.lang.Override public KrarksThumb copy() { return new KrarksThumb(this); } @@ -77,7 +77,7 @@ class KrarksThumbEffect extends ReplacementEffectImpl { super(effect); } - @Override + @java.lang.Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { Player player = game.getPlayer(event.getPlayerId()); if (player != null) { @@ -96,22 +96,22 @@ class KrarksThumbEffect extends ReplacementEffectImpl { return false; } - @Override + @java.lang.Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.FLIP_COIN; } - @Override + @java.lang.Override public boolean applies(GameEvent event, Ability source, Game game) { return source.getControllerId().equals(event.getPlayerId()); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { return false; } - @Override + @java.lang.Override public KrarksThumbEffect copy() { return new KrarksThumbEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeadenMyr.java b/Mage.Sets/src/mage/sets/mirrodin/LeadenMyr.java index ffb5900b8bd..7d144062de6 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeadenMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeadenMyr.java @@ -54,7 +54,7 @@ public class LeadenMyr extends CardImpl { super(card); } - @Override + @java.lang.Override public LeadenMyr copy() { return new LeadenMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeoninAbunas.java b/Mage.Sets/src/mage/sets/mirrodin/LeoninAbunas.java index e8fa6160cfa..540f7a870c1 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeoninAbunas.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeoninAbunas.java @@ -64,7 +64,7 @@ public class LeoninAbunas extends CardImpl { super(card); } - @Override + @java.lang.Override public LeoninAbunas copy() { return new LeoninAbunas(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeoninBladetrap.java b/Mage.Sets/src/mage/sets/mirrodin/LeoninBladetrap.java index 504e83a6da1..654eb93d909 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeoninBladetrap.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeoninBladetrap.java @@ -45,7 +45,7 @@ public class LeoninBladetrap extends mage.sets.commander2013.LeoninBladetrap { super(card); } - @Override + @java.lang.Override public LeoninBladetrap copy() { return new LeoninBladetrap(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeoninDenGuard.java b/Mage.Sets/src/mage/sets/mirrodin/LeoninDenGuard.java index e49cf3faa03..075c2178133 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeoninDenGuard.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeoninDenGuard.java @@ -73,7 +73,7 @@ public class LeoninDenGuard extends CardImpl { super(card); } - @Override + @java.lang.Override public LeoninDenGuard copy() { return new LeoninDenGuard(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeoninElder.java b/Mage.Sets/src/mage/sets/mirrodin/LeoninElder.java index c790c360d7e..45986262ef3 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeoninElder.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeoninElder.java @@ -60,7 +60,7 @@ public class LeoninElder extends CardImpl { super(card); } - @Override + @java.lang.Override public LeoninElder copy() { return new LeoninElder(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeoninScimitar.java b/Mage.Sets/src/mage/sets/mirrodin/LeoninScimitar.java index f4acfab0167..f2c5a2be69b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeoninScimitar.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeoninScimitar.java @@ -47,7 +47,7 @@ public class LeoninScimitar extends mage.sets.tenthedition.LeoninScimitar { super(card); } - @Override + @java.lang.Override public LeoninScimitar copy() { return new LeoninScimitar(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeoninSkyhunter.java b/Mage.Sets/src/mage/sets/mirrodin/LeoninSkyhunter.java index 2f58b879d29..edf59d4f9bf 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeoninSkyhunter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeoninSkyhunter.java @@ -56,7 +56,7 @@ public class LeoninSkyhunter extends CardImpl { super(card); } - @Override + @java.lang.Override public LeoninSkyhunter copy() { return new LeoninSkyhunter(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LeoninSunStandard.java b/Mage.Sets/src/mage/sets/mirrodin/LeoninSunStandard.java index dbd41164ff9..d24fd96fc10 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LeoninSunStandard.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LeoninSunStandard.java @@ -55,7 +55,7 @@ public class LeoninSunStandard extends CardImpl { super(card); } - @Override + @java.lang.Override public LeoninSunStandard copy() { return new LeoninSunStandard(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LifesparkSpellbomb.java b/Mage.Sets/src/mage/sets/mirrodin/LifesparkSpellbomb.java index d16126b5cc9..21ab646e064 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LifesparkSpellbomb.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LifesparkSpellbomb.java @@ -71,7 +71,7 @@ public class LifesparkSpellbomb extends CardImpl { super(card); } - @Override + @java.lang.Override public LifesparkSpellbomb copy() { return new LifesparkSpellbomb(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LightningGreaves.java b/Mage.Sets/src/mage/sets/mirrodin/LightningGreaves.java index 73a92cb9deb..391adfcb056 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LightningGreaves.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LightningGreaves.java @@ -68,7 +68,7 @@ public class LightningGreaves extends CardImpl { super(card); } - @Override + @java.lang.Override public LightningGreaves copy() { return new LightningGreaves(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LivingHive.java b/Mage.Sets/src/mage/sets/mirrodin/LivingHive.java index d2e38bc750b..7ba01ec498b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LivingHive.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LivingHive.java @@ -66,7 +66,7 @@ public class LivingHive extends CardImpl { super(card); } - @Override + @java.lang.Override public LivingHive copy() { return new LivingHive(this); } @@ -83,12 +83,12 @@ class LivingHiveEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public LivingHiveEffect copy() { return new LivingHiveEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(targetPointer.getFirst(game, source)); if (player != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/LodestoneMyr.java b/Mage.Sets/src/mage/sets/mirrodin/LodestoneMyr.java index b1f3e0e1457..05a91327a96 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LodestoneMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LodestoneMyr.java @@ -45,7 +45,7 @@ public class LodestoneMyr extends mage.sets.planechase.LodestoneMyr { super(card); } - @Override + @java.lang.Override public LodestoneMyr copy() { return new LodestoneMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LoomingHoverguard.java b/Mage.Sets/src/mage/sets/mirrodin/LoomingHoverguard.java index 3f09d0e5a51..657e07c8546 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LoomingHoverguard.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LoomingHoverguard.java @@ -69,7 +69,7 @@ public class LoomingHoverguard extends CardImpl { super(card); } - @Override + @java.lang.Override public LoomingHoverguard copy() { return new LoomingHoverguard(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LoxodonMender.java b/Mage.Sets/src/mage/sets/mirrodin/LoxodonMender.java index 4bcf2cee1ec..f280f831ae7 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LoxodonMender.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LoxodonMender.java @@ -73,7 +73,7 @@ public class LoxodonMender extends CardImpl { super(card); } - @Override + @java.lang.Override public LoxodonMender copy() { return new LoxodonMender(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LoxodonPunisher.java b/Mage.Sets/src/mage/sets/mirrodin/LoxodonPunisher.java index edc5fbb0893..9b849c157c1 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LoxodonPunisher.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LoxodonPunisher.java @@ -63,7 +63,7 @@ public class LoxodonPunisher extends CardImpl { super(card); } - @Override + @java.lang.Override public LoxodonPunisher copy() { return new LoxodonPunisher(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LoxodonWarhammer.java b/Mage.Sets/src/mage/sets/mirrodin/LoxodonWarhammer.java index 9c48fc6395e..510bb2b755c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LoxodonWarhammer.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LoxodonWarhammer.java @@ -47,7 +47,7 @@ public class LoxodonWarhammer extends mage.sets.planechase.LoxodonWarhammer { super(card); } - @Override + @java.lang.Override public LoxodonWarhammer copy() { return new LoxodonWarhammer(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LumengridWarden.java b/Mage.Sets/src/mage/sets/mirrodin/LumengridWarden.java index 210c29f8f5d..5729d6d8463 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LumengridWarden.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LumengridWarden.java @@ -45,7 +45,7 @@ public class LumengridWarden extends mage.sets.tenthedition.LumengridWarden { super(card); } - @Override + @java.lang.Override public LumengridWarden copy() { return new LumengridWarden(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/LuminousAngel.java b/Mage.Sets/src/mage/sets/mirrodin/LuminousAngel.java index 7fab125c19d..2bd4c953dff 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/LuminousAngel.java +++ b/Mage.Sets/src/mage/sets/mirrodin/LuminousAngel.java @@ -60,7 +60,7 @@ public class LuminousAngel extends CardImpl { super(card); } - @Override + @java.lang.Override public LuminousAngel copy() { return new LuminousAngel(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MalachiteGolem.java b/Mage.Sets/src/mage/sets/mirrodin/MalachiteGolem.java index c1b768a0e7f..354cb3b493c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MalachiteGolem.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MalachiteGolem.java @@ -59,7 +59,7 @@ public class MalachiteGolem extends CardImpl { super(card); } - @Override + @java.lang.Override public MalachiteGolem copy() { return new MalachiteGolem(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MarchOfTheMachines.java b/Mage.Sets/src/mage/sets/mirrodin/MarchOfTheMachines.java index 1c14f4eb5ff..a772a1b0441 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MarchOfTheMachines.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MarchOfTheMachines.java @@ -45,7 +45,7 @@ public class MarchOfTheMachines extends mage.sets.tenthedition.MarchOfTheMachine super(card); } - @Override + @java.lang.Override public MarchOfTheMachines copy() { return new MarchOfTheMachines(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MaskOfMemory.java b/Mage.Sets/src/mage/sets/mirrodin/MaskOfMemory.java index cc13eecf925..1fb2fff1292 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MaskOfMemory.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MaskOfMemory.java @@ -45,7 +45,7 @@ public class MaskOfMemory extends mage.sets.planechase.MaskOfMemory { super(card); } - @Override + @java.lang.Override public MaskOfMemory copy() { return new MaskOfMemory(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MassHysteria.java b/Mage.Sets/src/mage/sets/mirrodin/MassHysteria.java index b48267e3fba..2cc90d37270 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MassHysteria.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MassHysteria.java @@ -56,7 +56,7 @@ public class MassHysteria extends CardImpl { super(card); } - @Override + @java.lang.Override public MassHysteria copy() { return new MassHysteria(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Megatog.java b/Mage.Sets/src/mage/sets/mirrodin/Megatog.java index 801acb392b7..c888442f902 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Megatog.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Megatog.java @@ -72,7 +72,7 @@ public class Megatog extends CardImpl { super(card); } - @Override + @java.lang.Override public Megatog copy() { return new Megatog(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MesmericOrb.java b/Mage.Sets/src/mage/sets/mirrodin/MesmericOrb.java index 7b237c99fef..6e5e1f84b73 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MesmericOrb.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MesmericOrb.java @@ -61,7 +61,7 @@ public class MesmericOrb extends CardImpl { super(card); } - @Override + @java.lang.Override public MesmericOrb copy() { return new MesmericOrb(this); } @@ -77,17 +77,17 @@ class BecomesUntappedPermanentTriggeredAbility extends TriggeredAbilityImpl{ super(ability); } - @Override + @java.lang.Override public BecomesUntappedPermanentTriggeredAbility copy() { return new BecomesUntappedPermanentTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.UNTAPPED; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null) { @@ -97,7 +97,7 @@ class BecomesUntappedPermanentTriggeredAbility extends TriggeredAbilityImpl{ return false; } - @Override + @java.lang.Override public String getRule() { return "Whenever a permanent becomes untapped, " + super.getRule(); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MindsEye.java b/Mage.Sets/src/mage/sets/mirrodin/MindsEye.java index baec2090119..07dcfcda894 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MindsEye.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MindsEye.java @@ -54,7 +54,7 @@ public class MindsEye extends CardImpl { super(card); } - @Override + @java.lang.Override public MindsEye copy() { return new MindsEye(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Mindslaver.java b/Mage.Sets/src/mage/sets/mirrodin/Mindslaver.java index 10de4e8ae62..1e0e616bc1b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Mindslaver.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Mindslaver.java @@ -47,7 +47,7 @@ public class Mindslaver extends mage.sets.scarsofmirrodin.Mindslaver { super(card); } - @Override + @java.lang.Override public Mindslaver copy() { return new Mindslaver(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MolderSlug.java b/Mage.Sets/src/mage/sets/mirrodin/MolderSlug.java index cefc85a0183..f13d7e10a0e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MolderSlug.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MolderSlug.java @@ -67,7 +67,7 @@ public class MolderSlug extends CardImpl { super(card); } - @Override + @java.lang.Override public MolderSlug copy() { return new MolderSlug(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MoltenRain.java b/Mage.Sets/src/mage/sets/mirrodin/MoltenRain.java index bdcac25004e..e0872cb2b58 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MoltenRain.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MoltenRain.java @@ -63,7 +63,7 @@ public class MoltenRain extends CardImpl { super(card); } - @Override + @java.lang.Override public MoltenRain copy() { return new MoltenRain(this); } @@ -80,12 +80,12 @@ class MoltenRainEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public MoltenRainEffect copy() { return new MoltenRainEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent permanent = (Permanent) game.getLastKnownInformation(source.getFirstTarget(), Zone.BATTLEFIELD); if (permanent != null && !permanent.getSupertype().contains("Basic")) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/Mountain1.java b/Mage.Sets/src/mage/sets/mirrodin/Mountain1.java index 0679b2a11a2..83978d3dd3f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Mountain1.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Mountain1.java @@ -45,7 +45,7 @@ public class Mountain1 extends mage.cards.basiclands.Mountain { super(card); } - @Override + @java.lang.Override public Mountain1 copy() { return new Mountain1(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Mountain2.java b/Mage.Sets/src/mage/sets/mirrodin/Mountain2.java index ea38142bd3c..9190ef81d69 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Mountain2.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Mountain2.java @@ -45,7 +45,7 @@ public class Mountain2 extends mage.cards.basiclands.Mountain { super(card); } - @Override + @java.lang.Override public Mountain2 copy() { return new Mountain2(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Mountain3.java b/Mage.Sets/src/mage/sets/mirrodin/Mountain3.java index 3d4a0dd4bbf..9b13f549bf8 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Mountain3.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Mountain3.java @@ -45,7 +45,7 @@ public class Mountain3 extends mage.cards.basiclands.Mountain { super(card); } - @Override + @java.lang.Override public Mountain3 copy() { return new Mountain3(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Mountain4.java b/Mage.Sets/src/mage/sets/mirrodin/Mountain4.java index 7c8639020a4..852a488bb38 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Mountain4.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Mountain4.java @@ -45,7 +45,7 @@ public class Mountain4 extends mage.cards.basiclands.Mountain { super(card); } - @Override + @java.lang.Override public Mountain4 copy() { return new Mountain4(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MyrAdapter.java b/Mage.Sets/src/mage/sets/mirrodin/MyrAdapter.java index 16592471fe2..5ed2e2f88ec 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MyrAdapter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MyrAdapter.java @@ -62,7 +62,7 @@ public class MyrAdapter extends CardImpl { super(card); } - @Override + @java.lang.Override public MyrAdapter copy() { return new MyrAdapter(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MyrEnforcer.java b/Mage.Sets/src/mage/sets/mirrodin/MyrEnforcer.java index dbc7ba0755a..75d9999fb58 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MyrEnforcer.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MyrEnforcer.java @@ -45,7 +45,7 @@ public class MyrEnforcer extends mage.sets.planechase.MyrEnforcer { super(card); } - @Override + @java.lang.Override public MyrEnforcer copy() { return new MyrEnforcer(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/MyrRetriever.java b/Mage.Sets/src/mage/sets/mirrodin/MyrRetriever.java index 58fc7b74bf8..7791fdacbed 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/MyrRetriever.java +++ b/Mage.Sets/src/mage/sets/mirrodin/MyrRetriever.java @@ -45,7 +45,7 @@ public class MyrRetriever extends mage.sets.modernmasters.MyrRetriever { super(card); } - @Override + @java.lang.Override public MyrRetriever copy() { return new MyrRetriever(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NecrogenMists.java b/Mage.Sets/src/mage/sets/mirrodin/NecrogenMists.java index a6881b17569..6849b48b767 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NecrogenMists.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NecrogenMists.java @@ -55,7 +55,7 @@ public class NecrogenMists extends CardImpl { super(card); } - @Override + @java.lang.Override public NecrogenMists copy() { return new NecrogenMists(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NecrogenSpellbomb.java b/Mage.Sets/src/mage/sets/mirrodin/NecrogenSpellbomb.java index fcb16b0875d..67655a692a9 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NecrogenSpellbomb.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NecrogenSpellbomb.java @@ -65,7 +65,7 @@ public class NecrogenSpellbomb extends CardImpl { super(card); } - @Override + @java.lang.Override public NecrogenSpellbomb copy() { return new NecrogenSpellbomb(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Needlebug.java b/Mage.Sets/src/mage/sets/mirrodin/Needlebug.java index 56f10dfdd45..1bd3e785c7a 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Needlebug.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Needlebug.java @@ -59,7 +59,7 @@ public class Needlebug extends CardImpl { super(card); } - @Override + @java.lang.Override public Needlebug copy() { return new Needlebug(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NeurokHoversail.java b/Mage.Sets/src/mage/sets/mirrodin/NeurokHoversail.java index 6eef00d5055..909d74c8f87 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NeurokHoversail.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NeurokHoversail.java @@ -58,7 +58,7 @@ public class NeurokHoversail extends CardImpl { super(card); } - @Override + @java.lang.Override public NeurokHoversail copy() { return new NeurokHoversail(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NeurokSpy.java b/Mage.Sets/src/mage/sets/mirrodin/NeurokSpy.java index 3dccb51f5d5..51188369f43 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NeurokSpy.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NeurokSpy.java @@ -67,7 +67,7 @@ public class NeurokSpy extends CardImpl { super(card); } - @Override + @java.lang.Override public NeurokSpy copy() { return new NeurokSpy(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NightmareLash.java b/Mage.Sets/src/mage/sets/mirrodin/NightmareLash.java index 2b1afca7485..6afd1d2bab3 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NightmareLash.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NightmareLash.java @@ -68,7 +68,7 @@ public class NightmareLash extends CardImpl { super(card); } - @Override + @java.lang.Override public NightmareLash copy() { return new NightmareLash(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java b/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java index 5096665ecc1..b66386c5280 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java @@ -85,7 +85,7 @@ public class NimDevourer extends CardImpl { super(card); } - @Override + @java.lang.Override public NimDevourer copy() { return new NimDevourer(this); } @@ -102,12 +102,12 @@ class NimDevourerEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public NimDevourerEffect copy() { return new NimDevourerEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/NimLasher.java b/Mage.Sets/src/mage/sets/mirrodin/NimLasher.java index 1af1ffcdb64..b3cbc9c3d26 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NimLasher.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NimLasher.java @@ -67,7 +67,7 @@ public class NimLasher extends CardImpl { super(card); } - @Override + @java.lang.Override public NimLasher copy() { return new NimLasher(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NimReplica.java b/Mage.Sets/src/mage/sets/mirrodin/NimReplica.java index 1c1f302394b..a6605795079 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NimReplica.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NimReplica.java @@ -64,7 +64,7 @@ public class NimReplica extends CardImpl { super(card); } - @Override + @java.lang.Override public NimReplica copy() { return new NimReplica(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NimShambler.java b/Mage.Sets/src/mage/sets/mirrodin/NimShambler.java index 57a57fb340b..a3ad4388405 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NimShambler.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NimShambler.java @@ -72,7 +72,7 @@ public class NimShambler extends CardImpl { super(card); } - @Override + @java.lang.Override public NimShambler copy() { return new NimShambler(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NimShrieker.java b/Mage.Sets/src/mage/sets/mirrodin/NimShrieker.java index 8ed76b47f69..b81a37f2018 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NimShrieker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NimShrieker.java @@ -69,7 +69,7 @@ public class NimShrieker extends CardImpl { super(card); } - @Override + @java.lang.Override public NimShrieker copy() { return new NimShrieker(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/NuisanceEngine.java b/Mage.Sets/src/mage/sets/mirrodin/NuisanceEngine.java index 3b63bda3f46..184bf4f6dd0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NuisanceEngine.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NuisanceEngine.java @@ -45,7 +45,7 @@ public class NuisanceEngine extends mage.sets.planechase.NuisanceEngine { super(card); } - @Override + @java.lang.Override public NuisanceEngine copy() { return new NuisanceEngine(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/OblivionStone.java b/Mage.Sets/src/mage/sets/mirrodin/OblivionStone.java index 184dcc1ab32..d0ef92ef316 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/OblivionStone.java +++ b/Mage.Sets/src/mage/sets/mirrodin/OblivionStone.java @@ -71,7 +71,7 @@ public class OblivionStone extends CardImpl { super(card); } - @Override + @java.lang.Override public OblivionStone copy() { return new OblivionStone(this); } @@ -87,7 +87,7 @@ class OblivionStoneEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { for (Permanent p : game.getBattlefield().getAllActivePermanents()) { if (!(p.getCardType().contains(CardType.LAND) || p.getCounters().containsKey(CounterType.FATE))) { @@ -102,7 +102,7 @@ class OblivionStoneEffect extends OneShotEffect { return true; } - @Override + @java.lang.Override public OblivionStoneEffect copy() { return new OblivionStoneEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/OmegaMyr.java b/Mage.Sets/src/mage/sets/mirrodin/OmegaMyr.java index 615a1344097..5f9062daa1f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/OmegaMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/OmegaMyr.java @@ -52,7 +52,7 @@ public class OmegaMyr extends CardImpl { super(card); } - @Override + @java.lang.Override public OmegaMyr copy() { return new OmegaMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/OneDozenEyes.java b/Mage.Sets/src/mage/sets/mirrodin/OneDozenEyes.java index 3518126f722..db0a3d698e7 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/OneDozenEyes.java +++ b/Mage.Sets/src/mage/sets/mirrodin/OneDozenEyes.java @@ -45,7 +45,7 @@ public class OneDozenEyes extends mage.sets.commander2013.OneDozenEyes { super(card); } - @Override + @java.lang.Override public OneDozenEyes copy() { return new OneDozenEyes(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Ornithopter.java b/Mage.Sets/src/mage/sets/mirrodin/Ornithopter.java index c64f333279b..78ee448d269 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Ornithopter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Ornithopter.java @@ -45,7 +45,7 @@ public class Ornithopter extends mage.sets.tenthedition.Ornithopter { super(card); } - @Override + @java.lang.Override public Ornithopter copy() { return new Ornithopter(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Pentavus.java b/Mage.Sets/src/mage/sets/mirrodin/Pentavus.java index 6fe1b9ea2d9..a8a632e26e3 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Pentavus.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Pentavus.java @@ -45,7 +45,7 @@ public class Pentavus extends mage.sets.elspethvstezzeret.Pentavus { super(card); } - @Override + @java.lang.Override public Pentavus copy() { return new Pentavus(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/PewterGolem.java b/Mage.Sets/src/mage/sets/mirrodin/PewterGolem.java index 4109de8823f..bac712072bc 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PewterGolem.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PewterGolem.java @@ -57,7 +57,7 @@ public class PewterGolem extends CardImpl { super(card); } - @Override + @java.lang.Override public PewterGolem copy() { return new PewterGolem(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Plains1.java b/Mage.Sets/src/mage/sets/mirrodin/Plains1.java index 10604274df3..36245373646 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Plains1.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Plains1.java @@ -45,7 +45,7 @@ public class Plains1 extends mage.cards.basiclands.Plains { super(card); } - @Override + @java.lang.Override public Plains1 copy() { return new Plains1(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Plains2.java b/Mage.Sets/src/mage/sets/mirrodin/Plains2.java index 6a498371eb0..f0ef9c70afa 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Plains2.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Plains2.java @@ -45,7 +45,7 @@ public class Plains2 extends mage.cards.basiclands.Plains { super(card); } - @Override + @java.lang.Override public Plains2 copy() { return new Plains2(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Plains3.java b/Mage.Sets/src/mage/sets/mirrodin/Plains3.java index 99c444dcc52..6ecb5572b1b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Plains3.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Plains3.java @@ -45,7 +45,7 @@ public class Plains3 extends mage.cards.basiclands.Plains { super(card); } - @Override + @java.lang.Override public Plains3 copy() { return new Plains3(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Plains4.java b/Mage.Sets/src/mage/sets/mirrodin/Plains4.java index ed626f5590d..f0badf9c208 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Plains4.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Plains4.java @@ -45,7 +45,7 @@ public class Plains4 extends mage.cards.basiclands.Plains { super(card); } - @Override + @java.lang.Override public Plains4 copy() { return new Plains4(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/PlatedSlagwurm.java b/Mage.Sets/src/mage/sets/mirrodin/PlatedSlagwurm.java index 1e7509f184d..39cd1476dd2 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PlatedSlagwurm.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PlatedSlagwurm.java @@ -55,7 +55,7 @@ public class PlatedSlagwurm extends CardImpl { super(card); } - @Override + @java.lang.Override public PlatedSlagwurm copy() { return new PlatedSlagwurm(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/PlatinumAngel.java b/Mage.Sets/src/mage/sets/mirrodin/PlatinumAngel.java index 2fb71ad5da6..f4e95c130ae 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PlatinumAngel.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PlatinumAngel.java @@ -45,7 +45,7 @@ public class PlatinumAngel extends mage.sets.tenthedition.PlatinumAngel { super(card); } - @Override + @java.lang.Override public PlatinumAngel copy() { return new PlatinumAngel(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java b/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java index b4191b97b5b..edc6f1aef44 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java @@ -57,7 +57,7 @@ public class PredatorsStrike extends CardImpl { super(card); } - @Override + @java.lang.Override public PredatorsStrike copy() { return new PredatorsStrike(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/PromiseOfPower.java b/Mage.Sets/src/mage/sets/mirrodin/PromiseOfPower.java index 80706a26221..4296e76d279 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PromiseOfPower.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PromiseOfPower.java @@ -45,7 +45,7 @@ public class PromiseOfPower extends mage.sets.commander2014.PromiseOfPower { super(card); } - @Override + @java.lang.Override public PromiseOfPower copy() { return new PromiseOfPower(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java b/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java index 90dc9c2a875..7cfbf933b62 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ProteusStaff.java @@ -69,7 +69,7 @@ public class ProteusStaff extends CardImpl { super(card); } - @Override + @java.lang.Override public ProteusStaff copy() { return new ProteusStaff(this); } @@ -86,12 +86,12 @@ class ProteusStaffEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public ProteusStaffEffect copy() { return new ProteusStaffEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/PsychicMembrane.java b/Mage.Sets/src/mage/sets/mirrodin/PsychicMembrane.java index 7fb6463e9bd..13d12537019 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PsychicMembrane.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PsychicMembrane.java @@ -59,7 +59,7 @@ public class PsychicMembrane extends CardImpl { super(card); } - @Override + @java.lang.Override public PsychicMembrane copy() { return new PsychicMembrane(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/PsychogenicProbe.java b/Mage.Sets/src/mage/sets/mirrodin/PsychogenicProbe.java index 9ce7f410cf2..0c4b4c10041 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PsychogenicProbe.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PsychogenicProbe.java @@ -58,7 +58,7 @@ public class PsychogenicProbe extends CardImpl { super(card); } - @Override + @java.lang.Override public PsychogenicProbe copy() { return new PsychogenicProbe(this); } @@ -74,17 +74,17 @@ class PsychogenicProbeTriggeredAbility extends TriggeredAbilityImpl { super(ability); } - @Override + @java.lang.Override public PsychogenicProbeTriggeredAbility copy() { return new PsychogenicProbeTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType().equals(EventType.LIBRARY_SHUFFLED); } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(event.getPlayerId())); @@ -92,7 +92,7 @@ class PsychogenicProbeTriggeredAbility extends TriggeredAbilityImpl { return true; } - @Override + @java.lang.Override public String getRule() { return "Whenever a spell or ability causes a player to shuffle his or her library, Psychogenic Probe deals 2 damage to him or her."; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/PyriteSpellbomb.java b/Mage.Sets/src/mage/sets/mirrodin/PyriteSpellbomb.java index 8b8428a8a3f..23a1e2a8256 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PyriteSpellbomb.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PyriteSpellbomb.java @@ -65,7 +65,7 @@ public class PyriteSpellbomb extends CardImpl { super(card); } - @Override + @java.lang.Override public PyriteSpellbomb copy() { return new PyriteSpellbomb(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/RaiseTheAlarm.java b/Mage.Sets/src/mage/sets/mirrodin/RaiseTheAlarm.java index a168b852539..86ac6a53c0e 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/RaiseTheAlarm.java +++ b/Mage.Sets/src/mage/sets/mirrodin/RaiseTheAlarm.java @@ -52,7 +52,7 @@ public class RaiseTheAlarm extends CardImpl { super(card); } - @Override + @java.lang.Override public RaiseTheAlarm copy() { return new RaiseTheAlarm(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/RazorBarrier.java b/Mage.Sets/src/mage/sets/mirrodin/RazorBarrier.java index 49b87837480..a9568c08304 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/RazorBarrier.java +++ b/Mage.Sets/src/mage/sets/mirrodin/RazorBarrier.java @@ -45,7 +45,7 @@ public class RazorBarrier extends mage.sets.elspethvstezzeret.RazorBarrier { super(card); } - @Override + @java.lang.Override public RazorBarrier copy() { return new RazorBarrier(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Regress.java b/Mage.Sets/src/mage/sets/mirrodin/Regress.java index c54168c9910..911acf72f85 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Regress.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Regress.java @@ -53,7 +53,7 @@ public class Regress extends CardImpl { super(card); } - @Override + @java.lang.Override public Regress copy() { return new Regress(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ReiverDemon.java b/Mage.Sets/src/mage/sets/mirrodin/ReiverDemon.java index 0f3420423d5..5a6c5a41fe4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ReiverDemon.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ReiverDemon.java @@ -45,7 +45,7 @@ public class ReiverDemon extends mage.sets.divinevsdemonic.ReiverDemon { super(card); } - @Override + @java.lang.Override public ReiverDemon copy() { return new ReiverDemon(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java b/Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java index d4a2813bbf6..c85e9e2474d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java +++ b/Mage.Sets/src/mage/sets/mirrodin/RoarOfTheKha.java @@ -66,7 +66,7 @@ public class RoarOfTheKha extends CardImpl { super(card); } - @Override + @java.lang.Override public RoarOfTheKha copy() { return new RoarOfTheKha(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/RuleOfLaw.java b/Mage.Sets/src/mage/sets/mirrodin/RuleOfLaw.java index e30fdd02797..b72076ada60 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/RuleOfLaw.java +++ b/Mage.Sets/src/mage/sets/mirrodin/RuleOfLaw.java @@ -47,7 +47,7 @@ public class RuleOfLaw extends mage.sets.tenthedition.RuleOfLaw { super(card); } - @Override + @java.lang.Override public RuleOfLaw copy() { return new RuleOfLaw(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/RustmouthOgre.java b/Mage.Sets/src/mage/sets/mirrodin/RustmouthOgre.java index 669833fd276..175bc1194e6 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/RustmouthOgre.java +++ b/Mage.Sets/src/mage/sets/mirrodin/RustmouthOgre.java @@ -65,7 +65,7 @@ public class RustmouthOgre extends CardImpl { super(card); } - @Override + @java.lang.Override public RustmouthOgre copy() { return new RustmouthOgre(this); } @@ -81,17 +81,17 @@ class RustmouthOgreTriggeredAbility extends TriggeredAbilityImpl { super(ability); } - @Override + @java.lang.Override public RustmouthOgreTriggeredAbility copy() { return new RustmouthOgreTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.DAMAGED_PLAYER; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) { @@ -106,7 +106,7 @@ class RustmouthOgreTriggeredAbility extends TriggeredAbilityImpl { return false; } - @Override + @java.lang.Override public String getRule() { return "Whenever {this} deals combat damage to a player, you may destroy target artifact that player controls."; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/RustsporeRam.java b/Mage.Sets/src/mage/sets/mirrodin/RustsporeRam.java index ea823b712e3..643987c81bf 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/RustsporeRam.java +++ b/Mage.Sets/src/mage/sets/mirrodin/RustsporeRam.java @@ -66,7 +66,7 @@ public class RustsporeRam extends CardImpl { super(card); } - @Override + @java.lang.Override public RustsporeRam copy() { return new RustsporeRam(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ScaleOfChissGoria.java b/Mage.Sets/src/mage/sets/mirrodin/ScaleOfChissGoria.java index bb969fccc9f..32f80eceb4c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ScaleOfChissGoria.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ScaleOfChissGoria.java @@ -65,7 +65,7 @@ public class ScaleOfChissGoria extends CardImpl { super(card); } - @Override + @java.lang.Override public ScaleOfChissGoria copy() { return new ScaleOfChissGoria(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ScrabblingClaws.java b/Mage.Sets/src/mage/sets/mirrodin/ScrabblingClaws.java index 22f3b27323b..83c645ba001 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ScrabblingClaws.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ScrabblingClaws.java @@ -74,7 +74,7 @@ public class ScrabblingClaws extends CardImpl { super(card); } - @Override + @java.lang.Override public ScrabblingClaws copy() { return new ScrabblingClaws(this); } @@ -91,12 +91,12 @@ class ScrabblingClawsEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public ScrabblingClawsEffect copy() { return new ScrabblingClawsEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player targetPlayer = game.getPlayer(source.getFirstTarget()); if (targetPlayer != null) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/SculptingSteel.java b/Mage.Sets/src/mage/sets/mirrodin/SculptingSteel.java index 7c3715074fe..3844913c705 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SculptingSteel.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SculptingSteel.java @@ -45,7 +45,7 @@ public class SculptingSteel extends mage.sets.tenthedition.SculptingSteel { super(card); } - @Override + @java.lang.Override public SculptingSteel copy() { return new SculptingSteel(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ScytheOfTheWretched.java b/Mage.Sets/src/mage/sets/mirrodin/ScytheOfTheWretched.java index 341aecb7194..a0b0f53927a 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ScytheOfTheWretched.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ScytheOfTheWretched.java @@ -79,7 +79,7 @@ public class ScytheOfTheWretched extends CardImpl { super(card); } - @Override + @java.lang.Override public ScytheOfTheWretched copy() { return new ScytheOfTheWretched(this); } @@ -95,17 +95,17 @@ class ScytheOfTheWretchedTriggeredAbility extends TriggeredAbilityImpl { super(ability); } - @Override + @java.lang.Override public ScytheOfTheWretchedTriggeredAbility copy() { return new ScytheOfTheWretchedTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.ZONE_CHANGE; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zoneChange = (ZoneChangeEvent) event; if (zoneChange.isDiesEvent() && zoneChange.getTarget().getCardType().contains(CardType.CREATURE)) { @@ -122,7 +122,7 @@ class ScytheOfTheWretchedTriggeredAbility extends TriggeredAbilityImpl { return false; } - @Override + @java.lang.Override public String getRule() { return "Whenever a creature dealt damage by equipped creature this turn dies, " + super.getRule(); } @@ -153,7 +153,7 @@ class ScytheOfTheWretchedReanimateEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Card card = game.getCard(getTargetPointer().getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); @@ -169,7 +169,7 @@ class ScytheOfTheWretchedReanimateEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public Effect copy() { return new ScytheOfTheWretchedReanimateEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SeatOfTheSynod.java b/Mage.Sets/src/mage/sets/mirrodin/SeatOfTheSynod.java index a8353a2179d..351536ae651 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SeatOfTheSynod.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SeatOfTheSynod.java @@ -50,7 +50,7 @@ public class SeatOfTheSynod extends CardImpl { super(card); } - @Override + @java.lang.Override public SeatOfTheSynod copy() { return new SeatOfTheSynod(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SecondSunrise.java b/Mage.Sets/src/mage/sets/mirrodin/SecondSunrise.java index 141503c8ef7..376b69c06bb 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SecondSunrise.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SecondSunrise.java @@ -60,7 +60,7 @@ public class SecondSunrise extends CardImpl { super(card); } - @Override + @java.lang.Override public SecondSunrise copy() { return new SecondSunrise(this); } @@ -77,7 +77,7 @@ class SecondSunriseEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { SecondSunriseWatcher watcher = (SecondSunriseWatcher) game.getState().getWatchers().get("SecondSunriseWatcher"); if (watcher != null) { @@ -94,7 +94,7 @@ class SecondSunriseEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public SecondSunriseEffect copy() { return new SecondSunriseEffect(this); } @@ -112,19 +112,19 @@ class SecondSunriseWatcher extends Watcher { this.cards.addAll(watcher.cards); } - @Override + @java.lang.Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).isDiesEvent()) { cards.add(event.getTargetId()); } } - @Override + @java.lang.Override public SecondSunriseWatcher copy() { return new SecondSunriseWatcher(this); } - @Override + @java.lang.Override public void reset() { super.reset(); cards.clear(); diff --git a/Mage.Sets/src/mage/sets/mirrodin/SeethingSong.java b/Mage.Sets/src/mage/sets/mirrodin/SeethingSong.java index 118b7979eca..63ddebe54fd 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SeethingSong.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SeethingSong.java @@ -51,7 +51,7 @@ public class SeethingSong extends CardImpl { super(card); } - @Override + @java.lang.Override public SeethingSong copy() { return new SeethingSong(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Shatter.java b/Mage.Sets/src/mage/sets/mirrodin/Shatter.java index 6c8c5d51543..8b153e8955c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Shatter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Shatter.java @@ -53,7 +53,7 @@ public class Shatter extends CardImpl { super(card); } - @Override + @java.lang.Override public Shatter copy() { return new Shatter(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ShrapnelBlast.java b/Mage.Sets/src/mage/sets/mirrodin/ShrapnelBlast.java index c9dda788ef9..4b269946fbb 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ShrapnelBlast.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ShrapnelBlast.java @@ -63,7 +63,7 @@ public class ShrapnelBlast extends CardImpl { super(card); } - @Override + @java.lang.Override public ShrapnelBlast copy() { return new ShrapnelBlast(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SilverMyr.java b/Mage.Sets/src/mage/sets/mirrodin/SilverMyr.java index 024642a8d95..218dd3ecf9d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SilverMyr.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SilverMyr.java @@ -54,7 +54,7 @@ public class SilverMyr extends CardImpl { super(card); } - @Override + @java.lang.Override public SilverMyr copy() { return new SilverMyr(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SkeletonShard.java b/Mage.Sets/src/mage/sets/mirrodin/SkeletonShard.java index 4056a013046..2fe693eadd0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SkeletonShard.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SkeletonShard.java @@ -45,7 +45,7 @@ public class SkeletonShard extends mage.sets.planechase.SkeletonShard { super(card); } - @Override + @java.lang.Override public SkeletonShard copy() { return new SkeletonShard(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SkyhunterPatrol.java b/Mage.Sets/src/mage/sets/mirrodin/SkyhunterPatrol.java index 6223384d851..6827426e3d4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SkyhunterPatrol.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SkyhunterPatrol.java @@ -45,7 +45,7 @@ public class SkyhunterPatrol extends mage.sets.tenthedition.SkyhunterPatrol { super(card); } - @Override + @java.lang.Override public SkyhunterPatrol copy() { return new SkyhunterPatrol(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SlagwurmArmor.java b/Mage.Sets/src/mage/sets/mirrodin/SlagwurmArmor.java index 9e008c2bf27..ebd9df3c588 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SlagwurmArmor.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SlagwurmArmor.java @@ -56,7 +56,7 @@ public class SlagwurmArmor extends CardImpl { super(card); } - @Override + @java.lang.Override public SlagwurmArmor copy() { return new SlagwurmArmor(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SlithAscendant.java b/Mage.Sets/src/mage/sets/mirrodin/SlithAscendant.java index 931a7b32331..ba749e23710 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SlithAscendant.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SlithAscendant.java @@ -58,7 +58,7 @@ public class SlithAscendant extends CardImpl { super(card); } - @Override + @java.lang.Override public SlithAscendant copy() { return new SlithAscendant(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SlithBloodletter.java b/Mage.Sets/src/mage/sets/mirrodin/SlithBloodletter.java index aa1c5d3eae2..d0f0b07aaa9 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SlithBloodletter.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SlithBloodletter.java @@ -62,7 +62,7 @@ public class SlithBloodletter extends CardImpl { super(card); } - @Override + @java.lang.Override public SlithBloodletter copy() { return new SlithBloodletter(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SlithFirewalker.java b/Mage.Sets/src/mage/sets/mirrodin/SlithFirewalker.java index e6eaf50e072..c129b2dc3f7 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SlithFirewalker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SlithFirewalker.java @@ -58,7 +58,7 @@ public class SlithFirewalker extends CardImpl { super(card); } - @Override + @java.lang.Override public SlithFirewalker copy() { return new SlithFirewalker(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SlithPredator.java b/Mage.Sets/src/mage/sets/mirrodin/SlithPredator.java index 97f80ea6fe8..37c9e7edbc0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SlithPredator.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SlithPredator.java @@ -58,7 +58,7 @@ public class SlithPredator extends CardImpl { super(card); } - @Override + @java.lang.Override public SlithPredator copy() { return new SlithPredator(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SlithStrider.java b/Mage.Sets/src/mage/sets/mirrodin/SlithStrider.java index 9f129c8643b..7e63807e137 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SlithStrider.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SlithStrider.java @@ -59,7 +59,7 @@ public class SlithStrider extends CardImpl { super(card); } - @Override + @java.lang.Override public SlithStrider copy() { return new SlithStrider(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SolarTide.java b/Mage.Sets/src/mage/sets/mirrodin/SolarTide.java index 6164aff6d2c..4ca6d7f86ca 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SolarTide.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SolarTide.java @@ -75,7 +75,7 @@ public class SolarTide extends CardImpl { super(card); } - @Override + @java.lang.Override public SolarTide copy() { return new SolarTide(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SoldierReplica.java b/Mage.Sets/src/mage/sets/mirrodin/SoldierReplica.java index 51fcef5f56d..c1048cd8bcf 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SoldierReplica.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SoldierReplica.java @@ -64,7 +64,7 @@ public class SoldierReplica extends CardImpl { super(card); } - @Override + @java.lang.Override public SoldierReplica copy() { return new SoldierReplica(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SolemnSimulacrum.java b/Mage.Sets/src/mage/sets/mirrodin/SolemnSimulacrum.java index fd2af2f9877..e0d44cc8058 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SolemnSimulacrum.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SolemnSimulacrum.java @@ -45,7 +45,7 @@ public class SolemnSimulacrum extends mage.sets.magic2012.SolemnSimulacrum { super(card); } - @Override + @java.lang.Override public SolemnSimulacrum copy() { return new SolemnSimulacrum(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SomberHoverguard.java b/Mage.Sets/src/mage/sets/mirrodin/SomberHoverguard.java index 2cbd88cb148..33fdc7dbc4f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SomberHoverguard.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SomberHoverguard.java @@ -58,7 +58,7 @@ public class SomberHoverguard extends CardImpl { super(card); } - @Override + @java.lang.Override public SomberHoverguard copy() { return new SomberHoverguard(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SoulFoundry.java b/Mage.Sets/src/mage/sets/mirrodin/SoulFoundry.java index 8e4c6a28792..0ae3d362a29 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SoulFoundry.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SoulFoundry.java @@ -76,7 +76,7 @@ public class SoulFoundry extends CardImpl { super(card); } - @Override + @java.lang.Override public void adjustCosts(Ability ability, Game game) { if (ability instanceof SimpleActivatedAbility) { Permanent sourcePermanent = game.getPermanent(ability.getSourceId()); @@ -99,7 +99,7 @@ public class SoulFoundry extends CardImpl { } } - @Override + @java.lang.Override public SoulFoundry copy() { return new SoulFoundry(this); } @@ -122,7 +122,7 @@ class SoulFoundryImprintEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); @@ -147,7 +147,7 @@ class SoulFoundryImprintEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public SoulFoundryImprintEffect copy() { return new SoulFoundryImprintEffect(this); } @@ -164,7 +164,7 @@ class SoulFoundryEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { @@ -184,7 +184,7 @@ class SoulFoundryEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public SoulFoundryEffect copy() { return new SoulFoundryEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SpikeshotGoblin.java b/Mage.Sets/src/mage/sets/mirrodin/SpikeshotGoblin.java index 58929dcb715..b0ab572b366 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SpikeshotGoblin.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SpikeshotGoblin.java @@ -68,7 +68,7 @@ public class SpikeshotGoblin extends CardImpl { super(card); } - @Override + @java.lang.Override public SpikeshotGoblin copy() { return new SpikeshotGoblin(this); } @@ -84,7 +84,7 @@ class SpikeshotGoblinEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Permanent sourcePermanent = game.getPermanent(source.getSourceId()); if (sourcePermanent == null) { @@ -109,7 +109,7 @@ class SpikeshotGoblinEffect extends OneShotEffect { return false; } - @Override + @java.lang.Override public SpikeshotGoblinEffect copy() { return new SpikeshotGoblinEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java b/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java index d2eeb3bd174..6629c14c6fb 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SpoilsOfTheVault.java @@ -62,7 +62,7 @@ public class SpoilsOfTheVault extends CardImpl { super(card); } - @Override + @java.lang.Override public SpoilsOfTheVault copy() { return new SpoilsOfTheVault(this); } @@ -79,12 +79,12 @@ class SpoilsOfTheVaultEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public SpoilsOfTheVaultEffect copy() { return new SpoilsOfTheVaultEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { MageObject sourceObject = game.getObject(source.getSourceId()); Player controller = game.getPlayer(source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/mirrodin/StalkingStones.java b/Mage.Sets/src/mage/sets/mirrodin/StalkingStones.java index 718a641d777..aa3a43ba3e6 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/StalkingStones.java +++ b/Mage.Sets/src/mage/sets/mirrodin/StalkingStones.java @@ -45,7 +45,7 @@ public class StalkingStones extends mage.sets.tempest.StalkingStones { super(card); } - @Override + @java.lang.Override public StalkingStones copy() { return new StalkingStones(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SteelWall.java b/Mage.Sets/src/mage/sets/mirrodin/SteelWall.java index dea66f273cb..4f63898d32c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SteelWall.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SteelWall.java @@ -54,7 +54,7 @@ public class SteelWall extends CardImpl { super(card); } - @Override + @java.lang.Override public SteelWall copy() { return new SteelWall(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SunDroplet.java b/Mage.Sets/src/mage/sets/mirrodin/SunDroplet.java index 43a3d3ead75..f1c72773b64 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SunDroplet.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SunDroplet.java @@ -45,7 +45,7 @@ public class SunDroplet extends mage.sets.commander2013.SunDroplet { super(card); } - @Override + @java.lang.Override public SunDroplet copy() { return new SunDroplet(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SunbeamSpellbomb.java b/Mage.Sets/src/mage/sets/mirrodin/SunbeamSpellbomb.java index 62eec3e8ff6..e3743d62047 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SunbeamSpellbomb.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SunbeamSpellbomb.java @@ -63,7 +63,7 @@ public class SunbeamSpellbomb extends CardImpl { super(card); } - @Override + @java.lang.Override public SunbeamSpellbomb copy() { return new SunbeamSpellbomb(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Swamp1.java b/Mage.Sets/src/mage/sets/mirrodin/Swamp1.java index d854d42af6e..381b620b2ff 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Swamp1.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Swamp1.java @@ -45,7 +45,7 @@ public class Swamp1 extends mage.cards.basiclands.Swamp { super(card); } - @Override + @java.lang.Override public Swamp1 copy() { return new Swamp1(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Swamp2.java b/Mage.Sets/src/mage/sets/mirrodin/Swamp2.java index 7bd942df3f9..9c31334589f 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Swamp2.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Swamp2.java @@ -45,7 +45,7 @@ public class Swamp2 extends mage.cards.basiclands.Swamp { super(card); } - @Override + @java.lang.Override public Swamp2 copy() { return new Swamp2(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Swamp3.java b/Mage.Sets/src/mage/sets/mirrodin/Swamp3.java index 43839ceed36..459640075b0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Swamp3.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Swamp3.java @@ -45,7 +45,7 @@ public class Swamp3 extends mage.cards.basiclands.Swamp { super(card); } - @Override + @java.lang.Override public Swamp3 copy() { return new Swamp3(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Swamp4.java b/Mage.Sets/src/mage/sets/mirrodin/Swamp4.java index cd33dd58555..da560265cd8 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Swamp4.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Swamp4.java @@ -45,7 +45,7 @@ public class Swamp4 extends mage.cards.basiclands.Swamp { super(card); } - @Override + @java.lang.Override public Swamp4 copy() { return new Swamp4(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SwordOfKaldra.java b/Mage.Sets/src/mage/sets/mirrodin/SwordOfKaldra.java index cf7921dbde9..27c6fa36ec0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SwordOfKaldra.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SwordOfKaldra.java @@ -71,7 +71,7 @@ public class SwordOfKaldra extends CardImpl { super(card); } - @Override + @java.lang.Override public SwordOfKaldra copy() { return new SwordOfKaldra(this); } @@ -87,17 +87,17 @@ class SwordOfKaldraTriggeredAbility extends TriggeredAbilityImpl { super(ability); } - @Override + @java.lang.Override public SwordOfKaldraTriggeredAbility copy() { return new SwordOfKaldraTriggeredAbility(this); } - @Override + @java.lang.Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == EventType.DAMAGED_CREATURE; } - @Override + @java.lang.Override public boolean checkTrigger(GameEvent event, Game game) { Permanent equipment = game.getPermanent(this.getSourceId()); if (equipment != null @@ -111,7 +111,7 @@ class SwordOfKaldraTriggeredAbility extends TriggeredAbilityImpl { return false; } - @Override + @java.lang.Override public String getRule() { return "Whenever equipped creature deals damage to a creature, " + super.getRule(); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/SylvanScrying.java b/Mage.Sets/src/mage/sets/mirrodin/SylvanScrying.java index 5a061a85b19..6acde907ee5 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/SylvanScrying.java +++ b/Mage.Sets/src/mage/sets/mirrodin/SylvanScrying.java @@ -45,7 +45,7 @@ public class SylvanScrying extends mage.sets.tenthedition.SylvanScrying { super(card); } - @Override + @java.lang.Override public SylvanScrying copy() { return new SylvanScrying(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TajNarSwordsmith.java b/Mage.Sets/src/mage/sets/mirrodin/TajNarSwordsmith.java index 33a834624fb..884f933f931 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TajNarSwordsmith.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TajNarSwordsmith.java @@ -69,7 +69,7 @@ public class TajNarSwordsmith extends CardImpl { super(card); } - @Override + @java.lang.Override public TajNarSwordsmith copy() { return new TajNarSwordsmith(this); } @@ -86,12 +86,12 @@ class TajNarSwordsmithEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public TajNarSwordsmithEffect copy() { return new TajNarSwordsmithEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null && player.chooseUse(Outcome.BoostCreature, "Do you want to to pay {X}?", source, game)) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfDominance.java b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfDominance.java index 8501d95ab3f..f22aea13fd3 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfDominance.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfDominance.java @@ -62,7 +62,7 @@ public class TalismanOfDominance extends CardImpl { super(card); } - @Override + @java.lang.Override public TalismanOfDominance copy() { return new TalismanOfDominance(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfImpulse.java b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfImpulse.java index 1e191f0249c..f0072e4c5b2 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfImpulse.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfImpulse.java @@ -62,7 +62,7 @@ public class TalismanOfImpulse extends CardImpl { super(card); } - @Override + @java.lang.Override public TalismanOfImpulse copy() { return new TalismanOfImpulse(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfIndulgence.java b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfIndulgence.java index 48cbb1c73e7..d2b54e48067 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfIndulgence.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfIndulgence.java @@ -62,7 +62,7 @@ public class TalismanOfIndulgence extends CardImpl { super(card); } - @Override + @java.lang.Override public TalismanOfIndulgence copy() { return new TalismanOfIndulgence(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfProgress.java b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfProgress.java index d955bb7b8e3..906fe8f676d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfProgress.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfProgress.java @@ -62,7 +62,7 @@ public class TalismanOfProgress extends CardImpl { super(card); } - @Override + @java.lang.Override public TalismanOfProgress copy() { return new TalismanOfProgress(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfUnity.java b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfUnity.java index 3b87ca52e9a..2be502e301b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TalismanOfUnity.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TalismanOfUnity.java @@ -62,7 +62,7 @@ public class TalismanOfUnity extends CardImpl { super(card); } - @Override + @java.lang.Override public TalismanOfUnity copy() { return new TalismanOfUnity(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Tanglebloom.java b/Mage.Sets/src/mage/sets/mirrodin/Tanglebloom.java index d146518970a..c79c011f4db 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Tanglebloom.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Tanglebloom.java @@ -58,7 +58,7 @@ public class Tanglebloom extends CardImpl { super(card); } - @Override + @java.lang.Override public Tanglebloom copy() { return new Tanglebloom(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TelJiladArchers.java b/Mage.Sets/src/mage/sets/mirrodin/TelJiladArchers.java index 0aa6211b08d..2f0dde06bcf 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TelJiladArchers.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TelJiladArchers.java @@ -60,7 +60,7 @@ public class TelJiladArchers extends CardImpl { super(card); } - @Override + @java.lang.Override public TelJiladArchers copy() { return new TelJiladArchers(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TelJiladChosen.java b/Mage.Sets/src/mage/sets/mirrodin/TelJiladChosen.java index b6f56f03ca2..e86c45d4846 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TelJiladChosen.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TelJiladChosen.java @@ -57,7 +57,7 @@ public class TelJiladChosen extends CardImpl { super(card); } - @Override + @java.lang.Override public TelJiladChosen copy() { return new TelJiladChosen(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TelJiladExile.java b/Mage.Sets/src/mage/sets/mirrodin/TelJiladExile.java index c05e3255689..d7d9230191a 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TelJiladExile.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TelJiladExile.java @@ -59,7 +59,7 @@ public class TelJiladExile extends CardImpl { super(card); } - @Override + @java.lang.Override public TelJiladExile copy() { return new TelJiladExile(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TelJiladStylus.java b/Mage.Sets/src/mage/sets/mirrodin/TelJiladStylus.java index b6a5e99a576..f29623b9c82 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TelJiladStylus.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TelJiladStylus.java @@ -69,7 +69,7 @@ public class TelJiladStylus extends CardImpl { super(card); } - @Override + @java.lang.Override public TelJiladStylus copy() { return new TelJiladStylus(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TempestOfLight.java b/Mage.Sets/src/mage/sets/mirrodin/TempestOfLight.java index 8affb861174..e24ba4fd083 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TempestOfLight.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TempestOfLight.java @@ -45,7 +45,7 @@ public class TempestOfLight extends mage.sets.magic2010.TempestOfLight { super(card); } - @Override + @java.lang.Override public TempestOfLight copy() { return new TempestOfLight(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.java b/Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.java index 8665d7274d6..7767cfbe069 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TemporalCascade.java @@ -67,7 +67,7 @@ public class TemporalCascade extends CardImpl { super(card); } - @Override + @java.lang.Override public TemporalCascade copy() { return new TemporalCascade(this); } @@ -84,7 +84,7 @@ class TemporalCascadeShuffleEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player sourcePlayer = game.getPlayer(source.getControllerId()); for (UUID playerId: sourcePlayer.getInRange()) { @@ -103,7 +103,7 @@ class TemporalCascadeShuffleEffect extends OneShotEffect { return true; } - @Override + @java.lang.Override public TemporalCascadeShuffleEffect copy() { return new TemporalCascadeShuffleEffect(this); } @@ -120,7 +120,7 @@ class TemporalCascadeDrawEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player sourcePlayer = game.getPlayer(source.getControllerId()); game.getState().handleSimultaneousEvent(game); // needed here so state based triggered effects @@ -133,7 +133,7 @@ class TemporalCascadeDrawEffect extends OneShotEffect { return true; } - @Override + @java.lang.Override public TemporalCascadeDrawEffect copy() { return new TemporalCascadeDrawEffect(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Terror.java b/Mage.Sets/src/mage/sets/mirrodin/Terror.java index 057a2ca0c8b..ba172bc20f3 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Terror.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Terror.java @@ -45,7 +45,7 @@ public class Terror extends mage.sets.tenthedition.Terror { super(card); } - @Override + @java.lang.Override public Terror copy() { return new Terror(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ThirstForKnowledge.java b/Mage.Sets/src/mage/sets/mirrodin/ThirstForKnowledge.java index 4f3461387e8..eae35bffad9 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ThirstForKnowledge.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ThirstForKnowledge.java @@ -45,7 +45,7 @@ public class ThirstForKnowledge extends mage.sets.planechase.ThirstForKnowledge super(card); } - @Override + @java.lang.Override public ThirstForKnowledge copy() { return new ThirstForKnowledge(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Thoughtcast.java b/Mage.Sets/src/mage/sets/mirrodin/Thoughtcast.java index 4d90ccc4c25..1197995c4c1 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Thoughtcast.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Thoughtcast.java @@ -45,7 +45,7 @@ public class Thoughtcast extends mage.sets.elspethvstezzeret.Thoughtcast { super(card); } - @Override + @java.lang.Override public Thoughtcast copy() { return new Thoughtcast(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TitaniumGolem.java b/Mage.Sets/src/mage/sets/mirrodin/TitaniumGolem.java index 9cb7ff5f6bd..610835b34b4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TitaniumGolem.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TitaniumGolem.java @@ -59,7 +59,7 @@ public class TitaniumGolem extends CardImpl { super(card); } - @Override + @java.lang.Override public TitaniumGolem copy() { return new TitaniumGolem(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ToothAndNail.java b/Mage.Sets/src/mage/sets/mirrodin/ToothAndNail.java index a50188250a1..c9b4b4ab8dc 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ToothAndNail.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ToothAndNail.java @@ -45,7 +45,7 @@ public class ToothAndNail extends mage.sets.modernmasters.ToothAndNail { super(card); } - @Override + @java.lang.Override public ToothAndNail copy() { return new ToothAndNail(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ToothOfChissGoria.java b/Mage.Sets/src/mage/sets/mirrodin/ToothOfChissGoria.java index ba598aff8b0..8417487ab18 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ToothOfChissGoria.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ToothOfChissGoria.java @@ -65,7 +65,7 @@ public class ToothOfChissGoria extends CardImpl { super(card); } - @Override + @java.lang.Override public ToothOfChissGoria copy() { return new ToothOfChissGoria(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TowerOfChampions.java b/Mage.Sets/src/mage/sets/mirrodin/TowerOfChampions.java index 8da22439119..988534c802d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TowerOfChampions.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TowerOfChampions.java @@ -61,7 +61,7 @@ public class TowerOfChampions extends CardImpl { super(card); } - @Override + @java.lang.Override public TowerOfChampions copy() { return new TowerOfChampions(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TowerOfEons.java b/Mage.Sets/src/mage/sets/mirrodin/TowerOfEons.java index 4ae77a5e20b..fca55d57ed8 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TowerOfEons.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TowerOfEons.java @@ -58,7 +58,7 @@ public class TowerOfEons extends CardImpl { super(card); } - @Override + @java.lang.Override public TowerOfEons copy() { return new TowerOfEons(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TowerOfFortunes.java b/Mage.Sets/src/mage/sets/mirrodin/TowerOfFortunes.java index eed8fa34fb5..d3d80c565e1 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TowerOfFortunes.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TowerOfFortunes.java @@ -58,7 +58,7 @@ public class TowerOfFortunes extends CardImpl { super(card); } - @Override + @java.lang.Override public TowerOfFortunes copy() { return new TowerOfFortunes(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TowerOfMurmurs.java b/Mage.Sets/src/mage/sets/mirrodin/TowerOfMurmurs.java index 74cbf64bce8..3c4e4452eff 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TowerOfMurmurs.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TowerOfMurmurs.java @@ -60,7 +60,7 @@ public class TowerOfMurmurs extends CardImpl { super(card); } - @Override + @java.lang.Override public TowerOfMurmurs copy() { return new TowerOfMurmurs(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TrashForTreasure.java b/Mage.Sets/src/mage/sets/mirrodin/TrashForTreasure.java index 86536946578..4c1c77b310c 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TrashForTreasure.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TrashForTreasure.java @@ -66,7 +66,7 @@ public class TrashForTreasure extends CardImpl { super(card); } - @Override + @java.lang.Override public TrashForTreasure copy() { return new TrashForTreasure(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TreeOfTales.java b/Mage.Sets/src/mage/sets/mirrodin/TreeOfTales.java index 61fca0de6ac..c604eb3a7ad 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TreeOfTales.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TreeOfTales.java @@ -50,7 +50,7 @@ public class TreeOfTales extends CardImpl { super(card); } - @Override + @java.lang.Override public TreeOfTales copy() { return new TreeOfTales(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Triskelion.java b/Mage.Sets/src/mage/sets/mirrodin/Triskelion.java index 127256fd0c2..b47e3605ac4 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Triskelion.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Triskelion.java @@ -45,7 +45,7 @@ public class Triskelion extends mage.sets.magic2011.Triskelion { super(card); } - @Override + @java.lang.Override public Triskelion copy() { return new Triskelion(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TrollAscetic.java b/Mage.Sets/src/mage/sets/mirrodin/TrollAscetic.java index 19760f938cb..acdeea42cd8 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TrollAscetic.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TrollAscetic.java @@ -61,7 +61,7 @@ public class TrollAscetic extends CardImpl { super(card); } - @Override + @java.lang.Override public TrollAscetic copy() { return new TrollAscetic(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TrollsOfTelJilad.java b/Mage.Sets/src/mage/sets/mirrodin/TrollsOfTelJilad.java index b49354cd7cc..348bcbce2ab 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TrollsOfTelJilad.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TrollsOfTelJilad.java @@ -72,7 +72,7 @@ public class TrollsOfTelJilad extends CardImpl { super(card); } - @Override + @java.lang.Override public TrollsOfTelJilad copy() { return new TrollsOfTelJilad(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/TurnToDust.java b/Mage.Sets/src/mage/sets/mirrodin/TurnToDust.java index 06b9939603c..e7d98325521 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/TurnToDust.java +++ b/Mage.Sets/src/mage/sets/mirrodin/TurnToDust.java @@ -63,7 +63,7 @@ public class TurnToDust extends CardImpl { super(card); } - @Override + @java.lang.Override public TurnToDust copy() { return new TurnToDust(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/VaultOfWhispers.java b/Mage.Sets/src/mage/sets/mirrodin/VaultOfWhispers.java index 57203693fd5..539d41680f6 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VaultOfWhispers.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VaultOfWhispers.java @@ -50,7 +50,7 @@ public class VaultOfWhispers extends CardImpl { super(card); } - @Override + @java.lang.Override public VaultOfWhispers copy() { return new VaultOfWhispers(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/VedalkenArchmage.java b/Mage.Sets/src/mage/sets/mirrodin/VedalkenArchmage.java index 5589557fd24..6ae9ac52b87 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VedalkenArchmage.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VedalkenArchmage.java @@ -59,7 +59,7 @@ public class VedalkenArchmage extends CardImpl { super(card); } - @Override + @java.lang.Override public VedalkenArchmage copy() { return new VedalkenArchmage(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ViridianJoiner.java b/Mage.Sets/src/mage/sets/mirrodin/ViridianJoiner.java index c9e71165d4a..4c289b7e4e7 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ViridianJoiner.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ViridianJoiner.java @@ -59,7 +59,7 @@ public class ViridianJoiner extends CardImpl { super(card); } - @Override + @java.lang.Override public ViridianJoiner copy() { return new ViridianJoiner(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/ViridianShaman.java b/Mage.Sets/src/mage/sets/mirrodin/ViridianShaman.java index 152fb420104..93d6f8f77e9 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/ViridianShaman.java +++ b/Mage.Sets/src/mage/sets/mirrodin/ViridianShaman.java @@ -45,7 +45,7 @@ public class ViridianShaman extends mage.sets.tenthedition.ViridianShaman { super(card); } - @Override + @java.lang.Override public ViridianShaman copy() { return new ViridianShaman(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java index b3033e3265c..a4d47e9d1d1 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VorracBattlehorns.java @@ -75,7 +75,7 @@ public class VorracBattlehorns extends CardImpl { super(card); } - @Override + @java.lang.Override public VorracBattlehorns copy() { return new VorracBattlehorns(this); } @@ -103,12 +103,12 @@ class CantBeBlockedByMoreThanOneAttachedEffect extends ContinuousEffectImpl { this.attachmentType = effect.attachmentType; } - @Override + @java.lang.Override public CantBeBlockedByMoreThanOneAttachedEffect copy() { return new CantBeBlockedByMoreThanOneAttachedEffect(this); } - @Override + @java.lang.Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { switch (layer) { case RulesEffects: @@ -125,12 +125,12 @@ class CantBeBlockedByMoreThanOneAttachedEffect extends ContinuousEffectImpl { return false; } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { return false; } - @Override + @java.lang.Override public boolean hasLayer(Layer layer) { return layer == Layer.RulesEffects; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/VulshokBattlegear.java b/Mage.Sets/src/mage/sets/mirrodin/VulshokBattlegear.java index 7a2be4fbc20..99142d8b864 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VulshokBattlegear.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VulshokBattlegear.java @@ -58,7 +58,7 @@ public class VulshokBattlegear extends CardImpl { super(card); } - @Override + @java.lang.Override public VulshokBattlegear copy() { return new VulshokBattlegear(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/VulshokBerserker.java b/Mage.Sets/src/mage/sets/mirrodin/VulshokBerserker.java index 9ee0bff29aa..e108be7a73d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VulshokBerserker.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VulshokBerserker.java @@ -45,7 +45,7 @@ public class VulshokBerserker extends mage.sets.magic2011.VulshokBerserker { super(card); } - @Override + @java.lang.Override public VulshokBerserker copy() { return new VulshokBerserker(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java b/Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java index d07b4de3224..1022f368109 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java +++ b/Mage.Sets/src/mage/sets/mirrodin/VulshokGauntlets.java @@ -74,7 +74,7 @@ public class VulshokGauntlets extends CardImpl { super(card); } - @Override + @java.lang.Override public VulshokGauntlets copy() { return new VulshokGauntlets(this); } @@ -91,22 +91,22 @@ class VulshokGauntletsEffect extends ReplacementEffectImpl { super(effect); } - @Override + @java.lang.Override public VulshokGauntletsEffect copy() { return new VulshokGauntletsEffect(this); } - @Override + @java.lang.Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { return true; } - @Override + @java.lang.Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.UNTAP; } - @Override + @java.lang.Override public boolean applies(GameEvent event, Ability source, Game game) { if (game.getTurn().getStepType() == PhaseStep.UNTAP) { Permanent equipment = game.getPermanent(source.getSourceId()); diff --git a/Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java b/Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java index cbe3b765bd8..429360ddf67 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java +++ b/Mage.Sets/src/mage/sets/mirrodin/WailOfTheNim.java @@ -63,7 +63,7 @@ public class WailOfTheNim extends CardImpl { super(card); } - @Override + @java.lang.Override public WailOfTheNim copy() { return new WailOfTheNim(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/WallOfBlood.java b/Mage.Sets/src/mage/sets/mirrodin/WallOfBlood.java index 5535457b7f8..3e406902154 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/WallOfBlood.java +++ b/Mage.Sets/src/mage/sets/mirrodin/WallOfBlood.java @@ -62,7 +62,7 @@ public class WallOfBlood extends CardImpl { super(card); } - @Override + @java.lang.Override public WallOfBlood copy() { return new WallOfBlood(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/WanderguardSentry.java b/Mage.Sets/src/mage/sets/mirrodin/WanderguardSentry.java index 8fb623dad0f..40daf3e301b 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/WanderguardSentry.java +++ b/Mage.Sets/src/mage/sets/mirrodin/WanderguardSentry.java @@ -45,7 +45,7 @@ public class WanderguardSentry extends mage.sets.ninthedition.WanderguardSentry super(card); } - @Override + @java.lang.Override public WanderguardSentry copy() { return new WanderguardSentry(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/WeldingJar.java b/Mage.Sets/src/mage/sets/mirrodin/WeldingJar.java index ada85339d7e..dc1be1047bf 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/WeldingJar.java +++ b/Mage.Sets/src/mage/sets/mirrodin/WeldingJar.java @@ -58,7 +58,7 @@ public class WeldingJar extends CardImpl { super(card); } - @Override + @java.lang.Override public WeldingJar copy() { return new WeldingJar(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/WizardReplica.java b/Mage.Sets/src/mage/sets/mirrodin/WizardReplica.java index d750a39ba80..b2bdade4842 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/WizardReplica.java +++ b/Mage.Sets/src/mage/sets/mirrodin/WizardReplica.java @@ -45,7 +45,7 @@ public class WizardReplica extends mage.sets.planechase.WizardReplica { super(card); } - @Override + @java.lang.Override public WizardReplica copy() { return new WizardReplica(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/Worldslayer.java b/Mage.Sets/src/mage/sets/mirrodin/Worldslayer.java index 3cb17a7e367..6d3883763f7 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Worldslayer.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Worldslayer.java @@ -45,7 +45,7 @@ public class Worldslayer extends mage.sets.magic2012.Worldslayer { super(card); } - @Override + @java.lang.Override public Worldslayer copy() { return new Worldslayer(this); } diff --git a/Mage.Sets/src/mage/sets/mirrodin/WrenchMind.java b/Mage.Sets/src/mage/sets/mirrodin/WrenchMind.java index e03f202fee8..48f36ef3981 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/WrenchMind.java +++ b/Mage.Sets/src/mage/sets/mirrodin/WrenchMind.java @@ -61,7 +61,7 @@ public class WrenchMind extends CardImpl { super(card); } - @Override + @java.lang.Override public WrenchMind copy() { return new WrenchMind(this); } @@ -78,12 +78,12 @@ class WrenchMindEffect extends OneShotEffect { super(effect); } - @Override + @java.lang.Override public WrenchMindEffect copy() { return new WrenchMindEffect(this); } - @Override + @java.lang.Override public boolean apply(Game game, Ability source) { Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); if (targetPlayer != null && !targetPlayer.getHand().isEmpty()) { diff --git a/Mage.Sets/src/mage/sets/mirrodin/YotianSoldier.java b/Mage.Sets/src/mage/sets/mirrodin/YotianSoldier.java index 27981636572..c3f142ccc91 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/YotianSoldier.java +++ b/Mage.Sets/src/mage/sets/mirrodin/YotianSoldier.java @@ -55,7 +55,7 @@ public class YotianSoldier extends CardImpl { super(card); } - @Override + @java.lang.Override public YotianSoldier copy() { return new YotianSoldier(this); } From c98577cc6a724d755425a724718d721de15d4d33 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 22:18:01 +0200 Subject: [PATCH 307/375] Xmage 1.4.3v0 --- Mage.Client/pom.xml | 2 +- Mage.Common/pom.xml | 2 +- Mage.Common/src/mage/utils/MageVersion.java | 4 ++-- Mage.Plugins/Mage.Counter.Plugin/pom.xml | 2 +- Mage.Plugins/Mage.Theme.Plugin/pom.xml | 4 ++-- Mage.Plugins/pom.xml | 2 +- Mage.Server.Console/pom.xml | 2 +- Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml | 2 +- Mage.Server.Plugins/Mage.Deck.Limited/pom.xml | 2 +- Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml | 2 +- Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml | 2 +- Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml | 2 +- Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml | 2 +- Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml | 2 +- Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml | 2 +- Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml | 2 +- Mage.Server.Plugins/Mage.Player.AI/pom.xml | 2 +- Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml | 2 +- Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml | 2 +- Mage.Server.Plugins/Mage.Player.Human/pom.xml | 2 +- Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml | 2 +- Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml | 2 +- Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml | 2 +- Mage.Server.Plugins/pom.xml | 2 +- Mage.Server/pom.xml | 2 +- Mage.Sets/pom.xml | 2 +- Mage.Stats/pom.xml | 2 +- Mage.Tests/pom.xml | 2 +- Mage.Updater/pom.xml | 2 +- Mage/pom.xml | 2 +- Mage/src/mage/cards/repository/CardRepository.java | 2 +- Utils/release/getting_implemented_cards.txt | 3 +++ pom.xml | 4 ++-- 33 files changed, 38 insertions(+), 35 deletions(-) diff --git a/Mage.Client/pom.xml b/Mage.Client/pom.xml index 2fd01058e67..e48d07e8091 100644 --- a/Mage.Client/pom.xml +++ b/Mage.Client/pom.xml @@ -6,7 +6,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 org.mage diff --git a/Mage.Common/pom.xml b/Mage.Common/pom.xml index 29c08a1e814..09ab27aea29 100644 --- a/Mage.Common/pom.xml +++ b/Mage.Common/pom.xml @@ -7,7 +7,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 mage-common diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java index 59ec03f9cd2..805d71e91be 100644 --- a/Mage.Common/src/mage/utils/MageVersion.java +++ b/Mage.Common/src/mage/utils/MageVersion.java @@ -40,8 +40,8 @@ public class MageVersion implements Serializable, Comparable { */ public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; - public final static int MAGE_VERSION_PATCH = 2; - public final static String MAGE_VERSION_MINOR_PATCH = "v5"; + public final static int MAGE_VERSION_PATCH = 3; + public final static String MAGE_VERSION_MINOR_PATCH = "v0"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage.Plugins/Mage.Counter.Plugin/pom.xml b/Mage.Plugins/Mage.Counter.Plugin/pom.xml index e5ae116c808..df8cc7328b3 100644 --- a/Mage.Plugins/Mage.Counter.Plugin/pom.xml +++ b/Mage.Plugins/Mage.Counter.Plugin/pom.xml @@ -7,7 +7,7 @@ org.mage mage-plugins - 1.4.2 + 1.4.3 mage-counter-plugin diff --git a/Mage.Plugins/Mage.Theme.Plugin/pom.xml b/Mage.Plugins/Mage.Theme.Plugin/pom.xml index b85682e19c0..eebc730e4a8 100644 --- a/Mage.Plugins/Mage.Theme.Plugin/pom.xml +++ b/Mage.Plugins/Mage.Theme.Plugin/pom.xml @@ -6,7 +6,7 @@ org.mage mage-plugins - 1.4.2 + 1.4.3 mage-theme-plugin @@ -29,7 +29,7 @@ ${project.groupId} mage-client - 1.4.2 + 1.4.3 diff --git a/Mage.Plugins/pom.xml b/Mage.Plugins/pom.xml index ab4aa2c1d22..4e6b8ad8521 100644 --- a/Mage.Plugins/pom.xml +++ b/Mage.Plugins/pom.xml @@ -7,7 +7,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 mage-plugins diff --git a/Mage.Server.Console/pom.xml b/Mage.Server.Console/pom.xml index 839ee4bfd6f..77cb534fd1d 100644 --- a/Mage.Server.Console/pom.xml +++ b/Mage.Server.Console/pom.xml @@ -6,7 +6,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 org.mage diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml b/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml index b3599cd383e..dabc671779d 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-deck-constructed diff --git a/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml b/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml index fef00e55350..3ab629a71a6 100644 --- a/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml +++ b/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-deck-limited diff --git a/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml index 088bddb5c6e..66972c3a272 100644 --- a/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml +++ b/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-game-commanderduel diff --git a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml index bd62a87af49..ccfa64fc609 100644 --- a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml +++ b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml @@ -6,7 +6,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-game-commanderfreeforall diff --git a/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml b/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml index 40846d6d870..a608c789705 100644 --- a/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml +++ b/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-game-freeforall diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml index 84a07a702c4..7f1ff12438f 100644 --- a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml +++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-game-tinyleadersduel diff --git a/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml index b5d97c415da..7c6e74649f0 100644 --- a/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml +++ b/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-game-twoplayerduel diff --git a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml index 893420512a1..bf21ad2d2fe 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml +++ b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-player-ai-draftbot diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml b/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml index 2f9afe8a97e..4495a41f8a6 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-player-ai-ma diff --git a/Mage.Server.Plugins/Mage.Player.AI/pom.xml b/Mage.Server.Plugins/Mage.Player.AI/pom.xml index 2aa9ab4e65a..51788aff21a 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/pom.xml +++ b/Mage.Server.Plugins/Mage.Player.AI/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-player-ai diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml b/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml index d11572b64c7..62c8e069013 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-player-ai-mcts diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml b/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml index aa551c80b76..696f0b3043f 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml +++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-player-aiminimax diff --git a/Mage.Server.Plugins/Mage.Player.Human/pom.xml b/Mage.Server.Plugins/Mage.Player.Human/pom.xml index 9dfaa3988b1..28493362e66 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/pom.xml +++ b/Mage.Server.Plugins/Mage.Player.Human/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-player-human diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml index 92cd6907631..06efa02a054 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-tournament-boosterdraft diff --git a/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml b/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml index 091d2b0a971..884159dba8a 100644 --- a/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml +++ b/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-tournament-constructed diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml b/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml index ac640da9525..30abbd2009c 100644 --- a/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml +++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml @@ -7,7 +7,7 @@ org.mage mage-server-plugins - 1.4.2 + 1.4.3 mage-tournament-sealed diff --git a/Mage.Server.Plugins/pom.xml b/Mage.Server.Plugins/pom.xml index bcc34b3f72a..49073190dca 100644 --- a/Mage.Server.Plugins/pom.xml +++ b/Mage.Server.Plugins/pom.xml @@ -6,7 +6,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 mage-server-plugins diff --git a/Mage.Server/pom.xml b/Mage.Server/pom.xml index d0cec09ce35..a3b4db6ffdf 100644 --- a/Mage.Server/pom.xml +++ b/Mage.Server/pom.xml @@ -6,7 +6,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 mage-server diff --git a/Mage.Sets/pom.xml b/Mage.Sets/pom.xml index 95e4a1caf0b..a206bff7596 100644 --- a/Mage.Sets/pom.xml +++ b/Mage.Sets/pom.xml @@ -7,7 +7,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 org.mage diff --git a/Mage.Stats/pom.xml b/Mage.Stats/pom.xml index bad954e962b..91da9f71b06 100644 --- a/Mage.Stats/pom.xml +++ b/Mage.Stats/pom.xml @@ -6,7 +6,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 org.mage diff --git a/Mage.Tests/pom.xml b/Mage.Tests/pom.xml index 86e03d742f4..d5da2643a78 100644 --- a/Mage.Tests/pom.xml +++ b/Mage.Tests/pom.xml @@ -6,7 +6,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 mage-tests diff --git a/Mage.Updater/pom.xml b/Mage.Updater/pom.xml index 1cba689e490..90d4db3a1a6 100644 --- a/Mage.Updater/pom.xml +++ b/Mage.Updater/pom.xml @@ -5,7 +5,7 @@ mage-root org.mage - 1.4.2 + 1.4.3 4.0.0 diff --git a/Mage/pom.xml b/Mage/pom.xml index 02ac85bd1fe..c13b047036a 100644 --- a/Mage/pom.xml +++ b/Mage/pom.xml @@ -7,7 +7,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 mage diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 2f108bed587..1be590287bc 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -63,7 +63,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 41; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 31; + private static final long CARD_CONTENT_VERSION = 32; private final Random random = new Random(); private Dao cardDao; diff --git a/Utils/release/getting_implemented_cards.txt b/Utils/release/getting_implemented_cards.txt index 212b6db2e4c..02ecd0925f6 100644 --- a/Utils/release/getting_implemented_cards.txt +++ b/Utils/release/getting_implemented_cards.txt @@ -161,6 +161,9 @@ git log 193177d9999d56729a687ca3b1a2fc3f3b96d9e2..HEAD --diff-filter=A --name-st since 1.4.2.v5 git log 8dca887fadbbea41fb649ff17c5fe547a82ef23a..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt +since 1.4.3.v0 +git log 5de4637d9c7967612c207d3cf915c2861d922029..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt + 3. Copy added_cards.txt to trunk\Utils folder 4. Run script: > perl extract_in_wiki_format.perl diff --git a/pom.xml b/pom.xml index 176b2291351..65aa64f3d05 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.mage mage-root - 1.4.2 + 1.4.3 pom Mage Root Mage Root POM @@ -83,7 +83,7 @@ - 1.4.2 + 1.4.3 UTF-8 From 5dbc929367e4637a0c9ae60a73661920a1b68d7f Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 6 Aug 2015 23:11:36 +0200 Subject: [PATCH 308/375] Xmage 1.4.3v0 --- Mage.Server/release/server.msg.txt | 2 +- Mage.Server/server.msg.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Server/release/server.msg.txt b/Mage.Server/release/server.msg.txt index b22aa2823b6..82d31dc20a4 100644 --- a/Mage.Server/release/server.msg.txt +++ b/Mage.Server/release/server.msg.txt @@ -1,4 +1,4 @@ -Welcome! You are playing XMage version 1.4.2 +Welcome! You are playing XMage version 1.4.3 Find what was changed since previous versions on project Wiki https://github.com/magefree/mage/wiki Contact us on the XMAGE board of http://www.slightlymagic.net/forum/viewforum.php?f=70 for bug reports or enhancement requests. Download newest version from http://XMage.de \ No newline at end of file diff --git a/Mage.Server/server.msg.txt b/Mage.Server/server.msg.txt index b9630adc79b..b7101ba5dc5 100644 --- a/Mage.Server/server.msg.txt +++ b/Mage.Server/server.msg.txt @@ -2,5 +2,5 @@ HotKeys: Alt+E - Enlarge card image Wheel zoom in/out - Enlarge card image F4 - end current turn, response to stack F9 - skip all opponents' turns, no response to stack -Welcome! You are playing Mage version 1.4.2 +Welcome! You are playing Mage version 1.4.3 Contact us on www.slightlymagic.net \ No newline at end of file From 660f108a2acdb0317a2e43aa2690409e8d6ca127 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Fri, 7 Aug 2015 10:05:59 -0500 Subject: [PATCH 309/375] Added El-Hajjaj, Kjeldoran Gargoyle, Palliation Accord, Quagnoth, Spectral Bears, Spectral Force, Simoon, Shield of the Ages, Phantom Nishoba, Armorer Guildmage, Granger Guildmage, Shadow Guildmage, Shaper Guildmage, Wildfire Emissary, Zebra Unicorn, Doubtless One, Warrior Angel, Magus of the Scroll, Lilting Refrain, and Runes of Protection: Artifacts and Lands. Fixed spelling in Aggravate. --- .../src/mage/sets/arabiannights/ElHajjaj.java | 63 ++++ .../mage/sets/avacynrestored/Aggravate.java | 286 +++++++++--------- .../mage/sets/coldsnap/KjeldoranGargoyle.java | 70 +++++ .../sets/dissension/PalliationAccord.java | 154 ++++++++++ .../src/mage/sets/fourthedition/ElHajjaj.java | 52 ++++ .../src/mage/sets/futuresight/Quagnoth.java | 109 +++++++ .../mage/sets/homelands/SpectralBears.java | 52 ++++ .../src/mage/sets/iceage/ShieldOfTheAges.java | 52 ++++ Mage.Sets/src/mage/sets/invasion/Simoon.java | 52 ++++ .../mage/sets/judgment/PhantomNishoba.java | 155 ++++++++++ .../sets/mastersedition/ShieldOfTheAges.java | 111 +++++++ .../sets/mastersedition/SpectralBears.java | 117 +++++++ .../mage/sets/mirage/ArmorerGuildmage.java | 79 +++++ .../mage/sets/mirage/GrangerGuildmage.java | 84 +++++ .../src/mage/sets/mirage/ShadowGuildmage.java | 82 +++++ .../src/mage/sets/mirage/ShaperGuildmage.java | 81 +++++ .../mage/sets/mirage/WildfireEmissary.java | 79 +++++ .../src/mage/sets/mirage/ZebraUnicorn.java | 62 ++++ .../src/mage/sets/onslaught/DoubtlessOne.java | 79 +++++ .../mage/sets/revisededition/ElHajjaj.java | 52 ++++ .../mage/sets/stronghold/WarriorAngel.java | 67 ++++ .../sets/timeshifted/ShadowGuildmage.java | 54 ++++ .../sets/timeshifted/WildfireEmissary.java | 54 ++++ .../sets/timespiral/MagusOfTheScroll.java | 129 ++++++++ .../mage/sets/timespiral/SpectralForce.java | 118 ++++++++ .../mage/sets/urzassaga/LiltingRefrain.java | 73 +++++ .../urzassaga/RuneOfProtectionArtifacts.java | 141 +++++++++ .../sets/urzassaga/RuneOfProtectionLands.java | 141 +++++++++ Mage.Sets/src/mage/sets/visions/Simoon.java | 100 ++++++ 29 files changed, 2605 insertions(+), 143 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/arabiannights/ElHajjaj.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/KjeldoranGargoyle.java create mode 100644 Mage.Sets/src/mage/sets/dissension/PalliationAccord.java create mode 100644 Mage.Sets/src/mage/sets/fourthedition/ElHajjaj.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/Quagnoth.java create mode 100644 Mage.Sets/src/mage/sets/homelands/SpectralBears.java create mode 100644 Mage.Sets/src/mage/sets/iceage/ShieldOfTheAges.java create mode 100644 Mage.Sets/src/mage/sets/invasion/Simoon.java create mode 100644 Mage.Sets/src/mage/sets/judgment/PhantomNishoba.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/ShieldOfTheAges.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/SpectralBears.java create mode 100644 Mage.Sets/src/mage/sets/mirage/ArmorerGuildmage.java create mode 100644 Mage.Sets/src/mage/sets/mirage/GrangerGuildmage.java create mode 100644 Mage.Sets/src/mage/sets/mirage/ShadowGuildmage.java create mode 100644 Mage.Sets/src/mage/sets/mirage/ShaperGuildmage.java create mode 100644 Mage.Sets/src/mage/sets/mirage/WildfireEmissary.java create mode 100644 Mage.Sets/src/mage/sets/mirage/ZebraUnicorn.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/DoubtlessOne.java create mode 100644 Mage.Sets/src/mage/sets/revisededition/ElHajjaj.java create mode 100644 Mage.Sets/src/mage/sets/stronghold/WarriorAngel.java create mode 100644 Mage.Sets/src/mage/sets/timeshifted/ShadowGuildmage.java create mode 100644 Mage.Sets/src/mage/sets/timeshifted/WildfireEmissary.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/MagusOfTheScroll.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/SpectralForce.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionArtifacts.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionLands.java create mode 100644 Mage.Sets/src/mage/sets/visions/Simoon.java diff --git a/Mage.Sets/src/mage/sets/arabiannights/ElHajjaj.java b/Mage.Sets/src/mage/sets/arabiannights/ElHajjaj.java new file mode 100644 index 00000000000..30ee2520dd9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/arabiannights/ElHajjaj.java @@ -0,0 +1,63 @@ +/* + * 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.arabiannights; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageGainLifeSourceTriggeredAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class ElHajjaj extends CardImpl { + + public ElHajjaj(UUID ownerId) { + super(ownerId, 2, "El-Hajjaj", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); + this.expansionSetCode = "ARN"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever El-Hajjâj deals damage, you gain that much life. + this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); + } + + public ElHajjaj(final ElHajjaj card) { + super(card); + } + + @Override + public ElHajjaj copy() { + return new ElHajjaj(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/avacynrestored/Aggravate.java b/Mage.Sets/src/mage/sets/avacynrestored/Aggravate.java index a4a44b9a1d4..b762c36f219 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/Aggravate.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/Aggravate.java @@ -1,143 +1,143 @@ -/* - * 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.avacynrestored; - -import java.util.List; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.RequirementEffect; -import mage.cards.CardImpl; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.ControllerIdPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.TargetPlayer; -import mage.watchers.common.DamagedByWatcher; - -/** - * - * @author North - */ -public class Aggravate extends CardImpl { - - public Aggravate(UUID ownerId) { - super(ownerId, 125, "Aggravate", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{R}{R}"); - this.expansionSetCode = "AVR"; - - - // Aggravate deals 1 damage to each creature target player controls. - this.getSpellAbility().addEffect(new AggraveteEffect()); - this.getSpellAbility().addTarget(new TargetPlayer()); - // Each creature dealt damage this way attacks this turn if able. - this.getSpellAbility().addEffect(new AggravateRequirementEffect()); - this.getSpellAbility().addWatcher(new DamagedByWatcher()); - } - - public Aggravate(final Aggravate card) { - super(card); - } - - @Override - public Aggravate copy() { - return new Aggravate(this); - } -} - -class AggraveteEffect extends OneShotEffect { - - public AggraveteEffect() { - super(Outcome.Damage); - this.staticText = "{this} deals 1 damage to each creature target player controls"; - } - - public AggraveteEffect(final AggraveteEffect effect) { - super(effect); - } - - @Override - public AggraveteEffect copy() { - return new AggraveteEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); - if (player != null) { - FilterCreaturePermanent filter = new FilterCreaturePermanent(); - filter.add(new ControllerIdPredicate(player.getId())); - List creatures = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); - for (Permanent creature : creatures) { - creature.damage(1, source.getSourceId(), game, false, true); - } - return true; - } - return false; - } -} - -class AggravateRequirementEffect extends RequirementEffect { - - public AggravateRequirementEffect() { - super(Duration.EndOfTurn); - this.staticText = "Each creature dealt damage this way attacks this turn if able"; - } - - public AggravateRequirementEffect(final AggravateRequirementEffect effect) { - super(effect); - } - - @Override - public AggravateRequirementEffect copy() { - return new AggravateRequirementEffect(this); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - DamagedByWatcher watcher = (DamagedByWatcher) game.getState().getWatchers().get("DamagedByWatcher", source.getSourceId()); - if (watcher != null) { - return watcher.wasDamaged(permanent, game); - } - return false; - } - - @Override - public boolean mustAttack(Game game) { - return true; - } - - @Override - public boolean mustBlock(Game game) { - return false; - } -} +/* + * 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.avacynrestored; + +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.RequirementEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.watchers.common.DamagedByWatcher; + +/** + * + * @author North + */ +public class Aggravate extends CardImpl { + + public Aggravate(UUID ownerId) { + super(ownerId, 125, "Aggravate", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{R}{R}"); + this.expansionSetCode = "AVR"; + + + // Aggravate deals 1 damage to each creature target player controls. + this.getSpellAbility().addEffect(new AggravateEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + // Each creature dealt damage this way attacks this turn if able. + this.getSpellAbility().addEffect(new AggravateRequirementEffect()); + this.getSpellAbility().addWatcher(new DamagedByWatcher()); + } + + public Aggravate(final Aggravate card) { + super(card); + } + + @Override + public Aggravate copy() { + return new Aggravate(this); + } +} + +class AggravateEffect extends OneShotEffect { + + public AggravateEffect() { + super(Outcome.Damage); + this.staticText = "{this} deals 1 damage to each creature target player controls"; + } + + public AggravateEffect(final AggravateEffect effect) { + super(effect); + } + + @Override + public AggravateEffect copy() { + return new AggravateEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate(player.getId())); + List creatures = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); + for (Permanent creature : creatures) { + creature.damage(1, source.getSourceId(), game, false, true); + } + return true; + } + return false; + } +} + +class AggravateRequirementEffect extends RequirementEffect { + + public AggravateRequirementEffect() { + super(Duration.EndOfTurn); + this.staticText = "Each creature dealt damage this way attacks this turn if able"; + } + + public AggravateRequirementEffect(final AggravateRequirementEffect effect) { + super(effect); + } + + @Override + public AggravateRequirementEffect copy() { + return new AggravateRequirementEffect(this); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + DamagedByWatcher watcher = (DamagedByWatcher) game.getState().getWatchers().get("DamagedByWatcher", source.getSourceId()); + if (watcher != null) { + return watcher.wasDamaged(permanent, game); + } + return false; + } + + @Override + public boolean mustAttack(Game game) { + return true; + } + + @Override + public boolean mustBlock(Game game) { + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/KjeldoranGargoyle.java b/Mage.Sets/src/mage/sets/coldsnap/KjeldoranGargoyle.java new file mode 100644 index 00000000000..4cbcaead223 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/KjeldoranGargoyle.java @@ -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.coldsnap; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageGainLifeSourceTriggeredAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class KjeldoranGargoyle extends CardImpl { + + public KjeldoranGargoyle(UUID ownerId) { + super(ownerId, 10, "Kjeldoran Gargoyle", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{W}"); + this.expansionSetCode = "CSP"; + this.subtype.add("Gargoyle"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Whenever Kjeldoran Gargoyle deals damage, you gain that much life. + this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); + } + + public KjeldoranGargoyle(final KjeldoranGargoyle card) { + super(card); + } + + @Override + public KjeldoranGargoyle copy() { + return new KjeldoranGargoyle(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/dissension/PalliationAccord.java b/Mage.Sets/src/mage/sets/dissension/PalliationAccord.java new file mode 100644 index 00000000000..0d98ccb2056 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dissension/PalliationAccord.java @@ -0,0 +1,154 @@ +/* + * 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.dissension; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; + +/** + * + * @author fireshoes + */ +public class PalliationAccord extends CardImpl { + + public PalliationAccord(UUID ownerId) { + super(ownerId, 122, "Palliation Accord", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}{U}"); + this.expansionSetCode = "DIS"; + + // Whenever a creature an opponent controls becomes tapped, put a shield counter on Palliation Accord. + this.addAbility(new PallationAccordTriggeredAbility()); + + // Remove a shield counter from Palliation Accord: Prevent the next 1 damage that would be dealt to you this turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PalliationAccordPreventionEffect(), new RemoveCountersSourceCost(CounterType.SHIELD.createInstance()))); + } + + public PalliationAccord(final PalliationAccord card) { + super(card); + } + + @Override + public PalliationAccord copy() { + return new PalliationAccord(this); + } +} + +class PallationAccordTriggeredAbility extends TriggeredAbilityImpl { + PallationAccordTriggeredAbility() { + super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.SHIELD.createInstance())); + } + + PallationAccordTriggeredAbility(final PallationAccordTriggeredAbility ability) { + super(ability); + } + + @Override + public PallationAccordTriggeredAbility copy() { + return new PallationAccordTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.TAPPED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent p = game.getPermanent(event.getTargetId()); + if (p != null && p.getCardType().contains(CardType.CREATURE)) { + if (game.getOpponents(this.controllerId).contains(p.getControllerId())) + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever a creature an opponent controls becomes tapped, " + modes.getText(); + } +} + +class PalliationAccordPreventionEffect extends PreventionEffectImpl { + + public PalliationAccordPreventionEffect() { + super(Duration.EndOfTurn); + this.staticText = "Prevent the next 1 damage that would be dealt to you this turn"; + } + + public PalliationAccordPreventionEffect(final PalliationAccordPreventionEffect effect) { + super(effect); + } + + @Override + public PalliationAccordPreventionEffect copy() { + return new PalliationAccordPreventionEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + GameEvent preventEvent = new GameEvent(GameEvent.EventType.PREVENT_DAMAGE, + source.getControllerId(), source.getSourceId(), source.getControllerId(), event.getAmount(), false); + if (!game.replaceEvent(preventEvent)) { + int damage = event.getAmount(); + if (damage > 0) { + event.setAmount(damage - 1); + this.used = true; + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, + source.getControllerId(), source.getSourceId(), source.getControllerId(), 1)); + } + } + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!this.used && super.applies(event, source, game) && event.getTargetId().equals(source.getControllerId())) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/fourthedition/ElHajjaj.java b/Mage.Sets/src/mage/sets/fourthedition/ElHajjaj.java new file mode 100644 index 00000000000..a8a7adba105 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/ElHajjaj.java @@ -0,0 +1,52 @@ +/* + * 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.fourthedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class ElHajjaj extends mage.sets.arabiannights.ElHajjaj { + + public ElHajjaj(UUID ownerId) { + super(ownerId); + this.cardNumber = 18; + this.expansionSetCode = "4ED"; + } + + public ElHajjaj(final ElHajjaj card) { + super(card); + } + + @Override + public ElHajjaj copy() { + return new ElHajjaj(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/Quagnoth.java b/Mage.Sets/src/mage/sets/futuresight/Quagnoth.java new file mode 100644 index 00000000000..83c191c5817 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/Quagnoth.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.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.keyword.ShroudAbility; +import mage.abilities.keyword.SplitSecondAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.stack.StackObject; + +/** + * + * @author fireshoes + */ +public class Quagnoth extends CardImpl { + + public Quagnoth(UUID ownerId) { + super(ownerId, 150, "Quagnoth", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{G}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Beast"); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // Split second + this.addAbility(new SplitSecondAbility()); + + // Shroud + this.addAbility(ShroudAbility.getInstance()); + + // When a spell or ability an opponent controls causes you to discard Quagnoth, return it to your hand. + this.addAbility(new QuagnothTriggeredAbility()); + } + + public Quagnoth(final Quagnoth card) { + super(card); + } + + @Override + public Quagnoth copy() { + return new Quagnoth(this); + } +} + +class QuagnothTriggeredAbility extends TriggeredAbilityImpl { + + QuagnothTriggeredAbility() { + super(Zone.GRAVEYARD, new ReturnToHandSourceEffect()); + } + + QuagnothTriggeredAbility(final QuagnothTriggeredAbility ability) { + super(ability); + } + + @Override + public QuagnothTriggeredAbility copy() { + return new QuagnothTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DISCARDED_CARD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return game.getOpponents(this.getControllerId()).contains(game.getControllerId(event.getSourceId())) && + StackObject.class.isInstance(game.getObject(event.getSourceId())) && + getSourceId().equals(event.getTargetId()); + } + + @Override + public String getRule() { + return "When a spell or ability an opponent controls causes you to discard {this}, " + super.getRule(); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/homelands/SpectralBears.java b/Mage.Sets/src/mage/sets/homelands/SpectralBears.java new file mode 100644 index 00000000000..998177e34e2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/SpectralBears.java @@ -0,0 +1,52 @@ +/* + * 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.homelands; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class SpectralBears extends mage.sets.mastersedition.SpectralBears { + + public SpectralBears(UUID ownerId) { + super(ownerId); + this.cardNumber = 72; + this.expansionSetCode = "HML"; + } + + public SpectralBears(final SpectralBears card) { + super(card); + } + + @Override + public SpectralBears copy() { + return new SpectralBears(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/ShieldOfTheAges.java b/Mage.Sets/src/mage/sets/iceage/ShieldOfTheAges.java new file mode 100644 index 00000000000..62bebd747b7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/ShieldOfTheAges.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class ShieldOfTheAges extends mage.sets.mastersedition.ShieldOfTheAges { + + public ShieldOfTheAges(UUID ownerId) { + super(ownerId); + this.cardNumber = 310; + this.expansionSetCode = "ICE"; + } + + public ShieldOfTheAges(final ShieldOfTheAges card) { + super(card); + } + + @Override + public ShieldOfTheAges copy() { + return new ShieldOfTheAges(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/Simoon.java b/Mage.Sets/src/mage/sets/invasion/Simoon.java new file mode 100644 index 00000000000..eb8fc2cd18c --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/Simoon.java @@ -0,0 +1,52 @@ +/* + * 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.invasion; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Simoon extends mage.sets.visions.Simoon { + + public Simoon(UUID ownerId) { + super(ownerId); + this.cardNumber = 272; + this.expansionSetCode = "INV"; + } + + public Simoon(final Simoon card) { + super(card); + } + + @Override + public Simoon copy() { + return new Simoon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/PhantomNishoba.java b/Mage.Sets/src/mage/sets/judgment/PhantomNishoba.java new file mode 100644 index 00000000000..51cb80804d3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/PhantomNishoba.java @@ -0,0 +1,155 @@ +/* + * 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.judgment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageGainLifeSourceTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.turn.Step; + +/** + * + * @author fireshoes + */ +public class PhantomNishoba extends CardImpl { + + public PhantomNishoba(UUID ownerId) { + super(ownerId, 140, "Phantom Nishoba", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{G}{W}"); + this.expansionSetCode = "JUD"; + this.subtype.add("Cat"); + this.subtype.add("Beast"); + this.subtype.add("Spirit"); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Phantom Nishoba enters the battlefield with seven +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(7), true), "with seven +1/+1 counters on it")); + + // Whenever Phantom Nishoba deals damage, you gain that much life. + this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); + + // If damage would be dealt to Phantom Nishoba, prevent that damage. Remove a +1/+1 counter from Phantom Nishoba. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PhantomNishobaPreventionEffect())); + } + + public PhantomNishoba(final PhantomNishoba card) { + super(card); + } + + @Override + public PhantomNishoba copy() { + return new PhantomNishoba(this); + } +} + +class PhantomNishobaPreventionEffect extends PreventionEffectImpl { + + // remember turn and phase step to check if counter in this step was already removed + private int turn = 0; + private Step combatPhaseStep = null; + + public PhantomNishobaPreventionEffect() { + super(Duration.WhileOnBattlefield); + staticText = "If damage would be dealt to {this}, prevent that damage. Remove a +1/+1 counter from {this}"; + } + + public PhantomNishobaPreventionEffect(final PhantomNishobaPreventionEffect effect) { + super(effect); + this.turn = effect.turn; + this.combatPhaseStep = effect.combatPhaseStep; + } + + @Override + public PhantomNishobaPreventionEffect copy() { + return new PhantomNishobaPreventionEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + preventDamageAction(event, source, game); + + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + boolean removeCounter = true; + // check if in the same combat damage step already a counter was removed + if (game.getTurn().getPhase().getStep().getType().equals(PhaseStep.COMBAT_DAMAGE)) { + if (game.getTurnNum() == turn + && game.getTurn().getStep().equals(combatPhaseStep)) { + removeCounter = false; + } else { + turn = game.getTurnNum(); + combatPhaseStep = game.getTurn().getStep(); + } + } + + if(removeCounter && permanent.getCounters().containsKey(CounterType.P1P1)) { + StringBuilder sb = new StringBuilder(permanent.getName()).append(": "); + permanent.removeCounters(CounterType.P1P1.createInstance(), game); + sb.append("Removed a +1/+1 counter "); + game.informPlayers(sb.toString()); + } + } + + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (super.applies(event, source, game)) { + if (event.getTargetId().equals(source.getSourceId())) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mastersedition/ShieldOfTheAges.java b/Mage.Sets/src/mage/sets/mastersedition/ShieldOfTheAges.java new file mode 100644 index 00000000000..41cb5a5c322 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/ShieldOfTheAges.java @@ -0,0 +1,111 @@ +/* + * 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.mastersedition; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.PreventionEffectImpl; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class ShieldOfTheAges extends CardImpl { + + public ShieldOfTheAges(UUID ownerId) { + super(ownerId, 165, "Shield of the Ages", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "MED"; + + // {2}: Prevent the next 1 damage that would be dealt to you this turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ShieldOfTheAgesEffect(), new GenericManaCost(2))); + } + + public ShieldOfTheAges(final ShieldOfTheAges card) { + super(card); + } + + @Override + public ShieldOfTheAges copy() { + return new ShieldOfTheAges(this); + } +} + +class ShieldOfTheAgesEffect extends PreventionEffectImpl { + + public ShieldOfTheAgesEffect() { + super(Duration.EndOfTurn); + this.staticText = "Prevent the next 1 damage that would be dealt to you this turn"; + } + + public ShieldOfTheAgesEffect(final ShieldOfTheAgesEffect effect) { + super(effect); + } + + @Override + public ShieldOfTheAgesEffect copy() { + return new ShieldOfTheAgesEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + GameEvent preventEvent = new GameEvent(GameEvent.EventType.PREVENT_DAMAGE, + source.getControllerId(), source.getSourceId(), source.getControllerId(), event.getAmount(), false); + if (!game.replaceEvent(preventEvent)) { + int damage = event.getAmount(); + if (damage > 0) { + event.setAmount(damage - 1); + this.used = true; + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, + source.getControllerId(), source.getSourceId(), source.getControllerId(), 1)); + } + } + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!this.used && super.applies(event, source, game) && event.getTargetId().equals(source.getControllerId())) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mastersedition/SpectralBears.java b/Mage.Sets/src/mage/sets/mastersedition/SpectralBears.java new file mode 100644 index 00000000000..e364e177ea7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/SpectralBears.java @@ -0,0 +1,117 @@ +/* + * 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.mastersedition; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.DontUntapInControllersNextUntapStepSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author fireshoes + */ +public class SpectralBears extends CardImpl { + + public SpectralBears(UUID ownerId) { + super(ownerId, 131, "Spectral Bears", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "HML"; + this.subtype.add("Bear"); + this.subtype.add("Spirit"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Whenever Spectral Bears attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step. + this.addAbility(new SpectralBearsTriggeredAbility()); + } + + public SpectralBears(final SpectralBears card) { + super(card); + } + + @Override + public SpectralBears copy() { + return new SpectralBears(this); + } +} + +class SpectralBearsTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterPermanent filter = new FilterPermanent("black nontoken permanents"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLACK)); + filter.add(Predicates.not(new TokenPredicate())); + } + + public SpectralBearsTriggeredAbility() { + super(Zone.BATTLEFIELD, new DontUntapInControllersNextUntapStepSourceEffect()); + } + + public SpectralBearsTriggeredAbility(final SpectralBearsTriggeredAbility ability) { + super(ability); + } + + @Override + public SpectralBearsTriggeredAbility copy() { + return new SpectralBearsTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.ATTACKER_DECLARED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getSourceId().equals(this.getSourceId()); + } + + @Override + public boolean checkInterveningIfClause(Game game) { + UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(getSourceId(), game); + return defendingPlayerId != null && game.getBattlefield().countAll(filter, defendingPlayerId, game) < 1; + } + + @Override + public String getRule() { + return "Whenever {this} attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirage/ArmorerGuildmage.java b/Mage.Sets/src/mage/sets/mirage/ArmorerGuildmage.java new file mode 100644 index 00000000000..666cd572dab --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/ArmorerGuildmage.java @@ -0,0 +1,79 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class ArmorerGuildmage extends CardImpl { + + public ArmorerGuildmage(UUID ownerId) { + super(ownerId, 156, "Armorer Guildmage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {B}, {tap}: Target creature gets +1/+0 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{B}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // {G}, {tap}: Target creature gets +0/+1 until end of turn. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(0, 1, Duration.EndOfTurn), new ManaCostsImpl("{G}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public ArmorerGuildmage(final ArmorerGuildmage card) { + super(card); + } + + @Override + public ArmorerGuildmage copy() { + return new ArmorerGuildmage(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirage/GrangerGuildmage.java b/Mage.Sets/src/mage/sets/mirage/GrangerGuildmage.java new file mode 100644 index 00000000000..04609c2db9e --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/GrangerGuildmage.java @@ -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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class GrangerGuildmage extends CardImpl { + + public GrangerGuildmage(UUID ownerId) { + super(ownerId, 118, "Granger Guildmage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {R}, {tap}: Granger Guildmage deals 1 damage to target creature or player and 1 damage to you. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{R}")); + ability.addCost(new TapSourceCost()); + ability.addEffect(new DamageControllerEffect(1)); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + + // {W}, {tap}: Target creature gains first strike until end of turn. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public GrangerGuildmage(final GrangerGuildmage card) { + super(card); + } + + @Override + public GrangerGuildmage copy() { + return new GrangerGuildmage(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirage/ShadowGuildmage.java b/Mage.Sets/src/mage/sets/mirage/ShadowGuildmage.java new file mode 100644 index 00000000000..a85110dc505 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/ShadowGuildmage.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class ShadowGuildmage extends CardImpl { + + public ShadowGuildmage(UUID ownerId) { + super(ownerId, 38, "Shadow Guildmage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {U}, {tap}: Put target creature you control on top of its owner's library. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibraryTargetEffect(true), new ManaCostsImpl("{U}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetControlledCreaturePermanent()); + this.addAbility(ability); + + // {R}, {tap}: Shadow Guildmage deals 1 damage to target creature or player and 1 damage to you. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{R}")); + ability.addCost(new TapSourceCost()); + ability.addEffect(new DamageControllerEffect(1)); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public ShadowGuildmage(final ShadowGuildmage card) { + super(card); + } + + @Override + public ShadowGuildmage copy() { + return new ShadowGuildmage(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirage/ShaperGuildmage.java b/Mage.Sets/src/mage/sets/mirage/ShaperGuildmage.java new file mode 100644 index 00000000000..9a7f7354b6e --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/ShaperGuildmage.java @@ -0,0 +1,81 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class ShaperGuildmage extends CardImpl { + + public ShaperGuildmage(UUID ownerId) { + super(ownerId, 91, "Shaper Guildmage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{U}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {W}, {tap}: Target creature gains first strike until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // {B}, {tap}: Target creature gets +1/+0 until end of turn. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{B}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public ShaperGuildmage(final ShaperGuildmage card) { + super(card); + } + + @Override + public ShaperGuildmage copy() { + return new ShaperGuildmage(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirage/WildfireEmissary.java b/Mage.Sets/src/mage/sets/mirage/WildfireEmissary.java new file mode 100644 index 00000000000..bfb6722778d --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/WildfireEmissary.java @@ -0,0 +1,79 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author fireshoes + */ +public class WildfireEmissary extends CardImpl { + + private static final FilterCard filter = new FilterCard("white"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public WildfireEmissary(UUID ownerId) { + super(ownerId, 203, "Wildfire Emissary", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Efreet"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Protection from white + this.addAbility(new ProtectionAbility(filter)); + + // {1}{R}: Wildfire Emissary gets +1/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{1}{R}"))); + } + + public WildfireEmissary(final WildfireEmissary card) { + super(card); + } + + @Override + public WildfireEmissary copy() { + return new WildfireEmissary(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirage/ZebraUnicorn.java b/Mage.Sets/src/mage/sets/mirage/ZebraUnicorn.java new file mode 100644 index 00000000000..0997b3149db --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/ZebraUnicorn.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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageGainLifeSourceTriggeredAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class ZebraUnicorn extends CardImpl { + + public ZebraUnicorn(UUID ownerId) { + super(ownerId, 350, "Zebra Unicorn", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{W}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Unicorn"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Zebra Unicorn deals damage, you gain that much life. + this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); + } + + public ZebraUnicorn(final ZebraUnicorn card) { + super(card); + } + + @Override + public ZebraUnicorn copy() { + return new ZebraUnicorn(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/onslaught/DoubtlessOne.java b/Mage.Sets/src/mage/sets/onslaught/DoubtlessOne.java new file mode 100644 index 00000000000..006b01ae26d --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/DoubtlessOne.java @@ -0,0 +1,79 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageGainLifeSourceTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class DoubtlessOne extends CardImpl { + + final static FilterPermanent filter = new FilterPermanent("Clerics on the battlefield"); + + static { + filter.add(new SubtypePredicate("Cleric")); + } + + public DoubtlessOne(UUID ownerId) { + super(ownerId, 27, "Doubtless One", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Cleric"); + this.subtype.add("Avatar"); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Doubtless One's power and toughness are each equal to the number of Clerics on the battlefield. + this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new PermanentsOnBattlefieldCount(filter), Duration.EndOfGame))); + + // Whenever Doubtless One deals damage, you gain that much life. + this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); + } + + public DoubtlessOne(final DoubtlessOne card) { + super(card); + } + + @Override + public DoubtlessOne copy() { + return new DoubtlessOne(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/revisededition/ElHajjaj.java b/Mage.Sets/src/mage/sets/revisededition/ElHajjaj.java new file mode 100644 index 00000000000..ea0b5826aa5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/revisededition/ElHajjaj.java @@ -0,0 +1,52 @@ +/* + * 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.revisededition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class ElHajjaj extends mage.sets.arabiannights.ElHajjaj { + + public ElHajjaj(UUID ownerId) { + super(ownerId); + this.cardNumber = 16; + this.expansionSetCode = "3ED"; + } + + public ElHajjaj(final ElHajjaj card) { + super(card); + } + + @Override + public ElHajjaj copy() { + return new ElHajjaj(this); + } +} diff --git a/Mage.Sets/src/mage/sets/stronghold/WarriorAngel.java b/Mage.Sets/src/mage/sets/stronghold/WarriorAngel.java new file mode 100644 index 00000000000..d082d91d324 --- /dev/null +++ b/Mage.Sets/src/mage/sets/stronghold/WarriorAngel.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.stronghold; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsDamageGainLifeSourceTriggeredAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class WarriorAngel extends CardImpl { + + public WarriorAngel(UUID ownerId) { + super(ownerId, 123, "Warrior Angel", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{W}{W}"); + this.expansionSetCode = "STH"; + this.subtype.add("Angel"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Warrior Angel deals damage, you gain that much life. + this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); + } + + public WarriorAngel(final WarriorAngel card) { + super(card); + } + + @Override + public WarriorAngel copy() { + return new WarriorAngel(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/timeshifted/ShadowGuildmage.java b/Mage.Sets/src/mage/sets/timeshifted/ShadowGuildmage.java new file mode 100644 index 00000000000..8d76411452a --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/ShadowGuildmage.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.timeshifted; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class ShadowGuildmage extends mage.sets.mirage.ShadowGuildmage { + + public ShadowGuildmage(UUID ownerId) { + super(ownerId); + this.cardNumber = 46; + this.expansionSetCode = "TSB"; + this.rarity = Rarity.SPECIAL; + } + + public ShadowGuildmage(final ShadowGuildmage card) { + super(card); + } + + @Override + public ShadowGuildmage copy() { + return new ShadowGuildmage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timeshifted/WildfireEmissary.java b/Mage.Sets/src/mage/sets/timeshifted/WildfireEmissary.java new file mode 100644 index 00000000000..2befb05562a --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/WildfireEmissary.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.timeshifted; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class WildfireEmissary extends mage.sets.mirage.WildfireEmissary { + + public WildfireEmissary(UUID ownerId) { + super(ownerId); + this.cardNumber = 72; + this.expansionSetCode = "TSB"; + this.rarity = Rarity.SPECIAL; + } + + public WildfireEmissary(final WildfireEmissary card) { + super(card); + } + + @Override + public WildfireEmissary copy() { + return new WildfireEmissary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/MagusOfTheScroll.java b/Mage.Sets/src/mage/sets/timespiral/MagusOfTheScroll.java new file mode 100644 index 00000000000..cc4be45df3c --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/MagusOfTheScroll.java @@ -0,0 +1,129 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.NameACardEffect; +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.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class MagusOfTheScroll extends CardImpl { + + public MagusOfTheScroll(UUID ownerId) { + super(ownerId, 169, "Magus of the Scroll", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {3}, {tap}: Name a card. Reveal a card at random from your hand. If it's the named card, Magus of the Scroll deals 2 damage to target creature or player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new NameACardEffect(NameACardEffect.TypeOfName.ALL), new ManaCostsImpl("{3}")); + ability.addEffect(new MagusOfTheScrollEffect()); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public MagusOfTheScroll(final MagusOfTheScroll card) { + super(card); + } + + @Override + public MagusOfTheScroll copy() { + return new MagusOfTheScroll(this); + } +} + +class MagusOfTheScrollEffect extends OneShotEffect { + + public MagusOfTheScrollEffect() { + super(Outcome.Neutral); + staticText = "Reveal a card at random from your hand. If it's the named card, {this} deals 2 damage to target creature or player"; + } + + public MagusOfTheScrollEffect(final MagusOfTheScrollEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player you = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY); + if (sourceObject != null && you != null && cardName != null && !cardName.isEmpty()) { + if (you.getHand().size() > 0) { + Cards revealed = new CardsImpl(); + Card card = you.getHand().getRandom(game); + revealed.add(card); + you.revealCards(sourceObject.getName(), revealed, game); + if (card.getName().equals(cardName)) { + Permanent creature = game.getPermanent(targetPointer.getFirst(game, source)); + if (creature != null) { + creature.damage(2, source.getSourceId(), game, false, true); + return true; + } + Player player = game.getPlayer(targetPointer.getFirst(game, source)); + if (player != null) { + player.damage(2, source.getSourceId(), game, false, true); + return true; + } + return false; + } + } + return true; + } + return false; + } + + @Override + public MagusOfTheScrollEffect copy() { + return new MagusOfTheScrollEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/timespiral/SpectralForce.java b/Mage.Sets/src/mage/sets/timespiral/SpectralForce.java new file mode 100644 index 00000000000..42a566327d2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/SpectralForce.java @@ -0,0 +1,118 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.DontUntapInControllersNextUntapStepSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author fireshoes + */ +public class SpectralForce extends CardImpl { + + public SpectralForce(UUID ownerId) { + super(ownerId, 217, "Spectral Force", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Elemental"); + this.subtype.add("Spirit"); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Whenever Spectral Force attacks, if defending player controls no black permanents, it doesn't untap during your next untap step. + this.addAbility(new SpectralForceTriggeredAbility()); + } + + public SpectralForce(final SpectralForce card) { + super(card); + } + + @Override + public SpectralForce copy() { + return new SpectralForce(this); + } +} + +class SpectralForceTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterPermanent filter = new FilterPermanent("black permanents"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLACK)); + } + + public SpectralForceTriggeredAbility() { + super(Zone.BATTLEFIELD, new DontUntapInControllersNextUntapStepSourceEffect()); + } + + public SpectralForceTriggeredAbility(final SpectralForceTriggeredAbility ability) { + super(ability); + } + + @Override + public SpectralForceTriggeredAbility copy() { + return new SpectralForceTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.ATTACKER_DECLARED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getSourceId().equals(this.getSourceId()); + } + + @Override + public boolean checkInterveningIfClause(Game game) { + UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(getSourceId(), game); + return defendingPlayerId != null && game.getBattlefield().countAll(filter, defendingPlayerId, game) < 1; + } + + @Override + public String getRule() { + return "Whenever {this} attacks, if defending player controls no black permanents, it doesn't untap during your next untap step."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java b/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java new file mode 100644 index 00000000000..cf8cf62f232 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java @@ -0,0 +1,73 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.dynamicvalue.common.CountersCount; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class LiltingRefrain extends CardImpl { + + public LiltingRefrain(UUID ownerId) { + super(ownerId, 83, "Lilting Refrain", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "USG"; + + // At the beginning of your upkeep, you may put a verse counter on Lilting Refrain. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.VERSE.createInstance()), TargetController.YOU, true)); + + // Sacrifice Lilting Refrain: Counter target spell unless its controller pays {X}, where X is the number of verse counters on Lilting Refrain. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new CountersCount(CounterType.VERSE)), new SacrificeSourceCost()); + ability.addTarget(new TargetSpell()); + this.addAbility(ability); + } + + public LiltingRefrain(final LiltingRefrain card) { + super(card); + } + + @Override + public LiltingRefrain copy() { + return new LiltingRefrain(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionArtifacts.java b/Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionArtifacts.java new file mode 100644 index 00000000000..52286b85afe --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionArtifacts.java @@ -0,0 +1,141 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterObject; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.TargetSource; + +/** + * + * @author fireshoes + */ +public class RuneOfProtectionArtifacts extends CardImpl { + + public RuneOfProtectionArtifacts(UUID ownerId) { + super(ownerId, 35, "Rune of Protection: Artifacts", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "USG"; + + + // {W}: The next time a black source of your choice would deal damage to you this turn, prevent that damage. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RuneOfProtectionArtifactsEffect() , new ManaCostsImpl("W"))); + // Cycling {2} ({2}, Discard this card: Draw a card.) + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + } + + public RuneOfProtectionArtifacts(final RuneOfProtectionArtifacts card) { + super(card); + } + + @Override + public RuneOfProtectionArtifacts copy() { + return new RuneOfProtectionArtifacts(this); + } +} + +class RuneOfProtectionArtifactsEffect extends PreventionEffectImpl { + + private static final FilterObject filter = new FilterObject("artifact source"); + + static { + filter.add(new CardTypePredicate(CardType.ARTIFACT)); + } + + private TargetSource target; + + public RuneOfProtectionArtifactsEffect() { + super(Duration.EndOfTurn); + target = new TargetSource(filter); + + staticText = "The next time an artifact source of your choice would deal damage to you this turn, prevent that damage"; + } + + public RuneOfProtectionArtifactsEffect(final RuneOfProtectionArtifactsEffect effect) { + super(effect); + this.target = effect.target.copy(); + } + + @Override + public RuneOfProtectionArtifactsEffect copy() { + return new RuneOfProtectionArtifactsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public void init(Ability source, Game game) { + this.target.choose(Outcome.PreventDamage, source.getControllerId(), source.getSourceId(), game); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + if (event.getTargetId().equals(source.getControllerId()) && event.getSourceId().equals(target.getFirstTarget())) { + preventDamage(event, source, target.getFirstTarget(), game); + return true; + } + return false; + } + + private void preventDamage(GameEvent event, Ability source, UUID target, Game game) { + GameEvent preventEvent = new GameEvent(GameEvent.EventType.PREVENT_DAMAGE, target, source.getSourceId(), source.getControllerId(), event.getAmount(), false); + if (!game.replaceEvent(preventEvent)) { + int damage = event.getAmount(); + event.setAmount(0); + this.used = true; + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, target, source.getSourceId(), source.getControllerId(), damage)); + } + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!this.used && super.applies(event, source, game)) { + if (event.getTargetId().equals(source.getControllerId()) && event.getSourceId().equals(target.getFirstTarget())) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionLands.java b/Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionLands.java new file mode 100644 index 00000000000..5d088a895fb --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/RuneOfProtectionLands.java @@ -0,0 +1,141 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterObject; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.TargetSource; + +/** + * + * @author fireshoes + */ +public class RuneOfProtectionLands extends CardImpl { + + public RuneOfProtectionLands(UUID ownerId) { + super(ownerId, 39, "Rune of Protection: Lands", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "USG"; + + + // {W}: The next time a black source of your choice would deal damage to you this turn, prevent that damage. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RuneOfProtectionLandsEffect() , new ManaCostsImpl("W"))); + // Cycling {2} ({2}, Discard this card: Draw a card.) + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + } + + public RuneOfProtectionLands(final RuneOfProtectionLands card) { + super(card); + } + + @Override + public RuneOfProtectionLands copy() { + return new RuneOfProtectionLands(this); + } +} + +class RuneOfProtectionLandsEffect extends PreventionEffectImpl { + + private static final FilterObject filter = new FilterObject("land source"); + + static { + filter.add(new CardTypePredicate(CardType.LAND)); + } + + private TargetSource target; + + public RuneOfProtectionLandsEffect() { + super(Duration.EndOfTurn); + target = new TargetSource(filter); + + staticText = "The next time a land source of your choice would deal damage to you this turn, prevent that damage"; + } + + public RuneOfProtectionLandsEffect(final RuneOfProtectionLandsEffect effect) { + super(effect); + this.target = effect.target.copy(); + } + + @Override + public RuneOfProtectionLandsEffect copy() { + return new RuneOfProtectionLandsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public void init(Ability source, Game game) { + this.target.choose(Outcome.PreventDamage, source.getControllerId(), source.getSourceId(), game); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + if (event.getTargetId().equals(source.getControllerId()) && event.getSourceId().equals(target.getFirstTarget())) { + preventDamage(event, source, target.getFirstTarget(), game); + return true; + } + return false; + } + + private void preventDamage(GameEvent event, Ability source, UUID target, Game game) { + GameEvent preventEvent = new GameEvent(GameEvent.EventType.PREVENT_DAMAGE, target, source.getSourceId(), source.getControllerId(), event.getAmount(), false); + if (!game.replaceEvent(preventEvent)) { + int damage = event.getAmount(); + event.setAmount(0); + this.used = true; + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, target, source.getSourceId(), source.getControllerId(), damage)); + } + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!this.used && super.applies(event, source, game)) { + if (event.getTargetId().equals(source.getControllerId()) && event.getSourceId().equals(target.getFirstTarget())) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/visions/Simoon.java b/Mage.Sets/src/mage/sets/visions/Simoon.java new file mode 100644 index 00000000000..e0cac5096b1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/Simoon.java @@ -0,0 +1,100 @@ +/* + * 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.visions; + +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class Simoon extends CardImpl { + + public Simoon(UUID ownerId) { + super(ownerId, 136, "Simoon", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{R}{G}"); + this.expansionSetCode = "VIS"; + + // Simoon deals 1 damage to each creature target opponent controls. + this.getSpellAbility().addEffect(new SimoonEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public Simoon(final Simoon card) { + super(card); + } + + @Override + public Simoon copy() { + return new Simoon(this); + } +} + +class SimoonEffect extends OneShotEffect { + + public SimoonEffect() { + super(Outcome.Damage); + this.staticText = "{this} deals 1 damage to each creature target opponent controls"; + } + + public SimoonEffect(final SimoonEffect effect) { + super(effect); + } + + @Override + public SimoonEffect copy() { + return new SimoonEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate(player.getId())); + List creatures = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); + for (Permanent creature : creatures) { + creature.damage(1, source.getSourceId(), game, false, true); + } + return true; + } + return false; + } +} \ No newline at end of file From 9d43cebd2fca679497078a3f2ad7eb5787ee7b47 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Thu, 6 Aug 2015 09:52:36 -0700 Subject: [PATCH 310/375] implemented Voidmage Husher --- .../sets/mediainserts/VoidmageHusher.java | 82 +++++++++++++++++++ .../mage/sets/timespiral/VoidmageHusher.java | 54 ++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.java diff --git a/Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java b/Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java new file mode 100644 index 00000000000..6fc12f98694 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mediainserts; + +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetActivatedAbility; + +import java.util.UUID; + +/** + * + * @author andyfries + */ +public class VoidmageHusher extends CardImpl { + + public VoidmageHusher(UUID ownerId) { + super(ownerId, 62, "Voidmage Husher", Rarity.SPECIAL, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "MBP"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // When Voidmage Husher enters the battlefield, counter target activated ability. + Ability ability = new EntersBattlefieldTriggeredAbility(new CounterTargetEffect()); + ability.addTarget(new TargetActivatedAbility()); + this.addAbility(ability); + + // Whenever you cast a spell, you may return Voidmage Husher to its owner's hand. + this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), true)); + } + + public VoidmageHusher(final VoidmageHusher card) { + super(card); + } + + @Override + public VoidmageHusher copy() { + return new VoidmageHusher(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.java b/Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.java new file mode 100644 index 00000000000..f74b44b3dcb --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.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.timespiral; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author andyfries + */ +public class VoidmageHusher extends mage.sets.mediainserts.VoidmageHusher { + + public VoidmageHusher(UUID ownerId) { + super(ownerId); + this.cardNumber = 92; + this.expansionSetCode = "TSP"; + this.rarity = Rarity.UNCOMMON; + } + + public VoidmageHusher(final VoidmageHusher card) { + super(card); + } + + @Override + public VoidmageHusher copy() { + return new VoidmageHusher(this); + } +} From dcd5bd8974edbf80119590227a98c544dab5a131 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Thu, 6 Aug 2015 09:51:39 -0700 Subject: [PATCH 311/375] implemented Aurification --- .../src/mage/sets/onslaught/Aurification.java | 164 ++++++++++++++++++ .../continuous/BecomesSubtypeAllEffect.java | 17 +- Mage/src/mage/counters/CounterType.java | 1 + Mage/src/mage/counters/Counters.java | 10 ++ 4 files changed, 185 insertions(+), 7 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/onslaught/Aurification.java diff --git a/Mage.Sets/src/mage/sets/onslaught/Aurification.java b/Mage.Sets/src/mage/sets/onslaught/Aurification.java new file mode 100644 index 00000000000..92479ceca51 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/Aurification.java @@ -0,0 +1,164 @@ +/* + * 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.onslaught; + +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BecomesSubtypeAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.CounterPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +import java.util.ArrayList; +import java.util.UUID; + +/** + * + * @author andyfries + */ + +public class Aurification extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Each creature with a gold counter on it"); + + static { + filter.add(new CounterPredicate(CounterType.GOLD)); + } + + final String rule = "Each creature with a gold counter on it is a Wall in addition to its other creature types and has defender."; + + public Aurification(UUID ownerId) { + super(ownerId, 6, "Aurification", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}"); + this.expansionSetCode = "ONS"; + + // Whenever a creature deals damage to you, put a gold counter on it. + this.addAbility(new AddGoldCountersAbility()); + + // Each creature with a gold counter on it is a Wall in addition to its other creature types and has defender. + ArrayList subtypes = new ArrayList<>(1); + subtypes.add("Wall"); + + BecomesSubtypeAllEffect becomesSubtypeAllEffect = new BecomesSubtypeAllEffect(Duration.WhileOnBattlefield, subtypes, filter, false); + becomesSubtypeAllEffect.setText(""); + + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, becomesSubtypeAllEffect)); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(DefenderAbility.getInstance(), Duration.WhileOnBattlefield, filter, rule))); + + // When Aurification leaves the battlefield, remove all gold counters from all creatures. + this.addAbility(new LeavesBattlefieldTriggeredAbility(new RemoveAllGoldCountersEffect(), false)); + } + + public Aurification(final Aurification card) { + super(card); + } + + @Override + public Aurification copy() { + return new Aurification(this); + } + + public class AddGoldCountersAbility extends TriggeredAbilityImpl { + + public AddGoldCountersAbility() { + super(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.GOLD.createInstance())); + } + + public AddGoldCountersAbility(final AddGoldCountersAbility ability) { + super(ability); + } + + @Override + public AddGoldCountersAbility copy() { + return new AddGoldCountersAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(this.getControllerId())) { + Permanent permanent = game.getPermanent(event.getSourceId()); + if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getSourceId())); + } + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a creature deals damage to you, put a gold counter on it."; + } + + } + + public class RemoveAllGoldCountersEffect extends OneShotEffect { + public RemoveAllGoldCountersEffect() { + super(Outcome.Neutral); + this.staticText = "remove all gold counters from all creatures"; + } + + public RemoveAllGoldCountersEffect(final RemoveAllGoldCountersEffect effect) { + super(effect); + } + + @Override + public RemoveAllGoldCountersEffect copy() { + return new RemoveAllGoldCountersEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(CardType.CREATURE)) { + if (permanent != null){ + permanent.getCounters().removeAllCounters(CounterType.GOLD); + } + } + return true; + } + } +} \ No newline at end of file diff --git a/Mage/src/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java index 36c62e51adb..80e7bcdb69b 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java @@ -6,8 +6,11 @@ package mage.abilities.effects.common.continuous; import java.util.ArrayList; +import java.util.Iterator; +import mage.MageObjectReference; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.ContinuousEffectImpl; import mage.constants.Duration; import mage.constants.Layer; @@ -25,21 +28,23 @@ public class BecomesSubtypeAllEffect extends ContinuousEffectImpl { protected ArrayList subtypes = new ArrayList(); protected boolean loseOther; // loses other subtypes + protected FilterCreaturePermanent filter; - public BecomesSubtypeAllEffect(Duration duration, String subtype) { + public BecomesSubtypeAllEffect(Duration duration, String subtype) { this(duration, createArrayList(subtype)); } public BecomesSubtypeAllEffect(Duration duration, ArrayList subtypes) { - this(duration, subtypes, true); + this(duration, subtypes, new FilterCreaturePermanent("All creatures"), true); } public BecomesSubtypeAllEffect(Duration duration, - ArrayList subtypes, boolean loseOther) { + ArrayList subtypes, FilterCreaturePermanent filter, boolean loseOther) { super(duration, Outcome.Detriment); this.subtypes = subtypes; this.staticText = setText(); this.loseOther = loseOther; + this.filter = filter; } private static ArrayList createArrayList(String subtype) { @@ -52,7 +57,7 @@ public class BecomesSubtypeAllEffect extends ContinuousEffectImpl { super(effect); this.subtypes.addAll(effect.subtypes); this.loseOther = effect.loseOther; - this.loseOther = effect.loseOther; + this.filter = effect.filter; } @Override @@ -68,9 +73,7 @@ public class BecomesSubtypeAllEffect extends ContinuousEffectImpl { @Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - - for (Permanent permanent : game.getBattlefield() - .getAllActivePermanents(new FilterCreaturePermanent(), game)) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, game)) { if (permanent != null) { switch (layer) { case TypeChangingEffects_4: diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java index 2f0aa49ad8d..569afd3b645 100644 --- a/Mage/src/mage/counters/CounterType.java +++ b/Mage/src/mage/counters/CounterType.java @@ -55,6 +55,7 @@ public enum CounterType { FEATHER("feather"), FLOOD("flood"), FUSE("fuse"), + GOLD("gold"), HATCHLING("hatchling"), HOOFPRINT("hoofprint"), ICE("ice"), diff --git a/Mage/src/mage/counters/Counters.java b/Mage/src/mage/counters/Counters.java index 6b1aca15edf..473106f081f 100644 --- a/Mage/src/mage/counters/Counters.java +++ b/Mage/src/mage/counters/Counters.java @@ -96,6 +96,16 @@ public class Counters extends HashMap implements Serializable { } } + public void removeAllCounters(CounterType counterType){ + removeAllCounters(counterType.getName()); + } + + public void removeAllCounters(String name){ + if (this.containsKey(name)){ + this.remove(name); + } + } + public int getCount(String name) { if (this.containsKey(name)) { return this.get(name).getCount(); From ddceaa3e5423b52a5e7cb382be1a51c928d0d9ae Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 7 Aug 2015 20:51:27 +0200 Subject: [PATCH 312/375] *Fixed name of Historical and Super Standard format. --- .../Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java | 2 +- .../Mage.Deck.Constructed/src/mage/deck/SuperStandard.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java index 38c577f35ad..9fef3463b57 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java @@ -85,7 +85,7 @@ public class HistoricalStandard extends Constructed { * done in the overridden validate function. */ public HistoricalStandard() { - super("Variant Magic - Historical Standard"); + super("Constructed - Historical Standard"); // banned cards banned.add("Balance"); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java index f1fa0b0fa50..4eb4d5c4e8a 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java @@ -61,7 +61,7 @@ public class SuperStandard extends Constructed { * done in the overridden validate function. */ public SuperStandard() { - super("Variant Magic - Super Standard"); + super("Constructed - Super Standard"); banned.add("Ancient Den"); banned.add("Disciple of the Vault"); From 21cfe0611c15604e19bf26baf7dfbb6344c1594c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 7 Aug 2015 21:31:22 +0200 Subject: [PATCH 313/375] * Some fixes to Liting Refrain, Dying Wish and Violet Pall. --- .../src/mage/sets/gatecrash/DyingWish.java | 48 +++++++++++++-- .../src/mage/sets/morningtide/VioletPall.java | 19 +++++- .../mage/sets/urzassaga/LiltingRefrain.java | 4 +- Mage/src/mage/counters/CounterType.java | 61 ++++++++++--------- 4 files changed, 95 insertions(+), 37 deletions(-) diff --git a/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java b/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java index 772d3a72ad9..6b98ffc389e 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java +++ b/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java @@ -28,17 +28,21 @@ package mage.sets.gatecrash; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.target.common.TargetControlledCreaturePermanent; @@ -62,9 +66,8 @@ public class DyingWish extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - // When enchanted creature dies, target player loses X life and you gain X life, where X is its power. - DynamicValue attachedPower = new AttachedPermanentPowerCount(); + DynamicValue attachedPower = new DyingWishAttachedPermanentPowerCount(); ability = new DiesAttachedTriggeredAbility(new LoseLifeTargetEffect(attachedPower), "enchanted creature"); ability.addEffect(new GainLifeEffect(attachedPower)); ability.addTarget(new TargetPlayer()); @@ -80,3 +83,38 @@ public class DyingWish extends CardImpl { return new DyingWish(this); } } + +class DyingWishAttachedPermanentPowerCount implements DynamicValue { + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + Permanent attachmentPermanent = game.getPermanent(sourceAbility.getSourceId()); + if (attachmentPermanent == null) { + attachmentPermanent = (Permanent) game.getLastKnownInformation(sourceAbility.getSourceId(), Zone.BATTLEFIELD, sourceAbility.getSourceObjectZoneChangeCounter()); + } + if (attachmentPermanent != null && attachmentPermanent.getAttachedTo() != null) { + if (effect.getValue("attachedTo") != null) { + Permanent attached = (Permanent) effect.getValue("attachedTo"); + if (attached != null) { + return attached.getPower().getValue(); + } + } + } + return 0; + } + + @Override + public DynamicValue copy() { + return new DyingWishAttachedPermanentPowerCount(); + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return "its power"; + } +} diff --git a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java index 228a57579be..7b760e28e44 100644 --- a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java +++ b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java @@ -28,15 +28,18 @@ package mage.sets.morningtide; import java.util.UUID; +import mage.MageInt; import mage.constants.CardType; import mage.constants.Rarity; import mage.ObjectColor; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; /** @@ -58,7 +61,7 @@ public class VioletPall extends CardImpl { this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - this.getSpellAbility().addEffect(new CreateTokenEffect(new FaerieToken(), 1)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new VioletPallFaerieToken(), 1)); } public VioletPall(final VioletPall card) { @@ -70,3 +73,17 @@ public class VioletPall extends CardImpl { return new VioletPall(this); } } + +class VioletPallFaerieToken extends Token { + + VioletPallFaerieToken() { + super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add("Faerie"); + subtype.add("Rogue"); + power = new MageInt(1); + toughness = new MageInt(1); + this.addAbility(FlyingAbility.getInstance()); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java b/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java index cf8cf62f232..e4cfe2d3823 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java +++ b/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java @@ -55,7 +55,7 @@ public class LiltingRefrain extends CardImpl { // At the beginning of your upkeep, you may put a verse counter on Lilting Refrain. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.VERSE.createInstance()), TargetController.YOU, true)); - + // Sacrifice Lilting Refrain: Counter target spell unless its controller pays {X}, where X is the number of verse counters on Lilting Refrain. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new CountersCount(CounterType.VERSE)), new SacrificeSourceCost()); ability.addTarget(new TargetSpell()); @@ -70,4 +70,4 @@ public class LiltingRefrain extends CardImpl { public LiltingRefrain copy() { return new LiltingRefrain(this); } -} \ No newline at end of file +} diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java index 2f0aa49ad8d..18177a03392 100644 --- a/Mage/src/mage/counters/CounterType.java +++ b/Mage/src/mage/counters/CounterType.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.counters; /** @@ -34,6 +33,7 @@ package mage.counters; * @author nantuko */ public enum CounterType { + AGE("age"), AIM("aim"), ARROWHEAD("arrowhead"), @@ -76,6 +76,7 @@ public enum CounterType { POISON("poison"), PRESSURE("pressure"), QUEST("quest"), + SHIELD("shield"), SLIME("slime"), SPORE("spore"), STORAGE("storage"), @@ -85,6 +86,7 @@ public enum CounterType { TOWER("tower"), VELOCITY("velocity"), VILE("vile"), + VERSE("verse"), WISH("wish"); private final String name; @@ -112,7 +114,8 @@ public enum CounterType { } /** - * Create instance of counter type with defined amount of counters of the given type. + * Create instance of counter type with defined amount of counters of the + * given type. * * @param amount amount of counters of the given type. * @return @@ -129,4 +132,4 @@ public enum CounterType { return new Counter(name, amount); } } -} \ No newline at end of file +} From f128739e550bf494ba44c552931526c365299e11 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Sat, 8 Aug 2015 11:03:01 -0700 Subject: [PATCH 314/375] implemented Jinxed Choker --- .../src/mage/sets/mirrodin/JinxedChoker.java | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mirrodin/JinxedChoker.java diff --git a/Mage.Sets/src/mage/sets/mirrodin/JinxedChoker.java b/Mage.Sets/src/mage/sets/mirrodin/JinxedChoker.java new file mode 100644 index 00000000000..9ce1f78d594 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/JinxedChoker.java @@ -0,0 +1,180 @@ +/* + * 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.mirrodin; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility; +import mage.abilities.common.OnEventTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageControllerEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.cards.CardImpl; +import mage.constants.*; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +import java.lang.Override; +import java.util.UUID; + +/** + * + * @author andyfries + */ + +public class JinxedChoker extends CardImpl { + + public JinxedChoker(UUID ownerId) { + super(ownerId, 189, "Jinxed Choker", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "MRD"; + + // At the beginning of your end step, target opponent gains control of Jinxed Choker and puts a charge counter on it. + Ability endStepAbility = new BeginningOfYourEndStepTriggeredAbility(new JinxedChokerChangeControllerEffect(), false); + endStepAbility.addTarget(new TargetOpponent()); + + AddCountersSourceEffect addCountersSourceEffect = new AddCountersSourceEffect(CounterType.CHARGE.createInstance()); + addCountersSourceEffect.setText(""); + endStepAbility.addEffect(addCountersSourceEffect); + this.addAbility(endStepAbility); + + // At the beginning of your upkeep, Jinxed Choker deals damage to you equal to the number of charge counters on it. + Ability upkeepAbility = new OnEventTriggeredAbility(GameEvent.EventType.UPKEEP_STEP_PRE, "beginning of your upkeep", new DamageControllerEffect(new JinxedChokerDynamicValue()), false); + this.addAbility(upkeepAbility); + + // {3}: Put a charge counter on Jinxed Choker or remove one from it. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new JinxedChokerCounterEffect(), new ManaCostsImpl("{3}")); + this.addAbility(ability); + } + + public JinxedChoker(final JinxedChoker card) { + super(card); + } + + @Override + public JinxedChoker copy() { + return new JinxedChoker(this); + } +} + +class JinxedChokerChangeControllerEffect extends ContinuousEffectImpl { + + public JinxedChokerChangeControllerEffect() { + super(Duration.Custom, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + staticText = "target opponent gains control of {this} and puts a charge counter on it"; + } + + public JinxedChokerChangeControllerEffect(final JinxedChokerChangeControllerEffect effect) { + super(effect); + } + + @Override + public JinxedChokerChangeControllerEffect copy() { + return new JinxedChokerChangeControllerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) source.getSourceObjectIfItStillExists(game); + if (permanent != null) { + return permanent.changeControllerId(source.getFirstTarget(), game); + } else { + discard(); + } + return false; + } + +} + +class JinxedChokerDynamicValue implements DynamicValue { + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + Permanent permanent = game.getPermanent(sourceAbility.getSourceId()); + + int count = 0; + if (permanent != null){ + count = permanent.getCounters().getCount(CounterType.CHARGE); + } + return count; + } + + @Override + public JinxedChokerDynamicValue copy() { + return new JinxedChokerDynamicValue(); + } + + @Override + public String getMessage() { + return "charge counter on it"; + } + + @Override + public String toString() { + return "1"; + } +} + +class JinxedChokerCounterEffect extends OneShotEffect { + + public JinxedChokerCounterEffect() { + super(Outcome.Detriment); + this.staticText = "Put a charge counter on {this} or remove one from it"; + } + + public JinxedChokerCounterEffect(final JinxedChokerCounterEffect effect) { + super(effect); + } + + @Override + public JinxedChokerCounterEffect copy() { + return new JinxedChokerCounterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (controller != null && sourcePermanent != null) { + if (!sourcePermanent.getCounters().containsKey(CounterType.CHARGE) || controller.chooseUse(outcome, "Put a charge counter on? (No removes one)", source, game)) { + return new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true).apply(game, source); + } else { + return new RemoveCounterSourceEffect(CounterType.CHARGE.createInstance()).apply(game, source); + } + } + return false; + } +} \ No newline at end of file From 851ff6672109f22d4ceeb789647125c847ee9fb5 Mon Sep 17 00:00:00 2001 From: Andy Fries Date: Sun, 9 Aug 2015 10:12:09 -0700 Subject: [PATCH 315/375] implemented Political Trickery --- .../mage/sets/mirage/PoliticalTrickery.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java diff --git a/Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java b/Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java new file mode 100644 index 00000000000..75727938267 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java @@ -0,0 +1,79 @@ +/* + * 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.mirage; + +import java.util.UUID; + +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author andyfries + */ +public class PoliticalTrickery extends CardImpl { + + private static final String rule = "exchange control of target land you control and target land an opponent controls"; + + private static final FilterLandPermanent filter = new FilterLandPermanent("land an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public PoliticalTrickery(UUID ownerId) { + super(ownerId, 81, "Political Trickery", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{U}"); + this.expansionSetCode = "MIR"; + + // Exchange control of target land you control and target land an opponent controls. + Effect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, rule, false, true); + effect.setText("exchange control of target land you control and target land an opponent controls"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + public PoliticalTrickery(final PoliticalTrickery card) { + super(card); + } + + @Override + public PoliticalTrickery copy() { + return new PoliticalTrickery(this); + } +} From 54c1e4f66c7bece6a4d2d142b1bed2b0c850fa32 Mon Sep 17 00:00:00 2001 From: Gerhardt Schulle Date: Sun, 9 Aug 2015 21:35:49 +0200 Subject: [PATCH 316/375] Add option to log draft picks into a file for post review after the game. --- .../mage/client/dialog/PreferencesDialog.form | 37 +++-- .../mage/client/dialog/PreferencesDialog.java | 37 ++++- .../java/mage/client/draft/DraftPanel.java | 133 ++++++++++++++++++ 3 files changed, 190 insertions(+), 17 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form index e35b22b89bd..afaf19627ed 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form @@ -82,7 +82,7 @@ - + @@ -159,7 +159,7 @@ - +
@@ -173,7 +173,7 @@ - + @@ -333,16 +333,23 @@ - + - + + + + - + + + + + @@ -357,6 +364,16 @@ + + + + + + + + + + @@ -512,7 +529,7 @@ - + @@ -1155,7 +1172,7 @@ - + @@ -1606,7 +1623,7 @@ - + @@ -1819,7 +1836,7 @@ - + diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index bd764f48ce6..ec880ce8f42 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -91,6 +91,7 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER = "gameAskMoveToGraveORder"; public static final String KEY_GAME_LOG_AUTO_SAVE = "gameLogAutoSave"; + public static final String KEY_DRAFT_LOG_AUTO_SAVE = "draftLogAutoSave"; public static final String KEY_CARD_IMAGES_USE_DEFAULT = "cardImagesUseDefault"; public static final String KEY_CARD_IMAGES_PATH = "cardImagesPath"; @@ -362,6 +363,7 @@ public class PreferencesDialog extends javax.swing.JDialog { cbAskMoveToGraveOrder = new javax.swing.JCheckBox(); main_gamelog = new javax.swing.JPanel(); cbGameLogAutoSave = new javax.swing.JCheckBox(); + cbDraftLogAutoSave = new javax.swing.JCheckBox(); tabPhases = new javax.swing.JPanel(); jLabelHeadLine = new javax.swing.JLabel(); jLabelYourTurn = new javax.swing.JLabel(); @@ -643,18 +645,32 @@ public class PreferencesDialog extends javax.swing.JDialog { } }); + cbDraftLogAutoSave.setSelected(true); + cbDraftLogAutoSave.setText("Auto save draft logs (to \"../Mage.Client/gamelogs/\" directory)"); + cbDraftLogAutoSave.setToolTipText("The logs of all your games will be saved to the mentioned folder if this option is switched on."); + cbDraftLogAutoSave.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbDraftLogAutoSaveActionPerformed(evt); + } + }); + javax.swing.GroupLayout main_gamelogLayout = new javax.swing.GroupLayout(main_gamelog); main_gamelog.setLayout(main_gamelogLayout); main_gamelogLayout.setHorizontalGroup( main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(main_gamelogLayout.createSequentialGroup() .addContainerGap() - .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(cbDraftLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); main_gamelogLayout.setVerticalGroup( main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(main_gamelogLayout.createSequentialGroup() + .addComponent(cbGameLogAutoSave) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cbDraftLogAutoSave)) ); javax.swing.GroupLayout tabMainLayout = new javax.swing.GroupLayout(tabMain); @@ -675,7 +691,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addContainerGap() .addComponent(main_card, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, 189, Short.MAX_VALUE) + .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) @@ -861,7 +877,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addComponent(checkBoxEndTurnOthers)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(phases_stopSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(13, Short.MAX_VALUE)) + .addContainerGap(45, Short.MAX_VALUE)) ); tabsPanel.addTab("Phases", tabPhases); @@ -1435,7 +1451,7 @@ public class PreferencesDialog extends javax.swing.JDialog { ); tabAvatarsLayout.setVerticalGroup( tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 359, Short.MAX_VALUE) + .addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 432, Short.MAX_VALUE) ); tabsPanel.addTab("Avatars", tabAvatars); @@ -1585,7 +1601,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addGroup(connection_serversLayout.createSequentialGroup() .addGroup(connection_serversLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(lblURLServerList, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(txtURLServerList, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(txtURLServerList, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel17)) ); @@ -1617,7 +1633,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(pnlProxySettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(54, Short.MAX_VALUE)) + .addContainerGap(90, Short.MAX_VALUE)) ); pnlProxySettings.getAccessibleContext().setAccessibleDescription(""); @@ -1681,6 +1697,7 @@ public class PreferencesDialog extends javax.swing.JDialog { save(prefs, dialog.cbConfirmEmptyManaPool, KEY_GAME_CONFIRM_EMPTY_MANA_POOL, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.cbAskMoveToGraveOrder, KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY); + save(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY); // Phases save(prefs, dialog.checkBoxUpkeepYou, UPKEEP_YOU); @@ -2001,6 +2018,10 @@ public class PreferencesDialog extends javax.swing.JDialog { // TODO add your handling code here: }//GEN-LAST:event_cbAskMoveToGraveOrderActionPerformed + private void cbDraftLogAutoSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDraftLogAutoSaveActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_cbDraftLogAutoSaveActionPerformed + private void showProxySettings() { if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) { this.pnlProxy.setVisible(true); @@ -2079,6 +2100,7 @@ public class PreferencesDialog extends javax.swing.JDialog { load(prefs, dialog.cbAskMoveToGraveOrder, KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true"); load(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true"); + load(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true"); load(prefs, dialog.checkBoxUpkeepYou, UPKEEP_YOU, "on", "on"); load(prefs, dialog.checkBoxDrawYou, DRAW_YOU, "on", "on"); @@ -2449,6 +2471,7 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JCheckBox cbAskMoveToGraveOrder; private javax.swing.JCheckBox cbCheckForNewImages; private javax.swing.JCheckBox cbConfirmEmptyManaPool; + private javax.swing.JCheckBox cbDraftLogAutoSave; private javax.swing.JCheckBox cbEnableBattlefieldBGM; private javax.swing.JCheckBox cbEnableDraftSounds; private javax.swing.JCheckBox cbEnableGameSounds; diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java index da4ea2b4255..99645ecaedd 100644 --- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java +++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java @@ -41,10 +41,21 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; import java.util.HashSet; +import java.util.LinkedList; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JComponent; @@ -53,9 +64,12 @@ import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.KeyStroke; import javax.swing.Timer; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; import mage.client.MageFrame; import mage.client.components.tray.MageTray; import mage.client.deckeditor.SortSettingDraft; +import mage.client.dialog.PreferencesDialog; import mage.client.plugins.impl.Plugins; import mage.client.util.CardsViewUtil; import mage.client.util.Event; @@ -94,6 +108,19 @@ public class DraftPanel extends javax.swing.JPanel { // id of card with popup menu protected UUID cardIdPopupMenu; + // Filename for the draft log (only updated if writing the log). + private String logFilename; + + // Number of the current booster (for draft log writing). + private int packNo; + + // Number of the current card pick (for draft log writing). + private int pickNo; + + // Cached booster data to be written into the log (see logLastPick). + private String currentBoosterHeader; + private String[] currentBooster; + private static final CardsView emptyView = new CardsView(); /** Creates new form DraftPanel */ @@ -149,6 +176,20 @@ public class DraftPanel extends javax.swing.JPanel { if (!session.joinDraft(draftId)) { hideDraft(); } + + if (isLogging()) { + // If we are logging the draft create a file that will contain + // the log. + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); + logFilename = "Draft_" + sdf.format(new Date()) + "_" + draftId + ".txt"; + try { + Files.write(pathToDraftLog(), "".getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + } catch (IOException ex) { + Logger.getLogger(DraftPanel.class.getName()).log(Level.SEVERE, null, ex); + } + } else { + logFilename = null; + } } public void updateDraft(DraftView draftView) { @@ -167,6 +208,9 @@ public class DraftPanel extends javax.swing.JPanel { this.chkPack3.setSelected(draftView.getBoosterNum() > 2); this.txtCardNo.setText(Integer.toString(draftView.getCardNum())); + packNo = draftView.getBoosterNum(); + pickNo = draftView.getCardNum(); + int right = draftView.getPlayers().size() / 2; int left = draftView.getPlayers().size() - right; int height = left * 18; @@ -247,6 +291,7 @@ public class DraftPanel extends javax.swing.JPanel { } public void loadBooster(DraftPickView draftPickView) { + logLastPick(draftPickView); // upper area that shows the picks loadCardsToPickedCardsArea(draftPickView.getPicks()); @@ -413,6 +458,94 @@ public class DraftPanel extends javax.swing.JPanel { draftPicks.loadCards(CardsViewUtil.convertSimple(pickedCardsShown), bigCard, null); } + // Log the last card picked into the draft log together with booster + // contents. + // We don't get any event when the card is selected due to timeout + // that's why instead of proactively logging our pick we instead + // log *last* pick from the list of picks. + // To make this possible we cache the list of cards from the + // previous booster and it's sequence number (pack number / pick number) + // in fields currentBooster and currentBoosterHeader. + private void logLastPick(DraftPickView pickView) { + if (!isLogging()) { + return; + } + if (currentBooster != null) { + String lastPick = getCardName(getLastPick(pickView.getPicks().values())); + if (lastPick != null) { + logPick(lastPick); + } + currentBooster = null; + } + setCurrentBoosterForLog(pickView.getBooster()); + if (currentBooster.length == 1) { + logPick(currentBooster[0]); + } + } + + private static boolean isLogging() { + String autoSave = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_DRAFT_LOG_AUTO_SAVE, "true"); + return autoSave.equals("true"); + } + + private void setCurrentBoosterForLog(SimpleCardsView booster) { + LinkedList cards = new LinkedList<>(); + for (SimpleCardView simple: booster.values()) { + String cardName = getCardName(simple); + if (cardName != null) { + cards.add(cardName); + } + } + + currentBoosterHeader = "Pack " + packNo + " pick " + pickNo + ":\n"; + currentBooster = cards.toArray(new String[cards.size()]); + } + + private void logPick(String pick) { + StringBuilder b = new StringBuilder(); + b.append(currentBoosterHeader); + for (String name : currentBooster) { + b.append(pick.equals(name) ? "--> " : " "); + b.append(name); + b.append('\n'); + } + b.append('\n'); + appendToDraftLog(b.toString()); + } + + private Path pathToDraftLog() { + File saveDir = new File("gamelogs"); + if(!saveDir.exists()) { + saveDir.mkdirs(); + } + return new File(saveDir, logFilename).toPath(); + } + + private void appendToDraftLog(String data) { + try { + Files.write(pathToDraftLog(), data.getBytes(), StandardOpenOption.APPEND); + } catch (IOException ex) { + Logger.getLogger(DraftPanel.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private static SimpleCardView getLastPick(Collection picks) { + SimpleCardView last = null; + for (SimpleCardView pick : picks) { + last = pick; + } + return last; + } + + private static String getCardName(SimpleCardView card) { + if (card == null) { + return null; + } + CardInfo cardInfo = CardRepository.instance.findCard(card.getExpansionSetCode(), card.getCardNumber()); + return cardInfo != null ? cardInfo.getName() : null; + } + + /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is From 90c2ce6b2ef7f6920956d19c2b2cc3bb5e1e4615 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sun, 9 Aug 2015 22:29:36 -0500 Subject: [PATCH 317/375] Added Bite of the Black Rose, Cackling Witch, and Orim's Touch. Added Serra Angel and Tariel, Reckoner of Souls FTV: Angels reprints. Removed unused imports on Voidmage Husher. --- .../src/mage/deck/HistoricalStandard.java | 2 +- .../src/mage/deck/SuperStandard.java | 2 +- .../sets/conspiracy/BiteOfTheBlackRose.java | 114 ++++++++++++++++++ .../src/mage/sets/ftvangels/SerraAngel.java | 54 +++++++++ .../sets/ftvangels/TarielReckonerOfSouls.java | 52 ++++++++ .../src/mage/sets/gatecrash/DyingWish.java | 48 +++++++- .../src/mage/sets/invasion/OrimsTouch.java | 74 ++++++++++++ .../sets/mediainserts/VoidmageHusher.java | 77 ++++++++++++ .../sets/mercadianmasques/CacklingWitch.java | 80 ++++++++++++ .../mage/sets/mirage/PoliticalTrickery.java | 79 ++++++++++++ .../src/mage/sets/morningtide/VioletPall.java | 19 ++- .../mage/sets/planeshift/PollenRemedy.java | 2 +- .../mage/sets/timespiral/VoidmageHusher.java | 54 +++++++++ .../mage/sets/urzassaga/LiltingRefrain.java | 4 +- Mage/src/mage/counters/CounterType.java | 8 +- Utils/mtg-cards-data.txt | 2 + 16 files changed, 658 insertions(+), 13 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/conspiracy/BiteOfTheBlackRose.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/SerraAngel.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/TarielReckonerOfSouls.java create mode 100644 Mage.Sets/src/mage/sets/invasion/OrimsTouch.java create mode 100644 Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/CacklingWitch.java create mode 100644 Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.java diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java index 38c577f35ad..9fef3463b57 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java @@ -85,7 +85,7 @@ public class HistoricalStandard extends Constructed { * done in the overridden validate function. */ public HistoricalStandard() { - super("Variant Magic - Historical Standard"); + super("Constructed - Historical Standard"); // banned cards banned.add("Balance"); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java index f1fa0b0fa50..4eb4d5c4e8a 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java @@ -61,7 +61,7 @@ public class SuperStandard extends Constructed { * done in the overridden validate function. */ public SuperStandard() { - super("Variant Magic - Super Standard"); + super("Constructed - Super Standard"); banned.add("Ancient Den"); banned.add("Disciple of the Vault"); diff --git a/Mage.Sets/src/mage/sets/conspiracy/BiteOfTheBlackRose.java b/Mage.Sets/src/mage/sets/conspiracy/BiteOfTheBlackRose.java new file mode 100644 index 00000000000..d8f9840867e --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/BiteOfTheBlackRose.java @@ -0,0 +1,114 @@ +/* + * 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.conspiracy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostOpponentsEffect; +import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class BiteOfTheBlackRose extends CardImpl { + + public BiteOfTheBlackRose(UUID ownerId) { + super(ownerId, 26, "Bite of the Black Rose", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{B}"); + this.expansionSetCode = "CNS"; + + // Will of the council - Starting with you, each player votes for sickness or psychosis. If sickness gets more votes, creatures your opponents control get -2/-2 until end of turn. If psychosis gets more votes or the vote is tied, each opponent discards two cards. + this.getSpellAbility().addEffect(new BiteOfTheBlackRoseEffect()); + } + + public BiteOfTheBlackRose(final BiteOfTheBlackRose card) { + super(card); + } + + @Override + public BiteOfTheBlackRose copy() { + return new BiteOfTheBlackRose(this); + } +} + +class BiteOfTheBlackRoseEffect extends OneShotEffect { + + BiteOfTheBlackRoseEffect() { + super(Outcome.Benefit); + this.staticText = "Will of the council - Starting with you, each player votes for sickness or psychosis. If sickness gets more votes, creatures your opponents control get -2/-2 until end of turn. If psychosis gets more votes or the vote is tied, each opponent discards two cards"; + } + + BiteOfTheBlackRoseEffect(final BiteOfTheBlackRoseEffect effect) { + super(effect); + } + + @Override + public BiteOfTheBlackRoseEffect copy() { + return new BiteOfTheBlackRoseEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int sicknessCount = 0; + int psychosisCount = 0; + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + if (player.chooseUse(Outcome.ExtraTurn, "Choose sickness?", source, game)) { + sicknessCount++; + game.informPlayers(player.getLogName() + " has chosen: sickness"); + } else { + psychosisCount++; + game.informPlayers(player.getLogName() + " has chosen: psychosis"); + } + } + } + if (sicknessCount > psychosisCount) { + ContinuousEffect effect = new BoostOpponentsEffect(-2, -2, Duration.EndOfTurn); + game.addEffect(effect, source); + } else { + new DiscardEachPlayerEffect(new StaticValue(2), false, TargetController.OPPONENT).apply(game, source); + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ftvangels/SerraAngel.java b/Mage.Sets/src/mage/sets/ftvangels/SerraAngel.java new file mode 100644 index 00000000000..f9db2c50cc4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/SerraAngel.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.ftvangels; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class SerraAngel extends mage.sets.tenthedition.SerraAngel { + + public SerraAngel(UUID ownerId) { + super(ownerId); + this.cardNumber = 14; + this.expansionSetCode = "V15"; + this.rarity = Rarity.MYTHIC; + } + + public SerraAngel(final SerraAngel card) { + super(card); + } + + @Override + public SerraAngel copy() { + return new SerraAngel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/TarielReckonerOfSouls.java b/Mage.Sets/src/mage/sets/ftvangels/TarielReckonerOfSouls.java new file mode 100644 index 00000000000..e63b716a94e --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/TarielReckonerOfSouls.java @@ -0,0 +1,52 @@ +/* + * 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.ftvangels; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class TarielReckonerOfSouls extends mage.sets.commander.TarielReckonerOfSouls { + + public TarielReckonerOfSouls(UUID ownerId) { + super(ownerId); + this.cardNumber = 15; + this.expansionSetCode = "V15"; + } + + public TarielReckonerOfSouls(final TarielReckonerOfSouls card) { + super(card); + } + + @Override + public TarielReckonerOfSouls copy() { + return new TarielReckonerOfSouls(this); + } +} diff --git a/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java b/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java index 772d3a72ad9..6b98ffc389e 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java +++ b/Mage.Sets/src/mage/sets/gatecrash/DyingWish.java @@ -28,17 +28,21 @@ package mage.sets.gatecrash; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.target.common.TargetControlledCreaturePermanent; @@ -62,9 +66,8 @@ public class DyingWish extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - // When enchanted creature dies, target player loses X life and you gain X life, where X is its power. - DynamicValue attachedPower = new AttachedPermanentPowerCount(); + DynamicValue attachedPower = new DyingWishAttachedPermanentPowerCount(); ability = new DiesAttachedTriggeredAbility(new LoseLifeTargetEffect(attachedPower), "enchanted creature"); ability.addEffect(new GainLifeEffect(attachedPower)); ability.addTarget(new TargetPlayer()); @@ -80,3 +83,38 @@ public class DyingWish extends CardImpl { return new DyingWish(this); } } + +class DyingWishAttachedPermanentPowerCount implements DynamicValue { + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + Permanent attachmentPermanent = game.getPermanent(sourceAbility.getSourceId()); + if (attachmentPermanent == null) { + attachmentPermanent = (Permanent) game.getLastKnownInformation(sourceAbility.getSourceId(), Zone.BATTLEFIELD, sourceAbility.getSourceObjectZoneChangeCounter()); + } + if (attachmentPermanent != null && attachmentPermanent.getAttachedTo() != null) { + if (effect.getValue("attachedTo") != null) { + Permanent attached = (Permanent) effect.getValue("attachedTo"); + if (attached != null) { + return attached.getPower().getValue(); + } + } + } + return 0; + } + + @Override + public DynamicValue copy() { + return new DyingWishAttachedPermanentPowerCount(); + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return "its power"; + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/OrimsTouch.java b/Mage.Sets/src/mage/sets/invasion/OrimsTouch.java new file mode 100644 index 00000000000..bec89d9ae44 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/OrimsTouch.java @@ -0,0 +1,74 @@ +/* + * 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.invasion; + +import java.util.UUID; +import mage.abilities.condition.LockedInCondition; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalReplacementEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class OrimsTouch extends CardImpl { + + public OrimsTouch(UUID ownerId) { + super(ownerId, 23, "Orim's Touch", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}"); + this.expansionSetCode = "INV"; + + // Kicker {1} + this.addAbility(new KickerAbility("{1}")); + + // Prevent the next 2 damage that would be dealt to target creature or player this turn. If Orim's Touch was kicked, prevent the next 4 damage that would be dealt to that creature or player this turn instead. + Effect effect = new ConditionalReplacementEffect( + new PreventDamageToTargetEffect(Duration.EndOfTurn, 4), + new LockedInCondition(KickedCondition.getInstance()), + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2)); + effect.setText("Prevent the next 2 damage that would be dealt to target creature or player this turn. If Orim's Touch was kicked, prevent the next 4 damage that would be dealt to that creature or player this turn instead"); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + this.getSpellAbility().addEffect(effect); + } + + public OrimsTouch(final OrimsTouch card) { + super(card); + } + + @Override + public OrimsTouch copy() { + return new OrimsTouch(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java b/Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java new file mode 100644 index 00000000000..a6ec8c9bc4b --- /dev/null +++ b/Mage.Sets/src/mage/sets/mediainserts/VoidmageHusher.java @@ -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.mediainserts; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetActivatedAbility; + +/** + * + * @author andyfries + */ +public class VoidmageHusher extends CardImpl { + + public VoidmageHusher(UUID ownerId) { + super(ownerId, 62, "Voidmage Husher", Rarity.SPECIAL, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "MBP"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // When Voidmage Husher enters the battlefield, counter target activated ability. + Ability ability = new EntersBattlefieldTriggeredAbility(new CounterTargetEffect()); + ability.addTarget(new TargetActivatedAbility()); + this.addAbility(ability); + + // Whenever you cast a spell, you may return Voidmage Husher to its owner's hand. + this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), true)); + } + + public VoidmageHusher(final VoidmageHusher card) { + super(card); + } + + @Override + public VoidmageHusher copy() { + return new VoidmageHusher(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/CacklingWitch.java b/Mage.Sets/src/mage/sets/mercadianmasques/CacklingWitch.java new file mode 100644 index 00000000000..93bc1c8ca47 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/CacklingWitch.java @@ -0,0 +1,80 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CacklingWitch extends CardImpl { + + public CacklingWitch(UUID ownerId) { + super(ownerId, 119, "Cackling Witch", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {X}{B}, {tap}, Discard a card: Target creature gets +X/+0 until end of turn. + ManacostVariableValue manaX = new ManacostVariableValue(); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BoostTargetEffect(manaX, new StaticValue(0), Duration.EndOfTurn), + new ManaCostsImpl("{X}{B}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public CacklingWitch(final CacklingWitch card) { + super(card); + } + + @Override + public CacklingWitch copy() { + return new CacklingWitch(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java b/Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java new file mode 100644 index 00000000000..75727938267 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/PoliticalTrickery.java @@ -0,0 +1,79 @@ +/* + * 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.mirage; + +import java.util.UUID; + +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author andyfries + */ +public class PoliticalTrickery extends CardImpl { + + private static final String rule = "exchange control of target land you control and target land an opponent controls"; + + private static final FilterLandPermanent filter = new FilterLandPermanent("land an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public PoliticalTrickery(UUID ownerId) { + super(ownerId, 81, "Political Trickery", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{U}"); + this.expansionSetCode = "MIR"; + + // Exchange control of target land you control and target land an opponent controls. + Effect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, rule, false, true); + effect.setText("exchange control of target land you control and target land an opponent controls"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + public PoliticalTrickery(final PoliticalTrickery card) { + super(card); + } + + @Override + public PoliticalTrickery copy() { + return new PoliticalTrickery(this); + } +} diff --git a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java index 228a57579be..7b760e28e44 100644 --- a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java +++ b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java @@ -28,15 +28,18 @@ package mage.sets.morningtide; import java.util.UUID; +import mage.MageInt; import mage.constants.CardType; import mage.constants.Rarity; import mage.ObjectColor; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; /** @@ -58,7 +61,7 @@ public class VioletPall extends CardImpl { this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - this.getSpellAbility().addEffect(new CreateTokenEffect(new FaerieToken(), 1)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new VioletPallFaerieToken(), 1)); } public VioletPall(final VioletPall card) { @@ -70,3 +73,17 @@ public class VioletPall extends CardImpl { return new VioletPall(this); } } + +class VioletPallFaerieToken extends Token { + + VioletPallFaerieToken() { + super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add("Faerie"); + subtype.add("Rogue"); + power = new MageInt(1); + toughness = new MageInt(1); + this.addAbility(FlyingAbility.getInstance()); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/PollenRemedy.java b/Mage.Sets/src/mage/sets/planeshift/PollenRemedy.java index 7e3d7d8b1b7..dd294e5e17c 100644 --- a/Mage.Sets/src/mage/sets/planeshift/PollenRemedy.java +++ b/Mage.Sets/src/mage/sets/planeshift/PollenRemedy.java @@ -41,8 +41,8 @@ import mage.constants.Duration; import mage.constants.Rarity; import mage.filter.common.FilterControlledLandPermanent; import mage.game.Game; -import mage.target.common.TargetCreatureOrPlayerAmount; import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreatureOrPlayerAmount; /** * diff --git a/Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.java b/Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.java new file mode 100644 index 00000000000..f74b44b3dcb --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/VoidmageHusher.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.timespiral; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author andyfries + */ +public class VoidmageHusher extends mage.sets.mediainserts.VoidmageHusher { + + public VoidmageHusher(UUID ownerId) { + super(ownerId); + this.cardNumber = 92; + this.expansionSetCode = "TSP"; + this.rarity = Rarity.UNCOMMON; + } + + public VoidmageHusher(final VoidmageHusher card) { + super(card); + } + + @Override + public VoidmageHusher copy() { + return new VoidmageHusher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java b/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java index cf8cf62f232..e4cfe2d3823 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java +++ b/Mage.Sets/src/mage/sets/urzassaga/LiltingRefrain.java @@ -55,7 +55,7 @@ public class LiltingRefrain extends CardImpl { // At the beginning of your upkeep, you may put a verse counter on Lilting Refrain. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.VERSE.createInstance()), TargetController.YOU, true)); - + // Sacrifice Lilting Refrain: Counter target spell unless its controller pays {X}, where X is the number of verse counters on Lilting Refrain. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new CountersCount(CounterType.VERSE)), new SacrificeSourceCost()); ability.addTarget(new TargetSpell()); @@ -70,4 +70,4 @@ public class LiltingRefrain extends CardImpl { public LiltingRefrain copy() { return new LiltingRefrain(this); } -} \ No newline at end of file +} diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java index 2f0aa49ad8d..4fa55678416 100644 --- a/Mage/src/mage/counters/CounterType.java +++ b/Mage/src/mage/counters/CounterType.java @@ -34,6 +34,7 @@ package mage.counters; * @author nantuko */ public enum CounterType { + AGE("age"), AIM("aim"), ARROWHEAD("arrowhead"), @@ -76,6 +77,7 @@ public enum CounterType { POISON("poison"), PRESSURE("pressure"), QUEST("quest"), + SHIELD("shield"), SLIME("slime"), SPORE("spore"), STORAGE("storage"), @@ -84,6 +86,7 @@ public enum CounterType { TIME("time"), TOWER("tower"), VELOCITY("velocity"), + VERSE("verse"), VILE("vile"), WISH("wish"); @@ -112,7 +115,8 @@ public enum CounterType { } /** - * Create instance of counter type with defined amount of counters of the given type. + * Create instance of counter type with defined amount of counters of the + * given type. * * @param amount amount of counters of the given type. * @return @@ -129,4 +133,4 @@ public enum CounterType { return new Counter(name, amount); } } -} \ No newline at end of file +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index e6fcd5d3cb4..9c5ddb74ea1 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -27237,5 +27237,7 @@ Akroma, Angel of Fury|From the Vault: Angels|1|M|{5}{R}{R}{R}|Legendary Creature Akroma, Angel of Wrath|From the Vault: Angels|2|M|{5}{W}{W}{W}|Legendary Creature - Angel|6|6|Flying, first strike, vigilance, trample, haste, protection from black and from red| Avacyn, Angel of Hope|From the Vault: Angels|5|M|{5}{W}{W}{W}|Legendary Creature - Angel|8|8|Flying, vigilance$Avacyn, Angel of Hope and other permanents you control are indestructible.| Iona, Shield of Emeria|From the Vault: Angels|9|M|{6}{W}{W}{W}|Legendary Creature - Angel|7|7|Flying$As Iona, Shield of Emeria enters the battlefield, choose a color.$Your opponents can't cast spells of the chosen color.| +Serra Angel|From the Vault: Angels|14|M|{3}{W}{W}|Creature - Angel|4|4|Flying$Vigilance (Attacking doesn't cause this creature to tap.)| +Tariel, Reckoner of Souls|From the Vault: Angels|15|M|{4}{W}{B}{R}|Legendary Creature - Angel|4|7|Flying, vigilance${tap}: Choose a creature card at random from target opponent's graveyard. Put that card onto the battlefield under your control.| Oblivion Sower|Battle for Zendikar|999|M|{6}|Creature - Eldrazi|5|8|When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.| Evolving Wilds|Battle for Zendikar|236|C||Land|||{T}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library.| \ No newline at end of file From dd6f0f86a00fc25e79e431993630876cc42d1168 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sun, 9 Aug 2015 23:46:17 -0500 Subject: [PATCH 318/375] Added Furnace Dragon. Fixed duplicate verse type in CounterType. --- .../mage/sets/darksteel/FurnaceDragon.java | 107 ++++++++++++++++++ Mage/src/mage/counters/CounterType.java | 1 - 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/sets/darksteel/FurnaceDragon.java diff --git a/Mage.Sets/src/mage/sets/darksteel/FurnaceDragon.java b/Mage.Sets/src/mage/sets/darksteel/FurnaceDragon.java new file mode 100644 index 00000000000..8c7f749d57b --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/FurnaceDragon.java @@ -0,0 +1,107 @@ +/* + * 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.darksteel; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.ExileAllEffect; +import mage.abilities.keyword.AffinityForArtifactsAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; +import mage.watchers.common.CastFromHandWatcher; + +/** + * + * @author fireshoes + */ +public class FurnaceDragon extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifacts"); + + static { + filter.add(new CardTypePredicate(CardType.ARTIFACT)); + } + + public FurnaceDragon(UUID ownerId) { + super(ownerId, 62, "Furnace Dragon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{R}{R}{R}"); + this.expansionSetCode = "DST"; + this.subtype.add("Dragon"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Affinity for artifacts + this.addAbility(new AffinityForArtifactsAbility()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Furnace Dragon enters the battlefield, if you cast it from your hand, exile all artifacts. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(new ExileAllEffect(filter), new FurnaceDragonCondition()), false), new CastFromHandWatcher()); + } + + public FurnaceDragon(final FurnaceDragon card) { + super(card); + } + + @Override + public FurnaceDragon copy() { + return new FurnaceDragon(this); + } +} + +class FurnaceDragonCondition implements Condition { + + @Override + public boolean apply(Game game, Ability source) { + boolean applies = false; + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + Watcher watcher = game.getState().getWatchers().get("CastFromHand", source.getSourceId()); + if (watcher != null && watcher.conditionMet()) { + applies = true; + } + } + return applies; + } + + @Override + public String toString() { + return "you cast it from your hand"; + } +} diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java index 68007555633..b41502df694 100644 --- a/Mage/src/mage/counters/CounterType.java +++ b/Mage/src/mage/counters/CounterType.java @@ -87,7 +87,6 @@ public enum CounterType { VELOCITY("velocity"), VERSE("verse"), VILE("vile"), - VERSE("verse"), WISH("wish"); private final String name; From 01fcd508d80dbfe6a1f8e4f9d22ba9fc316c7fcd Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 10 Aug 2015 09:52:57 +0300 Subject: [PATCH 319/375] Remove excess text about adding counters from cards with vanishing --- .../src/mage/sets/futuresight/SoultetherGolem.java | 9 ++++++--- .../src/mage/sets/planarchaos/AvenRiftwatcher.java | 5 ++++- Mage.Sets/src/mage/sets/planarchaos/Calciderm.java | 9 ++++++--- Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java | 6 ++++-- .../src/mage/sets/planarchaos/KeldonMarauders.java | 12 +++++++----- .../src/mage/sets/planarchaos/LavacoreElemental.java | 7 +++++-- Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java | 4 +++- 7 files changed, 35 insertions(+), 17 deletions(-) diff --git a/Mage.Sets/src/mage/sets/futuresight/SoultetherGolem.java b/Mage.Sets/src/mage/sets/futuresight/SoultetherGolem.java index ca9d9e48c6f..5fb3ab962c1 100644 --- a/Mage.Sets/src/mage/sets/futuresight/SoultetherGolem.java +++ b/Mage.Sets/src/mage/sets/futuresight/SoultetherGolem.java @@ -29,6 +29,7 @@ package mage.sets.futuresight; import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -49,7 +50,7 @@ import mage.filter.predicate.permanent.ControllerPredicate; * @author fireshoes */ public class SoultetherGolem extends CardImpl { - + private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature"); static { @@ -65,10 +66,12 @@ public class SoultetherGolem extends CardImpl { this.toughness = new MageInt(3); // Vanishing 1 - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(1)))); + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(1))); + ability.setRuleVisible(false); + this.addAbility(ability); this.addAbility(new VanishingUpkeepAbility(1)); this.addAbility(new VanishingSacrificeAbility()); - + // Whenever another creature enters the battlefield under your control, put a time counter on Soultether Golem. this.addAbility(new EntersBattlefieldAllTriggeredAbility( Zone.BATTLEFIELD, diff --git a/Mage.Sets/src/mage/sets/planarchaos/AvenRiftwatcher.java b/Mage.Sets/src/mage/sets/planarchaos/AvenRiftwatcher.java index 8cf27f15ec2..4da27ce5740 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/AvenRiftwatcher.java +++ b/Mage.Sets/src/mage/sets/planarchaos/AvenRiftwatcher.java @@ -29,6 +29,7 @@ package mage.sets.planarchaos; import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersOrLeavesTheBattlefieldSourceTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; @@ -60,7 +61,9 @@ public class AvenRiftwatcher extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Vanishing 3 - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3)))); + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); + ability.setRuleVisible(false); + this.addAbility(ability); this.addAbility(new VanishingUpkeepAbility(3)); this.addAbility(new VanishingSacrificeAbility()); diff --git a/Mage.Sets/src/mage/sets/planarchaos/Calciderm.java b/Mage.Sets/src/mage/sets/planarchaos/Calciderm.java index 39865b67a5d..3bc5e170170 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/Calciderm.java +++ b/Mage.Sets/src/mage/sets/planarchaos/Calciderm.java @@ -28,15 +28,16 @@ package mage.sets.planarchaos; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.ShroudAbility; import mage.abilities.keyword.VanishingSacrificeAbility; import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.counters.CounterType; /** @@ -56,7 +57,9 @@ public class Calciderm extends CardImpl { // Shroud this.addAbility(ShroudAbility.getInstance()); // Vanishing 4 - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(4)))); + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(4))); + ability.setRuleVisible(false); + this.addAbility(ability); this.addAbility(new VanishingUpkeepAbility(4)); this.addAbility(new VanishingSacrificeAbility()); } diff --git a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java index a97add2ef48..ce30729322c 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java +++ b/Mage.Sets/src/mage/sets/planarchaos/Chronozoa.java @@ -28,8 +28,8 @@ package mage.sets.planarchaos; import java.util.UUID; - import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.LastTimeCounterRemovedCondition; @@ -64,7 +64,9 @@ public class Chronozoa extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Vanishing 3 - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(timeCounters)))); + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(timeCounters))); + ability.setRuleVisible(false); + this.addAbility(ability); this.addAbility(new VanishingUpkeepAbility(timeCounters)); this.addAbility(new VanishingSacrificeAbility()); // When Chronozoa is put into a graveyard from play, if it had no time counters on it, put two tokens into play that are copies of it. diff --git a/Mage.Sets/src/mage/sets/planarchaos/KeldonMarauders.java b/Mage.Sets/src/mage/sets/planarchaos/KeldonMarauders.java index d342e0f28d2..952005b8c69 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/KeldonMarauders.java +++ b/Mage.Sets/src/mage/sets/planarchaos/KeldonMarauders.java @@ -28,8 +28,6 @@ package mage.sets.planarchaos; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; @@ -39,6 +37,8 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.VanishingSacrificeAbility; import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.counters.CounterType; import mage.target.TargetPlayer; @@ -58,12 +58,14 @@ public class KeldonMarauders extends CardImpl { this.toughness = new MageInt(3); // Vanishing 2 - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2)))); + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))); + ability.setRuleVisible(false); + this.addAbility(ability); this.addAbility(new VanishingUpkeepAbility(2)); this.addAbility(new VanishingSacrificeAbility()); - + // When Keldon Marauders enters the battlefield or leaves the battlefield, it deals 1 damage to target player. - Ability ability = new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(new DamageTargetEffect(1), false); + ability = new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(new DamageTargetEffect(1), false); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/planarchaos/LavacoreElemental.java b/Mage.Sets/src/mage/sets/planarchaos/LavacoreElemental.java index c7ffdca38be..972e529d883 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/LavacoreElemental.java +++ b/Mage.Sets/src/mage/sets/planarchaos/LavacoreElemental.java @@ -29,6 +29,7 @@ package mage.sets.planarchaos; import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.effects.Effect; @@ -56,10 +57,12 @@ public class LavacoreElemental extends CardImpl { this.toughness = new MageInt(3); // Vanishing 1 - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(1)))); + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(1))); + ability.setRuleVisible(false); + this.addAbility(ability); this.addAbility(new VanishingUpkeepAbility(1)); this.addAbility(new VanishingSacrificeAbility()); - + // Whenever a creature you control deals combat damage to a player, put a time counter on Lavacore Elemental. Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(1)); effect.setText("put a time counter on {this}"); diff --git a/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java index 4357565e296..425d94127d0 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java +++ b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java @@ -69,7 +69,9 @@ public class RealityAcid extends CardImpl { this.addAbility(ability); // Vanishing 3 - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3)))); + ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); + ability.setRuleVisible(false); + this.addAbility(ability); this.addAbility(new VanishingUpkeepAbility(3)); this.addAbility(new VanishingSacrificeAbility()); From 2c8a5e692eb8925ac4c35edbf48e7af6b6aaec57 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 10 Aug 2015 09:57:58 +0300 Subject: [PATCH 320/375] Implement cards: Braids, Conjurer Adept; Magus of the Bazaar; Malach of the Dawn; Uktabi Drake; and Waning Wurm --- .../sets/planarchaos/BraidsConjurerAdept.java | 79 +++++++++++++++++++ .../sets/planarchaos/MagusOfTheBazaar.java | 65 +++++++++++++++ .../sets/planarchaos/MalachOfTheDawn.java | 68 ++++++++++++++++ .../mage/sets/planarchaos/UktabiDrake.java | 68 ++++++++++++++++ .../src/mage/sets/planarchaos/WaningWurm.java | 72 +++++++++++++++++ .../PutPermanentOnBattlefieldEffect.java | 24 +++++- 6 files changed, 373 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/planarchaos/BraidsConjurerAdept.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/MagusOfTheBazaar.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/MalachOfTheDawn.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/UktabiDrake.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/WaningWurm.java diff --git a/Mage.Sets/src/mage/sets/planarchaos/BraidsConjurerAdept.java b/Mage.Sets/src/mage/sets/planarchaos/BraidsConjurerAdept.java new file mode 100644 index 00000000000..6938504723b --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/BraidsConjurerAdept.java @@ -0,0 +1,79 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author LoneFox + */ +public class BraidsConjurerAdept extends CardImpl { + + private static final FilterCard filter = new FilterCard("artifact, creature, or land card") +; + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public BraidsConjurerAdept(UUID ownerId) { + super(ownerId, 36, "Braids, Conjurer Adept", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + this.expansionSetCode = "PLC"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // At the beginning of each player's upkeep, that player may put an artifact, creature, or land card from his or her hand onto the battlefield. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new PutPermanentOnBattlefieldEffect(filter, true), TargetController.ANY, false)); + } + + public BraidsConjurerAdept(final BraidsConjurerAdept card) { + super(card); + } + + @Override + public BraidsConjurerAdept copy() { + return new BraidsConjurerAdept(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheBazaar.java b/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheBazaar.java new file mode 100644 index 00000000000..fa9b7eaf222 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/MagusOfTheBazaar.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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class MagusOfTheBazaar extends CardImpl { + + public MagusOfTheBazaar(UUID ownerId) { + super(ownerId, 43, "Magus of the Bazaar", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(0); + this.toughness = new MageInt(1); + + // {tap}: Draw two cards, then discard three cards. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawDiscardControllerEffect(2, 3), new TapSourceCost())); } + + public MagusOfTheBazaar(final MagusOfTheBazaar card) { + super(card); + } + + @Override + public MagusOfTheBazaar copy() { + return new MagusOfTheBazaar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/MalachOfTheDawn.java b/Mage.Sets/src/mage/sets/planarchaos/MalachOfTheDawn.java new file mode 100644 index 00000000000..6bbae42c676 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/MalachOfTheDawn.java @@ -0,0 +1,68 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class MalachOfTheDawn extends CardImpl { + + public MalachOfTheDawn(UUID ownerId) { + super(ownerId, 24, "Malach of the Dawn", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Angel"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // {W}{W}{W}: Regenerate Malach of the Dawn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{W}{W}{W}"))); + } + + public MalachOfTheDawn(final MalachOfTheDawn card) { + super(card); + } + + @Override + public MalachOfTheDawn copy() { + return new MalachOfTheDawn(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/UktabiDrake.java b/Mage.Sets/src/mage/sets/planarchaos/UktabiDrake.java new file mode 100644 index 00000000000..cd638634faf --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/UktabiDrake.java @@ -0,0 +1,68 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.EchoAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class UktabiDrake extends CardImpl { + + public UktabiDrake(UUID ownerId) { + super(ownerId, 141, "Uktabi Drake", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Drake"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Haste + this.addAbility(HasteAbility.getInstance()); + // Echo {1}{G}{G} + this.addAbility(new EchoAbility("{1}{G}{G}")); + } + + public UktabiDrake(final UktabiDrake card) { + super(card); + } + + @Override + public UktabiDrake copy() { + return new UktabiDrake(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/WaningWurm.java b/Mage.Sets/src/mage/sets/planarchaos/WaningWurm.java new file mode 100644 index 00000000000..7a37457f8dd --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/WaningWurm.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.CounterType; + +/** + * + * @author LoneFox + */ +public class WaningWurm extends CardImpl { + + public WaningWurm(UUID ownerId) { + super(ownerId, 83, "Waning Wurm", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Zombie"); + this.subtype.add("Wurm"); + this.power = new MageInt(7); + this.toughness = new MageInt(6); + + // Vanishing 2 + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))); + ability.setRuleVisible(false); + this.addAbility(ability); + this.addAbility(new VanishingUpkeepAbility(2)); + this.addAbility(new VanishingSacrificeAbility()); + } + + public WaningWurm(final WaningWurm card) { + super(card); + } + + @Override + public WaningWurm copy() { + return new WaningWurm(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java b/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java index 09a89be1956..12a208ab190 100644 --- a/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java +++ b/Mage/src/mage/abilities/effects/common/PutPermanentOnBattlefieldEffect.java @@ -18,19 +18,26 @@ import mage.target.common.TargetCardInHand; public class PutPermanentOnBattlefieldEffect extends OneShotEffect { private final FilterCard filter; + private final boolean useTargetController; public PutPermanentOnBattlefieldEffect() { - this(new FilterPermanentCard("a permanent card")); + this(new FilterPermanentCard("a permanent card"), false); } public PutPermanentOnBattlefieldEffect(FilterCard filter) { + this(filter, false); + } + + public PutPermanentOnBattlefieldEffect(FilterCard filter, boolean useTargetController) { super(Outcome.PutCardInPlay); this.filter = filter; + this.useTargetController = useTargetController; } public PutPermanentOnBattlefieldEffect(final PutPermanentOnBattlefieldEffect effect) { super(effect); this.filter = effect.filter.copy(); + this.useTargetController = effect.useTargetController; } @Override @@ -40,7 +47,13 @@ public class PutPermanentOnBattlefieldEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player player; + if(useTargetController) { + player = game.getPlayer(getTargetPointer().getFirst(game, source)); + } + else { + player = game.getPlayer(source.getControllerId()); + } String choiceText = "Put " + filter.getMessage() + " from your hand onto the battlefield?"; if (player == null || !player.chooseUse(Outcome.PutCardInPlay, choiceText, source, game)) { return false; @@ -63,6 +76,11 @@ public class PutPermanentOnBattlefieldEffect extends OneShotEffect { return staticText; } - return "you may put " + filter.getMessage() + " from your hand onto the battlefield"; + if(useTargetController) { + return "that player may put " + filter.getMessage() + " from his or her hand onto the battlefield"; + } + else { + return "you may put " + filter.getMessage() + " from your hand onto the battlefield"; + } } } From cbe49333bb99da3d3c5c15f2d100d5ab42808655 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 10 Aug 2015 09:29:44 +0200 Subject: [PATCH 321/375] * Unravel the AEther - Fixed that the target was handled not targeted. --- .../src/mage/sets/bornofthegods/UnravelTheAEther.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java b/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java index 94705d22086..fd87b5d72d8 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java @@ -53,17 +53,16 @@ public class UnravelTheAEther extends CardImpl { static { filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), - new CardTypePredicate(CardType.ENCHANTMENT))); + new CardTypePredicate(CardType.ENCHANTMENT))); } public UnravelTheAEther(UUID ownerId) { super(ownerId, 143, "Unravel the AEther", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{G}"); this.expansionSetCode = "BNG"; - // Choose target artifact or enchantment. Its owner shuffles it into his or her library. this.getSpellAbility().addEffect(new UnravelTheAEtherShuffleIntoLibraryEffect()); - Target target = new TargetPermanent(1,1,filter,true); + Target target = new TargetPermanent(1, 1, filter, false); this.getSpellAbility().addTarget(target); } @@ -76,6 +75,7 @@ public class UnravelTheAEther extends CardImpl { return new UnravelTheAEther(this); } } + class UnravelTheAEtherShuffleIntoLibraryEffect extends OneShotEffect { public UnravelTheAEtherShuffleIntoLibraryEffect() { @@ -96,7 +96,7 @@ class UnravelTheAEtherShuffleIntoLibraryEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); if (permanent != null) { - if (permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true) ) { + if (permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true)) { game.getPlayer(permanent.getOwnerId()).shuffleLibrary(game); return true; } From ea564803a2464fabb284e479d2b22096a1eb1328 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 10 Aug 2015 09:35:55 +0200 Subject: [PATCH 322/375] * Stone-Seeder Hierophant - Fixed that the triggered ability did also trigger for not controlled lands. --- Mage.Sets/src/mage/sets/ravnica/StoneSeederHierophant.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/ravnica/StoneSeederHierophant.java b/Mage.Sets/src/mage/sets/ravnica/StoneSeederHierophant.java index b6aeee6f40c..8f33f38ad1b 100644 --- a/Mage.Sets/src/mage/sets/ravnica/StoneSeederHierophant.java +++ b/Mage.Sets/src/mage/sets/ravnica/StoneSeederHierophant.java @@ -58,8 +58,8 @@ public class StoneSeederHierophant extends CardImpl { this.toughness = new MageInt(1); // Whenever a land enters the battlefield under your control, untap Stone-Seeder Hierophant. - this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new FilterLandPermanent("a land"), false)); - + this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new FilterLandPermanent("a land"), false, null, true)); + // {tap}: Untap target land. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new TapSourceCost()); Target target = new TargetLandPermanent(); From 2abfad795e021f13b1a272a545be380c6a19cc36 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 10 Aug 2015 09:44:53 +0200 Subject: [PATCH 323/375] * Ticking Gnomes - Fixed not working activated ability. --- Mage.Sets/src/mage/sets/urzaslegacy/TickingGnomes.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/urzaslegacy/TickingGnomes.java b/Mage.Sets/src/mage/sets/urzaslegacy/TickingGnomes.java index e9956161084..c4458d3f390 100644 --- a/Mage.Sets/src/mage/sets/urzaslegacy/TickingGnomes.java +++ b/Mage.Sets/src/mage/sets/urzaslegacy/TickingGnomes.java @@ -28,9 +28,6 @@ package mage.sets.urzaslegacy; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -38,6 +35,8 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.EchoAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.Zone; import mage.target.common.TargetCreatureOrPlayer; @@ -60,6 +59,7 @@ public class TickingGnomes extends CardImpl { // Sacrifice Ticking Gnomes: Ticking Gnomes deals 1 damage to target creature or player. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new SacrificeSourceCost()); ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); } public TickingGnomes(final TickingGnomes card) { From 03e2456ab5635b261ae70afc6c62298de53bf789 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 10 Aug 2015 11:01:43 +0300 Subject: [PATCH 324/375] Implement cards: Ghost Tactician, Healing Leaves, Midnight Charm, Riptide Pilferer, Timbermare, and Thundermare --- .../mage/sets/ninthedition/Thundermare.java | 52 +++++++++++++ .../mage/sets/planarchaos/GhostTactician.java | 74 ++++++++++++++++++ .../mage/sets/planarchaos/HealingLeaves.java | 68 ++++++++++++++++ .../mage/sets/planarchaos/MidnightCharm.java | 75 ++++++++++++++++++ .../sets/planarchaos/RiptidePilferer.java | 67 ++++++++++++++++ .../src/mage/sets/planarchaos/Timbermare.java | 78 +++++++++++++++++++ .../src/mage/sets/portal/Thundermare.java | 75 ++++++++++++++++++ .../mage/sets/weatherlight/Thundermare.java | 52 +++++++++++++ 8 files changed, 541 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/ninthedition/Thundermare.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/GhostTactician.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/HealingLeaves.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/MidnightCharm.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/RiptidePilferer.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/Timbermare.java create mode 100644 Mage.Sets/src/mage/sets/portal/Thundermare.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/Thundermare.java diff --git a/Mage.Sets/src/mage/sets/ninthedition/Thundermare.java b/Mage.Sets/src/mage/sets/ninthedition/Thundermare.java new file mode 100644 index 00000000000..a9e7495472e --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/Thundermare.java @@ -0,0 +1,52 @@ +/* + * 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.ninthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class Thundermare extends mage.sets.portal.Thundermare { + + public Thundermare(UUID ownerId) { + super(ownerId); + this.cardNumber = 224; + this.expansionSetCode = "9ED"; + } + + public Thundermare(final Thundermare card) { + super(card); + } + + @Override + public Thundermare copy() { + return new Thundermare(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/GhostTactician.java b/Mage.Sets/src/mage/sets/planarchaos/GhostTactician.java new file mode 100644 index 00000000000..0dd988d3638 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/GhostTactician.java @@ -0,0 +1,74 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class GhostTactician extends CardImpl { + + public GhostTactician(UUID ownerId) { + super(ownerId, 6, "Ghost Tactician", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{W}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Spirit"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(2); + this.toughness = new MageInt(5); + + // {W}, {T}, Discard a card: Creatures you control get +1/+0 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BoostControlledEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + public GhostTactician(final GhostTactician card) { + super(card); + } + + @Override + public GhostTactician copy() { + return new GhostTactician(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/HealingLeaves.java b/Mage.Sets/src/mage/sets/planarchaos/HealingLeaves.java new file mode 100644 index 00000000000..f412e8438ce --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/HealingLeaves.java @@ -0,0 +1,68 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.GainLifeTargetEffect; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LoneFox + */ +public class HealingLeaves extends CardImpl { + + public HealingLeaves(UUID ownerId) { + super(ownerId, 150, "Healing Leaves", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{G}"); + this.expansionSetCode = "PLC"; + + // Choose one - Target player gains 3 life; or prevent the next 3 damage that would be dealt to target creature or player this turn. + this.getSpellAbility().addEffect(new GainLifeTargetEffect(3)); + this.getSpellAbility().addTarget(new TargetPlayer()); + Mode mode = new Mode(); + mode.getEffects().add(new PreventDamageToTargetEffect(Duration.EndOfTurn, 3)); + mode.getTargets().add(new TargetCreatureOrPlayer()); + this.getSpellAbility().addMode(mode); + } + + public HealingLeaves(final HealingLeaves card) { + super(card); + } + + @Override + public HealingLeaves copy() { + return new HealingLeaves(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/MidnightCharm.java b/Mage.Sets/src/mage/sets/planarchaos/MidnightCharm.java new file mode 100644 index 00000000000..3e280291816 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/MidnightCharm.java @@ -0,0 +1,75 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class MidnightCharm extends CardImpl { + + public MidnightCharm(UUID ownerId) { + super(ownerId, 74, "Midnight Charm", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{B}"); + this.expansionSetCode = "PLC"; + + // Choose one - Midnight Charm deals 1 damage to target creature and you gain 1 life; or target creature gains first strike until end of turn; or tap target creature. + this.getSpellAbility().addEffect(new DamageTargetEffect(1)); + this.getSpellAbility().addEffect(new GainLifeEffect(1)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + Mode mode = new Mode(); + mode.getEffects().add(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn)); + mode.getTargets().add(new TargetCreaturePermanent()); + this.getSpellAbility().addMode(mode); + mode = new Mode(); + mode.getEffects().add(new TapTargetEffect()); + mode.getTargets().add(new TargetCreaturePermanent()); + this.getSpellAbility().addMode(mode); + } + + public MidnightCharm(final MidnightCharm card) { + super(card); + } + + @Override + public MidnightCharm copy() { + return new MidnightCharm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/RiptidePilferer.java b/Mage.Sets/src/mage/sets/planarchaos/RiptidePilferer.java new file mode 100644 index 00000000000..dbb0b57f71c --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/RiptidePilferer.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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class RiptidePilferer extends CardImpl { + + public RiptidePilferer(UUID ownerId) { + super(ownerId, 60, "Riptide Pilferer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Merfolk"); + this.subtype.add("Rogue"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever Riptide Pilferer deals combat damage to a player, that player discards a card. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true)); // Morph {U} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{U}"))); + } + + public RiptidePilferer(final RiptidePilferer card) { + super(card); + } + + @Override + public RiptidePilferer copy() { + return new RiptidePilferer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/Timbermare.java b/Mage.Sets/src/mage/sets/planarchaos/Timbermare.java new file mode 100644 index 00000000000..3a3c321c9b1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/Timbermare.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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapAllEffect; +import mage.abilities.keyword.EchoAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author LoneFox + */ +public class Timbermare extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures"); + + static { + filter.add(new AnotherPredicate()); + } + + public Timbermare(UUID ownerId) { + super(ownerId, 140, "Timbermare", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Elemental"); + this.subtype.add("Horse"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Haste + this.addAbility(HasteAbility.getInstance()); + // Echo {5}{G} + this.addAbility(new EchoAbility("{5}{G}")); + // When Timbermare enters the battlefield, tap all other creatures. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapAllEffect(filter))); + } + + public Timbermare(final Timbermare card) { + super(card); + } + + @Override + public Timbermare copy() { + return new Timbermare(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portal/Thundermare.java b/Mage.Sets/src/mage/sets/portal/Thundermare.java new file mode 100644 index 00000000000..51a6fb7b48a --- /dev/null +++ b/Mage.Sets/src/mage/sets/portal/Thundermare.java @@ -0,0 +1,75 @@ +/* + * 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.portal; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapAllEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author LoneFox + */ +public class Thundermare extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures"); + + static { + filter.add(new AnotherPredicate()); + } + + public Thundermare(UUID ownerId) { + super(ownerId, 158, "Thundermare", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{R}"); + this.expansionSetCode = "POR"; + this.subtype.add("Elemental"); + this.subtype.add("Horse"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Haste + this.addAbility(HasteAbility.getInstance()); + // When Thundermare enters the battlefield, tap all other creatures. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapAllEffect(filter))); + } + + public Thundermare(final Thundermare card) { + super(card); + } + + @Override + public Thundermare copy() { + return new Thundermare(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/Thundermare.java b/Mage.Sets/src/mage/sets/weatherlight/Thundermare.java new file mode 100644 index 00000000000..6a8f1b8be50 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/Thundermare.java @@ -0,0 +1,52 @@ +/* + * 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.weatherlight; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class Thundermare extends mage.sets.portal.Thundermare { + + public Thundermare(UUID ownerId) { + super(ownerId); + this.cardNumber = 116; + this.expansionSetCode = "WTH"; + } + + public Thundermare(final Thundermare card) { + super(card); + } + + @Override + public Thundermare copy() { + return new Thundermare(this); + } +} From 269653d115ebcf9f85722962361ded0e5f473f3f Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 10 Aug 2015 10:06:45 +0200 Subject: [PATCH 325/375] * Induce Despair - Fixed not working boost effect. --- .../sets/riseoftheeldrazi/InduceDespair.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/InduceDespair.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/InduceDespair.java index 24b5f55f6af..5719b94007d 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/InduceDespair.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/InduceDespair.java @@ -28,33 +28,35 @@ package mage.sets.riseoftheeldrazi; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.RevealTargetFromHandCost; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCardInHand; import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; /** * * @author jeffwadsworth */ public class InduceDespair extends CardImpl { - + private static final FilterCreatureCard filter = new FilterCreatureCard("creature card from your hand"); public InduceDespair(UUID ownerId) { super(ownerId, 114, "Induce Despair", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{B}"); this.expansionSetCode = "ROE"; - // As an additional cost to cast Induce Despair, reveal a creature card from your hand. // Target creature gets -X/-X until end of turn, where X is the revealed card's converted mana cost. this.getSpellAbility().addEffect(new InduceDespairEffect()); @@ -87,13 +89,14 @@ class InduceDespairEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { RevealTargetFromHandCost cost = (RevealTargetFromHandCost) source.getCosts().get(0); Permanent creature = game.getPermanent(targetPointer.getFirst(game, source)); - if (cost != null) { - int CMC = -1 * cost.convertedManaCosts; - if (creature != null) { - creature.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(CMC, CMC, Duration.EndOfTurn)), source.getSourceId(), game, false); - } + if (cost != null && creature != null) { + int cmcBoost = -1 * cost.convertedManaCosts; + ContinuousEffect effect = new BoostTargetEffect(cmcBoost, cmcBoost, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(creature.getId(), creature.getZoneChangeCounter(game))); + game.addEffect(effect, source); + return true; } - return true; + return false; } @Override From a15d39db0a314d4e91ac8476084442b22cbb8181 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 10 Aug 2015 11:15:54 +0300 Subject: [PATCH 326/375] Implement cards: Gossamer Phantasm, Skulking Ghost, and Tar Pit Warrior --- .../src/mage/sets/mirage/SkulkingGhost.java | 66 +++++++++++++++++++ .../sets/planarchaos/GossamerPhantasm.java | 66 +++++++++++++++++++ .../src/mage/sets/visions/TarPitWarrior.java | 64 ++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mirage/SkulkingGhost.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/GossamerPhantasm.java create mode 100644 Mage.Sets/src/mage/sets/visions/TarPitWarrior.java diff --git a/Mage.Sets/src/mage/sets/mirage/SkulkingGhost.java b/Mage.Sets/src/mage/sets/mirage/SkulkingGhost.java new file mode 100644 index 00000000000..e6c67922517 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/SkulkingGhost.java @@ -0,0 +1,66 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesTargetTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class SkulkingGhost extends CardImpl { + + public SkulkingGhost(UUID ownerId) { + super(ownerId, 41, "Skulking Ghost", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Spirit"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Skulking Ghost becomes the target of a spell or ability, sacrifice it. + this.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect())); + } + + public SkulkingGhost(final SkulkingGhost card) { + super(card); + } + + @Override + public SkulkingGhost copy() { + return new SkulkingGhost(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/GossamerPhantasm.java b/Mage.Sets/src/mage/sets/planarchaos/GossamerPhantasm.java new file mode 100644 index 00000000000..651ed2bd337 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/GossamerPhantasm.java @@ -0,0 +1,66 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesTargetTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class GossamerPhantasm extends CardImpl { + + public GossamerPhantasm(UUID ownerId) { + super(ownerId, 55, "Gossamer Phantasm", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Illusion"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Gossamer Phantasm becomes the target of a spell or ability, sacrifice it. + this.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect())); + } + + public GossamerPhantasm(final GossamerPhantasm card) { + super(card); + } + + @Override + public GossamerPhantasm copy() { + return new GossamerPhantasm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/visions/TarPitWarrior.java b/Mage.Sets/src/mage/sets/visions/TarPitWarrior.java new file mode 100644 index 00000000000..f6212d37c3c --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/TarPitWarrior.java @@ -0,0 +1,64 @@ +/* + * 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.visions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesTargetTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class TarPitWarrior extends CardImpl { + + public TarPitWarrior(UUID ownerId) { + super(ownerId, 20, "Tar Pit Warrior", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "VIS"; + this.subtype.add("Cyclops"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // When Tar Pit Warrior becomes the target of a spell or ability, sacrifice it. + this.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect())); + } + + public TarPitWarrior(final TarPitWarrior card) { + super(card); + } + + @Override + public TarPitWarrior copy() { + return new TarPitWarrior(this); + } +} From 50ec425d9b7d8bafbde6db447ccafa10fc6aa50f Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 10 Aug 2015 12:28:19 +0300 Subject: [PATCH 327/375] Implement cards: Melancholy, Revered Dead, Ridged Kusite, and Thirst --- Mage.Sets/src/mage/sets/mirage/Thirst.java | 82 ++++++++++++++++++ .../src/mage/sets/planarchaos/Melancholy.java | 81 ++++++++++++++++++ .../mage/sets/planarchaos/ReveredDead.java | 66 +++++++++++++++ .../mage/sets/planarchaos/RidgedKusite.java | 83 +++++++++++++++++++ 4 files changed, 312 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mirage/Thirst.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/Melancholy.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/ReveredDead.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/RidgedKusite.java diff --git a/Mage.Sets/src/mage/sets/mirage/Thirst.java b/Mage.Sets/src/mage/sets/mirage/Thirst.java new file mode 100644 index 00000000000..db2df103b70 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/Thirst.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirage; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class Thirst extends CardImpl { + + public Thirst(UUID ownerId) { + super(ownerId, 104, "Thirst", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + // When Thirst enters the battlefield, tap enchanted creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect())); + // Enchanted creature doesn't untap during its controller's untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect())); + // At the beginning of your upkeep, sacrifice Thirst unless you pay {U}. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{U}")), + TargetController.YOU, false)); + } + + public Thirst(final Thirst card) { + super(card); + } + + @Override + public Thirst copy() { + return new Thirst(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/Melancholy.java b/Mage.Sets/src/mage/sets/planarchaos/Melancholy.java new file mode 100644 index 00000000000..9a5c7cc3e63 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/Melancholy.java @@ -0,0 +1,81 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +/** + * + * @author LoneFox + */ +public class Melancholy extends CardImpl { + + public Melancholy(UUID ownerId) { + super(ownerId, 88, "Melancholy", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + // When Melancholy enters the battlefield, tap enchanted creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect())); + // Enchanted creature doesn't untap during its controller's untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect())); + // At the beginning of your upkeep, sacrifice Melancholy unless you pay {B}. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{B}")), + TargetController.YOU, false)); + } + + public Melancholy(final Melancholy card) { + super(card); + } + + @Override + public Melancholy copy() { + return new Melancholy(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/ReveredDead.java b/Mage.Sets/src/mage/sets/planarchaos/ReveredDead.java new file mode 100644 index 00000000000..18abc745114 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/ReveredDead.java @@ -0,0 +1,66 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class ReveredDead extends CardImpl { + + public ReveredDead(UUID ownerId) { + super(ownerId, 29, "Revered Dead", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Spirit"); + this.subtype.add("Soldier"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {W}: Regenerate Revered Dead. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{W}"))); + } + + public ReveredDead(final ReveredDead card) { + super(card); + } + + @Override + public ReveredDead copy() { + return new ReveredDead(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/RidgedKusite.java b/Mage.Sets/src/mage/sets/planarchaos/RidgedKusite.java new file mode 100644 index 00000000000..87ab8078e8e --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/RidgedKusite.java @@ -0,0 +1,83 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class RidgedKusite extends CardImpl { + + public RidgedKusite(UUID ownerId) { + super(ownerId, 78, "Ridged Kusite", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Horror"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}{B}, {tap}, Discard a card: Target creature gets +1/+0 and gains first strike until end of turn. + Effect effect = new BoostTargetEffect(1, 0, Duration.EndOfTurn); + effect.setText("Target creature gets +1/+0"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{B}")); + effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains first strike until end of turn"); + ability.addEffect(effect); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public RidgedKusite(final RidgedKusite card) { + super(card); + } + + @Override + public RidgedKusite copy() { + return new RidgedKusite(this); + } +} From 20a3319afbe59a7cca775ec9adad393a100b4da7 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Mon, 10 Aug 2015 13:40:10 +0300 Subject: [PATCH 328/375] Implement cards: Forgotten Lore and Shrouded Lore --- .../src/mage/sets/iceage/ForgottenLore.java | 52 +++++++ .../sets/masterseditionii/ForgottenLore.java | 140 +++++++++++++++++ .../mage/sets/planarchaos/ShroudedLore.java | 141 ++++++++++++++++++ 3 files changed, 333 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/iceage/ForgottenLore.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/ForgottenLore.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/ShroudedLore.java diff --git a/Mage.Sets/src/mage/sets/iceage/ForgottenLore.java b/Mage.Sets/src/mage/sets/iceage/ForgottenLore.java new file mode 100644 index 00000000000..48aeebbb97b --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/ForgottenLore.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class ForgottenLore extends mage.sets.masterseditionii.ForgottenLore { + + public ForgottenLore(UUID ownerId) { + super(ownerId); + this.cardNumber = 125; + this.expansionSetCode = "ICE"; + } + + public ForgottenLore(final ForgottenLore card) { + super(card); + } + + @Override + public ForgottenLore copy() { + return new ForgottenLore(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/ForgottenLore.java b/Mage.Sets/src/mage/sets/masterseditionii/ForgottenLore.java new file mode 100644 index 00000000000..3fc2f88f87e --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/ForgottenLore.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.masterseditionii; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +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.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardIdPredicate; +import mage.filter.predicate.other.OwnerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; +import mage.target.common.TargetOpponent; +/** + * + * @author LoneFox + */ +public class ForgottenLore extends CardImpl { + + public ForgottenLore(UUID ownerId) { + super(ownerId, 164, "Forgotten Lore", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{G}"); + this.expansionSetCode = "ME2"; + + // Target opponent chooses a card in your graveyard. You may pay {G}. If you do, repeat this process except that opponent can't choose a card already chosen for Forgotten Lore. Then put the last chosen card into your hand. + this.getSpellAbility().addEffect(new ForgottenLoreEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public ForgottenLore(final ForgottenLore card) { + super(card); + } + + @Override + public ForgottenLore copy() { + return new ForgottenLore(this); + } +} + +class ForgottenLoreEffect extends OneShotEffect { + + public ForgottenLoreEffect() { + super(Outcome.Benefit); + staticText = "Target opponent chooses a card in your graveyard. You may pay {G}. If you do, repeat this process except that opponent can't choose a card already chosen for {this}. Then put the last chosen card into your hand."; + } + + public ForgottenLoreEffect(final ForgottenLoreEffect effect) { + super(effect); + } + + @Override + public ForgottenLoreEffect copy() { + return new ForgottenLoreEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player you = game.getPlayer(source.getControllerId()); + Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); + if(you != null && opponent != null) + { + FilterCard filter = new FilterCard(); + filter.add(new OwnerIdPredicate(you.getId())); + Cost cost = new ManaCostsImpl("{G}"); + TargetCardInGraveyard chosenCard; + Card card = null; + boolean done = false; + do { + chosenCard = new TargetCardInGraveyard(filter); + chosenCard.setNotTarget(true); + if(chosenCard.canChoose(opponent.getId(), game)) { + opponent.chooseTarget(Outcome.ReturnToHand, chosenCard, source, game); + card = game.getCard(chosenCard.getFirstTarget()); + filter.add(Predicates.not(new CardIdPredicate(card.getId()))); + game.informPlayers("Forgotten Lore: " + opponent.getLogName() + " has chosen " + card.getLogName()); + } + else { + done = true; + } + + if(!done) { + if(cost.canPay(source, source.getSourceId(), you.getId(), game) && you.chooseUse(Outcome.Benefit, "Pay {G} to choose a different card ?", source, game)) { + cost.clearPaid(); + if(!cost.pay(source, game, source.getSourceId(), you.getId(), false)) { + done = true; + } + } + else { + done = true; + } + } + + } while(!done); + + if(card != null) { + Cards cardsToHand = new CardsImpl(); + cardsToHand.add(card); + you.moveCards(cardsToHand, Zone.GRAVEYARD, Zone.HAND, source, game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/ShroudedLore.java b/Mage.Sets/src/mage/sets/planarchaos/ShroudedLore.java new file mode 100644 index 00000000000..a9ffdeab0bc --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/ShroudedLore.java @@ -0,0 +1,141 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +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.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardIdPredicate; +import mage.filter.predicate.other.OwnerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; +import mage.target.common.TargetOpponent; + +/** + * + * @author LoneFox + */ +public class ShroudedLore extends CardImpl { + + public ShroudedLore(UUID ownerId) { + super(ownerId, 91, "Shrouded Lore", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{B}"); + this.expansionSetCode = "PLC"; + + // Target opponent chooses a card in your graveyard. You may pay {B}. If you do, repeat this process except that opponent can't choose a card already chosen for Shrouded Lore. Then put the last chosen card into your hand. + this.getSpellAbility().addEffect(new ShroudedLoreEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public ShroudedLore(final ShroudedLore card) { + super(card); + } + + @Override + public ShroudedLore copy() { + return new ShroudedLore(this); + } +} + +class ShroudedLoreEffect extends OneShotEffect { + + public ShroudedLoreEffect() { + super(Outcome.Benefit); + staticText = "Target opponent chooses a card in your graveyard. You may pay {B}. If you do, repeat this process except that opponent can't choose a card already chosen for {this}. Then put the last chosen card into your hand."; + } + + public ShroudedLoreEffect(final ShroudedLoreEffect effect) { + super(effect); + } + + @Override + public ShroudedLoreEffect copy() { + return new ShroudedLoreEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player you = game.getPlayer(source.getControllerId()); + Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); + if(you != null && opponent != null) + { + FilterCard filter = new FilterCard(); + filter.add(new OwnerIdPredicate(you.getId())); + Cost cost = new ManaCostsImpl("{B}"); + TargetCardInGraveyard chosenCard; + Card card = null; + boolean done = false; + do { + chosenCard = new TargetCardInGraveyard(filter); + chosenCard.setNotTarget(true); + if(chosenCard.canChoose(opponent.getId(), game)) { + opponent.chooseTarget(Outcome.ReturnToHand, chosenCard, source, game); + card = game.getCard(chosenCard.getFirstTarget()); + filter.add(Predicates.not(new CardIdPredicate(card.getId()))); + game.informPlayers("Shrouded Lore: " + opponent.getLogName() + " has chosen " + card.getLogName()); + } + else { + done = true; + } + + if(!done) { + if(cost.canPay(source, source.getSourceId(), you.getId(), game) && you.chooseUse(Outcome.Benefit, "Pay {B} to choose a different card ?", source, game)) { + cost.clearPaid(); + if(!cost.pay(source, game, source.getSourceId(), you.getId(), false)) { + done = true; + } + } + else { + done = true; + } + } + + } while(!done); + + if(card != null) { + Cards cardsToHand = new CardsImpl(); + cardsToHand.add(card); + you.moveCards(cardsToHand, Zone.GRAVEYARD, Zone.HAND, source, game); + } + return true; + } + return false; + } +} From 73c12d7e785441fd8eacc2bf333568a7b3989933 Mon Sep 17 00:00:00 2001 From: D-Vaillant Date: Mon, 10 Aug 2015 11:24:03 -0700 Subject: [PATCH 329/375] Fixed bug where Hokori, Dust Drinker's toughness=1 --- .../src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java index 62bb2f97366..6a126e4d3de 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java @@ -62,7 +62,7 @@ public class HokoriDustDrinker extends CardImpl { this.subtype.add("Spirit"); this.power = new MageInt(2); - this.toughness = new MageInt(1); + this.toughness = new MageInt(2); // Lands don't untap during their controllers' untap steps. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, new FilterLandPermanent("Lands")))); From 2381f781e73dbdd4fc6fbd8aa70952753cf8daac Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 10 Aug 2015 14:03:31 -0500 Subject: [PATCH 330/375] Updated full FTV: Angels spoiler to mtg-cards-data.txt and existing reprints (needs Archangel of Strife coded if anyone wants). Implemented Chronatog, Chromescale Drake, Barren Glory, Triskelavus, and Chronosavant. Removed unused filter on Horobi, Death's Wail. --- .../championsofkamigawa/HorobiDeathsWail.java | 8 +- .../src/mage/sets/commander/Triskelavus.java | 52 ++++++++ .../mage/sets/darksteel/ChromescaleDrake.java | 122 ++++++++++++++++++ .../sets/ftvangels/AureliaTheWarleader.java | 52 ++++++++ .../mage/sets/ftvangels/BaneslayerAngel.java | 52 ++++++++ .../mage/sets/ftvangels/EntreatTheAngels.java | 52 ++++++++ .../src/mage/sets/ftvangels/ExaltedAngel.java | 54 ++++++++ .../mage/sets/ftvangels/IridescentAngel.java | 54 ++++++++ .../mage/sets/ftvangels/JenaraAsuraOfWar.java | 52 ++++++++ .../mage/sets/ftvangels/LightningAngel.java | 54 ++++++++ .../mage/sets/ftvangels/PlatinumAngel.java | 54 ++++++++ .../mage/sets/futuresight/BarrenGlory.java | 114 ++++++++++++++++ .../mage/sets/timespiral/Chronosavant.java | 69 ++++++++++ .../src/mage/sets/timespiral/Triskelavus.java | 99 ++++++++++++++ .../src/mage/sets/visions/Chronatog.java | 70 ++++++++++ Utils/mtg-cards-data.txt | 9 ++ 16 files changed, 960 insertions(+), 7 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/commander/Triskelavus.java create mode 100644 Mage.Sets/src/mage/sets/darksteel/ChromescaleDrake.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/AureliaTheWarleader.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/BaneslayerAngel.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/EntreatTheAngels.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/ExaltedAngel.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/IridescentAngel.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/JenaraAsuraOfWar.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/LightningAngel.java create mode 100644 Mage.Sets/src/mage/sets/ftvangels/PlatinumAngel.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/BarrenGlory.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/Chronosavant.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/Triskelavus.java create mode 100644 Mage.Sets/src/mage/sets/visions/Chronatog.java diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java index a254027b6a5..3e81a41733e 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java @@ -37,8 +37,6 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -51,11 +49,6 @@ import mage.target.targetpointer.FixedTarget; */ public class HorobiDeathsWail extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent("Demon"); - static { - filter.add(new SubtypePredicate("Demon")); - } - public HorobiDeathsWail(UUID ownerId) { super(ownerId, 117, "Horobi, Death's Wail", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); this.expansionSetCode = "CHK"; @@ -67,6 +60,7 @@ public class HorobiDeathsWail extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // Whenever a creature becomes the target of a spell or ability, destroy that creature. this.addAbility(new HorobiDeathsWailAbility(new DestroyTargetEffect())); } diff --git a/Mage.Sets/src/mage/sets/commander/Triskelavus.java b/Mage.Sets/src/mage/sets/commander/Triskelavus.java new file mode 100644 index 00000000000..4c7a7f021c3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/Triskelavus.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Triskelavus extends mage.sets.timespiral.Triskelavus { + + public Triskelavus(UUID ownerId) { + super(ownerId); + this.cardNumber = 263; + this.expansionSetCode = "CMD"; + } + + public Triskelavus(final Triskelavus card) { + super(card); + } + + @Override + public Triskelavus copy() { + return new Triskelavus(this); + } +} diff --git a/Mage.Sets/src/mage/sets/darksteel/ChromescaleDrake.java b/Mage.Sets/src/mage/sets/darksteel/ChromescaleDrake.java new file mode 100644 index 00000000000..9f06247482a --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/ChromescaleDrake.java @@ -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.darksteel; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.AffinityForArtifactsAbility; +import mage.abilities.keyword.FlyingAbility; +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.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class ChromescaleDrake extends CardImpl { + + public ChromescaleDrake(UUID ownerId) { + super(ownerId, 20, "Chromescale Drake", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{U}{U}{U}"); + this.expansionSetCode = "DST"; + this.subtype.add("Drake"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Affinity for artifacts + this.addAbility(new AffinityForArtifactsAbility()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Chromescale Drake enters the battlefield, reveal the top three cards of your library. Put all artifact cards revealed this way into your hand and the rest into your graveyard. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ChromescaleDrakeEffect())); + } + + public ChromescaleDrake(final ChromescaleDrake card) { + super(card); + } + + @Override + public ChromescaleDrake copy() { + return new ChromescaleDrake(this); + } +} + +class ChromescaleDrakeEffect extends OneShotEffect { + + public ChromescaleDrakeEffect() { + super(Outcome.Benefit); + staticText = "Reveal the top three cards of your library. Put all artifacts cards revealed this way into your hand and the rest into your graveyard"; + } + + public ChromescaleDrakeEffect(final ChromescaleDrakeEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller == null || sourceObject == null) { + return false; + } + + Cards cards = new CardsImpl(); + Cards cardsToHand = new CardsImpl(); + cards.addAll(controller.getLibrary().getTopCards(game, 3)); + if (!cards.isEmpty()) { + controller.revealCards(sourceObject.getName(), cards, game); + for (Card card: cards.getCards(game)) { + if (card.getCardType().contains(CardType.ARTIFACT)) { + cardsToHand.add(card); + cards.remove(card); + } + } + controller.moveCards(cardsToHand, Zone.LIBRARY, Zone.HAND, source, game); + controller.moveCards(cards, Zone.LIBRARY, Zone.GRAVEYARD, source, game); + } + return true; + } + + @Override + public ChromescaleDrakeEffect copy() { + return new ChromescaleDrakeEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/AureliaTheWarleader.java b/Mage.Sets/src/mage/sets/ftvangels/AureliaTheWarleader.java new file mode 100644 index 00000000000..d52f76988dd --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/AureliaTheWarleader.java @@ -0,0 +1,52 @@ +/* + * 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.ftvangels; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class AureliaTheWarleader extends mage.sets.gatecrash.AureliaTheWarleader { + + public AureliaTheWarleader(UUID ownerId) { + super(ownerId); + this.cardNumber = 4; + this.expansionSetCode = "V15"; + } + + public AureliaTheWarleader(final AureliaTheWarleader card) { + super(card); + } + + @Override + public AureliaTheWarleader copy() { + return new AureliaTheWarleader(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/BaneslayerAngel.java b/Mage.Sets/src/mage/sets/ftvangels/BaneslayerAngel.java new file mode 100644 index 00000000000..638203f7bdc --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/BaneslayerAngel.java @@ -0,0 +1,52 @@ +/* + * 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.ftvangels; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class BaneslayerAngel extends mage.sets.magic2010.BaneslayerAngel { + + public BaneslayerAngel(UUID ownerId) { + super(ownerId); + this.cardNumber = 6; + this.expansionSetCode = "V15"; + } + + public BaneslayerAngel(final BaneslayerAngel card) { + super(card); + } + + @Override + public BaneslayerAngel copy() { + return new BaneslayerAngel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/EntreatTheAngels.java b/Mage.Sets/src/mage/sets/ftvangels/EntreatTheAngels.java new file mode 100644 index 00000000000..e0551dd032b --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/EntreatTheAngels.java @@ -0,0 +1,52 @@ +/* + * 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.ftvangels; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class EntreatTheAngels extends mage.sets.avacynrestored.EntreatTheAngels { + + public EntreatTheAngels(UUID ownerId) { + super(ownerId); + this.cardNumber = 7; + this.expansionSetCode = "V15"; + } + + public EntreatTheAngels(final EntreatTheAngels card) { + super(card); + } + + @Override + public EntreatTheAngels copy() { + return new EntreatTheAngels(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/ExaltedAngel.java b/Mage.Sets/src/mage/sets/ftvangels/ExaltedAngel.java new file mode 100644 index 00000000000..c5536b6cb37 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/ExaltedAngel.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.ftvangels; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class ExaltedAngel extends mage.sets.onslaught.ExaltedAngel { + + public ExaltedAngel(UUID ownerId) { + super(ownerId); + this.cardNumber = 8; + this.expansionSetCode = "V15"; + this.rarity = Rarity.MYTHIC; + } + + public ExaltedAngel(final ExaltedAngel card) { + super(card); + } + + @Override + public ExaltedAngel copy() { + return new ExaltedAngel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/IridescentAngel.java b/Mage.Sets/src/mage/sets/ftvangels/IridescentAngel.java new file mode 100644 index 00000000000..6e1999d1cbf --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/IridescentAngel.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.ftvangels; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class IridescentAngel extends mage.sets.odyssey.IridescentAngel { + + public IridescentAngel(UUID ownerId) { + super(ownerId); + this.cardNumber = 10; + this.expansionSetCode = "V15"; + this.rarity = Rarity.MYTHIC; + } + + public IridescentAngel(final IridescentAngel card) { + super(card); + } + + @Override + public IridescentAngel copy() { + return new IridescentAngel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/JenaraAsuraOfWar.java b/Mage.Sets/src/mage/sets/ftvangels/JenaraAsuraOfWar.java new file mode 100644 index 00000000000..53c80937a61 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/JenaraAsuraOfWar.java @@ -0,0 +1,52 @@ +/* + * 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.ftvangels; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class JenaraAsuraOfWar extends mage.sets.alarareborn.JenaraAsuraOfWar { + + public JenaraAsuraOfWar(UUID ownerId) { + super(ownerId); + this.cardNumber = 11; + this.expansionSetCode = "V15"; + } + + public JenaraAsuraOfWar(final JenaraAsuraOfWar card) { + super(card); + } + + @Override + public JenaraAsuraOfWar copy() { + return new JenaraAsuraOfWar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/LightningAngel.java b/Mage.Sets/src/mage/sets/ftvangels/LightningAngel.java new file mode 100644 index 00000000000..1b78d96256c --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/LightningAngel.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.ftvangels; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class LightningAngel extends mage.sets.apocalypse.LightningAngel { + + public LightningAngel(UUID ownerId) { + super(ownerId); + this.cardNumber = 12; + this.expansionSetCode = "V15"; + this.rarity = Rarity.MYTHIC; + } + + public LightningAngel(final LightningAngel card) { + super(card); + } + + @Override + public LightningAngel copy() { + return new LightningAngel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ftvangels/PlatinumAngel.java b/Mage.Sets/src/mage/sets/ftvangels/PlatinumAngel.java new file mode 100644 index 00000000000..7a4a5812c1f --- /dev/null +++ b/Mage.Sets/src/mage/sets/ftvangels/PlatinumAngel.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.ftvangels; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class PlatinumAngel extends mage.sets.tenthedition.PlatinumAngel { + + public PlatinumAngel(UUID ownerId) { + super(ownerId); + this.cardNumber = 13; + this.expansionSetCode = "V15"; + this.rarity = Rarity.MYTHIC; + } + + public PlatinumAngel(final PlatinumAngel card) { + super(card); + } + + @Override + public PlatinumAngel copy() { + return new PlatinumAngel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/BarrenGlory.java b/Mage.Sets/src/mage/sets/futuresight/BarrenGlory.java new file mode 100644 index 00000000000..fb6b3661c9e --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/BarrenGlory.java @@ -0,0 +1,114 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.WinGameSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author fireshoes + */ +public class BarrenGlory extends CardImpl { + + public BarrenGlory(UUID ownerId) { + super(ownerId, 3, "Barren Glory", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}{W}"); + this.expansionSetCode = "FUT"; + + // At the beginning of your upkeep, if you control no permanents other than Barren Glory and have no cards in hand, you win the game. + Condition condition = new CardsInHandCondition(CardsInHandCondition.CountType.EQUAL_TO, 0); + TriggeredAbility ability = new BarrenGloryTriggeredAbility(); + this.addAbility(new ConditionalTriggeredAbility(ability, + condition, + "At the beginning of your upkeep, if you control no permanents other than {this} and have no cards in hand, you win the game")); + } + + public BarrenGlory(final BarrenGlory card) { + super(card); + } + + @Override + public BarrenGlory copy() { + return new BarrenGlory(this); + } +} + +class BarrenGloryTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterPermanent filter = new FilterPermanent(); + static { + filter.add(new AnotherPredicate()); + } + + BarrenGloryTriggeredAbility() { + super(Zone.BATTLEFIELD, new WinGameSourceControllerEffect()); + } + + BarrenGloryTriggeredAbility(final BarrenGloryTriggeredAbility ability) { + super(ability); + } + + @Override + public BarrenGloryTriggeredAbility copy() { + return new BarrenGloryTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.UPKEEP_STEP_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(this.controllerId)) { + if (game.getBattlefield().count(filter, this.getSourceId(), this.getControllerId(), game) == 0) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "At the beginning of your upkeep, if you control no permanents other than {this} and have no cards in hand, you win the game"; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/timespiral/Chronosavant.java b/Mage.Sets/src/mage/sets/timespiral/Chronosavant.java new file mode 100644 index 00000000000..9b503cc133d --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/Chronosavant.java @@ -0,0 +1,69 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; +import mage.abilities.effects.common.turn.SkipNextTurnSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class Chronosavant extends CardImpl { + + public Chronosavant(UUID ownerId) { + super(ownerId, 9, "Chronosavant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{W}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Giant"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // {1}{W}: Return Chronosavant from your graveyard to the battlefield tapped. You skip your next turn. + Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(true), new ManaCostsImpl("{1}{W}")); + ability.addEffect(new SkipNextTurnSourceEffect()); + this.addAbility(ability); + } + + public Chronosavant(final Chronosavant card) { + super(card); + } + + @Override + public Chronosavant copy() { + return new Chronosavant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java b/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java new file mode 100644 index 00000000000..2ed5d2e0eed --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java @@ -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.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.permanent.token.Token; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class Triskelavus extends CardImpl { + + public Triskelavus(UUID ownerId) { + super(ownerId, 266, "Triskelavus", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{7}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Construct"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Triskelavus enters the battlefield with three +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(3)), "with three +1/+1 counters on it")); + + // {1}, Remove a +1/+1 counter from Triskelavus: Put a 1/1 colorless Triskelavite artifact creature token with flying onto the battlefield. It has "Sacrifice this creature: This creature deals 1 damage to target creature or player." + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new TriskelaviteToken()), new RemoveCountersSourceCost(CounterType.P1P1.createInstance()))); + } + + public Triskelavus(final Triskelavus card) { + super(card); + } + + @Override + public Triskelavus copy() { + return new Triskelavus(this); + } +} + +class TriskelaviteToken extends Token { + + public TriskelaviteToken() { + super("Triskelavite", "colorless Triskelavite artifact creature token with flying onto the battlefield. It has \"Sacrifice this creature: This creature deals 1 damage to target creature or player.\""); + this.setOriginalExpansionSetCode("TSP"); + cardType.add(CardType.ARTIFACT); + cardType.add(CardType.CREATURE); + subtype.add("Triskelavite"); + power = new MageInt(1); + toughness = new MageInt(1); + + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new SacrificeSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + + addAbility(FlyingAbility.getInstance()); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/visions/Chronatog.java b/Mage.Sets/src/mage/sets/visions/Chronatog.java new file mode 100644 index 00000000000..96dc557dda3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/Chronatog.java @@ -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.visions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.turn.SkipNextTurnSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class Chronatog extends CardImpl { + + public Chronatog(UUID ownerId) { + super(ownerId, 28, "Chronatog", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "VIS"; + this.subtype.add("Atog"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // {0}: Chronatog gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn. + Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(3, 3, Duration.EndOfTurn), new GenericManaCost(0)); + ability.addEffect(new SkipNextTurnSourceEffect()); + this.addAbility(ability); + } + + public Chronatog(final Chronatog card) { + super(card); + } + + @Override + public Chronatog copy() { + return new Chronatog(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 9c5ddb74ea1..e70d9748735 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -27235,8 +27235,17 @@ Mountain|Premium Deck Series: Slivers|40|L||Basic Land - Mountain|||R| Forest|Premium Deck Series: Slivers|41|L||Basic Land - Forest|||G| Akroma, Angel of Fury|From the Vault: Angels|1|M|{5}{R}{R}{R}|Legendary Creature - Angel|6|6|Akroma, Angel of Fury can't be countered.$Flying, trample, protection from white and from blue${R}: Akroma, Angel of Fury gets +1/+0 until end of turn.$Morph {3}{R}{R}{R} You may cast this card face downn as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)| Akroma, Angel of Wrath|From the Vault: Angels|2|M|{5}{W}{W}{W}|Legendary Creature - Angel|6|6|Flying, first strike, vigilance, trample, haste, protection from black and from red| +Archangel of Strife|From the Vault: Angels|3|M|{5}{W}{W}|Creature - Angel|6|6|Flying$As Archangel of Strife enters the battlefield, each player chooses war or peace.$Creatures controlled by players who chose war get +3/+0.$Creatures controlled by players who chose peace get +0/+3.| +Aurelia, the Warleader|From the Vault: Angels|4|M|{2}{R}{R}{W}{W}|Legendary Creature - Angel|3|4|Flying, vigilance, haste$Whenever Aurelia, the Warleader attacks for the first time each turn, untap all creatures you control. After this phase, there is an additional combat phase.| Avacyn, Angel of Hope|From the Vault: Angels|5|M|{5}{W}{W}{W}|Legendary Creature - Angel|8|8|Flying, vigilance$Avacyn, Angel of Hope and other permanents you control are indestructible.| +Baneslayer Angel|From the Vault: Angels|6|M|{3}{W}{W}|Creature - Angel|5|5|Flying, first strike, lifelink, protection from Demons and from Dragons| +Entreat the Angels|From the Vault: Angels|7|M|{X}{X}{W}{W}{W}|Sorcery|||Put X 4/4 white Angel creature tokens with flying onto the battlefield.$Miracle {X}{W}{W} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.)| +Exalted Angel|From the Vault: Angels|8|M|{4}{W}{W}|Creature - Angel|4|5|Flying$Whenever Exalted Angel deals damage, you gain that much life.$Morph {2}{W}{W} You may cast this card face downn as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)| Iona, Shield of Emeria|From the Vault: Angels|9|M|{6}{W}{W}{W}|Legendary Creature - Angel|7|7|Flying$As Iona, Shield of Emeria enters the battlefield, choose a color.$Your opponents can't cast spells of the chosen color.| +Iridescent Angel|From the Vault: Angels|10|M|{5}{W}{U}|Creature - Angel|4|4|Flying, protection from all colors| +Jenara, Asura of War|From the Vault: Angels|11|M|{G}{W}{U}|Legendary Creature - Angel|3|3|Flying${1}{W}: Put a +1/+1 counter on Jenara, Asura of War.| +Lightning Angel|From the Vault: Angels|12|M|{1}{R}{W}{U}|Creature - Angel|3|4|Flying, vigilance, haste| +Platinum Angel|From the Vault: Angels|13|M|{7}|Artifact Creature - Angel|4|4|Flying$You can't lose the game and your opponents can't win the game.| Serra Angel|From the Vault: Angels|14|M|{3}{W}{W}|Creature - Angel|4|4|Flying$Vigilance (Attacking doesn't cause this creature to tap.)| Tariel, Reckoner of Souls|From the Vault: Angels|15|M|{4}{W}{B}{R}|Legendary Creature - Angel|4|7|Flying, vigilance${tap}: Choose a creature card at random from target opponent's graveyard. Put that card onto the battlefield under your control.| Oblivion Sower|Battle for Zendikar|999|M|{6}|Creature - Eldrazi|5|8|When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.| From 3d9fdc3116e83ec2ad018c6a57037d5e517e43a3 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 10 Aug 2015 21:04:38 -0500 Subject: [PATCH 331/375] Added 23 cards. Fixed that Nim Devourer did not only activate during your upkeep. Fixed spelling in Divine Offering. Fixed tooltip on Triskelavus token. --- .../src/mage/sets/antiquities/Crumble.java | 52 +++++++ .../src/mage/sets/fifthedition/Crumble.java | 54 +++++++ .../src/mage/sets/fourthedition/Crumble.java | 54 +++++++ .../sets/fourthedition/WordOfBinding.java | 76 +++++++++ .../sets/guildpact/YoreTillerNephilim.java | 109 +++++++++++++ .../mage/sets/judgment/KrosanReclamation.java | 145 ++++++++++++++++++ .../src/mage/sets/legends/HellsCaretaker.java | 52 +++++++ .../sets/legends/PresenceOfTheMaster.java | 130 ++++++++++++++++ .../src/mage/sets/legends/Transmutation.java | 61 ++++++++ .../src/mage/sets/legions/Glowrider.java | 109 +++++++++++++ .../src/mage/sets/legions/GoblinGrappler.java | 62 ++++++++ .../mage/sets/masterseditioniv/Crumble.java | 100 ++++++++++++ .../src/mage/sets/mirage/EbonyCharm.java | 141 +++++++++++++++++ .../src/mage/sets/mirage/Illumination.java | 121 +++++++++++++++ .../src/mage/sets/mirrodin/NimDevourer.java | 9 +- .../sets/mirrodinbesieged/DivineOffering.java | 11 +- .../sets/ninthedition/HellsCaretaker.java | 78 ++++++++++ .../mage/sets/onslaught/GoblinTaskmaster.java | 82 ++++++++++ .../mage/sets/onslaught/UndeadGladiator.java | 79 ++++++++++ .../planarchaos/MerfolkThaumaturgist.java | 71 +++++++++ .../src/mage/sets/revisededition/Crumble.java | 54 +++++++ .../mage/sets/scourge/RavenGuildMaster.java | 108 +++++++++++++ .../mage/sets/stronghold/MorgueThrull.java | 65 ++++++++ .../src/mage/sets/thedark/WordOfBinding.java | 52 +++++++ .../src/mage/sets/timespiral/Triskelavus.java | 2 +- .../mage/sets/torment/CephalidAristocrat.java | 63 ++++++++ .../src/mage/sets/torment/VengefulDreams.java | 79 ++++++++++ .../mage/sets/urzasdestiny/RapidDecay.java | 98 ++++++++++++ .../mage/sets/urzassaga/CarrionBeetles.java | 103 +++++++++++++ .../sets/urzassaga/PresenceOfTheMaster.java | 52 +++++++ .../mage/sets/weatherlight/CinderGiant.java | 71 +++++++++ .../weatherlight/DwarvenThaumaturgist.java | 71 +++++++++ .../sets/weatherlight/TolarianSerpent.java | 66 ++++++++ 33 files changed, 2471 insertions(+), 9 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/antiquities/Crumble.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/Crumble.java create mode 100644 Mage.Sets/src/mage/sets/fourthedition/Crumble.java create mode 100644 Mage.Sets/src/mage/sets/fourthedition/WordOfBinding.java create mode 100644 Mage.Sets/src/mage/sets/guildpact/YoreTillerNephilim.java create mode 100644 Mage.Sets/src/mage/sets/judgment/KrosanReclamation.java create mode 100644 Mage.Sets/src/mage/sets/legends/HellsCaretaker.java create mode 100644 Mage.Sets/src/mage/sets/legends/PresenceOfTheMaster.java create mode 100644 Mage.Sets/src/mage/sets/legends/Transmutation.java create mode 100644 Mage.Sets/src/mage/sets/legions/Glowrider.java create mode 100644 Mage.Sets/src/mage/sets/legions/GoblinGrappler.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/Crumble.java create mode 100644 Mage.Sets/src/mage/sets/mirage/EbonyCharm.java create mode 100644 Mage.Sets/src/mage/sets/mirage/Illumination.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/HellsCaretaker.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/GoblinTaskmaster.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/UndeadGladiator.java create mode 100644 Mage.Sets/src/mage/sets/planarchaos/MerfolkThaumaturgist.java create mode 100644 Mage.Sets/src/mage/sets/revisededition/Crumble.java create mode 100644 Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java create mode 100644 Mage.Sets/src/mage/sets/stronghold/MorgueThrull.java create mode 100644 Mage.Sets/src/mage/sets/thedark/WordOfBinding.java create mode 100644 Mage.Sets/src/mage/sets/torment/CephalidAristocrat.java create mode 100644 Mage.Sets/src/mage/sets/torment/VengefulDreams.java create mode 100644 Mage.Sets/src/mage/sets/urzasdestiny/RapidDecay.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/CarrionBeetles.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/PresenceOfTheMaster.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/CinderGiant.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/DwarvenThaumaturgist.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/TolarianSerpent.java diff --git a/Mage.Sets/src/mage/sets/antiquities/Crumble.java b/Mage.Sets/src/mage/sets/antiquities/Crumble.java new file mode 100644 index 00000000000..e9ca8886e69 --- /dev/null +++ b/Mage.Sets/src/mage/sets/antiquities/Crumble.java @@ -0,0 +1,52 @@ +/* + * 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.antiquities; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Crumble extends mage.sets.masterseditioniv.Crumble { + + public Crumble(UUID ownerId) { + super(ownerId); + this.cardNumber = 62; + this.expansionSetCode = "ATQ"; + } + + public Crumble(final Crumble card) { + super(card); + } + + @Override + public Crumble copy() { + return new Crumble(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/Crumble.java b/Mage.Sets/src/mage/sets/fifthedition/Crumble.java new file mode 100644 index 00000000000..0611ff890d0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/Crumble.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.fifthedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Crumble extends mage.sets.masterseditioniv.Crumble { + + public Crumble(UUID ownerId) { + super(ownerId); + this.cardNumber = 149; + this.expansionSetCode = "5ED"; + this.rarity = Rarity.UNCOMMON; + } + + public Crumble(final Crumble card) { + super(card); + } + + @Override + public Crumble copy() { + return new Crumble(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fourthedition/Crumble.java b/Mage.Sets/src/mage/sets/fourthedition/Crumble.java new file mode 100644 index 00000000000..18d5931db03 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/Crumble.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.fourthedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Crumble extends mage.sets.masterseditioniv.Crumble { + + public Crumble(UUID ownerId) { + super(ownerId); + this.cardNumber = 123; + this.expansionSetCode = "4ED"; + this.rarity = Rarity.UNCOMMON; + } + + public Crumble(final Crumble card) { + super(card); + } + + @Override + public Crumble copy() { + return new Crumble(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fourthedition/WordOfBinding.java b/Mage.Sets/src/mage/sets/fourthedition/WordOfBinding.java new file mode 100644 index 00000000000..ecdfe11b989 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/WordOfBinding.java @@ -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.fourthedition; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.effects.common.TapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class WordOfBinding extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures"); + + public WordOfBinding(UUID ownerId) { + super(ownerId, 56, "Word of Binding", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{X}{B}{B}"); + this.expansionSetCode = "4ED"; + + // Tap X target creatures. + this.getSpellAbility().addEffect(new TapTargetEffect("X target creatures")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1,filter, false)); + } + + public WordOfBinding(final WordOfBinding card) { + super(card); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability instanceof SpellAbility) { + ability.getTargets().clear(); + int numberToTap = ability.getManaCostsToPay().getX(); + numberToTap = Math.min(game.getBattlefield().count(filter, ability.getSourceId(), ability.getControllerId(), game), numberToTap); + ability.addTarget(new TargetCreaturePermanent(numberToTap, numberToTap, filter, false)); + } + } + + @Override + public WordOfBinding copy() { + return new WordOfBinding(this); + } +} diff --git a/Mage.Sets/src/mage/sets/guildpact/YoreTillerNephilim.java b/Mage.Sets/src/mage/sets/guildpact/YoreTillerNephilim.java new file mode 100644 index 00000000000..9dae8433031 --- /dev/null +++ b/Mage.Sets/src/mage/sets/guildpact/YoreTillerNephilim.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.guildpact; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class YoreTillerNephilim extends CardImpl { + + public YoreTillerNephilim(UUID ownerId) { + super(ownerId, 140, "Yore-Tiller Nephilim", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{W}{U}{B}{R}"); + this.expansionSetCode = "GPT"; + this.subtype.add("Nephilim"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Yore-Tiller Nephilim attacks, return target creature card from your graveyard to the battlefield tapped and attacking. + Ability ability = new AttacksTriggeredAbility(new YoreTillerNephilimEffect(), false); + ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard())); + this.addAbility(ability); + } + + public YoreTillerNephilim(final YoreTillerNephilim card) { + super(card); + } + + @Override + public YoreTillerNephilim copy() { + return new YoreTillerNephilim(this); + } +} + +class YoreTillerNephilimEffect extends OneShotEffect { + + public YoreTillerNephilimEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "return target creature card from your graveyard to the battlefield tapped and attacking"; + } + + public YoreTillerNephilimEffect(final YoreTillerNephilimEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + + if (controller != null) { + Card card = game.getCard(getTargetPointer().getFirst(game, source)); + if (card != null) { + if (card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId(), true)) { + Permanent permanent = game.getPermanent(card.getId()); + game.getCombat().addAttackingCreature(permanent.getId(), game); + } + } + return true; + + } + return false; + } + + @Override + public YoreTillerNephilimEffect copy() { + return new YoreTillerNephilimEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/KrosanReclamation.java b/Mage.Sets/src/mage/sets/judgment/KrosanReclamation.java new file mode 100644 index 00000000000..70ba3409027 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/KrosanReclamation.java @@ -0,0 +1,145 @@ +/* + * 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.judgment; + +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TimingRule; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class KrosanReclamation extends CardImpl { + + public KrosanReclamation(UUID ownerId) { + super(ownerId, 122, "Krosan Reclamation", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{G}"); + this.expansionSetCode = "JUD"; + + // Target player shuffles up to two target cards from his or her graveyard into his or her library. + this.getSpellAbility().addEffect(new KrosanReclamationEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + this.getSpellAbility().addTarget(new KrosanReclamationTarget()); + + // Flashback {1}{G} + this.addAbility(new FlashbackAbility(new ManaCostsImpl("{1}{G}"), TimingRule.INSTANT)); + } + + public KrosanReclamation(final KrosanReclamation card) { + super(card); + } + + @Override + public KrosanReclamation copy() { + return new KrosanReclamation(this); + } +} + +class KrosanReclamationEffect extends OneShotEffect { + + public KrosanReclamationEffect() { + super(Outcome.Neutral); + this.staticText = "Target player shuffles up to two target cards from his or her graveyard into his or her library"; + } + + public KrosanReclamationEffect(final KrosanReclamationEffect effect) { + super(effect); + } + + @Override + public KrosanReclamationEffect copy() { + return new KrosanReclamationEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player != null) { + List targets = source.getTargets().get(1).getTargets(); + boolean shuffle = false; + for (UUID targetId : targets) { + Card card = game.getCard(targetId); + if (card != null) { + if (player.getGraveyard().contains(card.getId())) { + player.getGraveyard().remove(card); + card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + shuffle = true; + } + } + } + if (shuffle) { + player.shuffleLibrary(game); + } + return true; + } + return false; + } +} + +class KrosanReclamationTarget extends TargetCard { + + public KrosanReclamationTarget() { + super(0, 2, Zone.GRAVEYARD, new FilterCard()); + } + + public KrosanReclamationTarget(final KrosanReclamationTarget target) { + super(target); + } + + @Override + public boolean canTarget(UUID id, Ability source, Game game) { + Card card = game.getCard(id); + if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { + UUID firstTarget = source.getFirstTarget(); + if (firstTarget != null && game.getPlayer(firstTarget).getGraveyard().contains(id)) { + return filter.match(card, game); + } + } + return false; + } + + @Override + public KrosanReclamationTarget copy() { + return new KrosanReclamationTarget(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/HellsCaretaker.java b/Mage.Sets/src/mage/sets/legends/HellsCaretaker.java new file mode 100644 index 00000000000..1c12ff1dc20 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/HellsCaretaker.java @@ -0,0 +1,52 @@ +/* + * 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.legends; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class HellsCaretaker extends mage.sets.ninthedition.HellsCaretaker { + + public HellsCaretaker(UUID ownerId) { + super(ownerId); + this.cardNumber = 19; + this.expansionSetCode = "LEG"; + } + + public HellsCaretaker(final HellsCaretaker card) { + super(card); + } + + @Override + public HellsCaretaker copy() { + return new HellsCaretaker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/PresenceOfTheMaster.java b/Mage.Sets/src/mage/sets/legends/PresenceOfTheMaster.java new file mode 100644 index 00000000000..d09c89d9de4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/PresenceOfTheMaster.java @@ -0,0 +1,130 @@ +/* + * 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.legends; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class PresenceOfTheMaster extends CardImpl { + + public PresenceOfTheMaster(UUID ownerId) { + super(ownerId, 200, "Presence of the Master", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + this.expansionSetCode = "LEG"; + + // Whenever a player casts an enchantment spell, counter it. + this.addAbility(new PresenceOfTheMasterTriggeredAbility()); + } + + public PresenceOfTheMaster(final PresenceOfTheMaster card) { + super(card); + } + + @Override + public PresenceOfTheMaster copy() { + return new PresenceOfTheMaster(this); + } +} + +class PresenceOfTheMasterTriggeredAbility extends TriggeredAbilityImpl { + + + public PresenceOfTheMasterTriggeredAbility() { + super(Zone.BATTLEFIELD, new CounterEffect()); + } + + + public PresenceOfTheMasterTriggeredAbility(final PresenceOfTheMasterTriggeredAbility abiltity) { + super(abiltity); + } + + @java.lang.Override + public PresenceOfTheMasterTriggeredAbility copy() { + return new PresenceOfTheMasterTriggeredAbility(this); + } + + @java.lang.Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SPELL_CAST; + } + + @java.lang.Override + public boolean checkTrigger(GameEvent event, Game game) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null && (spell.getCardType().contains(CardType.ENCHANTMENT))){ + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getTargetId())); + } + return true; + } + return false; + } + + @java.lang.Override + public String getRule() { + return "Whenever a player casts an enchantment spell, counter it"; + } +} + + +class CounterEffect extends OneShotEffect { + + public CounterEffect() { + super(Outcome.Detriment); + } + + public CounterEffect(final CounterEffect effect) { + super(effect); + } + + @java.lang.Override + public CounterEffect copy() { + return new CounterEffect(this); + } + + @java.lang.Override + public boolean apply(Game game, Ability source) { + return game.getStack().counter(this.getTargetPointer().getFirst(game, source), source.getSourceId(), game); + } + +} diff --git a/Mage.Sets/src/mage/sets/legends/Transmutation.java b/Mage.Sets/src/mage/sets/legends/Transmutation.java new file mode 100644 index 00000000000..cd32941e71d --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/Transmutation.java @@ -0,0 +1,61 @@ +/* + * 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.legends; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.SwitchPowerToughnessTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Transmutation extends CardImpl { + + public Transmutation(UUID ownerId) { + super(ownerId, 37, "Transmutation", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "LEG"; + + // Switch target creature's power and toughness until end of turn. + this.getSpellAbility().addEffect(new SwitchPowerToughnessTargetEffect(Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public Transmutation(final Transmutation card) { + super(card); + } + + @Override + public Transmutation copy() { + return new Transmutation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legions/Glowrider.java b/Mage.Sets/src/mage/sets/legions/Glowrider.java new file mode 100644 index 00000000000..15dbdef8c44 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legions/Glowrider.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.legions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.util.CardUtil; + +/** + * + * @author fireshoes + */ +public class Glowrider extends CardImpl { + + public Glowrider(UUID ownerId) { + super(ownerId, 15, "Glowrider", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "LGN"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Noncreature spells cost {1} more to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GlowriderCostReductionEffect())); + } + + public Glowrider(final Glowrider card) { + super(card); + } + + @Override + public Glowrider copy() { + return new Glowrider(this); + } +} + +class GlowriderCostReductionEffect extends CostModificationEffectImpl { + + GlowriderCostReductionEffect ( ) { + super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); + staticText = "Noncreature spells cost {1} more to cast"; + } + + GlowriderCostReductionEffect(GlowriderCostReductionEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + CardUtil.increaseCost(abilityToModify, 1); + return true; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + Card card = game.getCard(abilityToModify.getSourceId()); + if (card != null && !card.getCardType().contains(CardType.CREATURE)) { + return true; + } + } + return false; + } + + @Override + public GlowriderCostReductionEffect copy() { + return new GlowriderCostReductionEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/legions/GoblinGrappler.java b/Mage.Sets/src/mage/sets/legions/GoblinGrappler.java new file mode 100644 index 00000000000..445dffe7832 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legions/GoblinGrappler.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.legions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.ProvokeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class GoblinGrappler extends CardImpl { + + public GoblinGrappler(UUID ownerId) { + super(ownerId, 100, "Goblin Grappler", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "LGN"; + this.subtype.add("Goblin"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Provoke + this.addAbility(new ProvokeAbility()); + } + + public GoblinGrappler(final GoblinGrappler card) { + super(card); + } + + @Override + public GoblinGrappler copy() { + return new GoblinGrappler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/Crumble.java b/Mage.Sets/src/mage/sets/masterseditioniv/Crumble.java new file mode 100644 index 00000000000..6c6708362da --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/Crumble.java @@ -0,0 +1,100 @@ +/* + * 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.masterseditioniv; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetArtifactPermanent; + +/** + * + * @author fireshoes + */ +public class Crumble extends CardImpl { + + public Crumble(UUID ownerId) { + super(ownerId, 147, "Crumble", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{G}"); + this.expansionSetCode = "ME4"; + + // Destroy target artifact. It can't be regenerated. + this.getSpellAbility().addTarget(new TargetArtifactPermanent()); + this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); + + // That artifact's controller gains life equal to its converted mana cost. + this.getSpellAbility().addEffect(new CrumbleEffect()); + } + + public Crumble(final Crumble card) { + super(card); + } + + @Override + public Crumble copy() { + return new Crumble(this); + } +} + +class CrumbleEffect extends OneShotEffect { + + public CrumbleEffect() { + super(Outcome.GainLife); + staticText = "That artifact's controller gains life equal to its converted mana cost"; + } + + public CrumbleEffect(final CrumbleEffect effect) { + super(effect); + } + + @Override + public CrumbleEffect copy() { + return new CrumbleEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + int cost = permanent.getManaCost().convertedManaCost(); + Player player = game.getPlayer(permanent.getControllerId()); + if (player != null) { + player.gainLife(cost, game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/EbonyCharm.java b/Mage.Sets/src/mage/sets/mirage/EbonyCharm.java new file mode 100644 index 00000000000..ced14bb8364 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/EbonyCharm.java @@ -0,0 +1,141 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FearAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInASingleGraveyard; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class EbonyCharm extends CardImpl { + + public EbonyCharm(UUID ownerId) { + super(ownerId, 18, "Ebony Charm", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{B}"); + this.expansionSetCode = "MIR"; + + // Choose one - Target opponent loses 1 life and you gain 1 life; + this.getSpellAbility().addEffect(new EbonyCharmDrainEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + + // or exile up to three target cards from a single graveyard; + Mode mode = new Mode(); + mode.getEffects().add(new EbonyCharmExileEffect()); + mode.getTargets().add((new TargetCardInASingleGraveyard(0, 3, new FilterCard("up to three target cards from a single graveyard")))); + this.getSpellAbility().addMode(mode); + + // or target creature gains fear until end of turn. + mode = new Mode(); + mode.getTargets().add(new TargetCreaturePermanent()); + mode.getEffects().add(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn)); + this.getSpellAbility().addMode(mode); + } + + public EbonyCharm(final EbonyCharm card) { + super(card); + } + + @Override + public EbonyCharm copy() { + return new EbonyCharm(this); + } +} + +class EbonyCharmDrainEffect extends OneShotEffect { + + EbonyCharmDrainEffect() { + super(Outcome.Damage); + staticText = "target opponent loses 1 life and you gain 1 life"; + } + + EbonyCharmDrainEffect(final EbonyCharmDrainEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetPlayer = game.getPlayer(source.getFirstTarget()); + Player controllerPlayer = game.getPlayer(source.getControllerId()); + if (targetPlayer != null && controllerPlayer != null) { + targetPlayer.damage(1, source.getSourceId(), game, false, true); + controllerPlayer.gainLife(1, game); + } + return false; + } + + @Override + public EbonyCharmDrainEffect copy() { + return new EbonyCharmDrainEffect(this); + } + +} + +class EbonyCharmExileEffect extends OneShotEffect { + + public EbonyCharmExileEffect() { + super(Outcome.Exile); + this.staticText = "Exile up to three target cards from a single graveyard"; + } + + public EbonyCharmExileEffect(final EbonyCharmExileEffect effect) { + super(effect); + } + + @Override + public EbonyCharmExileEffect copy() { + return new EbonyCharmExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (UUID targetID : source.getTargets().get(0).getTargets()) { + Card card = game.getCard(targetID); + if (card != null) { + card.moveToExile(null, "", source.getSourceId(), game); + } + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/Illumination.java b/Mage.Sets/src/mage/sets/mirage/Illumination.java new file mode 100644 index 00000000000..cbf7f23238c --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/Illumination.java @@ -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.mirage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class Illumination extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("artifact or enchantment spell"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.ENCHANTMENT))); + } + + public Illumination(UUID ownerId) { + super(ownerId, 225, "Illumination", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{W}{W}"); + this.expansionSetCode = "MIR"; + + // Counter target artifact or enchantment spell. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetSpell(filter)); + + // Its controller gains life equal to its converted mana cost. + this.getSpellAbility().addEffect(new IlluminationEffect()); + } + + public Illumination(final Illumination card) { + super(card); + } + + @Override + public Illumination copy() { + return new Illumination(this); + } +} + +class IlluminationEffect extends OneShotEffect { + + public IlluminationEffect() { + super(Outcome.GainLife); + staticText = "Its controller gains life equal to its converted mana cost"; + } + + public IlluminationEffect(final IlluminationEffect effect) { + super(effect); + } + + @Override + public IlluminationEffect copy() { + return new IlluminationEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + UUID targetId = source.getFirstTarget(); + Player controller = null; + boolean countered = false; + if (targetId != null) { + controller = game.getPlayer(game.getControllerId(targetId)); + } + if (targetId != null + && game.getStack().counter(targetId, source.getSourceId(), game)) { + countered = true; + } + if (controller != null) { + Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); + int cost = spell.getManaCost().convertedManaCost(); + Player player = game.getPlayer(spell.getControllerId()); + if (player != null) { + player.gainLife(cost, game); + } + return true; + } + return countered; + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java b/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java index b66386c5280..cce49286673 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java +++ b/Mage.Sets/src/mage/sets/mirrodin/NimDevourer.java @@ -30,9 +30,10 @@ package mage.sets.mirrodin; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.IsStepCondition; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; @@ -42,6 +43,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.PhaseStep; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; @@ -76,7 +78,10 @@ public class NimDevourer extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(new PermanentsOnBattlefieldCount(filter), new StaticValue(0), Duration.WhileOnBattlefield))); // {B}{B}: Return Nim Devourer from your graveyard to the battlefield, then sacrifice a creature. Activate this ability only during your upkeep. - Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl("{B}{B}")); + Ability ability = new ConditionalActivatedAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToBattlefieldEffect(), + new ManaCostsImpl("{B}{B}"), + new IsStepCondition(PhaseStep.UPKEEP), null); ability.addEffect(new NimDevourerEffect()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/DivineOffering.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/DivineOffering.java index 1fcbb3dd8d2..8dd821a21b1 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/DivineOffering.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/DivineOffering.java @@ -28,14 +28,13 @@ package mage.sets.mirrodinbesieged; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Rarity; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; @@ -88,9 +87,9 @@ public class DivineOffering extends CardImpl { @Override public boolean apply(Game game, Ability source) { - Permanent artefact = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); - if (artefact != null) { - int cost = artefact.getManaCost().convertedManaCost(); + Permanent artifact = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + if (artifact != null) { + int cost = artifact.getManaCost().convertedManaCost(); Player player = game.getPlayer(source.getControllerId()); if (player != null) { player.gainLife(cost, game); diff --git a/Mage.Sets/src/mage/sets/ninthedition/HellsCaretaker.java b/Mage.Sets/src/mage/sets/ninthedition/HellsCaretaker.java new file mode 100644 index 00000000000..8e545b8c4b0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/HellsCaretaker.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.ninthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class HellsCaretaker extends CardImpl { + + public HellsCaretaker(UUID ownerId) { + super(ownerId, 137, "Hell's Caretaker", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "9ED"; + this.subtype.add("Horror"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {tap}, Sacrifice a creature: Return target creature card from your graveyard to the battlefield. Activate this ability only during your upkeep. + Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, + new ReturnFromGraveyardToBattlefieldTargetEffect(), + new TapSourceCost(), + new IsStepCondition(PhaseStep.UPKEEP), null); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); + this.addAbility(ability); + } + + public HellsCaretaker(final HellsCaretaker card) { + super(card); + } + + @Override + public HellsCaretaker copy() { + return new HellsCaretaker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/GoblinTaskmaster.java b/Mage.Sets/src/mage/sets/onslaught/GoblinTaskmaster.java new file mode 100644 index 00000000000..9d27c1aa72f --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/GoblinTaskmaster.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class GoblinTaskmaster extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin"); + + static { + filter.add(new SubtypePredicate("Goblin")); + } + + public GoblinTaskmaster(UUID ownerId) { + super(ownerId, 210, "Goblin Taskmaster", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Goblin"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {1}{R}: Target Goblin creature gets +1/+0 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{1}{R}")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + // Morph {R} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{R}"))); + } + + public GoblinTaskmaster(final GoblinTaskmaster card) { + super(card); + } + + @Override + public GoblinTaskmaster copy() { + return new GoblinTaskmaster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/UndeadGladiator.java b/Mage.Sets/src/mage/sets/onslaught/UndeadGladiator.java new file mode 100644 index 00000000000..19428fda45c --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/UndeadGladiator.java @@ -0,0 +1,79 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class UndeadGladiator extends CardImpl { + + public UndeadGladiator(UUID ownerId) { + super(ownerId, 178, "Undead Gladiator", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Zombie"); + this.subtype.add("Barbarian"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // {1}{B}, Discard a card: Return Undead Gladiator from your graveyard to your hand. Activate this ability only during your upkeep. + Ability ability = new ConditionalActivatedAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), + new ManaCostsImpl("{1}{B}"), + new IsStepCondition(PhaseStep.UPKEEP), null); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + + // Cycling {1}{B} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{B}"))); + } + + public UndeadGladiator(final UndeadGladiator card) { + super(card); + } + + @Override + public UndeadGladiator copy() { + return new UndeadGladiator(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/MerfolkThaumaturgist.java b/Mage.Sets/src/mage/sets/planarchaos/MerfolkThaumaturgist.java new file mode 100644 index 00000000000..849ade5be0e --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/MerfolkThaumaturgist.java @@ -0,0 +1,71 @@ +/* + * 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.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.SwitchPowerToughnessTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class MerfolkThaumaturgist extends CardImpl { + + public MerfolkThaumaturgist(UUID ownerId) { + super(ownerId, 56, "Merfolk Thaumaturgist", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // {tap}: Switch target creature's power and toughness until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SwitchPowerToughnessTargetEffect(Duration.EndOfTurn), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public MerfolkThaumaturgist(final MerfolkThaumaturgist card) { + super(card); + } + + @Override + public MerfolkThaumaturgist copy() { + return new MerfolkThaumaturgist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/revisededition/Crumble.java b/Mage.Sets/src/mage/sets/revisededition/Crumble.java new file mode 100644 index 00000000000..9e5ba1fb290 --- /dev/null +++ b/Mage.Sets/src/mage/sets/revisededition/Crumble.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.revisededition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Crumble extends mage.sets.masterseditioniv.Crumble { + + public Crumble(UUID ownerId) { + super(ownerId); + this.cardNumber = 98; + this.expansionSetCode = "3ED"; + this.rarity = Rarity.UNCOMMON; + } + + public Crumble(final Crumble card) { + super(card); + } + + @Override + public Crumble copy() { + return new Crumble(this); + } +} diff --git a/Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java b/Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java new file mode 100644 index 00000000000..938a4bc5dcb --- /dev/null +++ b/Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java @@ -0,0 +1,108 @@ +/* + * 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.scourge; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class RavenGuildMaster extends CardImpl { + + public RavenGuildMaster(UUID ownerId) { + super(ownerId, 47, "Raven Guild Master", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); + this.expansionSetCode = "SCG"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.subtype.add("Mutant"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever Raven Guild Master deals combat damage to a player, that player exiles the top ten cards of his or her library. + this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new RavenGuildMasterEffect(), false, true)); + + // Morph {2}{U}{U} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{2}{U}{U}"))); + } + + public RavenGuildMaster(final RavenGuildMaster card) { + super(card); + } + + @Override + public RavenGuildMaster copy() { + return new RavenGuildMaster(this); + } +} + +class RavenGuildMasterEffect extends OneShotEffect { + + public RavenGuildMasterEffect() { + super(Outcome.Exile); + this.staticText = "that player exiles the top ten cards of his or her library"; + } + + public RavenGuildMasterEffect(final RavenGuildMasterEffect effect) { + super(effect); + } + + @Override + public RavenGuildMasterEffect copy() { + return new RavenGuildMasterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(targetPointer.getFirst(game, source)); + if (player != null) { + int count = Math.min(player.getLibrary().size(), 10); + for (int i = 0; i < count; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + card.moveToExile(id, "", source.getSourceId(), game); + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/stronghold/MorgueThrull.java b/Mage.Sets/src/mage/sets/stronghold/MorgueThrull.java new file mode 100644 index 00000000000..2a6eff55e7d --- /dev/null +++ b/Mage.Sets/src/mage/sets/stronghold/MorgueThrull.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.stronghold; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class MorgueThrull extends CardImpl { + + public MorgueThrull(UUID ownerId) { + super(ownerId, 15, "Morgue Thrull", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "STH"; + this.subtype.add("Thrull"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Sacrifice Morgue Thrull: Put the top three cards of your library into your graveyard. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutTopCardOfLibraryIntoGraveControllerEffect(3), new SacrificeSourceCost())); + } + + public MorgueThrull(final MorgueThrull card) { + super(card); + } + + @Override + public MorgueThrull copy() { + return new MorgueThrull(this); + } +} diff --git a/Mage.Sets/src/mage/sets/thedark/WordOfBinding.java b/Mage.Sets/src/mage/sets/thedark/WordOfBinding.java new file mode 100644 index 00000000000..ecd0f63a4b6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/thedark/WordOfBinding.java @@ -0,0 +1,52 @@ +/* + * 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.thedark; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class WordOfBinding extends mage.sets.fourthedition.WordOfBinding { + + public WordOfBinding(UUID ownerId) { + super(ownerId); + this.cardNumber = 17; + this.expansionSetCode = "DRK"; + } + + public WordOfBinding(final WordOfBinding card) { + super(card); + } + + @Override + public WordOfBinding copy() { + return new WordOfBinding(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java b/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java index 2ed5d2e0eed..704c4c478d8 100644 --- a/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java +++ b/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java @@ -82,7 +82,7 @@ public class Triskelavus extends CardImpl { class TriskelaviteToken extends Token { public TriskelaviteToken() { - super("Triskelavite", "colorless Triskelavite artifact creature token with flying onto the battlefield. It has \"Sacrifice this creature: This creature deals 1 damage to target creature or player.\""); + super("Triskelavite", "1/1 colorless Triskelavite artifact creature token with flying onto the battlefield. It has \"Sacrifice this creature: This creature deals 1 damage to target creature or player.\""); this.setOriginalExpansionSetCode("TSP"); cardType.add(CardType.ARTIFACT); cardType.add(CardType.CREATURE); diff --git a/Mage.Sets/src/mage/sets/torment/CephalidAristocrat.java b/Mage.Sets/src/mage/sets/torment/CephalidAristocrat.java new file mode 100644 index 00000000000..f0c831e3a10 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/CephalidAristocrat.java @@ -0,0 +1,63 @@ +/* + * 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.torment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesTargetTriggeredAbility; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class CephalidAristocrat extends CardImpl { + + public CephalidAristocrat(UUID ownerId) { + super(ownerId, 27, "Cephalid Aristocrat", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Cephalid"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Whenever Cephalid Aristocrat becomes the target of a spell or ability, put the top two cards of your library into your graveyard. + this.addAbility(new BecomesTargetTriggeredAbility(new PutTopCardOfLibraryIntoGraveControllerEffect(2))); + } + + public CephalidAristocrat(final CephalidAristocrat card) { + super(card); + } + + @Override + public CephalidAristocrat copy() { + return new CephalidAristocrat(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/VengefulDreams.java b/Mage.Sets/src/mage/sets/torment/VengefulDreams.java new file mode 100644 index 00000000000..42b78e2114c --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/VengefulDreams.java @@ -0,0 +1,79 @@ +/* + * 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.torment; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.common.DiscardXTargetCost; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.common.FilterAttackingCreature; +import mage.game.Game; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class VengefulDreams extends CardImpl { + + public VengefulDreams(UUID ownerId) { + super(ownerId, 21, "Vengeful Dreams", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{W}{W}"); + this.expansionSetCode = "TOR"; + + // As an additional cost to cast Vengeful Dreams, discard X cards. + this.getSpellAbility().addCost(new DiscardXTargetCost(new FilterCard("cards"), true)); + + // Exile X target attacking creatures. + Effect effect = new ExileTargetEffect(); + effect.setText("Exile X target attacking creatures"); + this.getSpellAbility().addEffect(effect); + } + + public VengefulDreams(final VengefulDreams card) { + super(card); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = new GetXValue().calculate(game, ability, null); + Target target = new TargetCreaturePermanent(0, xValue, new FilterAttackingCreature(), false); + ability.addTarget(target); + } + + @Override + public VengefulDreams copy() { + return new VengefulDreams(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/RapidDecay.java b/Mage.Sets/src/mage/sets/urzasdestiny/RapidDecay.java new file mode 100644 index 00000000000..09775f15d30 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzasdestiny/RapidDecay.java @@ -0,0 +1,98 @@ +/* + * 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.urzasdestiny; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.target.common.TargetCardInASingleGraveyard; + +/** + * + * @author fireshoes + */ +public class RapidDecay extends CardImpl { + + public RapidDecay(UUID ownerId) { + super(ownerId, 67, "Rapid Decay", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "UDS"; + + // Exile up to three target cards from a single graveyard. + this.getSpellAbility().addEffect(new RapidDecayExileEffect()); + this.getSpellAbility().addTarget(new TargetCardInASingleGraveyard(0, 3, new FilterCard("up to three target cards from a single graveyard"))); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + } + + public RapidDecay(final RapidDecay card) { + super(card); + } + + @Override + public RapidDecay copy() { + return new RapidDecay(this); + } +} + +class RapidDecayExileEffect extends OneShotEffect { + + public RapidDecayExileEffect() { + super(Outcome.Exile); + this.staticText = "Exile up to three target cards from a single graveyard"; + } + + public RapidDecayExileEffect(final RapidDecayExileEffect effect) { + super(effect); + } + + @Override + public RapidDecayExileEffect copy() { + return new RapidDecayExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (UUID targetID : source.getTargets().get(0).getTargets()) { + Card card = game.getCard(targetID); + if (card != null) { + card.moveToExile(null, "", source.getSourceId(), game); + } + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/CarrionBeetles.java b/Mage.Sets/src/mage/sets/urzassaga/CarrionBeetles.java new file mode 100644 index 00000000000..20ed6bab867 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/CarrionBeetles.java @@ -0,0 +1,103 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.target.common.TargetCardInASingleGraveyard; + +/** + * + * @author fireshoes + */ +public class CarrionBeetles extends CardImpl { + + public CarrionBeetles(UUID ownerId) { + super(ownerId, 122, "Carrion Beetles", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}"); + this.expansionSetCode = "USG"; + this.subtype.add("Insect"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {2}{B}, {tap}: Exile up to three target cards from a single graveyard. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CarrionBeetlesExileEffect(), new ManaCostsImpl("{2}{B}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCardInASingleGraveyard(0, 3, new FilterCard("up to three target cards from a single graveyard"))); + this.addAbility(ability); + } + + public CarrionBeetles(final CarrionBeetles card) { + super(card); + } + + @Override + public CarrionBeetles copy() { + return new CarrionBeetles(this); + } +} + +class CarrionBeetlesExileEffect extends OneShotEffect { + + public CarrionBeetlesExileEffect() { + super(Outcome.Exile); + this.staticText = "Exile up to three target cards from a single graveyard"; + } + + public CarrionBeetlesExileEffect(final CarrionBeetlesExileEffect effect) { + super(effect); + } + + @Override + public CarrionBeetlesExileEffect copy() { + return new CarrionBeetlesExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (UUID targetID : source.getTargets().get(0).getTargets()) { + Card card = game.getCard(targetID); + if (card != null) { + card.moveToExile(null, "", source.getSourceId(), game); + } + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/PresenceOfTheMaster.java b/Mage.Sets/src/mage/sets/urzassaga/PresenceOfTheMaster.java new file mode 100644 index 00000000000..dd2cfa33e06 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/PresenceOfTheMaster.java @@ -0,0 +1,52 @@ +/* + * 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.urzassaga; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class PresenceOfTheMaster extends mage.sets.legends.PresenceOfTheMaster { + + public PresenceOfTheMaster(UUID ownerId) { + super(ownerId); + this.cardNumber = 32; + this.expansionSetCode = "USG"; + } + + public PresenceOfTheMaster(final PresenceOfTheMaster card) { + super(card); + } + + @Override + public PresenceOfTheMaster copy() { + return new PresenceOfTheMaster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/CinderGiant.java b/Mage.Sets/src/mage/sets/weatherlight/CinderGiant.java new file mode 100644 index 00000000000..574899c6fcd --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/CinderGiant.java @@ -0,0 +1,71 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.common.DamageAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author fireshoes + */ +public class CinderGiant extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("each other creature you control"); + static { + filter.add(new AnotherPredicate()); + } + + public CinderGiant(UUID ownerId) { + super(ownerId, 93, "Cinder Giant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Giant"); + this.power = new MageInt(5); + this.toughness = new MageInt(3); + + // At the beginning of your upkeep, Cinder Giant deals 2 damage to each other creature you control. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DamageAllEffect(2, filter), TargetController.YOU, false)); + } + + public CinderGiant(final CinderGiant card) { + super(card); + } + + @Override + public CinderGiant copy() { + return new CinderGiant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/DwarvenThaumaturgist.java b/Mage.Sets/src/mage/sets/weatherlight/DwarvenThaumaturgist.java new file mode 100644 index 00000000000..7eb2a3b3855 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/DwarvenThaumaturgist.java @@ -0,0 +1,71 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.SwitchPowerToughnessTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class DwarvenThaumaturgist extends CardImpl { + + public DwarvenThaumaturgist(UUID ownerId) { + super(ownerId, 98, "Dwarven Thaumaturgist", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Dwarf"); + this.subtype.add("Shaman"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // {tap}: Switch target creature's power and toughness until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SwitchPowerToughnessTargetEffect(Duration.EndOfTurn), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public DwarvenThaumaturgist(final DwarvenThaumaturgist card) { + super(card); + } + + @Override + public DwarvenThaumaturgist copy() { + return new DwarvenThaumaturgist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/TolarianSerpent.java b/Mage.Sets/src/mage/sets/weatherlight/TolarianSerpent.java new file mode 100644 index 00000000000..5446010fb4b --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/TolarianSerpent.java @@ -0,0 +1,66 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.OnEventTriggeredAbility; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author fireshoes + */ +public class TolarianSerpent extends CardImpl { + + public TolarianSerpent(UUID ownerId) { + super(ownerId, 57, "Tolarian Serpent", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Serpent"); + this.power = new MageInt(7); + this.toughness = new MageInt(7); + + // At the beginning of your upkeep, put the top seven cards of your library into your graveyard. + this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, + "beginning of your upkeep", + new PutTopCardOfLibraryIntoGraveControllerEffect(7), false)); + } + + public TolarianSerpent(final TolarianSerpent card) { + super(card); + } + + @Override + public TolarianSerpent copy() { + return new TolarianSerpent(this); + } +} From 44eabd501a55705fd53a2a25f4f0dd217bfdf257 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 11 Aug 2015 01:01:50 -0500 Subject: [PATCH 332/375] Added 13 cards. --- .../mage/sets/iceage/CurseOfMaritLage.java | 76 +++++++ .../mage/sets/iceage/WrathOfMaritLage.java | 186 ++++++++---------- .../mage/sets/mercadianmasques/Embargo.java | 71 +++++++ .../mercadianmasques/MagistratesScepter.java | 73 +++++++ .../mage/sets/mercadianmasques/Squeeze.java | 71 +++++++ .../src/mage/sets/nemesis/AvengerEnDal.java | 110 +++++++++++ .../src/mage/sets/nemesis/DefiantFalcon.java | 87 ++++++++ .../src/mage/sets/nemesis/Lawbringer.java | 81 ++++++++ .../src/mage/sets/nemesis/Lightbringer.java | 81 ++++++++ .../sets/nemesis/LinSivviDefiantHero.java | 145 ++++++++++++++ .../src/mage/sets/nemesis/RisingWaters.java | 112 +++++++++++ .../mage/sets/nemesis/SaprolingCluster.java | 69 +++++++ .../sets/pdsgraveborn/SickeningDreams.java | 103 ++++++++++ .../src/mage/sets/prophecy/MagetaTheLion.java | 85 ++++++++ .../mage/sets/torment/SickeningDreams.java | 52 +++++ .../mage/sets/torment/StupefyingTouch.java | 116 +++++++++++ 16 files changed, 1409 insertions(+), 109 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/iceage/CurseOfMaritLage.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/Embargo.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/MagistratesScepter.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/Squeeze.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/AvengerEnDal.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/DefiantFalcon.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/Lawbringer.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/Lightbringer.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/LinSivviDefiantHero.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/RisingWaters.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/SaprolingCluster.java create mode 100644 Mage.Sets/src/mage/sets/pdsgraveborn/SickeningDreams.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/MagetaTheLion.java create mode 100644 Mage.Sets/src/mage/sets/torment/SickeningDreams.java create mode 100644 Mage.Sets/src/mage/sets/torment/StupefyingTouch.java diff --git a/Mage.Sets/src/mage/sets/iceage/CurseOfMaritLage.java b/Mage.Sets/src/mage/sets/iceage/CurseOfMaritLage.java new file mode 100644 index 00000000000..4306cce6ccb --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/CurseOfMaritLage.java @@ -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.iceage; + +import java.util.UUID; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.abilities.effects.common.TapAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class CurseOfMaritLage extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Islands"); + + static { + filter.add(new SubtypePredicate("Island")); + } + + public CurseOfMaritLage(UUID ownerId) { + super(ownerId, 181, "Curse of Marit Lage", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}{R}"); + this.expansionSetCode = "ICE"; + + // When Curse of Marit Lage enters the battlefield, tap all Islands. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapAllEffect(filter))); + + // Islands don't untap during their controllers' untap steps. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, filter))); + } + + public CurseOfMaritLage(final CurseOfMaritLage card) { + super(card); + } + + @Override + public CurseOfMaritLage copy() { + return new CurseOfMaritLage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/WrathOfMaritLage.java b/Mage.Sets/src/mage/sets/iceage/WrathOfMaritLage.java index ba13bc802ba..c190395735e 100644 --- a/Mage.Sets/src/mage/sets/iceage/WrathOfMaritLage.java +++ b/Mage.Sets/src/mage/sets/iceage/WrathOfMaritLage.java @@ -1,109 +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.iceage; - -import java.util.List; -import java.util.UUID; -import mage.ObjectColor; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; - -/** - * - * @author Plopman - */ -public class WrathOfMaritLage extends CardImpl { - - public static final FilterCreaturePermanent filter = new FilterCreaturePermanent("red creatures"); - - static { - filter.add(new ColorPredicate(ObjectColor.RED)); - } - - - public WrathOfMaritLage(UUID ownerId) { - super(ownerId, 109, "Wrath of Marit Lage", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}"); - this.expansionSetCode = "ICE"; - - - // When Wrath of Marit Lage enters the battlefield, tap all red creatures. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TapAllEffect())); - // Red creatures don't untap during their controllers' untap steps. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, filter))); - } - - public WrathOfMaritLage(final WrathOfMaritLage card) { - super(card); - } - - @Override - public WrathOfMaritLage copy() { - return new WrathOfMaritLage(this); - } -} - -class TapAllEffect extends OneShotEffect { - - public TapAllEffect() { - super(Outcome.Tap); - staticText = "tap all red creatures"; - } - - public TapAllEffect(final TapAllEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - - List creatures = game.getBattlefield().getActivePermanents(WrathOfMaritLage.filter, source.getSourceId(), game); - for (Permanent creature : creatures) { - creature.tap(game); - } - return true; - } - - @Override - public TapAllEffect copy() { - return new TapAllEffect(this); - } -} +/* + * 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.iceage; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.abilities.effects.common.TapAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author Plopman + */ +public class WrathOfMaritLage extends CardImpl { + + public static final FilterCreaturePermanent filter = new FilterCreaturePermanent("red creatures"); + + static { + filter.add(new ColorPredicate(ObjectColor.RED)); + } + + public WrathOfMaritLage(UUID ownerId) { + super(ownerId, 109, "Wrath of Marit Lage", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}"); + this.expansionSetCode = "ICE"; + + + // When Wrath of Marit Lage enters the battlefield, tap all red creatures. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapAllEffect(filter))); + // Red creatures don't untap during their controllers' untap steps. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, filter))); + } + + public WrathOfMaritLage(final WrathOfMaritLage card) { + super(card); + } + + @Override + public WrathOfMaritLage copy() { + return new WrathOfMaritLage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Embargo.java b/Mage.Sets/src/mage/sets/mercadianmasques/Embargo.java new file mode 100644 index 00000000000..b23284d6211 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Embargo.java @@ -0,0 +1,71 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterNonlandPermanent; + +/** + * + * @author fireshoes + */ +public class Embargo extends CardImpl { + + private static final FilterPermanent filter = new FilterNonlandPermanent(); + + public Embargo(UUID ownerId) { + super(ownerId, 77, "Embargo", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + this.expansionSetCode = "MMQ"; + + // Nonland permanents don't untap during their controllers' untap steps. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, filter))); + + // At the beginning of your upkeep, you lose 2 life. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LoseLifeSourceControllerEffect(2), TargetController.YOU, false)); + } + + public Embargo(final Embargo card) { + super(card); + } + + @Override + public Embargo copy() { + return new Embargo(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/MagistratesScepter.java b/Mage.Sets/src/mage/sets/mercadianmasques/MagistratesScepter.java new file mode 100644 index 00000000000..7188340f9ad --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/MagistratesScepter.java @@ -0,0 +1,73 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; + +/** + * + * @author fireshoes + */ +public class MagistratesScepter extends CardImpl { + + public MagistratesScepter(UUID ownerId) { + super(ownerId, 304, "Magistrate's Scepter", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "MMQ"; + + // {4}, {tap}: Put a charge counter on Magistrate's Scepter. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance()), new GenericManaCost(4)); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // {tap}, Remove three charge counters from Magistrate's Scepter: Take an extra turn after this one. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddExtraTurnControllerEffect(), new TapSourceCost()); + ability.addCost(new RemoveCountersSourceCost(CounterType.CHARGE.createInstance(3))); + this.addAbility(ability); + } + + public MagistratesScepter(final MagistratesScepter card) { + super(card); + } + + @Override + public MagistratesScepter copy() { + return new MagistratesScepter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Squeeze.java b/Mage.Sets/src/mage/sets/mercadianmasques/Squeeze.java new file mode 100644 index 00000000000..554723aecaf --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Squeeze.java @@ -0,0 +1,71 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.cost.SpellsCostIncreasementAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author fireshoes + */ +public class Squeeze extends CardImpl { + + private static final FilterCard filter = new FilterCard("Sorcery spells"); + + static { + filter.add(new CardTypePredicate(CardType.SORCERY)); + } + + public Squeeze(UUID ownerId) { + super(ownerId, 105, "Squeeze", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + this.expansionSetCode = "MMQ"; + + // Sorcery spells cost {3} more to cast. + Effect effect = new SpellsCostIncreasementAllEffect(filter, 3); + effect.setText("Sorcery spells cost {3} more to cast"); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + } + + public Squeeze(final Squeeze card) { + super(card); + } + + @Override + public Squeeze copy() { + return new Squeeze(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/AvengerEnDal.java b/Mage.Sets/src/mage/sets/nemesis/AvengerEnDal.java new file mode 100644 index 00000000000..9875b337a52 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/AvengerEnDal.java @@ -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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetAttackingCreature; + +/** + * + * @author fireshoes + */ +public class AvengerEnDal extends CardImpl { + + public AvengerEnDal(UUID ownerId) { + super(ownerId, 2, "Avenger en-Dal", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {2}{W}, {tap}, Discard a card: Exile target attacking creature. Its controller gains life equal to its toughness. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl("{2}{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + ability.addTarget(new TargetAttackingCreature()); + ability.addEffect(new AvengerEnDalEffect()); + this.addAbility(ability); + } + + public AvengerEnDal(final AvengerEnDal card) { + super(card); + } + + @Override + public AvengerEnDal copy() { + return new AvengerEnDal(this); + } +} + +class AvengerEnDalEffect extends OneShotEffect { + + public AvengerEnDalEffect() { + super(Outcome.GainLife); + staticText = "Its controller gains life equal to its toughness"; + } + + public AvengerEnDalEffect(final AvengerEnDalEffect effect) { + super(effect); + } + + @Override + public AvengerEnDalEffect copy() { + return new AvengerEnDalEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + Player player = game.getPlayer(permanent.getControllerId()); + if (player != null) { + player.gainLife(permanent.getToughness().getValue(), game); + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/nemesis/DefiantFalcon.java b/Mage.Sets/src/mage/sets/nemesis/DefiantFalcon.java new file mode 100644 index 00000000000..ea6c267313c --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/DefiantFalcon.java @@ -0,0 +1,87 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.Filter; +import mage.filter.common.FilterPermanentCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author fireshoes + */ +public class DefiantFalcon extends CardImpl { + + private static final FilterPermanentCard filter = new FilterPermanentCard("Rebel permanent card with converted mana cost 3 or less"); + + static { + filter.add(new SubtypePredicate("Rebel")); + filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 4)); + } + + public DefiantFalcon(UUID ownerId) { + super(ownerId, 6, "Defiant Falcon", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Rebel"); + this.subtype.add("Bird"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {4}, {tap}: Search your library for a Rebel permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), false), + new ManaCostsImpl("{4}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + public DefiantFalcon(final DefiantFalcon card) { + super(card); + } + + @Override + public DefiantFalcon copy() { + return new DefiantFalcon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/Lawbringer.java b/Mage.Sets/src/mage/sets/nemesis/Lawbringer.java new file mode 100644 index 00000000000..ab0b587a21e --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/Lawbringer.java @@ -0,0 +1,81 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Lawbringer extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("red creature"); + + static { + filter.add(new ColorPredicate(ObjectColor.RED)); + } + + public Lawbringer(UUID ownerId) { + super(ownerId, 10, "Lawbringer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Kor"); + this.subtype.add("Rebel"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {tap}, Sacrifice Lawbringer: Exile target red creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public Lawbringer(final Lawbringer card) { + super(card); + } + + @Override + public Lawbringer copy() { + return new Lawbringer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/Lightbringer.java b/Mage.Sets/src/mage/sets/nemesis/Lightbringer.java new file mode 100644 index 00000000000..aefe3b373cd --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/Lightbringer.java @@ -0,0 +1,81 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Lightbringer extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("black creature"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLACK)); + } + + public Lightbringer(UUID ownerId) { + super(ownerId, 11, "Lightbringer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Kor"); + this.subtype.add("Rebel"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {tap}, Sacrifice Lightbringer: Exile target black creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public Lightbringer(final Lightbringer card) { + super(card); + } + + @Override + public Lightbringer copy() { + return new Lightbringer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/LinSivviDefiantHero.java b/Mage.Sets/src/mage/sets/nemesis/LinSivviDefiantHero.java new file mode 100644 index 00000000000..efc9dcd7c22 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/LinSivviDefiantHero.java @@ -0,0 +1,145 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.Filter.ComparisonType; +import mage.filter.FilterCard; +import mage.filter.common.FilterPermanentCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.other.OwnerPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class LinSivviDefiantHero extends CardImpl { + + private static final FilterCard filter = new FilterCard("Rebel card from your graveyard"); + + static { + filter.add(new OwnerPredicate(TargetController.YOU)); + filter.add(new SubtypePredicate("Rebel")); + } + + static final String rule = "Put target Rebel card from your graveyard on the bottom of your library"; + + public LinSivviDefiantHero(UUID ownerId) { + super(ownerId, 12, "Lin Sivvi, Defiant Hero", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); + this.expansionSetCode = "NMS"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Rebel"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // {X}, {tap}: Search your library for a Rebel permanent card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new LinSivviDefiantHeroEffect(), + new ManaCostsImpl("{X}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // {3}: Put target Rebel card from your graveyard on the bottom of your library. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibraryTargetEffect(false, rule), new GenericManaCost(3)); + ability.addTarget(new TargetCardInYourGraveyard(1, filter)); + this.addAbility(ability); + } + + public LinSivviDefiantHero(final LinSivviDefiantHero card) { + super(card); + } + + @Override + public LinSivviDefiantHero copy() { + return new LinSivviDefiantHero(this); + } +} + +class LinSivviDefiantHeroEffect extends OneShotEffect { + + public LinSivviDefiantHeroEffect() { + super(Outcome.DrawCard); + this.staticText = "Search your library for a Rebel permanent card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library"; + } + + public LinSivviDefiantHeroEffect(final LinSivviDefiantHeroEffect effect) { + super(effect); + } + + @Override + public LinSivviDefiantHeroEffect copy() { + return new LinSivviDefiantHeroEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + + int xCost = source.getManaCostsToPay().getX(); + + FilterPermanentCard filter = new FilterPermanentCard(new StringBuilder("Rebel permanent card with converted mana cost ").append(xCost).append(" or less").toString()); + filter.add(new ConvertedManaCostPredicate(ComparisonType.LessThan, xCost + 1)); + filter.add(new SubtypePredicate("Rebel")); + TargetCardInLibrary target = new TargetCardInLibrary(filter); + + if (player.searchLibrary(target, game)) { + Card card = player.getLibrary().getCard(target.getFirstTarget(), game); + if (card != null) { + player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId()); + } + player.shuffleLibrary(game); + return true; + } + player.shuffleLibrary(game); + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/nemesis/RisingWaters.java b/Mage.Sets/src/mage/sets/nemesis/RisingWaters.java new file mode 100644 index 00000000000..7afea122781 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/RisingWaters.java @@ -0,0 +1,112 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class RisingWaters extends CardImpl { + + public RisingWaters(UUID ownerId) { + super(ownerId, 38, "Rising Waters", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + this.expansionSetCode = "NMS"; + + // Lands don't untap during their controllers' untap steps. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, new FilterLandPermanent("Lands")))); + + // At the beginning of each player's upkeep, that player untaps a land he or she controls. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new RisingWatersUntapEffect(), TargetController.ANY, false)); + } + + public RisingWaters(final RisingWaters card) { + super(card); + } + + @Override + public RisingWaters copy() { + return new RisingWaters(this); + } +} + +class RisingWatersUntapEffect extends OneShotEffect { + + public RisingWatersUntapEffect() { + super(Outcome.Untap); + this.staticText = "that player untaps a land he or she controls"; + } + + public RisingWatersUntapEffect(final RisingWatersUntapEffect effect) { + super(effect); + } + + @Override + public RisingWatersUntapEffect copy() { + return new RisingWatersUntapEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(game.getActivePlayerId()); + FilterLandPermanent filter = new FilterLandPermanent("land you control"); + filter.add(new ControllerIdPredicate(game.getActivePlayerId())); + Target target = new TargetLandPermanent(filter); + if (player != null && player.chooseTarget(Outcome.Untap, target, source, game)) { + for (UUID landId : target.getTargets()) { + Permanent land = game.getPermanent(landId); + if (land != null) { + land.untap(game); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/SaprolingCluster.java b/Mage.Sets/src/mage/sets/nemesis/SaprolingCluster.java new file mode 100644 index 00000000000..2d0ff917a9a --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/SaprolingCluster.java @@ -0,0 +1,69 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.permanent.token.SaprolingToken; + +/** + * + * @author fireshoes + */ +public class SaprolingCluster extends CardImpl { + + public SaprolingCluster(UUID ownerId) { + super(ownerId, 114, "Saproling Cluster", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + this.expansionSetCode = "NMS"; + + // {1}, Discard a card: Put a 1/1 green Saproling creature token onto the battlefield. Any player may activate this ability. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken()) , new GenericManaCost(1)); + ability.addCost(new DiscardCardCost()); + ability.setMayActivate(TargetController.ANY); + ability.addEffect(new InfoEffect("Any player may activate this ability")); + this.addAbility(ability); + } + + public SaprolingCluster(final SaprolingCluster card) { + super(card); + } + + @Override + public SaprolingCluster copy() { + return new SaprolingCluster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/pdsgraveborn/SickeningDreams.java b/Mage.Sets/src/mage/sets/pdsgraveborn/SickeningDreams.java new file mode 100644 index 00000000000..0cfcfa9aff6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/pdsgraveborn/SickeningDreams.java @@ -0,0 +1,103 @@ +/* + * 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.pdsgraveborn; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.VariableCostImpl; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInHand; + +/** + * + * @author fireshoes + */ +public class SickeningDreams extends CardImpl { + + public SickeningDreams(UUID ownerId) { + super(ownerId, 18, "Sickening Dreams", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{B}"); + this.expansionSetCode = "PD3"; + + // As an additional cost to cast Sickening Dreams, discard X cards. + this.getSpellAbility().addCost(new SickeningDreamsAdditionalCost()); + + // Sickening Dreams deals X damage to each creature and each player. + this.getSpellAbility().addEffect(new DamageEverythingEffect(new GetXValue(), new FilterCreaturePermanent())); + } + + public SickeningDreams(final SickeningDreams card) { + super(card); + } + + @Override + public SickeningDreams copy() { + return new SickeningDreams(this); + } +} + +class SickeningDreamsAdditionalCost extends VariableCostImpl { + + SickeningDreamsAdditionalCost() { + super("cards to discard"); + this.text = "As an additional cost to cast {this}, discard X cards"; + } + + SickeningDreamsAdditionalCost(final SickeningDreamsAdditionalCost cost) { + super(cost); + } + + @Override + public SickeningDreamsAdditionalCost copy() { + return new SickeningDreamsAdditionalCost(this); + } + + @Override + public int getMaxValue(Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return controller.getHand().size(); + } + return 0; + } + + @Override + public Cost getFixedCostsFromAnnouncedValue(int xValue) { + TargetCardInHand target = new TargetCardInHand(xValue, new FilterCard()); + return new DiscardTargetCost(target); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/prophecy/MagetaTheLion.java b/Mage.Sets/src/mage/sets/prophecy/MagetaTheLion.java new file mode 100644 index 00000000000..d8bdc6221f7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/MagetaTheLion.java @@ -0,0 +1,85 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetCardInHand; + +/** + * + * @author fireshoes + */ +public class MagetaTheLion extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("creatures except for {this}"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + filter.add(new AnotherPredicate()); + } + + public MagetaTheLion(UUID ownerId) { + super(ownerId, 13, "Mageta the Lion", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); + this.expansionSetCode = "PCY"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {2}{W}{W}, {tap}, Discard two cards: Destroy all creatures except for Mageta the Lion. Those creatures can't be regenerated. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyAllEffect(filter, true), new ManaCostsImpl("{2}{W}{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardTargetCost(new TargetCardInHand(2,2, new FilterCard("two cards")))); + this.addAbility(ability); + } + + public MagetaTheLion(final MagetaTheLion card) { + super(card); + } + + @Override + public MagetaTheLion copy() { + return new MagetaTheLion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/SickeningDreams.java b/Mage.Sets/src/mage/sets/torment/SickeningDreams.java new file mode 100644 index 00000000000..84c68615434 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/SickeningDreams.java @@ -0,0 +1,52 @@ +/* + * 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.torment; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class SickeningDreams extends mage.sets.pdsgraveborn.SickeningDreams { + + public SickeningDreams(UUID ownerId) { + super(ownerId); + this.cardNumber = 83; + this.expansionSetCode = "TOR"; + } + + public SickeningDreams(final SickeningDreams card) { + super(card); + } + + @Override + public SickeningDreams copy() { + return new SickeningDreams(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/StupefyingTouch.java b/Mage.Sets/src/mage/sets/torment/StupefyingTouch.java new file mode 100644 index 00000000000..e52c34e006b --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/StupefyingTouch.java @@ -0,0 +1,116 @@ +/* + * 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.torment; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class StupefyingTouch extends CardImpl { + + public StupefyingTouch(UUID ownerId) { + super(ownerId, 48, "Stupefying Touch", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Stupefying Touch enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); + + // Enchanted creature's activated abilities can't be activated. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantActivateAbilitiesAttachedEffect())); + } + + public StupefyingTouch(final StupefyingTouch card) { + super(card); + } + + @Override + public StupefyingTouch copy() { + return new StupefyingTouch(this); + } +} + +class CantActivateAbilitiesAttachedEffect extends RestrictionEffect { + + public CantActivateAbilitiesAttachedEffect() { + super(Duration.WhileOnBattlefield); + staticText = "Enchanted creature's activated abilities can't be activated"; + } + + public CantActivateAbilitiesAttachedEffect(final CantActivateAbilitiesAttachedEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (enchantment != null && enchantment.getAttachedTo() != null) { + if (permanent.getId().equals(enchantment.getAttachedTo())) { + return true; + } + } + return false; + } + + @Override + public boolean canUseActivatedAbilities(Permanent permanent, Ability source, Game game) { + return false; + } + + @Override + public CantActivateAbilitiesAttachedEffect copy() { + return new CantActivateAbilitiesAttachedEffect(this); + } + +} \ No newline at end of file From 2dbb4a71e1bf845304342822bbd2b0df44aa8a75 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 11 Aug 2015 10:53:02 +0200 Subject: [PATCH 333/375] * Changed deck importer to use the same card prefered from newest core or expansion set. --- .../cards/decks/importer/DecDeckImporter.java | 23 ++++------ .../cards/decks/importer/MWSDeckImporter.java | 29 ++++++------ .../cards/decks/importer/TxtDeckImporter.java | 44 ++++--------------- .../mage/cards/repository/CardRepository.java | 31 +++++++------ 4 files changed, 50 insertions(+), 77 deletions(-) diff --git a/Mage/src/mage/cards/decks/importer/DecDeckImporter.java b/Mage/src/mage/cards/decks/importer/DecDeckImporter.java index 3dc368d3065..617313d634e 100644 --- a/Mage/src/mage/cards/decks/importer/DecDeckImporter.java +++ b/Mage/src/mage/cards/decks/importer/DecDeckImporter.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,16 +20,13 @@ * 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.cards.decks.importer; -import java.util.List; -import java.util.Random; import mage.cards.decks.DeckCardInfo; import mage.cards.decks.DeckCardLists; import mage.cards.repository.CardInfo; @@ -58,17 +55,15 @@ public class DecDeckImporter extends DeckImporter { String lineName = line.substring(delim).trim(); try { int num = Integer.parseInt(lineNum); - List cards = CardRepository.instance.findCards(lineName); - if (cards.isEmpty()) { + CardInfo cardInfo = CardRepository.instance.findPreferedCoreExpansionCard(lineName); + if (cardInfo == null) { sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append("\n"); } else { - Random random = new Random(); for (int i = 0; i < num; i++) { - CardInfo cardInfo = cards.get(random.nextInt(cards.size())); if (!sideboard) { - deckList.getCards().add(new DeckCardInfo(cardInfo.getName(),cardInfo.getCardNumber(), cardInfo.getSetCode())); + deckList.getCards().add(new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode())); } else { - deckList.getSideboard().add(new DeckCardInfo(cardInfo.getName(),cardInfo.getCardNumber(), cardInfo.getSetCode())); + deckList.getSideboard().add(new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode())); } } } diff --git a/Mage/src/mage/cards/decks/importer/MWSDeckImporter.java b/Mage/src/mage/cards/decks/importer/MWSDeckImporter.java index 09a19efe91c..3b29c552950 100644 --- a/Mage/src/mage/cards/decks/importer/MWSDeckImporter.java +++ b/Mage/src/mage/cards/decks/importer/MWSDeckImporter.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -63,27 +63,28 @@ public class MWSDeckImporter extends DeckImporter { String lineName = line.substring(delim + 1).trim(); try { int num = Integer.parseInt(lineNum); - List cards = null; + CardInfo cardInfo = null; if (!setCode.isEmpty()) { CardCriteria criteria = new CardCriteria(); criteria.name(lineName); criteria.setCodes(setCode); + List cards = null; cards = CardRepository.instance.findCards(criteria); - } - if (cards == null || cards.isEmpty()) { - cards = CardRepository.instance.findCards(lineName); + if (!cards.isEmpty()) { + cardInfo = cards.get(new Random().nextInt(cards.size())); + } + } else { + cardInfo = CardRepository.instance.findPreferedCoreExpansionCard(lineName); } - if (cards.isEmpty()) { + if (cardInfo == null) { sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append("\n"); } else { - Random random = new Random(); for (int i = 0; i < num; i++) { - CardInfo cardInfo = cards.get(random.nextInt(cards.size())); if (!sideboard) { - deckList.getCards().add(new DeckCardInfo(cardInfo.getName(),cardInfo.getCardNumber(), cardInfo.getSetCode())); + deckList.getCards().add(new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode())); } else { - deckList.getSideboard().add(new DeckCardInfo(cardInfo.getName(),cardInfo.getCardNumber(), cardInfo.getSetCode())); + deckList.getSideboard().add(new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode())); } } } diff --git a/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java index 0c0589baf73..dbfb00b268b 100644 --- a/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java +++ b/Mage/src/mage/cards/decks/importer/TxtDeckImporter.java @@ -28,18 +28,12 @@ package mage.cards.decks.importer; import java.util.Arrays; -import java.util.Date; -import java.util.GregorianCalendar; import java.util.HashSet; -import java.util.List; import java.util.Set; import mage.cards.decks.DeckCardInfo; import mage.cards.decks.DeckCardLists; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; -import mage.cards.repository.ExpansionInfo; -import mage.cards.repository.ExpansionRepository; -import mage.constants.SetType; /** * @@ -56,6 +50,10 @@ public class TxtDeckImporter extends DeckImporter { @Override protected void readLine(String line, DeckCardLists deckList) { + if (line.toLowerCase().contains("sideboard")) { + sideboard = true; + return; + } if (line.startsWith("//")) { return; } @@ -69,11 +67,6 @@ public class TxtDeckImporter extends DeckImporter { emptyLinesInARow = 0; } - if (line.toLowerCase().startsWith("sideboard")) { - sideboard = true; - return; - } - line = line.replace("\t", " "); // changing tabs to blanks as delimiter int delim = line.indexOf(' '); if (delim < 0) { @@ -93,36 +86,15 @@ public class TxtDeckImporter extends DeckImporter { } try { int num = Integer.parseInt(lineNum.replaceAll("\\D+", "")); - List cards = CardRepository.instance.findCards(lineName); - if (cards.isEmpty()) { + CardInfo cardInfo = CardRepository.instance.findPreferedCoreExpansionCard(lineName); + if (cardInfo == null) { sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append("\n"); } else { - // search the card released last with this name - Date lastReleaseDate = new GregorianCalendar(1900, 1, 1).getTime(); - Date lastExpansionDate = new GregorianCalendar(1900, 1, 1).getTime(); - CardInfo cardToUse = null; - for (CardInfo cardinfo : cards) { - ExpansionInfo set = ExpansionRepository.instance.getSetByCode(cardinfo.getSetCode()); - if (set != null) { - if ((set.getType().equals(SetType.EXPANSION) || set.getType().equals(SetType.CORE)) - && (lastExpansionDate == null || set.getReleaseDate().after(lastExpansionDate))) { - cardToUse = cardinfo; - lastExpansionDate = set.getReleaseDate(); - } - if (lastExpansionDate == null && (lastReleaseDate == null || set.getReleaseDate().after(lastReleaseDate))) { - cardToUse = cardinfo; - lastReleaseDate = set.getReleaseDate(); - } - } - } - if (cardToUse == null) { - cardToUse = cards.get(0); - } for (int i = 0; i < num; i++) { if (!sideboard) { - deckList.getCards().add(new DeckCardInfo(cardToUse.getName(), cardToUse.getCardNumber(), cardToUse.getSetCode())); + deckList.getCards().add(new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode())); } else { - deckList.getSideboard().add(new DeckCardInfo(cardToUse.getName(), cardToUse.getCardNumber(), cardToUse.getSetCode())); + deckList.getSideboard().add(new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode())); } } } diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 1be590287bc..13c6e972164 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -39,13 +39,13 @@ import com.j256.ormlite.table.TableUtils; import java.io.File; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Date; +import java.util.GregorianCalendar; import java.util.List; import java.util.Random; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.Callable; -import mage.cards.ExpansionSet; -import mage.cards.Sets; import mage.constants.CardType; import mage.constants.SetType; import org.apache.log4j.Logger; @@ -303,18 +303,24 @@ public enum CardRepository { public CardInfo findPreferedCoreExpansionCard(String name) { List cards = findCards(name); if (!cards.isEmpty()) { - CardInfo cardInfo = cards.get(random.nextInt(cards.size())); - ExpansionSet set = Sets.getInstance().get(cardInfo.getSetCode()); - if (set.getSetType().equals(SetType.EXPANSION) || set.getSetType().equals(SetType.CORE)) { - return cardInfo; - } - for (CardInfo cardInfoToCheck : cards) { - set = Sets.getInstance().get(cardInfoToCheck.getSetCode()); - if (set.getSetType().equals(SetType.CORE) || set.getSetType().equals(SetType.EXPANSION)) { - return cardInfoToCheck; + Date lastReleaseDate = new GregorianCalendar(1900, 1, 1).getTime(); + Date lastExpansionDate = new GregorianCalendar(1900, 1, 1).getTime(); + CardInfo cardToUse = null; + for (CardInfo cardinfo : cards) { + ExpansionInfo set = ExpansionRepository.instance.getSetByCode(cardinfo.getSetCode()); + if (set != null) { + if ((set.getType().equals(SetType.EXPANSION) || set.getType().equals(SetType.CORE)) + && (lastExpansionDate == null || set.getReleaseDate().after(lastExpansionDate))) { + cardToUse = cardinfo; + lastExpansionDate = set.getReleaseDate(); + } + if (lastExpansionDate == null && (lastReleaseDate == null || set.getReleaseDate().after(lastReleaseDate))) { + cardToUse = cardinfo; + lastReleaseDate = set.getReleaseDate(); + } } } - return cardInfo; + return cardToUse; } return null; } @@ -323,7 +329,6 @@ public enum CardRepository { try { QueryBuilder queryBuilder = cardDao.queryBuilder(); queryBuilder.where().eq("name", new SelectArg(name)); - return cardDao.query(queryBuilder.prepare()); } catch (SQLException ex) { } From c023240da8c66cc50e2b967bbe6bdb0e03c70dc6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 11 Aug 2015 13:39:02 +0200 Subject: [PATCH 334/375] * Necroskitter - Fixed that the triggered ability was not optional. --- Mage.Sets/src/mage/sets/eventide/Necroskitter.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/eventide/Necroskitter.java b/Mage.Sets/src/mage/sets/eventide/Necroskitter.java index e3945c2cc46..309521f8d17 100644 --- a/Mage.Sets/src/mage/sets/eventide/Necroskitter.java +++ b/Mage.Sets/src/mage/sets/eventide/Necroskitter.java @@ -80,7 +80,7 @@ public class Necroskitter extends CardImpl { class NecroskitterTriggeredAbility extends TriggeredAbilityImpl { public NecroskitterTriggeredAbility() { - super(Zone.BATTLEFIELD, new ReturnToBattlefieldUnderYourControlTargetEffect()); + super(Zone.BATTLEFIELD, new ReturnToBattlefieldUnderYourControlTargetEffect(), true); } public NecroskitterTriggeredAbility(NecroskitterTriggeredAbility ability) { @@ -100,18 +100,13 @@ class NecroskitterTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (game.getPermanent(sourceId) == null) { - if (game.getLastKnownInformation(sourceId, Zone.BATTLEFIELD) == null) { - return false; - } - } if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) { - Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); + Permanent permanent = zEvent.getTarget(); if (permanent != null && permanent.getCounters().containsKey(CounterType.M1M1) && game.getOpponents(controllerId).contains(permanent.getControllerId())) { for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId())); + effect.setTargetPointer(new FixedTarget(event.getTargetId(), game.getState().getZoneChangeCounter(event.getTargetId()))); } return true; } From 6c364f657948ab5a0788bbbcf357975ec9888492 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 11 Aug 2015 08:38:42 -0500 Subject: [PATCH 335/375] Fixed that Mwonvuli Acid-Moss put the land into play untapped. --- .../sets/timespiral/MwonvuliAcidMoss.java | 141 +++++++++--------- 1 file changed, 70 insertions(+), 71 deletions(-) diff --git a/Mage.Sets/src/mage/sets/timespiral/MwonvuliAcidMoss.java b/Mage.Sets/src/mage/sets/timespiral/MwonvuliAcidMoss.java index 7bb54c0dd5b..ede5bc10ed5 100644 --- a/Mage.Sets/src/mage/sets/timespiral/MwonvuliAcidMoss.java +++ b/Mage.Sets/src/mage/sets/timespiral/MwonvuliAcidMoss.java @@ -1,71 +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.timespiral; - -import java.util.UUID; -import mage.abilities.effects.common.DestroyTargetEffect; -import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.filter.common.FilterBasicLandCard; -import mage.filter.common.FilterLandCard; -import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.target.TargetPermanent; -import mage.target.common.TargetCardInLibrary; - -/** - * - * @author markedagain - */ -public class MwonvuliAcidMoss extends CardImpl { - - public MwonvuliAcidMoss(UUID ownerId) { - super(ownerId, 207, "Mwonvuli Acid-Moss", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}{G}"); - this.expansionSetCode = "TSP"; - - FilterLandCard filterForest = new FilterLandCard(); - filterForest.add(new SubtypePredicate("Forest")); - - // Destroy target land. Search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library. - this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); - this.getSpellAbility().addTarget(new TargetPermanent(new FilterLandPermanent())); - this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filterForest), false, true)); - } - - public MwonvuliAcidMoss(final MwonvuliAcidMoss card) { - super(card); - } - - @Override - public MwonvuliAcidMoss copy() { - return new MwonvuliAcidMoss(this); - } -} - +/* + * 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.timespiral; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterLandCard; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author markedagain + */ +public class MwonvuliAcidMoss extends CardImpl { + + public MwonvuliAcidMoss(UUID ownerId) { + super(ownerId, 207, "Mwonvuli Acid-Moss", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}{G}"); + this.expansionSetCode = "TSP"; + + FilterLandCard filterForest = new FilterLandCard(); + filterForest.add(new SubtypePredicate("Forest")); + + // Destroy target land. Search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library. + this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); + this.getSpellAbility().addTarget(new TargetPermanent(new FilterLandPermanent())); + this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filterForest), true, true)); + } + + public MwonvuliAcidMoss(final MwonvuliAcidMoss card) { + super(card); + } + + @Override + public MwonvuliAcidMoss copy() { + return new MwonvuliAcidMoss(this); + } +} + From 1a93d3a96d249381f0553b72f0ee30ab623201a7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 11 Aug 2015 16:30:28 +0200 Subject: [PATCH 336/375] Fixed that if cards from opponents were cast, that spell cast triggered abilities from this cards or optional additional costs from this card (e.g. Buyback) were controlled by the casting player. --- .../sets/khansoftarkir/VillainousWealth.java | 42 +++++++++---------- .../UlamogTheInfiniteGyre.java | 12 +++--- .../mage/abilities/TriggeredAbilities.java | 4 ++ .../costs/OptionalAdditionalSourceCosts.java | 7 +++- .../abilities/keyword/BuybackAbility.java | 5 ++- 5 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java b/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java index 05f841c7266..919ade12531 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java @@ -33,6 +33,8 @@ import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; 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; @@ -41,7 +43,6 @@ import mage.filter.Filter; import mage.filter.FilterCard; import mage.filter.common.FilterNonlandCard; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; -import mage.game.ExileZone; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInExile; @@ -58,7 +59,6 @@ public class VillainousWealth extends CardImpl { super(ownerId, 211, "Villainous Wealth", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{X}{B}{G}{U}"); this.expansionSetCode = "KTK"; - // Target opponent exiles the top X cards of his or her library. You may cast any number of nonland cards with converted mana cost X or less from among them without paying their mana cost. this.getSpellAbility().addTarget(new TargetOpponent()); this.getSpellAbility().addEffect(new VillainousWealthEffect()); @@ -101,30 +101,26 @@ class VillainousWealthEffect extends OneShotEffect { filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, source.getManaCostsToPay().getX() + 1)); UUID exileId = CardUtil.getCardExileZoneId(game, source); if (player != null) { - - // putting cards to exile shouldn't end the game, so getting minimun available - int cardsCount = Math.min(source.getManaCostsToPay().getX(), player.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = player.getLibrary().getFromTop(game); - if (card != null) { - controller.moveCardToExileWithInfo(card, exileId, mageObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); + Cards cardsToExile = new CardsImpl(); + cardsToExile.addAll(player.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); + controller.moveCards(cardsToExile, null, Zone.EXILED, source, game, true); + if (controller.chooseUse(Outcome.PlayForFree, "Cast cards exiled with " + mageObject.getLogName() + " without paying its mana cost?", source, game)) { + OuterLoop: + while (cardsToExile.count(filter, game) > 0) { + TargetCardInExile target = new TargetCardInExile(0, 1, filter, exileId, false); + while (cardsToExile.count(filter, game) > 0 && controller.choose(Outcome.PlayForFree, cardsToExile, target, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + controller.cast(card.getSpellAbility(), game, true); + cardsToExile.remove(card); + } else { + break OuterLoop; + } + target.clearChosen(); + } } } } - ExileZone exileZone = game.getExile().getExileZone(exileId); - while (exileZone != null && exileZone.count(filter, game) > 0 - && controller.chooseUse(Outcome.PlayForFree, "Cast cards exiled with " + mageObject.getLogName() +" without paying its mana cost?", source, game)) { - TargetCardInExile target = new TargetCardInExile(0,1, filter, exileId, false); - while (exileZone.count(filter, game) > 0 && controller.choose(Outcome.PlayForFree, exileZone, target, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - controller.cast(card.getSpellAbility(), game, true); - } else { - break; - } - target.clearChosen(); - } - } return true; } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java index cbf82ffea26..7f3cf02de88 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java @@ -64,7 +64,7 @@ public class UlamogTheInfiniteGyre extends CardImpl { this.power = new MageInt(10); this.toughness = new MageInt(10); - + // When you cast Ulamog, the Infinite Gyre, destroy target permanent. this.addAbility(new UlamogTheInfiniteGyreDestroyOnCastAbility()); // Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.) @@ -87,7 +87,7 @@ public class UlamogTheInfiniteGyre extends CardImpl { class UlamogTheInfiniteGyreDestroyOnCastAbility extends TriggeredAbilityImpl { - UlamogTheInfiniteGyreDestroyOnCastAbility ( ) { + UlamogTheInfiniteGyreDestroyOnCastAbility() { super(Zone.STACK, new DestroyTargetEffect()); this.addTarget(new TargetPermanent()); } @@ -114,13 +114,13 @@ class UlamogTheInfiniteGyreDestroyOnCastAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return new StringBuilder("When you cast {this}, ").append(super.getRule()).toString(); + return "When you cast {this}, " + super.getRule(); } } class UlamogTheInfiniteGyreEnterGraveyardEffect extends OneShotEffect { - UlamogTheInfiniteGyreEnterGraveyardEffect ( ) { + UlamogTheInfiniteGyreEnterGraveyardEffect() { super(Outcome.Benefit); staticText = "its owner shuffles his or her graveyard into his or her library"; } @@ -144,9 +144,9 @@ class UlamogTheInfiniteGyreEnterGraveyardEffect extends OneShotEffect { } Player player = game.getPlayer(ownerId); if (player != null) { - for (Card cardToMove: player.getGraveyard().getCards(game)) { + for (Card cardToMove : player.getGraveyard().getCards(game)) { cardToMove.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } + } player.shuffleLibrary(game); return true; } diff --git a/Mage/src/mage/abilities/TriggeredAbilities.java b/Mage/src/mage/abilities/TriggeredAbilities.java index 5bf7818a30a..969e3cb78fa 100644 --- a/Mage/src/mage/abilities/TriggeredAbilities.java +++ b/Mage/src/mage/abilities/TriggeredAbilities.java @@ -43,6 +43,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; +import mage.game.stack.Spell; /** * @@ -95,6 +96,9 @@ public class TriggeredAbilities extends ConcurrentHashMap Date: Tue, 11 Aug 2015 10:00:07 -0500 Subject: [PATCH 337/375] Implemented Allay, Civic Guildmage, and Forsaken Wastes. --- Mage.Sets/src/mage/sets/exodus/Allay.java | 65 ++++++++++ .../src/mage/sets/mirage/CivicGuildmage.java | 81 +++++++++++++ .../src/mage/sets/mirage/ForsakenWastes.java | 114 ++++++++++++++++++ 3 files changed, 260 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/exodus/Allay.java create mode 100644 Mage.Sets/src/mage/sets/mirage/CivicGuildmage.java create mode 100644 Mage.Sets/src/mage/sets/mirage/ForsakenWastes.java diff --git a/Mage.Sets/src/mage/sets/exodus/Allay.java b/Mage.Sets/src/mage/sets/exodus/Allay.java new file mode 100644 index 00000000000..f9e5abf1b14 --- /dev/null +++ b/Mage.Sets/src/mage/sets/exodus/Allay.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.exodus; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.BuybackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterEnchantmentPermanent; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class Allay extends CardImpl { + + public Allay(UUID ownerId) { + super(ownerId, 1, "Allay", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "EXO"; + + // Buyback {3} + this.addAbility(new BuybackAbility("{3}")); + + // Destroy target enchantment. + this.getSpellAbility().addTarget(new TargetPermanent(new FilterEnchantmentPermanent())); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + } + + public Allay(final Allay card) { + super(card); + } + + @Override + public Allay copy() { + return new Allay(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/CivicGuildmage.java b/Mage.Sets/src/mage/sets/mirage/CivicGuildmage.java new file mode 100644 index 00000000000..2a697a9af2b --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/CivicGuildmage.java @@ -0,0 +1,81 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CivicGuildmage extends CardImpl { + + public CivicGuildmage(UUID ownerId) { + super(ownerId, 211, "Civic Guildmage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {G}, {tap}: Target creature gets +0/+1 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(0, 1, Duration.EndOfTurn), new ManaCostsImpl("{G}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // {U}, {tap}: Put target creature you control on top of its owner's library. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibraryTargetEffect(true), new ManaCostsImpl("{U}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetControlledCreaturePermanent()); + this.addAbility(ability); + } + + public CivicGuildmage(final CivicGuildmage card) { + super(card); + } + + @Override + public CivicGuildmage copy() { + return new CivicGuildmage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/ForsakenWastes.java b/Mage.Sets/src/mage/sets/mirage/ForsakenWastes.java new file mode 100644 index 00000000000..00612501e4e --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/ForsakenWastes.java @@ -0,0 +1,114 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.abilities.effects.common.continuous.CantGainLifeAllEffect; +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.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.stack.Spell; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class ForsakenWastes extends CardImpl { + + public ForsakenWastes(UUID ownerId) { + super(ownerId, 23, "Forsaken Wastes", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + this.expansionSetCode = "MIR"; + this.supertype.add("World"); + + // Players can't gain life. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantGainLifeAllEffect())); + + // At the beginning of each player's upkeep, that player loses 1 life. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new LoseLifeTargetEffect(1), TargetController.ANY, false, true)); + + // Whenever Forsaken Wastes becomes the target of a spell, that spell's controller loses 5 life. + this.addAbility(new ForsakenWastesTriggeredAbility()); + } + + public ForsakenWastes(final ForsakenWastes card) { + super(card); + } + + @Override + public ForsakenWastes copy() { + return new ForsakenWastes(this); + } +} + +class ForsakenWastesTriggeredAbility extends TriggeredAbilityImpl { + + public ForsakenWastesTriggeredAbility() { + super(Zone.BATTLEFIELD, new LoseLifeTargetEffect(5), false); + } + + public ForsakenWastesTriggeredAbility(final ForsakenWastesTriggeredAbility ability) { + super(ability); + } + + @Override + public ForsakenWastesTriggeredAbility copy() { + return new ForsakenWastesTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.TARGETED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + MageObject eventSourceObject = game.getObject(event.getSourceId()); + if (eventSourceObject != null && event.getTargetId().equals(this.getSourceId())&& eventSourceObject instanceof Spell ) { + getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever {this} becomes the target of a spell, that spell's controller loses 5 life."; + } + +} From fcc67a5a604973dddb8a2a4908af40ce3b350e00 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 11 Aug 2015 23:12:52 -0500 Subject: [PATCH 338/375] Implemented 24 cards. Fixed some incorrect collector numbers in Ice Age. --- .../mage/sets/alliances/Reinforcements.java | 52 +++++++++ .../arabiannights/IslandFishJasconius.java | 52 +++++++++ .../mage/sets/fifthedition/BlessedWine.java | 64 +++++++++++ .../src/mage/sets/fifthedition/Flare.java | 66 +++++++++++ .../sets/fifthedition/KrovikanFetish.java | 80 +++++++++++++ .../src/mage/sets/fifthedition/TimeBomb.java | 52 +++++++++ .../src/mage/sets/fifthedition/Updraft.java | 54 +++++++++ .../fourthedition/IslandFishJasconius.java | 89 +++++++++++++++ .../src/mage/sets/iceage/BlessedWine.java | 52 +++++++++ Mage.Sets/src/mage/sets/iceage/Flare.java | 52 +++++++++ Mage.Sets/src/mage/sets/iceage/Infuse.java | 78 +++++++++++++ .../src/mage/sets/iceage/KrovikanFetish.java | 52 +++++++++ Mage.Sets/src/mage/sets/iceage/MindWarp.java | 2 +- .../src/mage/sets/iceage/SkeletonShip.java | 80 +++++++++++++ Mage.Sets/src/mage/sets/iceage/TimeBomb.java | 52 +++++++++ Mage.Sets/src/mage/sets/iceage/Updraft.java | 68 +++++++++++ .../src/mage/sets/judgment/NantukoTracer.java | 68 +++++++++++ .../sets/masterseditionii/KrovikanFetish.java | 52 +++++++++ .../sets/masterseditionii/Reinforcements.java | 61 ++++++++++ .../sets/masterseditionii/SkeletonShip.java | 52 +++++++++ .../mage/sets/masterseditionii/TimeBomb.java | 78 +++++++++++++ .../mage/sets/masterseditioniii/Infuse.java | 52 +++++++++ .../mercadianmasques/MagistratesVeto.java | 73 ++++++++++++ .../src/mage/sets/mirage/BoneHarvest.java | 67 +++++++++++ Mage.Sets/src/mage/sets/mirage/Flare.java | 52 +++++++++ Mage.Sets/src/mage/sets/mirage/Jolt.java | 78 +++++++++++++ Mage.Sets/src/mage/sets/mirage/Taniwha.java | 108 ++++++++++++++++++ .../src/mage/sets/nemesis/TricksterMage.java | 86 ++++++++++++++ .../src/mage/sets/prophecy/Flameshot.java | 74 ++++++++++++ .../revisededition/IslandFishJasconius.java | 52 +++++++++ .../src/mage/sets/scourge/SkirkVolcanist.java | 84 ++++++++++++++ Mage.Sets/src/mage/sets/tempest/Stun.java | 7 +- .../mage/sets/torment/BarbarianOutcast.java | 77 +++++++++++++ .../mage/sets/torment/FlashOfDefiance.java | 81 +++++++++++++ .../sets/urzasdestiny/CovetousDragon.java | 71 ++++++++++++ .../sets/urzasdestiny/TetheredGriffin.java | 71 ++++++++++++ .../src/mage/sets/visions/EmeraldCharm.java | 88 ++++++++++++++ .../src/mage/sets/visions/MagmaMine.java | 76 ++++++++++++ .../src/mage/sets/weatherlight/Downdraft.java | 82 +++++++++++++ Utils/mtg-cards-data.txt | 52 ++++----- 40 files changed, 2554 insertions(+), 33 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/alliances/Reinforcements.java create mode 100644 Mage.Sets/src/mage/sets/arabiannights/IslandFishJasconius.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/BlessedWine.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/Flare.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/KrovikanFetish.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/TimeBomb.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/Updraft.java create mode 100644 Mage.Sets/src/mage/sets/fourthedition/IslandFishJasconius.java create mode 100644 Mage.Sets/src/mage/sets/iceage/BlessedWine.java create mode 100644 Mage.Sets/src/mage/sets/iceage/Flare.java create mode 100644 Mage.Sets/src/mage/sets/iceage/Infuse.java create mode 100644 Mage.Sets/src/mage/sets/iceage/KrovikanFetish.java create mode 100644 Mage.Sets/src/mage/sets/iceage/SkeletonShip.java create mode 100644 Mage.Sets/src/mage/sets/iceage/TimeBomb.java create mode 100644 Mage.Sets/src/mage/sets/iceage/Updraft.java create mode 100644 Mage.Sets/src/mage/sets/judgment/NantukoTracer.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/KrovikanFetish.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/Reinforcements.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/SkeletonShip.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/TimeBomb.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/Infuse.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/MagistratesVeto.java create mode 100644 Mage.Sets/src/mage/sets/mirage/BoneHarvest.java create mode 100644 Mage.Sets/src/mage/sets/mirage/Flare.java create mode 100644 Mage.Sets/src/mage/sets/mirage/Jolt.java create mode 100644 Mage.Sets/src/mage/sets/mirage/Taniwha.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/TricksterMage.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/Flameshot.java create mode 100644 Mage.Sets/src/mage/sets/revisededition/IslandFishJasconius.java create mode 100644 Mage.Sets/src/mage/sets/scourge/SkirkVolcanist.java create mode 100644 Mage.Sets/src/mage/sets/torment/BarbarianOutcast.java create mode 100644 Mage.Sets/src/mage/sets/torment/FlashOfDefiance.java create mode 100644 Mage.Sets/src/mage/sets/urzasdestiny/CovetousDragon.java create mode 100644 Mage.Sets/src/mage/sets/urzasdestiny/TetheredGriffin.java create mode 100644 Mage.Sets/src/mage/sets/visions/EmeraldCharm.java create mode 100644 Mage.Sets/src/mage/sets/visions/MagmaMine.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/Downdraft.java diff --git a/Mage.Sets/src/mage/sets/alliances/Reinforcements.java b/Mage.Sets/src/mage/sets/alliances/Reinforcements.java new file mode 100644 index 00000000000..9cf544f1282 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/Reinforcements.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Reinforcements extends mage.sets.masterseditionii.Reinforcements { + + public Reinforcements(UUID ownerId) { + super(ownerId); + this.cardNumber = 142; + this.expansionSetCode = "ALL"; + } + + public Reinforcements(final Reinforcements card) { + super(card); + } + + @Override + public Reinforcements copy() { + return new Reinforcements(this); + } +} diff --git a/Mage.Sets/src/mage/sets/arabiannights/IslandFishJasconius.java b/Mage.Sets/src/mage/sets/arabiannights/IslandFishJasconius.java new file mode 100644 index 00000000000..165b82a7109 --- /dev/null +++ b/Mage.Sets/src/mage/sets/arabiannights/IslandFishJasconius.java @@ -0,0 +1,52 @@ +/* + * 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.arabiannights; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class IslandFishJasconius extends mage.sets.fourthedition.IslandFishJasconius { + + public IslandFishJasconius(UUID ownerId) { + super(ownerId); + this.cardNumber = 22; + this.expansionSetCode = "ARN"; + } + + public IslandFishJasconius(final IslandFishJasconius card) { + super(card); + } + + @Override + public IslandFishJasconius copy() { + return new IslandFishJasconius(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/BlessedWine.java b/Mage.Sets/src/mage/sets/fifthedition/BlessedWine.java new file mode 100644 index 00000000000..2775748e3ea --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/BlessedWine.java @@ -0,0 +1,64 @@ +/* + * 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.fifthedition; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class BlessedWine extends CardImpl { + + public BlessedWine(UUID ownerId) { + super(ownerId, 287, "Blessed Wine", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "5ED"; + + // You gain 1 life. + this.getSpellAbility().addEffect(new GainLifeEffect(1)); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public BlessedWine(final BlessedWine card) { + super(card); + } + + @Override + public BlessedWine copy() { + return new BlessedWine(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/Flare.java b/Mage.Sets/src/mage/sets/fifthedition/Flare.java new file mode 100644 index 00000000000..9a11b49dbd9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/Flare.java @@ -0,0 +1,66 @@ +/* + * 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.fifthedition; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class Flare extends CardImpl { + + public Flare(UUID ownerId) { + super(ownerId, 11, "Flare", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}"); + this.expansionSetCode = "5ED"; + + // Flare deals 1 damage to target creature or player. + this.getSpellAbility().addEffect(new DamageTargetEffect(1)); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Flare(final Flare card) { + super(card); + } + + @Override + public Flare copy() { + return new Flare(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/KrovikanFetish.java b/Mage.Sets/src/mage/sets/fifthedition/KrovikanFetish.java new file mode 100644 index 00000000000..b0737e4e546 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/KrovikanFetish.java @@ -0,0 +1,80 @@ +/* + * 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.fifthedition; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class KrovikanFetish extends CardImpl { + + public KrovikanFetish(UUID ownerId) { + super(ownerId, 34, "Krovikan Fetish", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + this.expansionSetCode = "5ED"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Krovikan Fetish enters the battlefield, draw a card at the beginning of the next turn's upkeep. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); + + // Enchanted creature gets +1/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield))); + } + + public KrovikanFetish(final KrovikanFetish card) { + super(card); + } + + @Override + public KrovikanFetish copy() { + return new KrovikanFetish(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/TimeBomb.java b/Mage.Sets/src/mage/sets/fifthedition/TimeBomb.java new file mode 100644 index 00000000000..02b17e3aa86 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/TimeBomb.java @@ -0,0 +1,52 @@ +/* + * 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.fifthedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class TimeBomb extends mage.sets.masterseditionii.TimeBomb { + + public TimeBomb(UUID ownerId) { + super(ownerId); + this.cardNumber = 404; + this.expansionSetCode = "5ED"; + } + + public TimeBomb(final TimeBomb card) { + super(card); + } + + @Override + public TimeBomb copy() { + return new TimeBomb(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/Updraft.java b/Mage.Sets/src/mage/sets/fifthedition/Updraft.java new file mode 100644 index 00000000000..7b8982eed8d --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/Updraft.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.fifthedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class Updraft extends mage.sets.iceage.Updraft { + + public Updraft(UUID ownerId) { + super(ownerId); + this.cardNumber = 133; + this.expansionSetCode = "5ED"; + this.rarity = Rarity.COMMON; + } + + public Updraft(final Updraft card) { + super(card); + } + + @Override + public Updraft copy() { + return new Updraft(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fourthedition/IslandFishJasconius.java b/Mage.Sets/src/mage/sets/fourthedition/IslandFishJasconius.java new file mode 100644 index 00000000000..fd840a61c28 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/IslandFishJasconius.java @@ -0,0 +1,89 @@ +/* + * 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.fourthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.UntapSourceEffect; +import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.Filter; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author fireshoes + */ +public class IslandFishJasconius extends CardImpl { + + public IslandFishJasconius(UUID ownerId) { + super(ownerId, 78, "Island Fish Jasconius", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{U}{U}{U}"); + this.expansionSetCode = "4ED"; + this.subtype.add("Fish"); + this.power = new MageInt(6); + this.toughness = new MageInt(8); + + // Island Fish Jasconius doesn't untap during your untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepSourceEffect())); + + // At the beginning of your upkeep, you may pay {U}{U}{U}. If you do, untap Island Fish Jasconius. + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + Zone.BATTLEFIELD, + new DoIfCostPaid(new UntapSourceEffect(), new ManaCostsImpl("{U}{U}{U}")), + TargetController.YOU, + false)); + + // Island Fish Jasconius can't attack unless defending player controls an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island")))); + + // When you control no Islands, sacrifice Island Fish Jasconius. + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + } + + public IslandFishJasconius(final IslandFishJasconius card) { + super(card); + } + + @Override + public IslandFishJasconius copy() { + return new IslandFishJasconius(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/BlessedWine.java b/Mage.Sets/src/mage/sets/iceage/BlessedWine.java new file mode 100644 index 00000000000..106007dcc35 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/BlessedWine.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class BlessedWine extends mage.sets.fifthedition.BlessedWine { + + public BlessedWine(UUID ownerId) { + super(ownerId); + this.cardNumber = 231; + this.expansionSetCode = "ICE"; + } + + public BlessedWine(final BlessedWine card) { + super(card); + } + + @Override + public BlessedWine copy() { + return new BlessedWine(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/Flare.java b/Mage.Sets/src/mage/sets/iceage/Flare.java new file mode 100644 index 00000000000..417b3ffdb1e --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/Flare.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Flare extends mage.sets.fifthedition.Flare { + + public Flare(UUID ownerId) { + super(ownerId); + this.cardNumber = 185; + this.expansionSetCode = "ICE"; + } + + public Flare(final Flare card) { + super(card); + } + + @Override + public Flare copy() { + return new Flare(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/Infuse.java b/Mage.Sets/src/mage/sets/iceage/Infuse.java new file mode 100644 index 00000000000..d531e6be499 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/Infuse.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.iceage; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class Infuse extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact, creature, or land"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public Infuse(UUID ownerId) { + super(ownerId, 80, "Infuse", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{U}"); + this.expansionSetCode = "ICE"; + + // Untap target artifact, creature, or land. + this.getSpellAbility().addEffect(new UntapTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Infuse(final Infuse card) { + super(card); + } + + @Override + public Infuse copy() { + return new Infuse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/KrovikanFetish.java b/Mage.Sets/src/mage/sets/iceage/KrovikanFetish.java new file mode 100644 index 00000000000..88688aeb24d --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/KrovikanFetish.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class KrovikanFetish extends mage.sets.fifthedition.KrovikanFetish { + + public KrovikanFetish(UUID ownerId) { + super(ownerId); + this.cardNumber = 28; + this.expansionSetCode = "ICE"; + } + + public KrovikanFetish(final KrovikanFetish card) { + super(card); + } + + @Override + public KrovikanFetish copy() { + return new KrovikanFetish(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/MindWarp.java b/Mage.Sets/src/mage/sets/iceage/MindWarp.java index d64c55a9dc5..0d6cbb17f83 100644 --- a/Mage.Sets/src/mage/sets/iceage/MindWarp.java +++ b/Mage.Sets/src/mage/sets/iceage/MindWarp.java @@ -43,7 +43,7 @@ import mage.target.TargetPlayer; public class MindWarp extends CardImpl { public MindWarp(UUID ownerId) { - super(ownerId, 14, "Mind Warp", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{X}{3}{B}"); + super(ownerId, 36, "Mind Warp", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{X}{3}{B}"); this.expansionSetCode = "ICE"; diff --git a/Mage.Sets/src/mage/sets/iceage/SkeletonShip.java b/Mage.Sets/src/mage/sets/iceage/SkeletonShip.java new file mode 100644 index 00000000000..38a31f5b63c --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/SkeletonShip.java @@ -0,0 +1,80 @@ +/* + * 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.iceage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.Filter; +import mage.filter.common.FilterLandPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class SkeletonShip extends CardImpl { + + public SkeletonShip(UUID ownerId) { + super(ownerId, 379, "Skeleton Ship", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "ICE"; + this.supertype.add("Legendary"); + this.subtype.add("Skeleton"); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // When you control no Islands, sacrifice Skeleton Ship. + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + + // {tap}: Put a -1/-1 counter on target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.M1M1.createInstance()), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public SkeletonShip(final SkeletonShip card) { + super(card); + } + + @Override + public SkeletonShip copy() { + return new SkeletonShip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/TimeBomb.java b/Mage.Sets/src/mage/sets/iceage/TimeBomb.java new file mode 100644 index 00000000000..a707e9dc092 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/TimeBomb.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class TimeBomb extends mage.sets.masterseditionii.TimeBomb { + + public TimeBomb(UUID ownerId) { + super(ownerId); + this.cardNumber = 317; + this.expansionSetCode = "ICE"; + } + + public TimeBomb(final TimeBomb card) { + super(card); + } + + @Override + public TimeBomb copy() { + return new TimeBomb(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/Updraft.java b/Mage.Sets/src/mage/sets/iceage/Updraft.java new file mode 100644 index 00000000000..64254f22b38 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/Updraft.java @@ -0,0 +1,68 @@ +/* + * 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.iceage; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Updraft extends CardImpl { + + public Updraft(UUID ownerId) { + super(ownerId, 105, "Updraft", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "ICE"; + + // Target creature gains flying until end of turn. + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Updraft(final Updraft card) { + super(card); + } + + @Override + public Updraft copy() { + return new Updraft(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/NantukoTracer.java b/Mage.Sets/src/mage/sets/judgment/NantukoTracer.java new file mode 100644 index 00000000000..e0752b818d2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/NantukoTracer.java @@ -0,0 +1,68 @@ +/* + * 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.judgment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author fireshoes + */ +public class NantukoTracer extends CardImpl { + + public NantukoTracer(UUID ownerId) { + super(ownerId, 125, "Nantuko Tracer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "JUD"; + this.subtype.add("Insect"); + this.subtype.add("Druid"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // When Nantuko Tracer enters the battlefield, you may put target card from a graveyard on the bottom of its owner's library. + Ability ability = new EntersBattlefieldTriggeredAbility(new PutOnLibraryTargetEffect(false), true); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + } + + public NantukoTracer(final NantukoTracer card) { + super(card); + } + + @Override + public NantukoTracer copy() { + return new NantukoTracer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/KrovikanFetish.java b/Mage.Sets/src/mage/sets/masterseditionii/KrovikanFetish.java new file mode 100644 index 00000000000..dd4f06c1a9b --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/KrovikanFetish.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class KrovikanFetish extends mage.sets.fifthedition.KrovikanFetish { + + public KrovikanFetish(UUID ownerId) { + super(ownerId); + this.cardNumber = 100; + this.expansionSetCode = "ME2"; + } + + public KrovikanFetish(final KrovikanFetish card) { + super(card); + } + + @Override + public KrovikanFetish copy() { + return new KrovikanFetish(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/Reinforcements.java b/Mage.Sets/src/mage/sets/masterseditionii/Reinforcements.java new file mode 100644 index 00000000000..b348961ba26 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/Reinforcements.java @@ -0,0 +1,61 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class Reinforcements extends CardImpl { + + public Reinforcements(UUID ownerId) { + super(ownerId, 28, "Reinforcements", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}"); + this.expansionSetCode = "ME2"; + + // Put up to three target creature cards from your graveyard on top of your library. + this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 3, new FilterCreatureCard("creature cards from your graveyard"))); + } + + public Reinforcements(final Reinforcements card) { + super(card); + } + + @Override + public Reinforcements copy() { + return new Reinforcements(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/SkeletonShip.java b/Mage.Sets/src/mage/sets/masterseditionii/SkeletonShip.java new file mode 100644 index 00000000000..96b1af5b4e6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/SkeletonShip.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class SkeletonShip extends mage.sets.iceage.SkeletonShip { + + public SkeletonShip(UUID ownerId) { + super(ownerId); + this.cardNumber = 197; + this.expansionSetCode = "ME2"; + } + + public SkeletonShip(final SkeletonShip card) { + super(card); + } + + @Override + public SkeletonShip copy() { + return new SkeletonShip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/TimeBomb.java b/Mage.Sets/src/mage/sets/masterseditionii/TimeBomb.java new file mode 100644 index 00000000000..d71d59a7ea7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/TimeBomb.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.masterseditionii; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.dynamicvalue.common.CountersCount; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class TimeBomb extends CardImpl { + + public TimeBomb(UUID ownerId) { + super(ownerId, 223, "Time Bomb", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}"); + this.expansionSetCode = "ME2"; + + // At the beginning of your upkeep, put a time counter on Time Bomb. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(), true), TargetController.YOU, false)); + + // {1}, {tap}, Sacrifice Time Bomb: Time Bomb deals damage equal to the number of time counters on it to each creature and each player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new DamageEverythingEffect(new CountersCount(CounterType.TIME), new FilterCreaturePermanent()), + new GenericManaCost(1)); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public TimeBomb(final TimeBomb card) { + super(card); + } + + @Override + public TimeBomb copy() { + return new TimeBomb(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/Infuse.java b/Mage.Sets/src/mage/sets/masterseditioniii/Infuse.java new file mode 100644 index 00000000000..a67a3b3f188 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/Infuse.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Infuse extends mage.sets.iceage.Infuse { + + public Infuse(UUID ownerId) { + super(ownerId); + this.cardNumber = 38; + this.expansionSetCode = "ME3"; + } + + public Infuse(final Infuse card) { + super(card); + } + + @Override + public Infuse copy() { + return new Infuse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/MagistratesVeto.java b/Mage.Sets/src/mage/sets/mercadianmasques/MagistratesVeto.java new file mode 100644 index 00000000000..88a61653bb4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/MagistratesVeto.java @@ -0,0 +1,73 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantBlockAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author fireshoes + */ +public class MagistratesVeto extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("white creatures and blue creatures"); + + static { + filter.add(Predicates.or( + new ColorPredicate(ObjectColor.WHITE), + new ColorPredicate(ObjectColor.BLUE))); + } + + public MagistratesVeto(UUID ownerId) { + super(ownerId, 204, "Magistrate's Veto", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + this.expansionSetCode = "MMQ"; + + // White creatures and blue creatures can't block. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAllEffect(filter, Duration.WhileOnBattlefield))); + } + + public MagistratesVeto(final MagistratesVeto card) { + super(card); + } + + @Override + public MagistratesVeto copy() { + return new MagistratesVeto(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/BoneHarvest.java b/Mage.Sets/src/mage/sets/mirage/BoneHarvest.java new file mode 100644 index 00000000000..0d770f08eaf --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/BoneHarvest.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.mirage; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class BoneHarvest extends CardImpl { + + public BoneHarvest(UUID ownerId) { + super(ownerId, 6, "Bone Harvest", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{B}"); + this.expansionSetCode = "MIR"; + + // Put any number of target creature cards from your graveyard on top of your library. + this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard"))); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public BoneHarvest(final BoneHarvest card) { + super(card); + } + + @Override + public BoneHarvest copy() { + return new BoneHarvest(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/Flare.java b/Mage.Sets/src/mage/sets/mirage/Flare.java new file mode 100644 index 00000000000..967557d19a9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/Flare.java @@ -0,0 +1,52 @@ +/* + * 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.mirage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Flare extends mage.sets.fifthedition.Flare { + + public Flare(UUID ownerId) { + super(ownerId); + this.cardNumber = 176; + this.expansionSetCode = "MIR"; + } + + public Flare(final Flare card) { + super(card); + } + + @Override + public Flare copy() { + return new Flare(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/Jolt.java b/Mage.Sets/src/mage/sets/mirage/Jolt.java new file mode 100644 index 00000000000..820ea3ba0e0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/Jolt.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.mirage; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.MayTapOrUntapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class Jolt extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact, creature, or land"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public Jolt(UUID ownerId) { + super(ownerId, 70, "Jolt", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{U}"); + this.expansionSetCode = "MIR"; + + // You may tap or untap target artifact, creature, or land. + this.getSpellAbility().addEffect(new MayTapOrUntapTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Jolt(final Jolt card) { + super(card); + } + + @Override + public Jolt copy() { + return new Jolt(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/Taniwha.java b/Mage.Sets/src/mage/sets/mirage/Taniwha.java new file mode 100644 index 00000000000..fb71c293fe1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/Taniwha.java @@ -0,0 +1,108 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.PhasingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class Taniwha extends CardImpl { + + public Taniwha(UUID ownerId) { + super(ownerId, 95, "Taniwha", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "MIR"; + this.supertype.add("Legendary"); + this.subtype.add("Serpent"); + this.power = new MageInt(7); + this.toughness = new MageInt(7); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Phasing + this.addAbility(PhasingAbility.getInstance()); + + // At the beginning of your upkeep, all lands you control phase out. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TaniwhaEffect(), TargetController.YOU, false)); + } + + public Taniwha(final Taniwha card) { + super(card); + } + + @Override + public Taniwha copy() { + return new Taniwha(this); + } +} + +class TaniwhaEffect extends OneShotEffect { + + public TaniwhaEffect() { + super(Outcome.Detriment); + this.staticText = "all lands you control phase out"; + } + + public TaniwhaEffect(final TaniwhaEffect effect) { + super(effect); + } + + @Override + public TaniwhaEffect copy() { + return new TaniwhaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), controller.getId(), game)) { + permanent.phaseOut(game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/TricksterMage.java b/Mage.Sets/src/mage/sets/nemesis/TricksterMage.java new file mode 100644 index 00000000000..771161cf3c7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/TricksterMage.java @@ -0,0 +1,86 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.MayTapOrUntapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class TricksterMage extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact, creature, or land"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public TricksterMage(UUID ownerId) { + super(ownerId, 49, "Trickster Mage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{U}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Human"); + this.subtype.add("Spellshaper"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {U}, {tap}, Discard a card: You may tap or untap target artifact, creature, or land. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MayTapOrUntapTargetEffect(), new ManaCostsImpl("{U}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public TricksterMage(final TricksterMage card) { + super(card); + } + + @Override + public TricksterMage copy() { + return new TricksterMage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/Flameshot.java b/Mage.Sets/src/mage/sets/prophecy/Flameshot.java new file mode 100644 index 00000000000..b4ff94e68b9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/Flameshot.java @@ -0,0 +1,74 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.effects.common.DamageMultiEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCardInHand; +import mage.target.common.TargetCreaturePermanentAmount; + +/** + * + * @author fireshoes + */ +public class Flameshot extends CardImpl { + + private static final FilterCard filter = new FilterCard("a Mountain card"); + + static { + filter.add(new SubtypePredicate("Mountain")); + } + + public Flameshot(UUID ownerId) { + super(ownerId, 90, "Flameshot", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{R}"); + this.expansionSetCode = "PCY"; + + // You may discard a Mountain card rather than pay Flameshot's mana cost. + this.addAbility(new AlternativeCostSourceAbility(new DiscardTargetCost(new TargetCardInHand(filter)))); + + // Flameshot deals 3 damage divided as you choose among one, two, or three target creatures. + this.getSpellAbility().addEffect(new DamageMultiEffect(3)); + this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(3)); + } + + public Flameshot(final Flameshot card) { + super(card); + } + + @Override + public Flameshot copy() { + return new Flameshot(this); + } +} diff --git a/Mage.Sets/src/mage/sets/revisededition/IslandFishJasconius.java b/Mage.Sets/src/mage/sets/revisededition/IslandFishJasconius.java new file mode 100644 index 00000000000..a3174bbcb7a --- /dev/null +++ b/Mage.Sets/src/mage/sets/revisededition/IslandFishJasconius.java @@ -0,0 +1,52 @@ +/* + * 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.revisededition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class IslandFishJasconius extends mage.sets.fourthedition.IslandFishJasconius { + + public IslandFishJasconius(UUID ownerId) { + super(ownerId); + this.cardNumber = 61; + this.expansionSetCode = "3ED"; + } + + public IslandFishJasconius(final IslandFishJasconius card) { + super(card); + } + + @Override + public IslandFishJasconius copy() { + return new IslandFishJasconius(this); + } +} diff --git a/Mage.Sets/src/mage/sets/scourge/SkirkVolcanist.java b/Mage.Sets/src/mage/sets/scourge/SkirkVolcanist.java new file mode 100644 index 00000000000..383c25f0006 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scourge/SkirkVolcanist.java @@ -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.scourge; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageMultiEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanentAmount; + +/** + * + * @author fireshoes + */ +public class SkirkVolcanist extends CardImpl { + + private static final FilterControlledLandPermanent filterSacrifice = new FilterControlledLandPermanent("two Mountains"); + + static { + filterSacrifice.add(new SubtypePredicate("Mountain")); + } + + public SkirkVolcanist(UUID ownerId) { + super(ownerId, 104, "Skirk Volcanist", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "SCG"; + this.subtype.add("Goblin"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Morph-Sacrifice two Mountains. + this.addAbility(new MorphAbility(this, new SacrificeTargetCost(new TargetControlledPermanent(2,2, filterSacrifice, false)))); + + // When Skirk Volcanist is turned face up, it deals 3 damage divided as you choose among one, two, or three target creatures. + Effect effect = new DamageMultiEffect(3); + effect.setText("it deals 3 damage divided as you choose among one, two, or three target creatures"); + Ability ability = new TurnedFaceUpSourceTriggeredAbility(effect); + ability.addTarget(new TargetCreaturePermanentAmount(3)); + this.addAbility(ability); + } + + public SkirkVolcanist(final SkirkVolcanist card) { + super(card); + } + + @Override + public SkirkVolcanist copy() { + return new SkirkVolcanist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/Stun.java b/Mage.Sets/src/mage/sets/tempest/Stun.java index 82cc6f5cb77..ecaa81eac69 100644 --- a/Mage.Sets/src/mage/sets/tempest/Stun.java +++ b/Mage.Sets/src/mage/sets/tempest/Stun.java @@ -28,9 +28,6 @@ package mage.sets.tempest; import java.util.UUID; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; - -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.cards.CardImpl; @@ -50,10 +47,8 @@ public class Stun extends CardImpl { this.expansionSetCode = "TMP"; // Target creature can't block this turn. - Effect effect = new CantBlockTargetEffect(Duration.EndOfTurn); - effect.setText("Target creature can't block this turn."); - this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new CantBlockTargetEffect(Duration.EndOfTurn)); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/sets/torment/BarbarianOutcast.java b/Mage.Sets/src/mage/sets/torment/BarbarianOutcast.java new file mode 100644 index 00000000000..0becdaa5ed7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/BarbarianOutcast.java @@ -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.torment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class BarbarianOutcast extends CardImpl { + + private static final FilterControlledLandPermanent filterControlledLand = new FilterControlledLandPermanent("a Swamp"); + + static { + filterControlledLand.add(new SubtypePredicate("Swamp")); + } + + public BarbarianOutcast(UUID ownerId) { + super(ownerId, 92, "Barbarian Outcast", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Human"); + this.subtype.add("Barbarian"); + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When you control no Swamps, sacrifice Barbarian Outcast. + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterLandPermanent("Swamp", "no Swamps"), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + } + + public BarbarianOutcast(final BarbarianOutcast card) { + super(card); + } + + @Override + public BarbarianOutcast copy() { + return new BarbarianOutcast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/FlashOfDefiance.java b/Mage.Sets/src/mage/sets/torment/FlashOfDefiance.java new file mode 100644 index 00000000000..b537c088f8c --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/FlashOfDefiance.java @@ -0,0 +1,81 @@ +/* + * 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.torment; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantBlockAllEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TimingRule; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author fireshoes + */ +public class FlashOfDefiance extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("green creatures and white creatures"); + + static { + filter.add(Predicates.or( + new ColorPredicate(ObjectColor.WHITE), + new ColorPredicate(ObjectColor.GREEN))); + } + + public FlashOfDefiance(UUID ownerId) { + super(ownerId, 99, "Flash of Defiance", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{R}"); + this.expansionSetCode = "TOR"; + + // Green creatures and white creatures can't block this turn. + this.getSpellAbility().addEffect(new CantBlockAllEffect(filter, Duration.EndOfTurn)); + + // Flashback-{1}{R}, Pay 3 life. + Ability ability = new FlashbackAbility(new ManaCostsImpl("{1}{R}"), TimingRule.SORCERY); + ability.addCost(new PayLifeCost(3)); + this.addAbility(ability); + } + + public FlashOfDefiance(final FlashOfDefiance card) { + super(card); + } + + @Override + public FlashOfDefiance copy() { + return new FlashOfDefiance(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/CovetousDragon.java b/Mage.Sets/src/mage/sets/urzasdestiny/CovetousDragon.java new file mode 100644 index 00000000000..03d130e3e28 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzasdestiny/CovetousDragon.java @@ -0,0 +1,71 @@ +/* + * 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.urzasdestiny; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterArtifactPermanent; + +/** + * + * @author fireshoes + */ +public class CovetousDragon extends CardImpl { + + public CovetousDragon(UUID ownerId) { + super(ownerId, 80, "Covetous Dragon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{R}"); + this.expansionSetCode = "UDS"; + this.subtype.add("Dragon"); + this.power = new MageInt(6); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When you control no artifacts, sacrifice Covetous Dragon. + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterArtifactPermanent(), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + } + + public CovetousDragon(final CovetousDragon card) { + super(card); + } + + @Override + public CovetousDragon copy() { + return new CovetousDragon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/TetheredGriffin.java b/Mage.Sets/src/mage/sets/urzasdestiny/TetheredGriffin.java new file mode 100644 index 00000000000..85da8fd853b --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzasdestiny/TetheredGriffin.java @@ -0,0 +1,71 @@ +/* + * 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.urzasdestiny; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterEnchantmentPermanent; + +/** + * + * @author fireshoes + */ +public class TetheredGriffin extends CardImpl { + + public TetheredGriffin(UUID ownerId) { + super(ownerId, 21, "Tethered Griffin", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{W}"); + this.expansionSetCode = "UDS"; + this.subtype.add("Griffin"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When you control no enchantments, sacrifice Tethered Griffin. + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + new FilterEnchantmentPermanent(), Filter.ComparisonType.Equal, 0, + new SacrificeSourceEffect())); + } + + public TetheredGriffin(final TetheredGriffin card) { + super(card); + } + + @Override + public TetheredGriffin copy() { + return new TetheredGriffin(this); + } +} diff --git a/Mage.Sets/src/mage/sets/visions/EmeraldCharm.java b/Mage.Sets/src/mage/sets/visions/EmeraldCharm.java new file mode 100644 index 00000000000..9897e61e069 --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/EmeraldCharm.java @@ -0,0 +1,88 @@ +/* + * 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.visions; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterEnchantmentPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetEnchantmentPermanent; + +/** + * + * @author fireshoes + */ +public class EmeraldCharm extends CardImpl { + + private static final FilterEnchantmentPermanent filter = new FilterEnchantmentPermanent("non-Aura enchantment"); + + static { + filter.add(Predicates.not(new SubtypePredicate("Aura"))); + } + + public EmeraldCharm(UUID ownerId) { + super(ownerId, 56, "Emerald Charm", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{G}"); + this.expansionSetCode = "VIS"; + + // Choose one - Untap target permanent; + this.getSpellAbility().addEffect(new UntapTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent()); + + // or destroy target non-Aura enchantment; + Mode mode = new Mode(); + mode.getEffects().add(new DestroyTargetEffect()); + mode.getTargets().add(new TargetEnchantmentPermanent(filter)); + this.getSpellAbility().addMode(mode); + + // or target creature loses flying until end of turn. + mode = new Mode(); + mode.getEffects().add(new LoseAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn)); + mode.getTargets().add(new TargetCreaturePermanent()); + this.getSpellAbility().addMode(mode); + } + + public EmeraldCharm(final EmeraldCharm card) { + super(card); + } + + @Override + public EmeraldCharm copy() { + return new EmeraldCharm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/visions/MagmaMine.java b/Mage.Sets/src/mage/sets/visions/MagmaMine.java new file mode 100644 index 00000000000..aac5b04b731 --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/MagmaMine.java @@ -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.visions; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.dynamicvalue.common.CountersCount; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class MagmaMine extends CardImpl { + + public MagmaMine(UUID ownerId) { + super(ownerId, 149, "Magma Mine", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}"); + this.expansionSetCode = "VIS"; + + // {4}: Put a pressure counter on Magma Mine. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new AddCountersSourceEffect(CounterType.PRESSURE.createInstance(), true), + new GenericManaCost(4))); + + // {tap}, Sacrifice Magma Mine: Magma Mine deals damage equal to the number of pressure counters on it to target creature or player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new CountersCount(CounterType.PRESSURE)), new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public MagmaMine(final MagmaMine card) { + super(card); + } + + @Override + public MagmaMine copy() { + return new MagmaMine(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/Downdraft.java b/Mage.Sets/src/mage/sets/weatherlight/Downdraft.java new file mode 100644 index 00000000000..0ec3c65aaf9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/Downdraft.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.weatherlight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Downdraft extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public Downdraft(UUID ownerId) { + super(ownerId, 67, "Downdraft", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + this.expansionSetCode = "WTH"; + + // {G}: Target creature loses flying until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new LoseAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), + new ManaCostsImpl("{G}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Sacrifice Downdraft: Downdraft deals 2 damage to each creature with flying. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageAllEffect(2, filter), new SacrificeSourceCost())); + } + + public Downdraft(final Downdraft card) { + super(card); + } + + @Override + public Downdraft copy() { + return new Downdraft(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index e70d9748735..16b1a1bce1d 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -6708,10 +6708,10 @@ Dire Wolves|Ice Age|118|C|{2}{G}|Creature - Wolf|2|2|Dire Wolves has banding as Earthlore|Ice Age|119|C|{G}|Enchantment - Aura|||Enchant land you control$Tap enchanted land: Target blocking creature gets +1/+2 until end of turn. Activate this ability only if enchanted land is untapped.| Fear|Ice Age|12|C|{B}{B}|Enchantment - Aura|||Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.)$Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.)| Elder Druid|Ice Age|120|R|{3}{G}|Creature - Elf Cleric Druid|2|2|{3}{G}, {tap}: You may tap or untap target artifact, creature, or land.| -Wiitigo|Ice Age|120|R|{3}{G}{G}{G}|Creature - Yeti|0|0|Wiitigo enters the battlefield with six +1/+1 counters on it.$At the beginning of your upkeep, put a +1/+1 counter on Wiitigo if it has blocked or been blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it.| +Wiitigo|Ice Age|164|R|{3}{G}{G}{G}|Creature - Yeti|0|0|Wiitigo enters the battlefield with six +1/+1 counters on it.$At the beginning of your upkeep, put a +1/+1 counter on Wiitigo if it has blocked or been blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it.| Essence Filter|Ice Age|121|C|{1}{G}{G}|Sorcery|||Destroy all enchantments or all nonwhite enchantments.| Fanatical Fever|Ice Age|122|U|{2}{G}{G}|Instant|||Target creature gets +3/+0 and gains trample until end of turn.| -Reclamation|Ice Age|122|R|{2}{G}{W}|Enchantment|||Black creatures can't attack unless their controller sacrifices a land for each black creature he or she controls that's attacking.| +Reclamation|Ice Age|378|R|{2}{G}{W}|Enchantment|||Black creatures can't attack unless their controller sacrifices a land for each black creature he or she controls that's attacking.| Folk of the Pines|Ice Age|123|C|{4}{G}|Creature - Dryad|2|5|{1}{G}: Folk of the Pines gets +1/+0 until end of turn.| Forbidden Lore|Ice Age|124|R|{2}{G}|Enchantment - Aura|||Enchant land$Enchanted land has "{tap}: Target creature gets +2/+1 until end of turn."| Forgotten Lore|Ice Age|125|U|{G}|Sorcery|||Target opponent chooses a card in your graveyard. You may pay {G}. If you do, repeat this process except that opponent can't choose a card already chosen for Forgotten Lore. Then put the last chosen card into your hand.| @@ -6731,7 +6731,7 @@ Hurricane|Ice Age|137|U|{X}{G}|Sorcery|||Hurricane deals X damage to each creatu Johtull Wurm|Ice Age|138|U|{5}{G}|Creature - Wurm|6|6|Whenever Johtull Wurm becomes blocked, it gets -2/-1 until end of turn for each creature blocking it beyond the first.| Juniper Order Druid|Ice Age|139|C|{2}{G}|Creature - Human Cleric Druid|1|1|{tap}: Untap target land.| Foul Familiar|Ice Age|14|C|{2}{B}|Creature - Spirit|3|1|Foul Familiar can't block.${B}, Pay 1 life: Return Foul Familiar to its owner's hand.| -Mind Warp|Ice Age|14|U|{X}{3}{B}|Sorcery|||Look at target player's hand and choose X cards from it. That player discards those cards.| +Mind Warp|Ice Age|36|U|{X}{3}{B}|Sorcery|||Look at target player's hand and choose X cards from it. That player discards those cards.| Lhurgoyf|Ice Age|140|R|{2}{G}{G}|Creature - Lhurgoyf|*|1+*|Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1.| Lure|Ice Age|141|U|{1}{G}{G}|Enchantment - Aura|||Enchant creature$All creatures able to block enchanted creature do so.| Maddening Wind|Ice Age|142|U|{2}{G}|Enchantment - Aura|||Enchant creature$Cumulative upkeep {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$At the beginning of the upkeep of enchanted creature's controller, Maddening Wind deals 2 damage to that player.| @@ -6745,7 +6745,7 @@ Ritual of Subdual|Ice Age|149|R|{4}{G}{G}|Enchantment|||Cumulative upkeep {2} (This creature can't attack.)$Sacrifice Tinder Wall: Add {R}{R} to your mana pool.${R}, Sacrifice Tinder Wall: Tinder Wall deals 2 damage to target creature it's blocking.| Touch of Vitae|Ice Age|159|U|{2}{G}|Instant|||Until end of turn, target creature gains haste and "{0}: Untap this creature. Activate this ability only once."$Draw a card at the beginning of the next turn's upkeep.| Gaze of Pain|Ice Age|16|C|{1}{B}|Sorcery|||Until end of turn, whenever a creature you control attacks and isn't blocked, you may choose to have it deal damage equal to its power to a target creature. If you do, it assigns no combat damage this turn.| -Warning|Ice Age|16|C|{W}|Instant|||Prevent all combat damage that would be dealt by target attacking creature this turn.| +Warning|Ice Age|279|C|{W}|Instant|||Prevent all combat damage that would be dealt by target attacking creature this turn.| Venomous Breath|Ice Age|161|U|{3}{G}|Instant|||Choose target creature. At end of combat, destroy all creatures that blocked or were blocked by it this turn.| Wall of Pine Needles|Ice Age|162|U|{3}{G}|Creature - Plant Wall|3|3|Defender (This creature can't attack.)${G}: Regenerate Wall of Pine Needles.| Whiteout|Ice Age|163|U|{1}{G}|Instant|||All creatures lose flying until end of turn.$Sacrifice a snow land: Return Whiteout from your graveyard to your hand.| @@ -6856,7 +6856,7 @@ Heal|Ice Age|254|C|{W}|Instant|||Prevent the next 1 damage that would be dealt t Hipparion|Ice Age|255|U|{1}{W}|Creature - Horse|1|3|Hipparion can't block creatures with power 3 or greater unless you pay {1}.| Kelsinko Ranger|Ice Age|257|C|{W}|Creature - Human|1|1|{1}{W}: Target green creature gains first strike until end of turn.| Kjeldoran Elite Guard|Ice Age|258|U|{3}{W}|Creature - Human Soldier|2|2|{tap}: Target creature gets +2/+2 until end of turn. When that creature leaves the battlefield this turn, sacrifice Kjeldoran Elite Guard. Activate this ability only during combat.| -Kjeldoran Guard|Ice Age|258|C|{1}{W}|Creature - Human Soldier|1|1|{tap}: Target creature gets +1/+1 until end of turn. When that creature leaves the battlefield this turn, sacrifice Kjeldoran Guard. Activate this ability only during combat and only if defending player controls no snow lands.| +Kjeldoran Guard|Ice Age|259|C|{1}{W}|Creature - Human Soldier|1|1|{tap}: Target creature gets +1/+1 until end of turn. When that creature leaves the battlefield this turn, sacrifice Kjeldoran Guard. Activate this ability only during combat and only if defending player controls no snow lands.| Knight of Stromgald|Ice Age|26|U|{B}{B}|Creature - Human Knight|2|1|Protection from white${B}: Knight of Stromgald gains first strike until end of turn.${B}{B}: Knight of Stromgald gets +1/+0 until end of turn.| Kjeldoran Knight|Ice Age|260|R|{W}{W}|Creature - Human Knight|1|1|Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)${1}{W}: Kjeldoran Knight gets +1/+0 until end of turn.${W}{W}: Kjeldoran Knight gets +0/+2 until end of turn.| Kjeldoran Phalanx|Ice Age|261|R|{5}{W}|Creature - Human Soldier|2|5|First strike; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)| @@ -6922,7 +6922,7 @@ Sunstone|Ice Age|316|U|{3}|Artifact|||{2}, Sacrifice a snow land: Prevent all co Time Bomb|Ice Age|317|R|{4}|Artifact|||At the beginning of your upkeep, put a time counter on Time Bomb.${1}, {tap}, Sacrifice Time Bomb: Time Bomb deals damage equal to the number of time counters on it to each creature and each player.| Urza's Bauble|Ice Age|318|U|{0}|Artifact|||{tap}, Sacrifice Urza's Bauble: Look at a card at random in target player's hand. You draw a card at the beginning of the next turn's upkeep.| Vexing Arcanix|Ice Age|319|R|{4}|Artifact|||{3}, {tap}: Target player names a card, then reveals the top card of his or her library. If it's the named card, the player puts it into his or her hand. Otherwise, the player puts it into his or her graveyard and Vexing Arcanix deals 2 damage to him or her.| -Land Cap|Ice Age|319|R||Land|||Land Cap doesn't untap during your untap step if it has a depletion counter on it.$At the beginning of your upkeep, remove a depletion counter from Land Cap.${tap}: Add {W} or {U} to your mana pool. Put a depletion counter on Land Cap.| +Land Cap|Ice Age|338|R||Land|||Land Cap doesn't untap during your untap step if it has a depletion counter on it.$At the beginning of your upkeep, remove a depletion counter from Land Cap.${tap}: Add {W} or {U} to your mana pool. Put a depletion counter on Land Cap.| Leshrac's Sigil|Ice Age|32|U|{B}{B}|Enchantment|||Whenever an opponent casts a green spell, you may pay {B}{B}. If you do, look at that player's hand and choose a card from it. The player discards that card.${B}{B}: Return Leshrac's Sigil to its owner's hand.| Vibrating Sphere|Ice Age|320|R|{4}|Artifact|||As long as it's your turn, creatures you control get +2/+0.$As long as it's not your turn, creatures you control get -0/-2.| Walking Wall|Ice Age|321|U|{4}|Artifact Creature - Wall|0|6|Defender${3}: Walking Wall gets +3/-1 until end of turn and can attack this turn as though it didn't have defender. Activate this ability only once each turn.| @@ -6933,24 +6933,24 @@ Zuran Orb|Ice Age|325|U|{0}|Artifact|||Sacrifice a land: You gain 2 life.| Adarkar Wastes|Ice Age|326|R||Land|||{tap}: Add {1} to your mana pool.${tap}: Add {W} or {U} to your mana pool. Adarkar Wastes deals 1 damage to you.| Brushland|Ice Age|327|R||Land|||{tap}: Add {1} to your mana pool.${tap}: Add {G} or {W} to your mana pool. Brushland deals 1 damage to you.| Forest|Ice Age|328|L||Basic Land - Forest|||G| -Forest|Ice Age|328|L||Basic Land - Forest|||G| -Forest|Ice Age|328|L||Basic Land - Forest|||G| +Forest|Ice Age|329|L||Basic Land - Forest|||G| +Forest|Ice Age|330|L||Basic Land - Forest|||G| Lim-Dul's Cohort|Ice Age|33|C|{1}{B}{B}|Creature - Zombie|2|3|Whenever Lim-Dûl's Cohort blocks or becomes blocked by a creature, that creature can't be regenerated this turn.| Glacial Chasm|Ice Age|331|U||Land|||Cumulative upkeep-Pay 2 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$When Glacial Chasm enters the battlefield, sacrifice a land.$Creatures you control can't attack.$Prevent all damage that would be dealt to you.| Halls of Mist|Ice Age|332|R||Land|||Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$Creatures that attacked during their controller's last turn can't attack.| Ice Floe|Ice Age|333|U||Land|||You may choose not to untap Ice Floe during your untap step.${tap}: Tap target creature without flying that's attacking you. It doesn't untap during its controller's untap step for as long as Ice Floe remains tapped.| Island|Ice Age|334|L||Basic Land - Island|||U| -Island|Ice Age|334|L||Basic Land - Island|||U| -Island|Ice Age|334|L||Basic Land - Island|||U| +Island|Ice Age|335|L||Basic Land - Island|||U| +Island|Ice Age|336|L||Basic Land - Island|||U| Karplusan Forest|Ice Age|337|R||Land|||{tap}: Add {1} to your mana pool.${tap}: Add {R} or {G} to your mana pool. Karplusan Forest deals 1 damage to you.| Lava Tubes|Ice Age|339|R||Land|||Lava Tubes doesn't untap during your untap step if it has a depletion counter on it.$At the beginning of your upkeep, remove a depletion counter from Lava Tubes.${tap}: Add {B} or {R} to your mana pool. Put a depletion counter on Lava Tubes.| Lim-Dul's Hex|Ice Age|34|U|{1}{B}|Enchantment|||At the beginning of your upkeep, for each player, Lim-Dûl's Hex deals 1 damage to that player unless he or she pays {B} or {3}.| Mountain|Ice Age|340|L||Basic Land - Mountain|||R| -Mountain|Ice Age|340|L||Basic Land - Mountain|||R| -Mountain|Ice Age|340|L||Basic Land - Mountain|||R| -Plains|Ice Age|343|L||Basic Land - Plains|||W| -Plains|Ice Age|343|L||Basic Land - Plains|||W| +Mountain|Ice Age|341|L||Basic Land - Mountain|||R| +Mountain|Ice Age|342|L||Basic Land - Mountain|||R| Plains|Ice Age|343|L||Basic Land - Plains|||W| +Plains|Ice Age|344|L||Basic Land - Plains|||W| +Plains|Ice Age|345|L||Basic Land - Plains|||W| River Delta|Ice Age|346|R||Land|||River Delta doesn't untap during your untap step if it has a depletion counter on it.$At the beginning of your upkeep, remove a depletion counter from River Delta.${tap}: Add {U} or {B} to your mana pool. Put a depletion counter on River Delta.| Snow-Covered Forest|Ice Age|347|L||Basic Snow Land - Forest|||G| Snow-Covered Island|Ice Age|348|L||Basic Snow Land - Island|||U| @@ -6958,9 +6958,9 @@ Snow-Covered Mountain|Ice Age|349|L||Basic Snow Land - Mountain|||R| Mind Ravel|Ice Age|35|C|{2}{B}|Sorcery|||Target player discards a card.$Draw a card at the beginning of the next turn's upkeep.| Snow-Covered Plains|Ice Age|350|L||Basic Snow Land - Plains|||W| Snow-Covered Swamp|Ice Age|351|L||Basic Snow Land - Swamp|||B| -Swamp|Ice Age|351|L||Basic Land - Swamp|||B| -Swamp|Ice Age|351|L||Basic Land - Swamp|||B| -Swamp|Ice Age|351|L||Basic Land - Swamp|||B| +Swamp|Ice Age|353|L||Basic Land - Swamp|||B| +Swamp|Ice Age|354|L||Basic Land - Swamp|||B| +Swamp|Ice Age|355|L||Basic Land - Swamp|||B| Sulfurous Springs|Ice Age|352|R||Land|||{tap}: Add {1} to your mana pool.${tap}: Add {B} or {R} to your mana pool. Sulfurous Springs deals 1 damage to you.| Timberline Ridge|Ice Age|356|R||Land|||Timberline Ridge doesn't untap during your untap step if it has a depletion counter on it.$At the beginning of your upkeep, remove a depletion counter from Timberline Ridge.${tap}: Add {R} or {G} to your mana pool. Put a depletion counter on Timberline Ridge.| Underground River|Ice Age|357|R||Land|||{tap}: Add {1} to your mana pool.${tap}: Add {U} or {B} to your mana pool. Underground River deals 1 damage to you.| @@ -6972,7 +6972,7 @@ Diabolic Vision|Ice Age|362|U|{U}{B}|Sorcery|||Look at the top five cards of you Earthlink|Ice Age|363|R|{3}{B}{R}{G}|Enchantment|||At the beginning of your upkeep, sacrifice Earthlink unless you pay {2}.$Whenever a creature dies, that creature's controller sacrifices a land.| Elemental Augury|Ice Age|364|R|{U}{B}{R}|Enchantment|||{3}: Look at the top three cards of target player's library, then put them back in any order.| Essence Vortex|Ice Age|365|U|{1}{U}{B}|Instant|||Destroy target creature unless its controller pays life equal to its toughness. A creature destroyed this way can't be regenerated.| -Justice|Ice Age|366|U|{2}{W}{W}|Enchantment|||At the beginning of your upkeep, sacrifice Justice unless you pay {W}{W}.$$Whenever a red creature or spell deals damage, Justice deals that much damage to that creature's or spell's controller.| +Justice|Ice Age|256|U|{2}{W}{W}|Enchantment|||At the beginning of your upkeep, sacrifice Justice unless you pay {W}{W}.$$Whenever a red creature or spell deals damage, Justice deals that much damage to that creature's or spell's controller.| Fiery Justice|Ice Age|366|R|{R}{G}{W}|Sorcery|||Fiery Justice deals 5 damage divided as you choose among any number of target creatures and/or players. Target opponent gains 5 life.| Fire Covenant|Ice Age|367|U|{1}{B}{R}|Instant|||As an additional cost to cast Fire Covenant, pay X life.$Fire Covenant deals X damage divided as you choose among any number of target creatures.| Flooded Woodlands|Ice Age|368|R|{2}{U}{B}|Enchantment|||Green creatures can't attack unless their controller sacrifices a land for each green creature he or she controls that's attacking.| @@ -6994,13 +6994,13 @@ Stormbind|Ice Age|382|R|{1}{R}{G}|Enchantment|||{2}, Discard a card at random: S Wings of Aesthir|Ice Age|383|U|{W}{U}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +1/+0 and has flying and first strike.| Minion of Tevesh Szat|Ice Age|39|R|{4}{B}{B}{B}|Creature - Demon Minion|4|4|At the beginning of your upkeep, Minion of Tevesh Szat deals 2 damage to you unless you pay {B}{B}.${tap}: Target creature gets +3/-2 until end of turn.| Burnt Offering|Ice Age|4|C|{B}|Instant|||As an additional cost to cast Burnt Offering, sacrifice a creature.$Add X mana in any combination of {B} and/or {R} to your mana pool, where X is the sacrificed creature's converted mana cost.| -Trailblazer|Ice Age|4|R|{2}{G}{G}|Instant|||Target creature is unblockable this turn.| +Trailblazer|Ice Age|160|R|{2}{G}{G}|Instant|||Target creature is unblockable this turn.| Mole Worms|Ice Age|40|U|{2}{B}|Creature - Worm|1|1|You may choose not to untap Mole Worms during your untap step.${tap}: Tap target land. It doesn't untap during its controller's untap step for as long as Mole Worms remains tapped.| Moor Fiend|Ice Age|41|C|{3}{B}|Creature - Horror|3|3|Swampwalk| Necropotence|Ice Age|42|R|{B}{B}{B}|Enchantment|||Skip your draw step.$Whenever you discard a card, exile that card from your graveyard.$Pay 1 life: Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step.| Norritt|Ice Age|43|C|{3}{B}|Creature - Imp|1|1|{tap}: Untap target blue creature.${tap}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. If it doesn't, destroy it at the beginning of the next end step. Activate this ability only before attackers are declared.| Oath of Lim-Dul|Ice Age|44|R|{3}{B}|Enchantment|||Whenever you lose life, for each 1 life you lost, sacrifice a permanent other than Oath of Lim-Dûl unless you discard a card. (Damage dealt to you causes you to lose life.)${B}{B}: Draw a card.| -Melee|Ice Age|44|U|{4}{R}|Instant|||Cast Melee only during your turn and only during combat before blockers are declared.$You choose which creatures block this combat and how those creatures block.$Whenever a creature attacks and isn't blocked this combat, untap it and remove it from combat.| +Melee|Ice Age|200|U|{4}{R}|Instant|||Cast Melee only during your turn and only during combat before blockers are declared.$You choose which creatures block this combat and how those creatures block.$Whenever a creature attacks and isn't blocked this combat, untap it and remove it from combat.| Pestilence Rats|Ice Age|45|C|{2}{B}|Creature - Rat|*|3|Pestilence Rats's power is equal to the number of other Rats on the battlefield. (For example, as long as there are two other Rats on the battlefield, Pestilence Rats's power and toughness are 2/3.)| Pox|Ice Age|46|R|{B}{B}{B}|Sorcery|||Each player loses a third of his or her life, then discards a third of the cards in his or her hand, then sacrifices a third of the creatures he or she controls, then sacrifices a third of the lands he or she controls. Round up each time.| Seizures|Ice Age|47|C|{1}{B}|Enchantment - Aura|||Enchant creature$Whenever enchanted creature becomes tapped, Seizures deals 3 damage to that creature's controller unless that player pays {3}.| @@ -7028,7 +7028,7 @@ Dreams of the Dead|Ice Age|66|U|{3}{U}|Enchantment|||{1}{U}: Return target white Enervate|Ice Age|67|C|{1}{U}|Instant|||Tap target artifact, creature, or land.$$Draw a card at the beginning of the next turn's upkeep.| Errant Minion|Ice Age|68|C|{2}{U}|Enchantment - Aura|||Enchant creature$At the beginning of the upkeep of enchanted creature's controller, that player may pay any amount of mana. Errant Minion deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way.| Essence Flare|Ice Age|69|C|{U}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+0.$At the beginning of the upkeep of enchanted creature's controller, put a -0/-1 counter on that creature.| -Flare|Ice Age|69|C|{2}{R}|Instant|||Flare deals 1 damage to target creature or player.$$Draw a card at the beginning of the next turn's upkeep.| +Flare|Ice Age|185|C|{2}{R}|Instant|||Flare deals 1 damage to target creature or player.$$Draw a card at the beginning of the next turn's upkeep.| Dark Banishing|Ice Age|7|C|{2}{B}|Instant|||Destroy target nonblack creature. It can't be regenerated.| Force Void|Ice Age|70|U|{2}{U}|Instant|||Counter target spell unless its controller pays {1}.$$Draw a card at the beginning of the next turn's upkeep.| Glacial Wall|Ice Age|71|U|{2}{U}|Creature - Wall|0|7|Defender (This creature can't attack.)| @@ -7040,7 +7040,7 @@ Illusionary Presence|Ice Age|76|R|{1}{U}{U}|Creature - Illusion|2|2|Cumulative u Tor Giant|Ice Age|76|C|{3}{R}|Creature - Giant|3|3|| Illusionary Terrain|Ice Age|77|U|{U}{U}|Enchantment|||Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$As Illusionary Terrain enters the battlefield, choose two basic land types.$Basic lands of the first chosen type are the second chosen type.| Illusionary Wall|Ice Age|78|C|{4}{U}|Creature - Illusion Wall|7|4|Defender, flying, first strike$Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)| -Aggression|Ice Age|78|U|{2}{R}|Enchantment - Aura|||Enchant non-Wall creature$Enchanted creature has first strike and trample.$At the beginning of the end step of enchanted creature's controller, destroy that creature if it didn't attack this turn.| +Aggression|Ice Age|169|U|{2}{R}|Enchantment - Aura|||Enchant non-Wall creature$Enchanted creature has first strike and trample.$At the beginning of the end step of enchanted creature's controller, destroy that creature if it didn't attack this turn.| Illusions of Grandeur|Ice Age|79|R|{3}{U}|Enchantment|||Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$When Illusions of Grandeur enters the battlefield, you gain 20 life.$When Illusions of Grandeur leaves the battlefield, you lose 20 life.| Dark Ritual|Ice Age|8|C|{B}|Instant|||Add {B}{B}{B} to your mana pool.| Infuse|Ice Age|80|C|{2}{U}|Instant|||Untap target artifact, creature, or land.$$Draw a card at the beginning of the next turn's upkeep.| @@ -7054,15 +7054,15 @@ Mystic Remora|Ice Age|87|C|{U}|Enchantment|||Cumulative upkeep {1} (At the be Phantasmal Mount|Ice Age|88|U|{1}{U}|Creature - Illusion Horse|1|1|Flying${tap}: Target creature you control with toughness 2 or less gets +1/+1 and gains flying until end of turn. When Phantasmal Mount leaves the battlefield this turn, sacrifice that creature. When the creature leaves the battlefield this turn, sacrifice Phantasmal Mount.| Polar Kraken|Ice Age|89|R|{8}{U}{U}{U}|Creature - Kraken|11|11|Trample$Polar Kraken enters the battlefield tapped.$Cumulative upkeep-Sacrifice a land. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)| Demonic Consultation|Ice Age|9|U|{B}|Instant|||Name a card. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal the named card. Put that card into your hand and exile all other cards revealed this way.| -Formation|Ice Age|9|R|{1}{W}|Instant|||Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)$Draw a card at the beginning of the next turn's upkeep.| +Formation|Ice Age|249|R|{1}{W}|Instant|||Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)$Draw a card at the beginning of the next turn's upkeep.| Portent|Ice Age|90|C|{U}|Sorcery|||Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle his or her library.$Draw a card at the beginning of the next turn's upkeep.| Power Sink|Ice Age|91|C|{X}{U}|Instant|||Counter target spell unless its controller pays {X}. If he or she doesn't, that player taps all lands with mana abilities he or she controls and empties his or her mana pool.| -Blizzard|Ice Age|91|R|{G}{G}|Enchantment|||Cast Blizzard only if you control a snow land.$Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$Creatures with flying don't untap during their controllers' untap steps.| +Blizzard|Ice Age|115|R|{G}{G}|Enchantment|||Cast Blizzard only if you control a snow land.$Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$Creatures with flying don't untap during their controllers' untap steps.| Ray of Command|Ice Age|92|C|{3}{U}|Instant|||Untap target creature an opponent controls and gain control of it until end of turn. That creature gains haste until end of turn. When you lose control of the creature, tap it.| Ray of Erasure|Ice Age|93|C|{U}|Instant|||Target player puts the top card of his or her library into his or her graveyard.$Draw a card at the beginning of the next turn's upkeep.| Reality Twist|Ice Age|94|R|{U}{U}{U}|Enchantment|||Cumulative upkeep {1}{U}{U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)$If tapped for mana, Plains produce {R}, Swamps produce {G}, Mountains produce {W}, and Forests produce {B} instead of any other type.| Sea Spirit|Ice Age|95|U|{4}{U}|Creature - Elemental Spirit|2|3|{U}: Sea Spirit gets +1/+0 until end of turn.| -Rally|Ice Age|95|C|{W}{W}|Instant|||Blocking creatures get +1/+1 until end of turn.| +Rally|Ice Age|272|C|{W}{W}|Instant|||Blocking creatures get +1/+1 until end of turn.| Shyft|Ice Age|96|R|{4}{U}|Creature - Shapeshifter|4|2|At the beginning of your upkeep, you may have Shyft become the color or colors of your choice. (This effect lasts indefinitely.)| Sibilant Spirit|Ice Age|97|R|{5}{U}|Creature - Spirit|5|6|Flying$Whenever Sibilant Spirit attacks, defending player may draw a card.| Silver Erne|Ice Age|98|U|{3}{U}|Creature - Bird|2|2|Flying, trample| From 884a1f798c474b4d667ef848bde6c32cb6447125 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Wed, 12 Aug 2015 00:12:11 -0500 Subject: [PATCH 339/375] Fixed that Taniwha's ability phased out all lands instead of just controlled lands. --- Mage.Sets/src/mage/sets/mirage/Taniwha.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mirage/Taniwha.java b/Mage.Sets/src/mage/sets/mirage/Taniwha.java index fb71c293fe1..15b0e0426ff 100644 --- a/Mage.Sets/src/mage/sets/mirage/Taniwha.java +++ b/Mage.Sets/src/mage/sets/mirage/Taniwha.java @@ -39,7 +39,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.TargetController; -import mage.filter.common.FilterLandPermanent; +import mage.filter.common.FilterControlledLandPermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -98,7 +98,7 @@ class TaniwhaEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), controller.getId(), game)) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterControlledLandPermanent(), controller.getId(), game)) { permanent.phaseOut(game); } return true; From 3addd1dd2a3be30e38a0221d195bfec4e36506e7 Mon Sep 17 00:00:00 2001 From: jonhwoods Date: Wed, 12 Aug 2015 12:52:41 -0400 Subject: [PATCH 340/375] Sounds Update Made the sounds shorter, quieter and less agressive using normalization, fade in and fade outs --- Mage.Client/sounds/OnAddArtifact.wav | Bin 103454 -> 53998 bytes Mage.Client/sounds/OnAddPermanent.wav | Bin 58716 -> 37478 bytes Mage.Client/sounds/OnAttack.wav | Bin 64464 -> 41204 bytes Mage.Client/sounds/OnBlock.wav | Bin 87930 -> 41176 bytes Mage.Client/sounds/OnButtonCancel.wav | Bin 27914 -> 24482 bytes Mage.Client/sounds/OnButtonOk.wav | Bin 26386 -> 18128 bytes Mage.Client/sounds/OnCountdown1.wav | Bin 6006 -> 6006 bytes Mage.Client/sounds/OnDraftSelect.wav | Bin 12864 -> 12580 bytes Mage.Client/sounds/OnDraw.wav | Bin 6220 -> 5394 bytes Mage.Client/sounds/OnEndTurn.wav | Bin 117644 -> 80980 bytes Mage.Client/sounds/OnGameStart.wav | Bin 119448 -> 59746 bytes Mage.Client/sounds/OnHover.wav | Bin 13116 -> 7548 bytes Mage.Client/sounds/OnNextPage.wav | Bin 22828 -> 22816 bytes Mage.Client/sounds/OnNextPhase.wav | Bin 63990 -> 52340 bytes Mage.Client/sounds/OnPlayerJoined.wav | Bin 218572 -> 103034 bytes Mage.Client/sounds/OnPlayerLeft.wav | Bin 50056 -> 50056 bytes Mage.Client/sounds/OnPlayerLost.wav | Bin 240812 -> 196530 bytes Mage.Client/sounds/OnPlayerQuit.wav | Bin 60664 -> 60664 bytes Mage.Client/sounds/OnPlayerQuitTournament.wav | Bin 91364 -> 91364 bytes Mage.Client/sounds/OnPlayerSubmittedDeck.wav | Bin 146852 -> 146852 bytes Mage.Client/sounds/OnPlayerWhispered.wav | Bin 20336 -> 33740 bytes Mage.Client/sounds/OnPlayerWon.wav | Bin 296198 -> 244162 bytes Mage.Client/sounds/OnPrevPage.wav | Bin 25446 -> 17260 bytes Mage.Client/sounds/OnSkipButton.wav | Bin 63990 -> 44262 bytes Mage.Client/sounds/OnSkipButtonCancel.wav | Bin 27914 -> 27836 bytes Mage.Client/sounds/OnStackNew.wav | Bin 80376 -> 68928 bytes Mage.Client/sounds/OnSummon-.wav | Bin 127486 -> 71446 bytes Mage.Client/sounds/OnSummon.wav | Bin 111094 -> 66322 bytes Mage.Client/sounds/OnTapPermanent.wav | Bin 26386 -> 9480 bytes Mage.Client/sounds/OnTournamentStart.wav | Bin 135936 -> 67990 bytes 30 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Mage.Client/sounds/OnAddArtifact.wav b/Mage.Client/sounds/OnAddArtifact.wav index e9488ecad8e00a4c675b734c86f44d88f8c99b4b..2d6295ca75264b5c9307d5277502a7fa47dda070 100644 GIT binary patch literal 53998 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%0AHvd@ysl=WfOXG9qrH~x28yA2EOPCiG|#T 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 literal 103454 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
  • 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�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

    %NG%*&mi^11w{6@MMTc*9rFEG8iF;`r29H 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 literal 58716 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Ξ()Lr_!7(6J<0DNu}mVPh}-#^Z~U|rzLmvPBNYr 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 literal 64464 zcmW)I1#}ci*LGFwxW^NckRXe*xVyW%>*6d9FYfLRi@RHJUu~L! z%$(`&s;=vG?|r&whqi5B3IOzL(YMXm$um<7004-OvV8$)eI5V;7{KTeGe;c9*JwaG zuz+a%Z3a3J1ImLaK!G5lfq+DmgMOe~^bY+(cH~5ERDw#;3-kfmP$9}duhD1p486o> z3ebI2g!0ifbOU|I$4z|Z7P^kI{{Qzs=wEaj9YW{OMf3>0L0`}-e0)Kfctk56xfns9 z0uIEXil77N3p#?TAQi-eTA&^11?GYSU?n&P)`08a1Q-Gufads`;b1%%3{HYBU?doe zKM1@9X>cc441RzTum)}ff8bHpf(0NJi~_wue|-Nc&=ihGzH#KkE=Q8Z|>5(E`lz>R=M60KQ?K z3CN3|Cl*w~eA)z_;s1;AvjtHam;(IZD!2`r!0ynA=S0qP?gYyo{;$2GeIG>_PCvL0ALU zCBDFoFc<%N3)aIM(2sR41{9#>s65ESvbqg(@+cUJ`G~+7@D5ah!{HIQ8}nvA{?`Bw z%HyQ>A|-AW28zF=pIAq(qpiS(HEt}bjz-H@#i7DV;ilL@QcJz0`Qj2;K{O>k0K42? zzAcTC_DPMTxBM<)fP4sRT>|E3C*+dHVUCQJjz|;Gb<8^x){^>!llTcP$_eN!UgdbX z5ek4q(2lxDt)v$y74($m3wxxU`07d6sw{^0;dUfSvU~~3sm4`7zGvW!nh-Iz{ zIE@y|z2#+S9;g9&p*fgWm%wp!8f(r@v%D}fGnf-~SCcnTgTl1VSon}{Jg5E-P3 zItQ!4kA#JMh3(5QYC4%nt|q&ZtBC_dCvpai!(6Ef#}HO<7WIH-h;d*csshUr7r2}s6d`8 z-r+xpR%xm{26aZuq--&WZP!$6Q69+Oq-Am%Fu^Ez7TdS3SYq0NFQ73T2%2F#H2@GW z36#p+q~T(9c@dZoTfxR~7S`+_e!dPwB2gXuBYl^$kOynfHPi}3Knbi(JjZLF2`_-g zsGIy#u7hsK@1=k=2DJbu5QD9m2Dnk4yh}EM$yhVrpgy1nQH>l6&mb?DK-`1hQC~a` z2S^oLqiZujv(L8vHd_%q@>fmb|QvHaoAdYBFO(fqCt;ihWHI$)5j3=_N<>?Lk zfRCsKoJ(xLzrLUDk85BqoCAA6Jq!XX7z2O9M%XIbzy~l5v;s{)DYndh ztbeW1dcVC&^AIS-di)+Lh%WF6+)B7%Dz?XdV1pmv z0kBY>A-}_Z*o-F0xzc`dp%jZ6qa68{JQ#Z_B}xa4V0EYk|H!S837&>^K|rDcRS)0`}aeaJ_eP;4VbVh?qh z>B$C|3Ct<#09%=v4%<-W**;8tViN2?rjmI?3mCxmZ!|oI>9U9DLH(pi>Lf7+`bj7K zCzSy{p+AT!WGP&Oz5Yzl8MKj)h$YerU`6G`cadXUva~|%5P23X7v90o6z*|{xozSn zIZ9f|HxrNJsOP5mg&!w%fM?+b`JQ+}Dl6X=z5GaF6qcfuViVz<*a*wQSZS_MRg6Jr zuun+9lH>q0!42#QZ-73~0<*yxXeAzy1l5h~Lwtt+r%wWoRj#5d=pgEgSrV zMLvR7;OL?Z_zk9^|3Ex_p3)Jg!9BDZM8T8r6j4l+z*3M22Qd}d%G6Uh2g^+vfN-o- zR!T$NWuI6Z-6Af)%V-N)gL=ys(LeAs7$g}*L1Mrc_yVO#qs3zJjHnmS2nU7Q{B*7? zKUnxJMoB?|6}Iyox7F5z5VU92c1qlaPhcFW7&@6nnLs%*< z5J>5TJQRL|%P5N3NA8f-;y3XDKSJ1mDv{5indkxA5li6=@E$dh9|@&=OQ|&&KrDj) zz-GuTUKhVfaoB&R12ftq*F1m4#%eq1M8Y=m~L`6vOQJ=g?Q`1+#&yN=^YLep2MQxCk7UM4><)2_~b8#5L*~ zcoMD`94w53D=>doz&-FJZwvP1+K88BhYZAr+(UkiR0QucsdO=Tj{RAYbPxSa)SwoF zY^k%Xluz)@g)-!M#WE^ddMQ_9ma-9PNMtqt2(REeB0vGznJG(o!8mkFyu>F;8{uwL zQ7A8eB(kaNa0&5+YDXjsE5dWQU}Tff4a}q0vnQA{@Roc{T7q{kZ^dY#tF#pSgnOv7 z%rs>>X_Ff8>myUb9fZ|jI6Ndm{(|U5Q{gCRrfy(KuP0SQ(Znd?0DMC%qn_ct$Zj}} zJWAAs+42dQ=V8Rh-Nn}D3;&J(BsP*`u-9oyjF*}PR{5d$1lx`}=qy#r{so&NM0^CZ zxb+c>92O3Rjzn1SfoucT5c|m&(zU?y(0P6wpT-B|L+}vZFJuunln)pa(GN#!UF5;C z7pfID#Wi*wJ(Zk6QFI1%nDoOf@=Lin>7zdrx#a)YIBG4(M!)G8_8e2fAj(60BRbOA zRA;(6bDzm%S1KwgcPoA}#})m^d~uB2msv~omk!8N8CKPRngL(J$HJDtxkwInxhFZj z*c4lkCxE2(&__XhI2ah=lYD>~eV9?;i_T4!JRJ(P$~E5AJ}OIKsLl z&6m%Eudp-RDMw3Fg+^jMSp&+#2e1wCk)X%{L^PE{-JzD!gQ&|?0lk;3PdouH#h!d! zk;T0EDBeUzNroJQBb9A(xrL@)F0GnkcN5_BZ&6$K(VPj zQdUR-xiYzlnN0g|+;&HvBrZjh=q}7QVhUMCX;M8_ZBuaH7<}ukpt{~3`Rf$EwES8Pj3QFPDVHj*22nC)8GJ^-g9l3{*%@IK;Bc%y0u8(k3 znupp*2c&iAiewT0Kpxmxs2-Xf*~I-9*yOz$VELt-H89^lIJm<%%HKqI2rt62!Xe>^ zI5*VKyEnL8*v~%^dcaA_QOZs1dyPgtn*1%lVm`7zs7$JWJ|zWQnfY+-_rlVgZ6j8fT8c~4balc)9Q3f23WR@5UnTw2cc z71rYzXrx>R$8nqS{vMz_DOE_2|0SMDmxDjThf#g>udrW=A|?`b_dDdZ4zguB!^6M#8|zbm5iQO{z{* zB>dtm?v%8iqC~%Ia%ckCm%1noLkhARbDa|DkK_?hgF^bYaS?N}KH1nks4tJU-ITXts3sZrqp6;chEnq9L?k;|6 zwY#2s=X#n1#&F8Wv|!87s&Iwi;lP#f0il}EQrv;=!dh^z`o16rC7xjA>}4!0H8 zvSrnz;wS0H@nEUgD^fk&FE~EfBGN!?4k6t^y;W=1gp|vfZPZ#t6&0nvpv^O{i$9vE zPnw@NH$G^N)8A372btl|fl&A|SIUh5gEbdTf~lSHihh>jIQPLZsyM31Qhd}_#n%oL7w?7kyZV&eF3z#v31uE5C4&-_>JOy5Ju&4M3*`7wQz2xU^@wcTs zv3tZC9331KY7q_xdIs1Clz&lAs0g{2u1OXNlyDhGk3W$vc-KEd7)mvUX<#;Sj_%I< zp|ofksqN%NxdzdI3`ldt(Xb*@k(t0c)fd%=Se`1+)MA=5O_)7IBalJeQYB~}D%Y`1 z=+0zCau4}8^ZNria@$_}_Bz=-`P*L;`<|*4#@r<^E5mIkCPmym)jL9{n z8;2O{8d{n9#kNl<7jw>B+hmGr7?W>mgLP$aOwE|xv5R9aYbBIIM6vIb$KV}MpCOd< zlp19UJBO%Dw^EKXPB*mB7br8}@JNm{opvfu6a7Lh1FgfI`3a#I?;86g>j7JX(tJ;E zf5h=Ce|f&bUeo!>Inwpk-PHAmOZJcFABiKmmf<6zd~P09q8p*TNjH_Mh)3aVI89zC zcHtj}O2box=HMrK%l#FY<6GtX;N9<-RMN=tG5iD#r1z+9t7|B8hz#TxAB6w&CIr1G zig<;0b!H}qK1Xz5^Ax?waiO`s!Or`(e$HpU;y_n!J5j}OJZ4DL3~d{7oNN$cxTgGi zVzk1_W;5k9$1HqYOq?pZj-ic`V~;B{*jAurWMXIlpNe`>t*A-Z?hgqiMMxZ{C`ZCk>KGRQ)NH&uC z1m}B>`J0Ik$gfl(d4XO{1i(YG43!AtmUww^90?&mYsH&b}s;F!oxa-)1 zWj#>(!KV~?VyjXWyQ)lD^q+K6sGsX`Nw?Cgkvw>w*`=*#`6rf&Zx!>_xP|#19_XA@ zR3X1*p~t$(W8?m0mi{-~v2=m;mg7qBP~czpY)^r2fWNAL2saaFLm%KcX%U!C zZ2`|v9`Qf*b^W}k2c|p9*#rk(;22?ovYn}yaThaGo*jPdn_v20iLSFbuSQV)!cB3d^F@H8(-IwWX?C$G6;4J6cC49nlh~3n4Hb;3yF`hlBAeBdyPTdgm zO-tjbRLc{+L-7}A%rU{{{=R|g!M))_q83a|s$DKiE*#8;w zqEE*XF_CCPOtYv9mLwCQ2Zrg!SmS!_ZZ?Z~s`;XwrR+`rBDP9$aJg?%prPO8Z4_D{ z0l8SLN4C?y)nHjHYueTcSn^+U6XH_+s2+rIU5sz_} zNiEC{RSR_Yymn}HWQ?t+h`uww9&cWj64&L=8l1P71KhQMQlvn*^wn_E9i`=gx z^@&2|8g0DZr|nNI7i#e<1UDDuTT`+uUs*iSex+n`$zA6d{~7F=CyG;r!Ty7#=lnaQ z`t*I>`lvr+_LwSY-mAizUaB|b_Q+9pHJ8D)$=S*CA@CzyD{?fP#N~1;`51A%_+I3N z`r*pnX08w3XM8*IkYcskuKb{AqwK_#0|kOFJjYk!rhHkU_gp@gDqKaE!ATs;9|uom zQZAB@L5lb)FO|~B66z)tiG_+;nx7iCc80E^;tVl^&?pBYxP6jK8V|1({fpHOifKzB5`V>Us z5#knAjw+>ZX?B>bmWxqeEh+kobVDKoEZ{c=zJ<#WgwjrA%Po{^RSnSc$WSEFci3?_ zLVhcx%9->8_LTCp?t`(SE=9Fop;iqct_N%TXG(M7XYNzzLF7VsX&?}}2L!UEyq(`B z-I7j$4vK(!2)#s_kE*FE7;hOTMjwhw)ZAg`YNi;EYIG#xs+OM4o0(Tq+|7!LYuZ

    7A~2Ud#ONjY<1e~Up&JiP5hgS7ZfFWj|6*1I5JD8H#F7y4R4K$bkkM& z+C?e{-tE-Fd*B9Wq*yHR!bA6E8{w+#-B5b1w4T2;&xL=4I)-Nkw+6S1{cx7Gln4A9HqDPR+7h_8f+!d@sVw`=~ z@V*Onj+}_Zb8|&Aza;oISQOeF>c$sSi%e5vDn}cly6K(lRW?x>WNwf{i7+@WuHg&C zF*wIXkiW?;Tq9Q_#|_tZZxiowAMaE7H*@KrrF>JS=(TEE|Iwf|tugo1I;mgG0DW^) zFCC|ytn068jPv#j!F|EU=b|H0l7Fn{dzeKPWh8gP^}&g-9*|2!hb~6v)4bKqG~SQuVs5HVP&A<*q2XebJe2*UG&7aiwMvzKrscNj zkgkj2p=E8%WAhlzROT)*{r~1gJy9}o3e^hTb|l+py8HWwxgFN=_G^w^?tpi^`?b5K z@08yij)=#=BB_OEj{Wc8RG5cz!vpbMyZBbZBb@C%z~%e;__n$<&gXtYTq$y)G2Z*` z9M3doRB2^r8|O`5Ww9r@UNuScTJu<=XLf=8(i>rbbOGHbuF%8iN8}v1M?Nd3Nyh`< zoT;TZ?CY%;i!YQsa-Q+t^bZdIdZbsl(3DgtXJqSQmf?S=p8v; zc~ke=Slys!zQ|GVF#VPt!9=4ifqJfot`y%|&#}^2*Me{s+`tszY){2-AO953BcF?Z zLj0+mY?u~Prp(ynsTMD5MslFHtDWnNtBSLZ?SQq9qocLJ`odRB6vU1G*RFAaMN)lq z4cr9}*)0Z@cra3n?jCPQuM%Ae4GL*|)tu>$Ci&hU zlYj2dhyL1fbE-h`j@_@yHAkYRo7$LPnde*TN9~Lml7f=w$DY=YQwfT0>{ODKo!(1U zowc~QS8-;3M)nljN%+h_MXxs<(*CO(Vf=0xsoe|Ou&<+I64zTsSW?ThsPHsxe!@`m zL8cgFi=zTkA<8LR^4z)6o>MZc_;bm6$LCVJLj&yLpYO z(6fjwayxpV;fCd3<4)s7LjhYEbSKKlFxbeI=2kd-MOR(5BVD)*_8h1aPRsw4G^?8tAA>;@7uK(U-wAx?bC8#p3zK9nW)LzRSl{;X_* zNmLGq6}xc5BB%LuZd>Fp*@ym?)9Fp>4w^fP5pa>TK+p?&<+@TQ;hC5q50MxVfB?-h zRiPR_Czlb^P`2`qq!EpSTLKp%C%M>A zOV^F!lHBvTKMI$Wq}fl{f<-?I-Ni2)y?wj=&)u@?p-(5qP>BqQbFm>(ORT_M3O|5T z9?22mDd9umO#f{h}VBo2;6yRO&kDv($Ce z^)7|3M*X>#Mi?$Sp$I;K;)1Kk37-$(3xg>auuApqB+@$=V zyJs#n4>ldNFtPVylVXxB1zHXJg=iy}4Gs6%eN%li-Kh@0&E}~RX)htv5IN)=RF=pf zj-wCKJu*-Czoajz8EF~iCzmUqdNrw&WuNK>yODk&r3Dg#ha;83s!(B|seN|wYmb*d z6R7J_1r~?r;v7*m$%t%W$QPqb5uXsx3IR#V*77 z08zLrN8nlRsqaysVK_HHgmy~t#8Gk|y#$W*cDCtU?R+;~PTxDAVVh9H$x2Kfb5ikK z4HP7Je)m>&)R*#3@`IzpnVC+(#{fH_1P#7+4ORB2tK|QcEEq333bmQTR;w&(LpQ zL;w9qH{pwKx+CB{#rKNz_t%QN5N_e@*eoFMqkLQai4i5=K&(Vm$CbdxQUu)r7s*eG zT(wi3r@LUNrd_R^$@ZeYleOqQFiCnL?gIDe=c*_AKaHz3oT`duvbumi3}b~RL7Hzu zE-=nch>nYmnV1x%{ByE#>tVyt6n9(6VDR>G&)*KtWPcC}Hh zH9c0)d>+o2{{(}j6^czN8ZHD2h&oa$Us377k|jkKi&m6Ou$8ktvGLA>&W5hj!9Tgu zurZPoXcPRO^jiKFEOc8vOfZI<$~P8=h_!|P1e;h{`XavN&Eb2#M87@smFpkc?m6pC z36^zFFT9X_K6BzPTh=w}J+fNd@YJ{E2UqA_Zf|)|u|slIw!3$V^MmbE@u`xwwjQ?p zqT!D5zHNTWRi!vDt6J9n+===2><>AUOa5^+;aX|#B|I&Yn7TAQKW#+vs7g1 z{UTr7o72GKy#;4h!yc8SDx99e+>HuTy-q=vwh#cBSv9oX@UN z)MrzbUWH2eU3=8>P~S~Kt5)cI+Kak(QJ-SN#sqD3V-5Wwx&z$A2DArp?aRu#Kudp~ z>mh%MZNjwT8v61A{e-HpD$~i}h&vJgE>4KPqIZ%z#D9g(WMzesTqRlL`DkBQ5l9qL zh>i5W%6%qPJQY<-*F~3M>SC-#KZ%rg(T;dmLthWsuSz$YqGnpUn1<_KE6&L_XK7*U z!mZY6_EWZd_HwTIz6Tyvsn-F07H$*z#w<49OIV%+lKLjCO1c}Zw+u^#c;u-2c?Rr*uaEat{6zu3m0o<`aFvpIifP zx_4*rFyA3ki;IN2`bW8cc|F2NSXQ1O&JzyvS}q|}99$Yv@gun-JSUwLgwO^50{;Nv z2hHkPeLwO)U!~$@)}`T{xAaVC1!I*J=_g{YY-QEjXeLK^8Qkwb9c+p25+mjH!Wyxx z=obdUV(JXzWO~qLVKsTOa9;Q+Kcq+LRv9X3>nN+M(sjk^O!9;@T4*bML2Xf?$a6pW zi@3w&mC!>-6ifLEsJB{Ww(Fs~L>Co%Em2Bro>-LBrtJQ*+f%=%Oo-p0)u>Jzy`~0g z2_=Abiov>fhMrN4qUS1u!8q?N-_YV(+4T!{y8jE`7M-9O{iktH(zDc(somq+5M~V$N+r84S4u-;v zKhwF%)6O?K*jJv(c2hplc+Dr`r^PSOPbX&iPZl4~?VYo|;A&~IZP{;g_D0+3z&znO zJ+_Ge!p<7_BBg-A_xodxH@9k6u4uCrfo;fDg2n_Jm3={>aP`2}~LM%+jK!IzAAUzT1kP#>n#w4LhUVC7 z7KiiO+O9@s35`NP6zSUvf!WIL(X=-n)YsL}>M*Tk+{${|G}SC}A79z^sdNo@iFwVe z0PV#Qcu#mdaxkzp^gX;TY!3k6JeO$OUYJ~T#JfxC3vR$zYQ3gx%>1aMdRF(BE?L!3 zRWr&Svq4i^iF7{wJa!!1!FR9=nZchQe?QAA{=t9$nzcM%=ku^JCb!|Gew?m^Im%sh z-?AI*H3Nlo&)CAW73G(tH!E8svA5w3(-`!QOm&sFEidxtP09aaFY!EczO;FYb`;sI zDW#Q!yZU^~D)V4ttTvYwK~?#&bX%|mmU_0klS+ZDt96oVdg+Ivm-%%H;&ZEIDt@mj z`s6wjZi2Q_7VWrbLz%_#dt=HcrI+~>m7r`cBJU2@Y46KOb6E+DLETQ)Q=5o}9f|MsIAwW5IZJ`gsQf~{=HIx2 zuA_mAfu+I0aJ;si>6AIi+{n~YYt?8Bn>Dw|D{@C5;)-f_(GzOqKjE=@|KqO0BV z6fJ<$aes$iJTGk`Pb$u;X_blkD653c!Zcu36zH! z9f@BZMJOJK%fp+Td-9k4Zjf{DxAb#zR;}Dt`8oNs3xAaKbky+f<)?xFsDnzcX0z@w z-u*X;-jnb(v3(p7WsIs4cRqeqOj697n2Y8_{T0n9ZH8`;mQ}qYcL)pp-90AvKc4xa zDH1{bp|q>ax>O4htBCr`v{h4)`WO5Z?c70s6UR%(XxCf&LaXR{A0#8g0#AZ^>0Q|5 zi{md+UfRe^)(wd7pL8_7LfluQkLgaXS1eZSl7L_eX z%b!`$-~J@9QrbYo(tYTG^cC%sI74#%l+`JJCxlHS)%(yacR~KOoPPMaU;aC&fXO5V z%ino1WOtn_?3dj#r+v|9w-s)UUR{o^cqt_#W|66lY6@wUE2Hh8KVc9XdIisruwK|L z7t(s2UON|eOm!gU3wp=8+=AR41$zswInT<3X1JwI+>BVY@vwRjvy{9^?^oTU3xuEk z8cv0MfooBK;$}G$NnN*^RyjE(-3^U(|&NXbH_l0}f-W4`0{TA6o>}CF^ zsHjY(WzwrWge!u*jrVm%^)-bbS4`f*L)2+F2Rx!*D_dyH`qf%5^B7IyC-U1ko_`~U zh~0`sO31zj40RuEoG}EVCw49 z=sl<<+)5u&cTpT;_LK92d+Zs-!%G|cMXsOd5E}Bik?Uv}byuY^Cr0mzeHGIw_D8g= zZpW;lA=Mg=7bbc0iho)E=eZr)Cvn6Es+@Y5;hiaDH0m0tM>1*ehWtr(6pDir zJwvSrJWj`Hax{Y#&0&9jOX!FAm}rO61M^)qN=>D^?N>`?IW9(y zQ129JbQH1*^@QL2bMBt7Uwj1)ks9(Fc@#)OMP3r;(DAt1)&V5SZ(s}fT$~p%1xDI$ zmOOEliDUo^eO>!02E@%Z@7H#wJ>h_W~%HGmliBDka>rX@*5~JhS8oUaU>=oMV zsOy*?zC%r?A5cS>e^o6teGCs{QOpm03+gTS1l~qikF~U(vzb%t9_>?vq+svBC~uo! zk~oE#ZCVsRG})Q_H1UykRPa*a;Ou#s9WzU_%aknf&KGWj(ZnBYSzT>QacnHEV)lbR zdqMX2->-j%vl;6=c2Qb(dbgy6n7OLCzKhxN_l%#7GSxY^OFsMKX*v3H@|OfvjNUYf z8097Hr-};-{P_!PeoqVU=3rals9-}mN}0NbQiZSX{>7iO_h${s{Zcr_cFJ`)Fpa!# zd=`BoW=TTN_+EwrTsssAky4#A=lpdZDnsFWZL(+XvLKdkun*WPl6}=;hH8xWmlQP0AED%H^mH%Uv-tovr*Uqq>yln1SCO_p@+WK<8Qd^i)sV-7!kan6& zjuxZhVYTW}@!Z2s5cdcH)QA3#m;T*8T_0k+z zg;BzE{!~OOZvo5ru6!Fb9U5VOxvOXqyG62Gs?x^xA=Xx|`tW^RxzzN8*QT!YZSVR* zUGb;V4ZaoJJ~~ZD8ABF2?$0E9Qi*qe;Q!yeTDCZvd{*F){CAGEIdV5p)SIwy!K%;I8dI5dI6@ zp!O>c;jI0jSShxDj1-+0ZP)Y-esk-&qHw41bzwioGmL{%l;e#F=3C4i&R*Ir?`hWi ztTlz*yl3DkqM(ydu&@{trtnwT`lt{txh^oF{}K^s275*v|V9ZfwicdeZ6zB^HXVO_oHwL(U;!F zpY$a;@q$ZCk!p(J+UDx<#&0nLO{>`kbXkT+=lQ1mQ*aLsjwJfW1&0d5z$?1GVmWB& zUFjsl?(j=@6_=gU6JeC5h>AWK8`2F?++!CJON9gcDtI2MrNMGPY9@P>&VreU6VgNf zc^CL*hI_qsUYrI;s>*i$P0$UbHcqs zTjc!;q&TdotUYb4X|%FiahLB}KH$CJ?|?1*SNS>dLetS$pb_-%Vrs;8HOx>~V%x%_ zp*YV1&mq@s`(WEM`!ZX;b#iH)$VbIvb9`+7_#Lq`3?Ed}6gBBD#2dvT^OZ8y$}3{m zN%#E~U4sfAFM%>{ilWYqE~)-=PAV7_h)C>p_D{5#j{yh_>8`S0_4<$TUL?|AM%8@3}t z`9IB0rUmg_dC5o`zo_caB$K3#Hl;+Z)EJUubulSH=~V>7Cfr;!yMxuXD<7(emFyr0)-R zqUVHvJa-n(WlE`g&`bOWhjV2DbvObe5-XA))xFHUP3INSNW~5G<=GY&ZMVW_h6X3PP)r=4}B9R!mFTWc$f2wW2x<0VXMNA z_BOs7f{mVL925I2(VfyLB`rCWu+P#>{gM)pCgOKaEpAiTvUr(iyi|ZD^V(2R=qJAf zEv25(#nKPo`qFIY9RJf$OVLQ~Vm>MoRNu98P5mvg=2zNlOg?(dyCY+T1W1v~s67h3 zu7Tx5)I0rd@YLfe(HB(AJ(bg}__+I+pw~Q0++Xf|a*Fw)Vh|)2PZXEYZgLp@4dd70^L;ae15!Z#K3h>eOcQ;yn2=P7p4&84rQ{UJK?x3pI=(UKGY zJYJcQAKyE=x~8%ymA10Yb?SX|_?YlWY9Wjc58zhHsc=8s2^oywya)y{`!(CufUGEH zgaWQ|R)zJx`&f7_xTUsQIwv?%7N+S_&&5TXW-1r)<=qOWHZWD{Le0W?)9>_KoKq@v z?y;pM)Hm0S z(r3~tf8U~C`MD)a+%tAC0c7W$C*Gq@JX#TAG3_ay;zm?OXzxHzX0Vb zv2`w`{PE&lylZM?2pCrxGBxpv8>CJCCrr5a+h&xwtyNvU!k$MC%^8%a{`*VMU&xbYzp9XdWZ-!U!Vd-yTHuHwH zF~_KJgb5=l#)@8X7RKUb2rnW%xoNo5dNs97k%@Z`-zk16&ncI(?{QDoNa=IL7R(BM zjx6GL^Y6rs=oUOm)?@3aP1--T4Ya$pM>JEEPpJ2xn>EakR9TqMO^zIm6mZ@641N#aga5&g5i7{C z$cLuE6k;AmBEH0U;i?#`eHWe}+u)wwp45J_6->k!=3Qu-JQp2@x<<5v zRbV%$!idR{xDr($mq(|hkKCk?GuS=6D1tbn_*>LV6XpM51Y?Mpg}bLc^h=C1o5l9R zwSI>FOns$3knM;bASADrZinn9f(>Zwl3=G4fQ@A9Td1 z=9(~_XisjT22p*;>cmYT$UuHAWr-Ce9ohp{!}9o9+!){cw|r6BDJkThQa!N-KH3To z`PY19p{?*sI4F(7$bpJP5|Ig8!V-+cj6=gf21csR2ahn;YP-BZir_t3e__4QOni(v z>%l8oCe|0PisQt&VyRRUBY|&%ZA2C+lc%ZI^b@8hlSmhk8(?pYV7n{<)B|L}0&+C2 zVfSaS-qAncB~%B!##q!(xOVkFm`Vmo6FrzoU;(?7y~oyOs!}`2ouohvCH&a(-y{^| zGmP$-Kn@~ei2{rj-h)gLIv@m z*a)L8$Ab`Y6L;zkXVREkWEJ=my_A28q_CXl`8wiv`8?c6R-;PDYq;yL1bWbHyz2hq zLX4nFlwL_jc|69s^#jX*7Qe^f4C*Yu#8e>UZt{I;niQ1OXfy7rm=2f1)o?7xmJOKR zJunL7B}O#wkvHO~zKU2Vd=wrFg~ARoB3(r`jAH)?PGW3+bvaEQCqI`rp^;z&##bj} zRQYvu6Qj0EF%rEks(}1>Jb>pakX;xF-5U1C)M!9fASEJ-EJrZ#HTosrz-Uu1?p}Ey z_mxjdPoz|g^7vD(kMS(4(I#*f?7*nyVQ8nEj^7i|0rbPzm920nQABJfreHj+1!YNf zrEyYu`G?#Pr6Cf{kf%!R#PXsaH(?CIcx^qb4Mrdjnu}2_0gUggkI}Xwu?nM;U&uS9 z*WxO1m>45Y60Y<6c?;iwtHWvd+k9AfC{05rzzo=x@DTB2H&R7zB4)yRU?LLi#u=_4 z%M#!4dX8Yauf-TwJ@E!Uf_GsX93w>Iw^}?!tK^;XB~*;Fa`VUwR1W=x8N{w&o3f*r z^HeY5Dp-b2$R^DF(b7?|jd)Mok2}3<$u}?_p*^m04g>$-w-NjwBDf}qCPtDS$eu(l zV3C9=d_$gr@#F(gS=^D(TJ9w+5o5)x!ZD$j=oXhtUg?zF5H!cA`3`uFUKr;bk8!e@ zUIo^PJB8;ZuzVKbqWEQd? z_{)b;0!5Q)aC7U4Kcg0Cz1`N{Z=3Kmbw?LK)z}m?6%kGl55h_4Bsi;f5oJh?41-Uy zEg4SoWDoFWd+};C4jeqKa89ScGZOd*r{UWx59@ghINMr-w>}=|0B?csP=_c)ZijcZ zlq^kkqlS@*L^iSmxDRK+&us~==J#Y1Y7O-T{GgqQnoa~>icW$HL=FrTI~ z=?=^krUMhpG@*BrN5T2O5!T38cwXj`)yUzX1)k?bIS+t^&=EeD>hP)DBKMHl$RorR zVlH```c2no9@7c*0a}3-egu5SrHF#gNz6I*fRhm8tj8hr7JO&@@qc(KF6I;=vXd{s z@7@ZO2rsBf)FLtg$RM%c(0&0P`r^)7rvWekRPf4o19km;GB2Ky6Wk03(KnP6yy5?B)~;#awv*6rVhgi}pD1+X z*Ry}9n$8`ov{4wejhoC9c3<2N4@D>JW|l{9E=LCo2XY7cgf8nFiE3h0SdFNiQN_b| zNnHs>56bcCAEP>W`20*k!fWMIHm9Ehl{J+X4Bj?+kPU=K?x((D5qYE3$choJu-`5b zx;MLn6nMIrzKyw8f!O!bb9Vz*Wg&sNOQ=>u9qX1^+a8V)DXG{H>Q zKWh8b_Uc@nw_lY_8WW$)WFM_b6gg&iYvksQSaG?K zOGxLR@dtP>e}fIsk4T!>hfAThRv)9fep73t-B1~|qS9H;F4s|dYwwL_ps)MoYy!f; zMmT@UlLx88Om}VyUrER!+~b}zi>P_TA?!jkt%_y~W2$awE44aWWi6l9SgWcnR$Hr0 z)WR^!xTC!?j@mRao}SLfyFlXZ^LabEn@AdWk}6ANcSfQ=RGxa{p}v?+Y9nwInT0=Zrn(Z)-m|vJvr!>IC-^g3eD=wTBxu^bLBZ`3&~~ zfBhlc3#$1g89!3br%q4r95^F)*8XS(wGnEnI?QN-45AFXhQH1gV+S(l>1xzZV4tie zYmkG$T`xGYUDN2V?oqbMt%HpMtAeGKWNo^gm6!_W?rr;?zD-#tpOD|nOei5^R_dIT zt7-j%cTJgD1^VV~{%Nl2l%eMc#mXb~cL-K2KBZsFj8CrcZ$;wuv^aH`GeWwWWp9qU zxrCfa*^WoVh(pQW_@G_e7-5wFddX&BS=6<1YHHemByaNF(C?mqOJ;1g>+-tyT;%VlxBfW6AoiNoqMhknS*fg?fwp_7$v&{EB;yK5`f2HwStdQ{ z-+(`R{w)a9rRs%W%33J0ku;8|YkHMkf$PEM$`37Ijlg>>j~XdI3iM0gmsTgZ-h53g zr9V;)f!=W$I`qX|39c6ItwMYIXxgdY2Y$TxzU=3X#4(|7cpN`Um`H6y)6Fub&s<}* zCol0a(gX1dU!IlavzV(8S^T-XOtDT-Ph7v##7C6+*>PrVirA0_6C^g zR)xSb=uL<}KmFYJtHkePe}5%&=~m`SP(Wm(x=3ckzL?9gHF7-5bu&*=-fD5B;)=&b z$4$>0o_AQDzqxwn7!#8-YLP!(y2M^1E8&vn0qvw(11g|v%1>1=SXkec zrM+3lDaW;OXZ5skHG!4Wmh5j1RhlVd)Oq?6R2>LaGs#3WU2T=|GWkSu!L+=Y@k&MW zk|}G6^4-u-xsJ|~&jjAp&{an&$qvG^tvI}n?kyJa9Sg4>_R#f(*ORLA@EwBYCMG-Y-yvYenH^_`7+vO zbPR4VdQ&fj`R*s43EqjW{A>-FM0rs=)Q~{XO&iG;XAGjIzAa;3>ix8g0HsfK!ukK) zHNA^Gd$}xlmUc`23_88K#3a}9sClvJv7xBbLRVv6%IKd(zaRLer**Ur34D0gutZ@l zo|nn}x%vItujeTdy2zCB6^>}?{z_j3eg92mOc1HZaB+r~a`+N`!`yGU$#`5~<-b9{ zs{aoC+nu&m8$qq$;Cwfh!|Ev=%x-m&vPSR7J+uH_2>c`)G5AwT$}4{pGufrP*)jquMMagmNmC%$&|-dOR<%$H{C|CNRR5 z1E(YxS&-^Py=AUT=RH9;=ixlfgg9y&y})9JMfj#ZwcqAqsJ;@RI+|;C z3x%b}ryWh>(?6%*2)u?4zG$35N9h{edhQtSVcXd|LT%CuCbECNC+1eCFu6SaA{J#C z=f6Ykk;kQ_C*J)tD)o+eh_?8ru6g`vb8_0~f2;n|DWBAQV*4y)_Fg&eWgY1LjH(5~ zp}X}yJ>J+ub{ATB&v?GGukCee$3UgjQOQpFu#hD$GA~kyD-0EJaefWGkZ5i9G1}?v ztx3*YP_wXt#SQ|7L%7q}?4}HmHz?J#B}OIZI<=JgPR(W$*)jBbDuyY}J>|LzRov(N zy}~?U3&SG9tN4ext4QVe()0%B0{UP^Y5hYL11$p?!PB9V%2lnpbrc10ULuNG%#`9L z32&u^o>u;b5ki*y(Fdce#AL=K#&nJ@kcEt>?JXkCrN04zU?UD;gcsoF_5m}bU)OgU z2hESrar8P49*xU5m!RJ4NUdkw++>z!CH635Qd!AM&VF1JjW^2}we<`Q=F0jWeUPE* z*|gruYDG|UsPXDzZICJ1KD?Az1y#T!V5t-%Hxd)bHgs2d0Xe{ttlC;!Xh7guaHkSw z1&B{nEcu^3U9BCMpPHOJHnn2<@<3@lEABQbD89tnT9L944ym%j&J$?1AtaGm?m0dgrD$Cnj*xR&wv$ysPJ z%$QaKv#0}5q}HL`RrE_M#)DZhZrMZC~oh4#q>%`|*m*cNuj-@rRx zEXAzAZ?#Rj%c%^tK@R#GJD$0SpX(j;G^I~qR7S7Nw7@d?oQ3H$=;m*5^>&^r{EKi$*>PzweLq z>F!+8ULjg6=l1$~gbfJa6W%#&uCK5+!m~$cN)3Vz#RhAM8E$RB!^t_I-~P;X=R2^y zm>lc~rUuJME4@?0{zUAF>=vHi+fgjT<)T}W3D8q3O${Ow$;ae7%-9>v7e;S&q%u@1 z1U>!7#&n~$dM1q7f+Ce>R?8hzm2VpCscf@pwsKT9*7yX_3 z{q>h-Uw(eg{j=J?%BgCmE$@}LrO$vKe9hlY{`HoB@M|Ma#3W=J6n!h)B`qOikzm#| z%UVs~o9#iV&~?0E=dzmW4Yb$tf&icKBE4ez{*>Y=h0|)KAAo21z9!o$v6k1Q@1Q#W zFVH9>YcO6fN;mcY$+|Q;GfMP0&X0_Q-|K%=`?c`zr1TMbX}C!bc4nAOjVsEPAfx65 zKhtn0L{AdV3SXH&bP6S4mwCoejM2s&<%WDsk(7CX_Ta-G5gMs5#x1m$ZYvCyk|jml z%|8c5*+qIApUd6WpAz;rET^{sw-}!_GL@2{yP;i%&sj}fBWF0H?CfeNb4rjfF5~IU zH@7FEWYpz|p5Zye2Kte|d-$!Wa?uyFwvWmh(H15wN4WVyZRx(dtw(mRll*Wd)nr#O z&Db3L9oKKqaQ7Ukk&BnQ@pbrBLKA5@sMVMI7x}-tOH1)$7j`K59=MsgoyTZAQGjNc z@6c763D4AOv#$D5KBfHB6VY~RF@Fo3p@tK%zNu|OQ-WKR=K2czKcXUAji13+;o|8b zXqz$BsA_1|LUJ~{iXX-urNfA4W&>qNXk{>aX1_pXxw869J*CiUQJKovm%2W)N~o_k z*S_X_V3yMjoMrY7ZFV4kMukk5Hiv91%DzkCaMz)8o8tptQktbS4jjM_#M!>6ut%OQ z+%D&gUQ}(XFE+51iX_{U9L{d% zv!2+9TqmCLjr9E%`rB7Cawd-YcOhlB`X7_zxg3_^f6kRMHf5@*t5PB}-e@FK+}+Qe z;0hPl1NFp*|Jjk&8dXwGYNRn%A8K5&yr__!Zm)8N!EO2|`T*TJ(@CYbfDUmfw_iHz zbA{dXp9{Mi9uv04HCLFzz9l6z&>jgro;2t!eS(hfGGaRp2ZqNLJ*cGuhoL0#3RX!O zvA$HqHQQC)_1zuk+vRT;HZ}ZI_3fnMXR z1*}bjxdNujU7iRuq? zG|`HkB;*(4*_l>zxp!b%;B#QB+|Wva{^1LIs&m1%)w=Q#<$#hu6p~v55vw;bgS<}U zwqL3}l~x+3tx=X5SMBHa4XcM)(A;1&R8lf)WIRs0lkp<-*kFl)^ik>!(9rT44K!74 zuIIB#ICB9^;iGDhELj#`w%R`>|(iaap-oJa83gm;*d|Qzm4-3|b0w!)%Za9gRD>A;^tW*GAG%?8wf30LjGWpmWrd=I%s{)~Mm5epK-}jpxOTZuxhr_f`49VZ z`(xobPYxRw)-8Ng`1Y_Y;VZ)zdh3hxSdq5L1%%tF1U;zI^k}*ag^BW1PG&j#hri;! z5?(us&5|p+epXM!ApcQ+_ptS0o5PnzHjHW=(Kf89|BffG>m=VDG;TwjG1f?9tTEIa zh8L4O^O7CP-KHj@NuVM2!@TdKlanvtS?Y;#Wfxx3%i(h=Otocma}|Ykt}>v{`%Mn9 zZ>j?_muJ)nYN5Ak1GB!?I4Gt@C)G~AomL~D$%Bnt_$c*{TkbC7>*FfPjKt;iKf#RP ze*FtjuHHC>;r6lByl-B#HtS(>A^C*?svh`m-k`{kH|g!4a*4Ck4k)keRfLF(YO$dz z@^?8xqp`y0m+tV>nJ0Lyx;A}n+J?X`_yik+-@YeZf`~(!QC4fCc(h99UgL<-A2lO# z0uSRbP*{(n4*DkfOCU;au7w-toN-J&29sNfIry*H$V@T6+6AC{K@zutRoD@~1;;{l z^S;r<-suF$lWY*Y0=KCj_<_C6JZO|b_o#1d5V(|O>5bGmeAzgztx!VpQe!DGj6E!V zbF*IL+2AhWa!VJ*C$4?&1)iqq{|XYi9f}g(oc6*UwgkdEPHs9aN1waJz3btZlg<3Cn=V>#H3R{ zfUuX#IgNaHmE(gR>Mh_;eumn-KIvyq^96+gLS^wN-TR}=k7VpipB5YnpIJQKPaOnhR+>^YkR|m`(!lhl#sjJr|IL-*3S)AbSA$#At<<>m z9l<K1*1?Y7}LG{%|ljotb;vkFm^+zI{R_fAVxSC7}5 zLG2*gXPhvmH#?hrWgSx0%%oIT>Y2(LvZYLPD&Zt$D>&h{8fOc5b?ZEw}_{g zFoI6DJ7^!|tD#+TQ7znlPEt%CdOwwujCJBM3GBfUTyFPlZ<23eSheuye%@EoTh+VI zn-E?;`ck&V*(Swo&$2GOxA%-obAjbIY*yr`ET6M9%(^FXy*FOkF6`n2j+H9;+JqmB zSR6GnOL}C#@G`!?uG8WvA-6<%hI?kYquuMobD%Tai0|2tph_=hCjdD!8K!kDtbv*% z4^zIXCyfa(OIrgS{W`b~iZKhS{neA&T|;#)@axL6uLs8Hy%TuPf}_C|Z*R$s#EtzXg!{fq7f-I_^H zqH~igodtGXqo={4=EQM&0ULz#`zny>IvUf>iFO!{vO~&`!1mx?MbIvouh3GnhB{4Y zsP0l3ApAHw=vn2_N*8UC5eb~jmQ*s%0}9Y|YnpjN+paG+4ArmXQfg?qtT*;9Gg_ac z5^8?EE-Fmcqvz0*VJ@-{NS=Ag0yM!j7k02Y2@}oRofQ|%Tw z&1sG|+56BfqA-1l*~u>wUBU+L3}0Qc!AJ1Kci&I=`*>+@InNr`5a=XXd_N&k$R~Dk z{q=P5&UWXO1_&GZ`}{PquDiYWoi7jU#?!+d_>+8!Z?b>0f2ePqXP;-4uY*4V`fxA& zt-y1%(cRCp+=aMG)Lfjy=qcl1YqgiP8n=KQ>4kYzeHnTfC>89Xl(bmtEmu^0E2ay} z+0xWKaK{V-id|K}{y_VwK7oFIUt^E8%jr&3!~rcib9P#>w3F#d@SVvKN1WAYo`ub)W)-V~<6?fY z6_|QJd5$6!6tvEob<7-QccY^H1}L8|ofWpJZp;WJHArrkxk`OxUUFKHR}l2Fj5pXQsQDtC#2qi^X_pjcc{5 zhgg-L%hU&TWmcFl&*am^6!92ef_1U8xMF-u!IE~mN4h7v6WtpnP$Yy@74aP6Rq-EOp*G464H48ErDF z%1^A*WGyC!D@0dD1j`!U74eIeuj?x1z1~#slrFnySR8Q3%vj)Z54LC7M{UVjNSERre!1{dyd|FC))3>Zwbov1Cfphy z%Kfwm;39OlZs;qaj*#&Z^QBtfnnSIj50ZR_OfI{T#u|mJB)y6L+|qC#>X7tbct*rS{{ye;J>_n}&7ls02ehiEkaxQ; z;NKV)9#KEygLjRvpPR!cvw7(xQm01?U4eRY%(K8-Gkjg7EBv6Rnskd>O2<96%s zM!bGip9<&QA^aKiD+ox_y`T#+(mJ8m2`vh(S1VYroIz{`-e z%a+*Y?!oS+!VYFWk*aP^9g*@l^Qg?Jd-UbzWo=++a_FzTK2$td24*9R0}BKFgAde6_7G|(yMw6$ zo^Y4mAk-o=HS5Tfp;YMY$HP?ji$epCCI2(;eayz-cnL;+=ehMF?N-jeBC~W6z zF@1=mR!?J&x!X#^;JIfaPr$K3asdfz~8Ln+^4UKwZ+Et59gEJ zM{B9xu_jV4n9bM_^)o& zC-_(Su6h@_UrV-_*Hr`vmJxh1Gl`lFij#CAjIIgu-s+(Ixl2!@X3@WyAbp9fO}Kyo zKZJ;(^V6xc%-!I9(Cdog)7WujDoi`4qjt6l?(%S8@0SFEc^9LP(n9VUY81SnY%&^} zS53#-1x&n1qlP+G=_qFgZe{KYz0^(^f6WDU9kjqru&J;tDT8!)ub_(1In#u&2rOY#f+FNy~w$b=xjzG(T+{kxe_EVpkY1|?94x3H*3QVr!VgASm5gq-* zJULvYxlXi0ouC=+ELWVn#LeYf^Q*XO>`-c+(*Z@n{&Pj^W;Os4Z8&8x^SS=qEw(k= zm#xker6&Wyyds6@*=z>4nLEMeXS$G-vjnL7ab^&RxB0b1B~G3$hpVmi_C{~x8>nF` zz`W##7H3|zYdUS60jQ)MWw*9#*o&-zwq{;d?go88^eLtc(GJ+%DUmKf3ruxtE8cDJ z>e1kU^eL&;Gy2Jc^ttv7B0w#t4iYNlQRILGg%!kZN5E<5GHwN&zcf^dh`@J&qG>V@ zcv?t0J^v9r_eZ8t#co#Eit9)$ZE6V;L0M6)cuK^Eci^YF0T#gD`<;<;y&m4+QIUyisdqK?*OO8j^wFw#P zlEXt^FRFeBbJ9Jdk+Y!h&PsL$2clZ0cLV%_O(>Xm(4GDDzkO$HGxaXYf}Qj z2k5!r_098SaI>5_#sRezblnCh&lEx{rg6q}ypf6If3b_HnW(T5hygX+A8MA+QaU31;biKL z)n0wABx%ph=BO$;l5GyGYr{EVi{^3Tm)R2&)HQaD_!lax!NN&u089|FY6G=;b_v=g zt@3X2pYWA&O{KTkFLhJ%b?hcXR1)Qolf>6y@Gl{sj7+gVe$f~?Gm|X zbh>jK#X#CaGdv1d#RI|h*O9tSlEfT)rr8AU6_Lg}OK@6~UD=spKInmsW4@75R1)=@ zQrOv26Hia~5U~e0n7D0>P%6r67zltEi6 z+P({3pVWu0Vvo?$v=>%w$Ow7sd zi_v0V;R2hND(0lvfAt6IarKne(70o4H=m-9&NT8fRg~O@$Dn5RCeXyZcUDlZSq4~t zi=_&#o$feqJ+IgM-t|~W5qb$dp@%y~94b~9s|feS5w14UP#|dx6i0I9=oJL#oUvD1 zmywPUP+Pt_n<3HYt8>J;j@BBLv`5-9ZL&52rmn51NAzQ+8e4%b2^l8^tXTb}`c5xw z*LM1ldzlVGX<;`rggQ+Y!BIdjx~8AfvGEhVgtb-+NcA14F+?rg!(MEf`cS=@wE*^$ z#-J@tLX+&GP=HjVIs+TEEAbiiHR@^|^y-Ff)Bx?o8C(T&Ir_0PpkFDI4bW1(kNQxJ zF=sfd$sAM=sP=>49@W+!hL_@2_FOZ@5cIdEql(Vr%{s-H7-Az0)RkX{)Pw z$1Y4RXA=0)(rHQLpn$g4Yj>b)kf<&;Us#*qq&)@GsBZWWs)@E)m-U0%0==>7TgMNi5!PbB}!9%RZL2IiKWeLP?rn`{S{mrx1 zH34RLi^&>90;G)eBC7)jY_3$pJ<2oN+s60AOS{hr^T03h3ZC>HaOWuJ$?v@difX^> zzEofO#6>dCpa(h$vR~Q|BdK@HLH;mw_FG6J#nr+!t_{&at)D-xaV9&-$8R;hA^qs%vY*6Q3~I% zdRskg36~)Ef!6mIb<@ddhZ`;Q?MAq@1hi=DAVp*Yqx2Cb7o@tgANUlWV{e0YH3jPW^;BzS3cHkz zr>8(yZ#&tZ>B(0SL&6=tF_+BL2EB79<`Z{A;KirnT*;Qkx^lVCL5F@Z5HoXgKk0dN zB=8OLiUpLZn7bV)Fpu;srGkp2GoFK68_G40XrV za87uJdScL(6HA>rpcm?=f7KoRhItfsCf#H&M}~?l#+G2sEJ39Y-^j>bheOb{6A?_8@q&ryC9IZ%#e3mh;y9sa}=`%YD?H#!hRu*+Nf|3x^KN z(b`6{2apG=qeuEEsB_n8`OWS47$jUtuqxJ@JArB572U$?@e|M-*RxMMW$3?59QTGk zkDBST)ZJRpe1|JShiE_f0X?>NqA1)Na&Ou?vGzfAj;v|J%@fvSM}xj}8RManpq95E z0n_n~tE1}xw-hSKJkMMLH@s-72>(esRf=)iwx%2Ab^OlyL<)k?)>>4QR?FEyfg zRQaerk&$7)Tm+Ym%!gCqq4I$!D4!Yp?`-*x|K&qSCsd~&>IKXrvXQ>m;;W`aY| zb?KLMWm+Rv;2hQ^eXZ6*{uvx1N2q=Dts_e$b01G zN`n5wYJe%S8P$+lP4%P0Hc^H(SX&Ee0N<6h1|bQU!wJk$k9Z`z7I)&uh-IsN7rUsOY;2NmYDwK^&N166~=lrq*xvMj&fmCyZ0Y{9#j1fmPD zsR^}eK*_wNwscgkfv2Z`qKD$*iMG~mH3f1^*1`T%k$OYNg9D_kcw8Wa1TKm?W{)xJ z8(obEluo+2+rkGpr8{yx;2zwEXpKFPNQUeIxDf1iHQ939HBM%FkxfB={l+N*$wf9f z9eUBnNgwFrZ$Pfz3do|8F#|a-jhK^c2{waH2jX~lx;djU2bgr`DI~uH`L0}dwkUI+ zIz$8=4GuPEgbIBstf1?dv>P`VdXy%OvfXCc9CHPIS818d2_4ozT~ zT8sr3P8waAl)$mFj~GKgVUF@U#cg~B^#zpPVa`&N2|kudR#vl#)f49>XT*=b;phm)xn%IyrNpK}yuQ@p_mjoFMK{I@?ybE6#QK+|{MCd||d3c>tG1q@BkugP#x# zdqT*N3VQyzOGz#H(o7@rl=B2`P7NJ~>`VKFx^5CW+|fRd=ZUnBn?&COcff9P66h}G z&|~RKw2zy}>+D>55?RH$gMQjm?Z>e0zS$)p%W9)>&lKz(NOBsXbSoOwK-KV`S5@C z3+s{{Vdu2xqORzZm1?!c6(OhdIQfw(P8S7UP=Xya^O%pVG3X*HY7a2)>L;LU+EP0J zbF*aYkv$#V0)oYT=QE^VG^BciDtikWXpJ^&8NBhtV5}DQ6niL6CDJL4j)fcje(Eye z$D^!<;1KL*E(VX>cc&RRC*GnDwrsz2E>o>&Ozt3N;2KsD!*BMtAK}5ob@CmV3y6Lb zt^a#sn(JNlen2k$2I~4v_H6u`=t|e&zVo+vf}2TA#w5@-uB!|5yVhx(lWYf0r&J;l zy)sk5TP`cz)T>%Idm!jusaZeKq@O$WWc(W0u?=@Okr_o=ky4ccv-V^D&=5?gvKz{2>=xDIL20PSk?wNSn zbH-oM7v+wZvWx$L$L$B-$=%93%7fh>T&;y;Oa=NSWTV{^`hxBx+?Ait#f&9iqc28+ z)=Qsil(!(=j#m_zaawP!)lfI7CH2MDD(Iu0z%|f#W375l4d|=w7@`)niS#-} zEgl%E=XGozL5pxl$jW@~^d)yuW2rU7D7(5kF%X{FKh)FeKpzpyx-aq7aJG<~{Py4Z zL{EB{ei2fU>bTmuI&%(kD@xk8q&!KZQ=f&lp@RHVUptudrucKaE|X1-MWM*xr_c=L zl2M=7Njr3Jx-b#auBNw5Jo%SODwMIwEX%+1n*Pzgz2biA8tl3Ku$O#9Kj88MaV1jh zBJ^gvlY`N1twAs;{Y3hQU_rA5*+MwxKHzRCtS4p|OO$J&UO))dtTY5{YP=ZSBO#|J zHIpN`SSBx=1Lvs$)O~nTPYJ(-Nv>`#AK!^tO;00tIt+1|G$@M7Mtnm*jQZ+x<(HPn zylpY|8fzg;8&BF@sexi1Z(YCS^Sjz`o4}1F@w;4&{A(gkMSSxoxIYWc`77LQ?xb)} zB%r=*#1H2bwl|xTt;}pB+kncxiXDWWb}gp`C>82473pa53#w^-GwvFlEf$v|Fg$;M ziFQOqxMPn%8!f-t!8oMn(c9<`jYvBM?<6-fM_Gr;#FZ=!YRBw;t833H6v?QFL=O;DqC!~BjQm60jMcA|d}Pmy5Els5!t zLr?6yve;Tk{Gw7Jv+4|42mEW>@EerH?q*VE8<=jk#YLH;!XIHPyO9`c)lrXu7A4I1 zX76%LNafl9F0fDJI5wBijPFOocB(a%eKMoZ##QJJoXz>!s?;4wQS1oLz^dpTR1SUR zyrHa0ivAK6qDOHs{FR-tf1I>=+4KoUTAezzdsfEO5 z+{PYZ{%20L!tFgK+<`PrJ7B(YIDWk6w=b{9;T}5=v@HQPkTbMRD~OZn;$j~61y2@# zKK}$a!S8b#s8Yu1)RGzBwPn;9_xSKxVNtGzWk;4IsZH{f>gzJE9Z z)Oar7q$R?cw3-UgacpDINL*mMF$bs-L>gLYoimqPtL%w59<&$V=>hZ-%0-q(n*LM$ zAa4vsLPZb))ka%937m?+D)7vd)Gt8~F503YnRfv?0N;(*^x4^+`cxY> zlgrERWXqBB%@@Iasa(?dL_2wEXbC>S^>x?v&GXg*GJkcvM1PXmJVj1fn<;2}h*9qG zk%6db5r!|^^@e23jT*0QfMk_s#7tqFr=7=kC%NXcukki(i?%30rH)HFk?PL889Ii_ z3(ei>t}9ZE_?P+5iNiMTXuFLP=6w4CzDM@vD!Y!j&p~CEgK1A($A9s7$T&JnJR|m! z%jk=25IO`s#07i<<^gFC>xc_P3-UEN68?N1cF|677pz1Mg$&51Fpa$l8tPL{Jz@*F zhzdZW;wDO?vN40$Z@_{$Cl!`Ti?{fyTon5s)RwpS3E;mKxTS1%t_Bxib8xfS|7erI z;NtCXb%)x#Jh0%W!q19@HPaM220tOMvNWWP28r6>;>+S3L<{V#&|R+RjDv~S6ubuJ zcJHlE_6hr!In(%}chc+Y=Z%i`AxO1M#wDEDSilt^g>o=_YvYjv4#Q#gTpU5xWomIg zHXFsDELuBxt+L)|fUlCqbjl==B+Nhjv?63iM5b(@PvECpWyP+&m9kR zPhXgvk=wBKqWVjtDk=k&)jj9}uC}imFCatiGWh9Q!72R5+G0siNm?j`F5#Na6mW&- zAexg8$>pFjPIM}u(&iF9+`wigIzf$v>2V!M6069Z0>}QU%%&M@(zj>K3iZ=B82zmi z#3t^b07O|a2iFLf*51oS)zMm#5#}^t;`t1Ivrs|oCj4Ncs8!%b^y7BWsas4;Atg{f zH3TpIJbDbhl6pe^pvExMn7#B{syZY``oM!ofD8CL@ec0B*(5Ni`w|YFz(w$og2gwdN^eIZ51~PS@^H)T6!6|iReQ3AqDmcIf`mVm4cM#k&qO76q1ZD zLtn8c@eaI{_s}`37dYIfDU;RLT08TqJq34m#-YE!z1XQHDz&uj#uqycaxQZ~Mp=d- zLAR-)G0!}2jx~Q7ZS*COeR#~wWidedN`gP7+RL3tl7wXNF2FWHF!A1ri$VpH2si0H z=q&mLImYq!1JL|VHuKrj@Jb>NHH{hv9k2D&9!Rpihx!@yl-I!?q3J4XRfeB+8r)%7 z(KB?MXh09raI3&g`NfHZ3K1B@+&gl)oy9~( z!2E#vz|?sx*#%Vs?_w6MnZD3=oR5&Xx)oC6|04=hqnNwwB<8WR*xF_^G4G+Z)D!Lw ze}mqSW2{|zPQ4b;=WLiV{H1;DAxIA_!n}c3waXrBtkI6c&Yw@43tg)kSRsCcYV;X& zcm4nydj&I<910HOAv+nE8Uw1So0Nysq|XsrG3zhH$Lk( zj1|@>wA*WJ1hw>Y466goR2QK<&Up0PRE=mepSjbP z$db%rI*xn`^$};sSjFspHe*%OFRJSy=g$L7vMy{U+YT6ocR>NW-B<}1Xdp{)Rp?Wu8S0J(@%+~cr$p6S309X1@sbj0XLlv z$=aKVwL}Ve4Z1Qar;3Jqq>l{$FQP}p$nf+2qTU0pR53%iBMcD(q9L9V|B6k-5VxFZ zKre?%y&7(Tn}geVDS3>p#&%;HLefQfwg$K_icsCikwAxNwT@ z?`+01AW5`6&f-jkwEL4p70Sg_V9GEKy^ib;x44}|5+rR0iEHF0aB1&@y^O(UAj!7? zBv3a)S)fABMmC1NWHk~Jwc)(`fg-SFAGY)1v$#JbTX%+OW^dv=DA$V7pMjk$fgbHL zxNW~;A9PjL;toW6I+t!HOa2$eB%X*cwb)=9jIl-Rx8eQrBHTg)f56YkKTaip0| z{jJUK=7_H4y=o>kQIm|ZV4zTm-Jk&mF8uNm+ z*njLlWM2L>8lWGiTUN zTmsjCtIzIZF4L#Uy2Li;E}oCOK#KWzVl(*@)LeI9Ej1yh0pp=3^_~P;F*yw!1(A@@ z+Z;G3|L-N0pn6mJ=nM2EYBsSK(hx4f8F5!1W9CA$oXw;{mj+MJW~K^LnY!<&C>b<@ zlsZbDDF2o#sdbD`wilAEEuc?0=&^a#*l$iUYZ@K&5n64PRQGGg%*nQHbvG~Ro3%E^ zX*7ab&GEurZX{g+QtCTF;!+rrfr)<`p7!jJHT;!cK$jwCpauFwrM|k^C}kHyx9zc@ zLYl8^(HEl%i`$Mdi=#zkeP$!;;WN3ckW3dxMp7-w zW6lM90Npmnf#Y$eKG*7l-x3!gJvk@t3#a@Z>L&lfHQt-#UFUkhb|pi&raj*%uXYP9 z39b#+lRah`LZ>3=QB*c65^~GCQpxNaVTHIFa!UVDkBN3b@VG!5Y&c(!f5u&9E|L@^ z)(?TTl#U?58b~33fSDA{jA7Q%*Qj>XUT`~fqjdT_B*oqUzQH@-JGgOGq9eVWOAmxVx`w&3vq)$K`oxfi)2k)ioMuOzb$K5p6SrcZAIk1vbmMBEI>28!4D&KWb`!d8*n5zu}vP}(g7w{r< zN5f6wN$rUX1FazoypLl}X(s`D9T(Y22 zs*yFRtkBOr%VmNWdknvTS2+wR-Mx6srL!m5&FmofeGj)$_$H=_J4CPOfgW~OrVB+v zQgtudf|+M0eiN*;$M95src2Q-`Z;vZ&r zs81wAE_y*?1rSPH&U#eYiigbC=b?9@1xk5vJeGy&F+s)v5#$%_9(Alq=6q1w6*Mb@ zVyeB<4f>F`fcFvxT`bzp4heA0jLXJDv#{0LI&J~e0J#v4s)DX8#py`4f*g-2;1OR) z=7UMLW)-v&%;E;A?N%4VjUxgo(oJ-AI-cC;yaCSAC88qzhaJrs@FX537m$s}TtHJX zU|M0|DL@qKN))Af(5>J`Js1y1U9Aqra(zBby_;GyfEB?pDGb9u6xIki_$|z2@(aFc zdCbvPK{Ods;TqE?n4;`Zb{bceKg<1q8jOP5cQNSQ&n9Mp?zI_?Kxg2r-HbXC`yjJ- z6)0Bway&bm9zp)Xh0#|#1$6;+Z6ziJ`Zn{Wn&4HsDzz1&*_Y&Br+~B5838BSA=u0N z!YikNs`irBAdBN7Sso@GqtSIV9p{Jj=K!CnDP%&$Q#=3IL<%IqWC1V8D62Ej%BsLjx{O`O8Uz2!IBSYk)Ar!Q;F_3EEu{0& zr@#+#*m;3h0jscsIa8ajj8h6|gRK6*fT+q0C$FOaEAXEH$M6ePm|jDsIvbqjgho!G z@{$_LYI?Ml$|*I`7>!#(9`H7yjPQYdPGvY1aC;Q6e_6L6t^I;^-R_E;6GcF~P?cOu z#5im0jn)-ZfEYxn^euWh(bv|DIaY3`Jbjd_%Lf>PYyjP{|6sZn0lG^HGNAey+02b- z8M%>Z#O9`>2_JOp^E%zhaZshNBu6?yG#cL}hB9CHyW#_>qf}G;A$%7m3gh@1kUjmF zjE6ep6sUl{!!y{O=;SPfTD&4zpPCB};1HEUcVr_#x!|xCvx-iDGdhu~%fz!wIKEd8cTKz}x9TT!$N}#CGA&3zqOsn9V!}V3<4Yp|;a)=ugyF;ElP+iNrXk0Y-Ldy8=+6-Jp6`orSOtTN34f zGt-y&R3D$fBR+}jM|8$fXah>X|6}Paz}z;THm()e zcb5w@Gcz+o+i=794<`*bX_(V6V;g2_8fIorLk%-CUvgku((3!|^?Upr*p_8!cXr^N zcV@exFV}b_WIcOuKqC(M0y5n@5DHLxAKVdIPKS&xW{0p~MDGNZ!+TiOL|3&{ zYai$xv>aC^5r?t2^I*;qpo(;-EG&fJ2_X}Eiyt|peLX^+-3hVe-FAfuNHsGa?WF-nE|$N!@b<1DU7W+ z-~Y$}4lx@VmcD|%Lbqj4X?VYD+p%rC{2~7UUup9W-9;K`;i9}=gi7xA{&xOHzHpG0 zb>{Epd2$-1VB3GtcN>42(p+sm0EJ5|ilWQ26ET*uYWTYNT3d&VntDmP?-kJMd&^~J zdWwzmK59SXMO`*iTer*tW)~xcv0nG-g+*_znpafbb6>i}@Jg=13HgZ~NhcE3IL7d=nJEmnKds8746PqrkLTvv~C$F#J zSwC6d*`; zIE_Eu9Y1q0JJ5W`z8nTAZ=_!n59zTMg|#?hUv&=3W@3YJh2CE#+h- zud3K-p719K%VRCkNbJC|o-ga_wTP}_&8NBzp7N`gkc>xTnalmn8RjUIW|tTZ8hTT& zE2e9S`R1hHFX_qsE;XB3kMX*~$-Q(Hue=&wLz#unT9v%yqKWa)DiYQ&{8(5q|1+ze znMmKP4WR?sTvp~eu}5!eTrftMmyO@pTk9?zekxLvUsG%}hJ!kl@eQzUn*+@SMnS!n z$Vk_(ujX}jC9RXFYNCsgzl47^TL_;w-W^Z8l15tr%V8OI=&HDqqk?~qhZ=$>2iE!`H zJFFBP?*4Q$IgRbjq2g4NYzWN?6%Ex0T?)0gBOU2vaa%iw?6!6)G;cGwv)O_h13Q8x z?7_}VGIWh#*}em7?jcjTQ|wm3baDA&+s9Q6rIi{z(%6heE^?l7jeW^<-$a8I)=PtE zmXbcVoU_L65SkMFHy9II=X952w4VA8#$4*O&uS;-OJ|Nf%-&5_EQ}~JhcQM^D~5Pa zKsXaRYKOjlw(cx(hQe#;U<@_un}dz z<=oBmlUfZgo4oHPluz7O?i#s=o@-Y`Wn;V9*E(*+Skcyd>%5iMdTON88)IKbR zmhg|l2kh@V;rr%$>3a*GvxP60uf6Yp?*Yu@!*GNGdM7cK?qylE%Gyn$>L9(zV!)J} zVo7cEcRy{5)>E9<`xx1bw?uiR;g62?bQsk=odix@5RJL4!I7e-{)WzN=e%O_wDZ>9 zXdkz8I(6wK@z(p~<@AQRTS8Og_Qsr!k+Cs>CH6}0J^{T8bIF`;dS|cQ+9^$Mx$(~L z_D>-ZtQ6dC7xC7S*BYYxwdziaz~GoJF`47W1PeIQT_U6CkC>duGK0QH8|pp?$mnj- z8g*+E+_`i}+n{X_*YrpFS1qkOB@l`(AAKkGk-bJVAe;HrcgO6i`hL50LSN%D#=eP3 z6u50~1q~eJ``7oz3~5>1zo_p{9LnUj@SbQvdeTkPyBRrPmvko^RmV;fcOj-_+~v?! zSsyN51FMkvC)%&1COtn^u{3&e7qu~4^n%s{UjzRztD62lFV4;CYHkDi+eT>rz_Yo9 zuKD8jb2`9#E9zeL5*W*^Tg+rpUutUyJM-PuZ|J{K2l5ZKlI`@8W=~%+e{0`Ovz)O; zzioW6I{T;k=lSlNr}dFyw5SH}a-Gp0&$WY*f)2&o{1w78L`)CA?!N>7p{{6*FPB%; zGDiFEhc}O$n6P2O+X-5P_wt=Gs)#uGg<0(COp|orvo?l34lf;k*EiePMyy_eJjqCB zo>Q3qhC_)6{}R8lW9ws43k+hNsbTN7UpgD`2Hz2t51_YG z6(Ya{?s0o<@K9Vx;jtP@is_DWn~J4!Ye--WAZINDqYN^e1dDyE{LGnz4gk zEjPRNT7P7kzAYAAg~U-W+U-WP+0M=H{Vd*q%{j(L(bqdmm+&yBIo4(m@yi|3#CBKZurEO>H`H z>A(6UYfjjvh?J4jBQHlR@P9Bz8$msZ(ck>tw-a9?t-rBvhk1^k9lOBGde9qj7(Fke zv4@RWw?)JXaz}l%3)*AQ$Cu_l>xGru+C|U0aP3!mrPg;AIJM};wFOM<2QgkWqJsB2 zonJ1y+ueM0M=eAi>IJ#FmY#zRE`f)C9!-5XkRZ4_^uReLOJR{5YFqQ6dDA&x>>KRC zwky;ZEGJ)RLU3)M0Q)YViB1w53>c*2>Nj7ZLNn=w30!1MTfAZV#`Q z$YwtEWebL`) z$5J3ZUy_#y*0{*$%wNFDnvB%Co~fX1LUlk+X%+kdiSgB zCQh4H*kX8Qg{-F9Rr~iqY}}{dEw`{<-zURD;b+4qhIRARf+J{ZJKZD1yFWM^AVee{>&o!Ftr811YSz985@ zBQu53l}h%3Bb$V~g4jj+&PgZJM6VKd0hUIblxOZVbQ=HJF^(F-qlG(A9R})LW-5HH&-C2x?oRZo={2oZ{!3IUWg^<$MPBxyR~I`v+dN^d_NDNr z_n+}a`i_~CjS6}sIhT)U*%9<5eJlUPi|grS*IsH}^dshT-!br`QobbSeBy}tbS$oi zRrjV_*}JYa z;GWk}O?8>x0B61DvN|ll#d5wkpUC@zF%++-gw@x`K&;c(sYDg)aC?w@%R5DG%SVK9 zQiN$g$se5Q_@#P7-Ii z^UR%x=l#TcgQRux_M$Dzuv5z;?W?zx-gQ()I{V!>@_?4X=xc5|XSw)|FT?k?%KOG2a*SI+$l}big}UiEZ>~BZDQa zO1>plee;TbozBL&wC${>7kFJubZIv5p9wo2*4N+2isf^;v?54h8oKGuB`WG}BsI60 z+v(Xm49@HUudJ-=4ySkN7uiZ{CtipG`UyR=aZ%4oGz0K^l{a4_(U{(8sd&$$W zU~@$e*v<>^cGK$j!~`t|or(V@GdZ2k&oAgd{0Y6@$-Qh(w@=`UB!jQ|yQrWq0cS|< zg`9Gsg@H{V(yiR~a4e>KX=Qb%I9SFmn2GD*qK%X*+~sZoa!WtT7<%mn;VaIxSHZd+ z9eNykWV=p5x(KJIYNCL*1P%qP#nf_;phOD-L6Hw?ZnbhtU`{=yE;IoO9Xq216s zW&G}&L3j0jdOq)8I~2?x%5AT8exl>EkmFIa{2d3T-aEXY=^i`aW6*&7=l>KIl~Mqd#^tk={6KmIbS*ZABUbv@!If z4#{;el%JW$t$x;fW2t_SEanukTOVQUHKrMTj4gEC*=Bq*)05fSYc)38>w~qfuq@7b zCFmnqypE~rU8VvBVk+cEU~o+tnG&TEgb ziOs}8FOh6Z?su5I)R`Z<7zH!VUoGrB7~h+mS)}!O3E$3YCE^J3Np#_&YTam9d5k+1;XR zXh?8M& zK6~;`51x-35%(~dSiTn(tOV?X(1KjWzy9m~b1;#{`Q942#SZUpc!9^@;Jxyt^&K$} zXiJ=Sp(OS!c~wh9#>~^p>t(gZ$o^8QbUqom=>L7fEMhLxH8D=CHCCV@>YMcS$M0Ef z_>E3xeL4>{iumA&mpa;`?TPz&ue4AMWG zqexv-_WAk8lX`jUjQP8Mn7r6hG8tjsLiaejybjfkf3d^EP9m5vytA^b>v}RjvQ#Q` zB-FS)_?q6B;Jp|(iYM>kKXblk?+YJp>+ht5uSr8|JW^JmBa ze0Lkuk9{89mma#u>=~g!p;w`=_9J}dhoJHIZ9#9yj={9{N2eswo%HPoedMYgPwtODVgb zR}5xBA%71#wd{2rc}P16mOcP{D<2t?0!CI}W%$*vjsFoHt-?zjYfdn`n@P+B)caQz ziS>rYCh(A^`cZu{wGD@@UA~TR&?bSq)}$hLrS@6;ZN!=xtmdZQ5cn4*jegcx|EI7@ z;W@(IS?7#-;Afh?x)IUbsLawR2OeWiba`y4|ds(zKTA1j7ecUYuia%NXFXTG* zImqK=b`m)Q*wboguw$TDAU5z9mFhF(9WSvasQbGRtP=Mgvw&mWfECx=~t}UVe9cNDKZP7!qh5{4+ETPDyH5#;fd>c6qy# zUD2Kk8n`QT&%Q}~&_qvZ?lKxvZSpT&rAB{$^lemh;=o}i6ItpWT5_+rJKoM^8%{rZ zNbDybn@q%B)(Lmd$cD&S7coE^ARRlCT>*ySam_SN!P?dJk1#Kn!Vw-vcK0fs?~-`m zu-wb#PVW!)CYUcT*&tDI$>SOZH@Ru_1ipv<>AoR`?Tv6xI_cyjP3fi(n0k8C)Qf0; z%7Rj|9t)u}8tIiyY0dHP4x1Ua-1orvu6?7b^pMQJ4loIf-o}pxsE#NPpP~=F_g8u~ zwBjO+s_1{PX5FniRx>k+;R$?e@u%M3-0yoGwkP6fg0TrwL|pMFu!iZ;^bh}yy<{%3 zug!DcD&KtTq;Zk#!&vqlh!$Oq1?DgqoCADoeA|5;eBG=W#sg%<0g;@iEoW!jLjEX! zet&E0lOECn-Vkh`Pt2i1WhT=w4;ugI<%Okn_No(4O+ahq)CkNYSG&?80`9(AVHMvIXDV z(=txJWR@qoKRQpbaZBWWGP#Z9Q2S}%RNV5w+E91u`nu`|^~1s-;`_)LykJ!v01s&5 zE~8h~O}i;MgPdj_-z{GWUtZHsZ^%Djyl;lhu*bWc^7P^}GnL=-S5TBUrge21(9 zMpHOTH`piX4SCoW^mh0T-g=InucPz^?8lJMti(<#!(l+p5DCa7?bGMN7^7y0{KI*0 zUs(e+Tb0p3n`r?*=W z59>7heB|}|dA;E(EO+nPdT4(jL7+e&WAJI{nv+wW1FvyqN}0#)0~R&FJ{qbJx=3Z} zt6&-=VzWHzz4qpMn~;%9_-WxFnG2oP?rO5$x14>>duJHlS!!%;l=R#*?hMe=^e_zS zuyfaFKx9s+9a`oU3Y4-U&J9f#a-eqlh3?wnj@A_ z7xK55r2T~_*;A{i7c!f`^gBns=%{fE2GC6{=#@kdx8)8Bc}ew$*6(4|tNAozn3v72 z7trzODtWJ{t!qgZp}cP@9gg18L2wJWb0gxN^>Y2f}p9+yV zutY;(Lsy;MaR*h}R%xr`m0rsMAk>}@qFkR3Y+H%ir4>rQ{NV=Y6& zL(f4*);L9pMoQtce-(depX5Kz=g>=}trz+wT1HWSk=R@2o^}3kW;prX3D|m_9cIRX zyFGONvAf&1z_>cmaiXX@g|+oq#(2|UQI^$ADnUBS=5A>)n-TJVAex2CyPnAOJ!imdcY$PaV< zs%VL%_O`%Yt-sCGMilwTtMHJ{(eEJ&H2Z*ftp9058M)0H#zr`BonR`o2hILNyrBZu zHM3e5&F{t|vc`$T0%~J3Fj777k=lT`mo^WZSNl>WaR4X+z?y}!?8Kbt|LA+vLpOxfT=ZMVuAw7|C z60B^6wg;@NqkJI05m#M;YjHr2pxd?dOtOeO$e-4g5!^*0QI?)6kI)1Sh`QdpE74d> z$)2ufSMbBwqS2zOI8A@SE9`)D4nAaO=bk-V$rhaKp4fyje0M8t0=U^F_qEg4IpEBP z?RO8^UMYiQu8KP!=v&k*WZKd8U^hyx#FC$vS=}?Cb%Et^jpD||-3#QkySOD_Amn5h zyja++I>^Gf&`-ez!3v?yWP!Tli`8O9XXHAvkqzAL%)$O;q&nnxcc^=lSoR{XJhoR7 z*MirRHQk&t4PHcHq$(Esu^l{mGU#+mud8h6W_6m_ zeeI6;1RcEn=*&)7uy<6X{Q~pg4fwe0oOeIV4qBMrmdv_g%oLH@4EYm$f@`6E&R+RU zD`K29XPCo{mU>DwbWa}rzy`L!qJBUwZWsM8`sklUPISl-BzipjwuhkK)7Woqk~~kX z&Q8sTzUd&|aXbhu`(ky`_ZrezWYhy??g9JiHeI4Kk#F_1GI}W^v02LcXtlDkn0c|L z@HOEBmJ)l(fHb!9_^#7+tuq?2wYWmYrh(YUE?W)sJ9=$!jG4wrBTBDKFUG4>rSH@0 z8?G_Syh)7m*%-?{R#Ws!M99VTvc%|<^*{B#F#IZFp)aA+_lXapG;GT{?5kJXOk^&_ zwpXQguDQt1Zft)eiFe6n&Bbaj*N$P$b+W-*_{<#Gh4~EKh+{vlC!&q;i(~BYvkkPm z8r8>3#3&J?mDBpsllzN1$sNHg+U^FTy);^VcF*gDP2CJjEaY^hC&OjAn7syfu$ss* zBYRieRj`c?z%8!jUBgmT1hxE&y|m^rwz)t}64FOa5PK)|#=|nXNi4D{G%<8G)D&iK zVfHs1jW&Kx&Zd?$(REE(1u5u>)7xHXf3b%+pJ08*xaIJ|U*knKC68YOyS>o~b9cC% z*a}Jkv;`J?FHZ33fX|2VhNylD#)4f;Br-PsJje5BIRL4DrnOE2Ah1@hkX1n8~ z^!HA%)7EJ(l8&(L*zs)$-rJu>65}qtjK;w&?jYyM65dp;wZ0Xv>!`6ux5Q*`2pwz2 zkW)yi{RzLkHM4#eEcBGNjA*-)oI<8~yOta#SQIn<4*jq!RB0mM7N}~TwZgh8Eve>x-1d}@!iIgE!;tTqU+oBM#eoO5=BHxur zR8s1h%82A}ziNmyScR;_2oJm;$vCAJTSb7KdvBA)=qu_83A20!-pmf|DK_Cde4N}w z(fN>cn4p$OIgr^WZYAu{aBUewdx>y5ptK z!~a=C9;PDeCY_hU8^ivpqhM0KCzss_yK|A~tcKSH?Uo6ovkGzFHO`(HvW1Gk2fmiX#WT&^h7bE(LLY=rR>Wvy6fvgh zuNZ;1T0JcXSJjP3B){m%H8sRCS0MZOBdn8+dM~{YSN;*rc0mh~5vV9Oh%~xipM=)? zl`59j#4Ce|OWxAOL+QvP)PyC__7d~`RAYQ`scs~i$b??ICsW9>>}|8qdFkwR7s(%qD1L(_wwHRn9_)x!+HOkzW)Qut zlF8O^%5%c9?+wav$L%W{k&A!ete`vnkWen{ZL~Aqy+-_4(mm(o0|hK@FR+VaS*OF; zZ447^2DWgMyU|So6SIJG0EX2(yDV~D77F1Lr+-|Zbpw}988!9%xX zLGV=*Fm~k* zPdmx+o@;x@wFLTRYE+(zJeprVgv~J{^p|bGv(Ijf!M93m=G4<@zp;z=4sh!z?}Qi! z%6i6ZYqmBV{J1h`){@w!azrSrjHO0WBO`pEb@0rSGydJswq3MjbU|*7)`~T1fZt^? z`xvD`UnHnqVq*^7D|&(5wxgF~2O?ER^nxdQ+Q?}ogDv0IdS&JSyK7Hv#0%kxMfwCI z8NT2<<1K#MT0S{~ohLJxd(8z_8eco#R9`LMbnB9t9!p-7I*gs-6|u)3T-zjLI=8<&ZX@98o0@!L*(aun%1FAD1G^o#li{VLI32IB@X^-sD%gx5*b zM`m}UQ>*Y^fF2zC(ayWjOFgh78@vPL-=&v?*dm2@9qg~L4B$)G_m&Wo{f*w5Lrnbx z6_xLqZTj=T1f1{Qaucv--k|L&z*~Ip=9jDG1!_vpQ@tBa$FqT0!I5+VS&E;Zf?m(F zLQUzb(I8}y=h9$W&PKnTvYXotz~1c8L$LYk)P;RyZ{f=1!k&e)!oaVLR~H~!D+=Fk zv7OZEcQ>7v!NLKBpS3G z`;+bhi#bhKyXVweB>@9i;NEa6vY+J`^xkyYDn74K6uZ9A8G~p1N{;l}YwN}D`Vzga zzDx{bPu5%DpK;Cy`dk{)VZY4=nvdADidRYAf#GxCJ_rUG<@V4nQ`djrx7U9W2JTrg zfr{BH)Jl%`GU(~8qyD<#CBwVWJ+!JYsV~gyreiP11mXunw?I+n|a4*XjB9bN=Jt`g>7BZn&4S1GGojqFq=B) z0qpMu#yXr`rms>JklvhRwlY&03t7L_u%OeCv-4UrtVmA!i*MIf!pJ3Ei{2W>9@jC* z+->q4p<*{KY%1&DOUQ0aS)PnUSjg>)=HRu^u12rP?EHDEy;~ z#O+1-FCG5WIO>+(u%1(TZ{#iSApXHT>H;3?DfLEpOv$K{j)gVaA05ybBql`nv5eT$ z8+>|`mW!&it5oF&+5h-4(MM|R-h0skboPo@N6w*g@sPa4E*-m&y}DGxHq$rZuUDcD zq!RISEi2&b??2%yOYQ$X7!i4}?v+Jry|JNjv}R^SKH|hiv4Tv?Wc>}=Ym{Dr>)Jy^ zbQ)}+g=Sy_Yr!|%OSY&kx~&2Ev|&a_-=wcV&!xkrF47B-hrMA$m@ACY^fR4?72e^E z_wIrc8X|8_?!TjT?Bgl7?1oa za@Ui+;J1@aO9n#!f*qAh;&o;5>fiw-r@lYVU5Ia=)op_HX-|#jSo((@qGQ5PqLVA^ zN&bpnqQB8`z8*}N`uO~J@G{%T*K{kcKy};c(8kblIQUzLn(K1LfsAGi=Kid`nR<{r zXxpJ)F?|0o@{XI)E$Gysx+t3?+}@yt4XMxgCJ)Pe)OO`$*VUQCG?U#5ZV$JkTbHXW zMMkkGESx)FjuL*kpPbx%nU4yOoUljo7&G*r>9_Z@`_-OfmvrjEFjxqR8smMYg6Fw> zgWsCbokuosyw?(M=A_16?yUOOVjrBm;=}|A$+d^D(mQO6(bsnZ2pu#OR0ti9Jpi*Pu>V?;?&NHoUN-$E@%N%rI}$h!r_ zFlOgpu^*<%KCOgy56*C3^g|UrlQG12uHUB`uOk&=D_}?-L7Gm(xX7S)7DE`TA>h6- zvLAXl2~stj3bd)9miI*tDj~n&EuE%1?6{Uzlw}9yePAyIiT%dNFGP;@wH{)-p2`U5 zC-qaa-?;PPdIKsFnt?wTVB92_!~;C|j@oeExvh_;;^8AZcr7G?{eqUd zi-*z`-tJr~7P4@je>De5PR!LcAOilbWdo=A+Zbi^GfEi!iFd-pdgOa6l@&e36Y(3- z_;D=EBz-LTylCp-CX1Q)ikI2H46vX|GCH9nJikazf-n;FG- z*yrQ$>MCi)$QvG~F8PI9493V_>H_xTUp;WE%6IIn^DFw`3>_I4Q$4>0T^QqJg?ltf zP9@%5BfGrwnBAzFQ(wFg%p?&U+mg-{J0+gs3@r2)d!_TuNrbOB0ZZxH z_rM>^JL9p@N0BPs>p)jMYN5g5%hH434r^%_FXqb3=$Q@s@$J2SN8lN-V zLvAW|GC4$Eu?E;>F?4znSbq=QABn#{xEEv%jp_otno-mVXVHdxU!^DSd1dL=HQ6|$ zmlA8}9PrxNNmNtc8%Vb45c@U!q|GKWNC!s$1U#@DQnko?AU6|}><1xe%1+`hyvte- z@RN4bH@vo{QTveAY+`l(rBpbof5QJ6>)UDObX`vca_pRza6*-$ae7)&>YO#XZH z>t0EwzrH@eh(RU>`bvep_wTe`!?C^yqSPAQP>RmCQjZ4lse^{SiQY}a4(WZg{p8%M zQE5>cd40kSdo)qRZce7Sl_`NFVLYgEtP%S(PBRRxt`TrWmYx! z7&X~vunsx!xuDUR(PgE{#H}ZTl^m@r*h#zrm|TSR$g{LT)L(7GhOY#pImeYWqB3u_ zoW)4&Amca?`PuKCVocW4p(6}Gd@ieV1Z(XJl1ATZ@-wFRk#*V4djfypa(wP$D#z}? z7MCFMSPh4;3HEp>G07?Hsn)26nw1vEf~K zd^O~Dc^j;^I{s#6b_Dr}M|XR8CLEuJG8F_&f*M++; z#P`hNm_*tWvZ{aLi|-cqSjlxoCG72atu~Ry06OrDCi8Jql%t<~S2zL3wL;+I&-GQX zfi!sd*Fl>l5nBVV4-8@*ZPi!%iBEiD)-xLhGrkAb-BNQ7yzGi#-Y?)9)PM(d291`F z==&mFODY(Rh@oE+m$Wht>M4x1Fe;Dxn)q_j|I4q{k*(;h(9${V4rGmf_XcwXlAWTi z>h0M3y{7*)dvsUBC#-0s)~CQs?g$EXQWl`cfnSctzuwM1Sj~xH`dXQNrWFl0+$M9l z)GP|~Ae*rczoNPK7VQ5fUP&dacPitOK2x`hl&}gydM)Fzo*GRXL{5{^{ca<1>qGJc zmev>v^|aU2h#2NdtERtg*fM%9boBpVy(2&P0D105ughEVk^2*JG#icfNPZ_bkdw9E z6RRE#P82782f_J+F`0`-+z&@>x%{1s{22O8?&NAJGu}UgHe815atw^=03G-ygX27b z<68vj$_9%3HxWx_ca8JLIpww{TFnO5lb((XyXgaS%>BzffxW$n?wsNjbTqK%s!lDZ z3(pUt)AG6N+#~KXx4654T-pE7j(6}G*Mnk4IcJ?$PD1STUi{6z@&pl5Yk7i|;<4v_ zB_1(uTXz?_aF27>(Ok6ijfDU+Z~b6X1;qq%$yvcE;ESZVr4bDq}uq{4UyD7c#CU!t)WazJ(F6~ z&so7;WsrO9N+eYToMt9gbuV82DDc(XutdL7%ejvKs^T@Yq+UG&Vp$v>(K5vxP6nwV@`P^sV!`Wdscc9kwlCi`vjpxK5*@!6q zhc|mloS_~i9X#@vRE$jq2h62U*W2o|vFT?)MaPgEx(wU+xD4Q%-In86d9$_YoG-a~ znH}n8Tdl2$R$ptT)z){xm&zxpe0!+(6pLB0v%#mQux?*q%}c|;Pio|ab^6WhXQi`p z!)3jI#osAPbA`vKW$H(z)Ir$TQh#T3HjkJqtOdT;zMHTj>i8yG_uwt|r{1fBo)#~3 z6nyI~{aXNrwF93z9DZy3nepfhckkebvKTa$d;|UP(J9JTS*frn= z{$p3J?*f^hwMguCW@!`X=^)U=u}DgK{ErQ+rzfnlu1Nf!tmC)Tcn^^2$=lbXV&X>- ztTFPwJm%T#iE&IHt)~+w&=hId%c7sN8pLNDNZP+dH>qK0g_E1Vg_bVFNbQmpyjk98 z&XNgCwT*ktS?C%d@4Lk-W01ASsz@H>w6Ra02j}~c?h$`H6xTpayWzWL0&QIg-jM>t z>JEJU#`sim_^rdKD5yl&{-f}qFL-~$1KJ3aZ>AAWPO%=>MyFaTmx>$zGuxZHsf-_| zpAjvo@1LOgv6V^jZ9if$`?3=5VO>vn8#&iQm<6RkR6<^J?F3Bu5PmMmf|xE&kh$wk zX5}*-SPhWTfubW-O1r?tdJw}@;^#Qnb5rn73+tW^ov6_z!J$uU0q%M$?1rIupIhl& zQBc&u`rpQHv|0HB-~evsJ7F0$;^+qKsUaNp4FTg%Mq$kZbGMsPlV84RLPbbFvL_Gc!Df;eQcAh(( zVcSGY%(ZgLHuj-?E}D~=aALOihUal62l(N z_B6QH!|en13TKBqjFl2eCh#cI^O8~RKp*=YjM9GQXE;A`WN;pWUey7e{7l73T{)JR zelJ?)H0y2yviuL;QYV=l8}tU$D*<@~7oJB|x_M+JCXhrCRrOz}=UKt1*Ck7}n!X1w zk?u-h5tCS}ZRH^Of%qyGA2k!Y@<-7JJnku4?*?)FH+1V(a)f>1Z~jcCxEi|oCp`Hy z@f`R|ROo%hn&!~QhzK%{RYCP=?=(7Md!Pl3uO5?yBMZN)3s;sp%q3+GnqAttn^X6 z92w4EVSP)z20Wj1cq#kHk(>q9iPj726S;?T?5~rAD}5-l;{(oO_1B@}NNF(DUi1t+ zYYa3s>QP(yn$k-kXtlSx!0+Eo=Cp{>S?|lICE6=BUSlJfjBDS3yey?^`7;sGb={yV zz+7;r`N&Hus`$H+FWLzUJCj+(Oh#Y&KZ)Jilb^heMY%-|w-mE^1{C{{a~bR=qixtF ziDz<=7ygCV;uXB|{%E3oSpOwp?`4tLy>gq}!?^t;Phyp)(69bD*6$%Yat_vaIhyi{ zbBqecRP3j+#~y1B1~6tD}7% z;sKAKvSuFD>&38xkI<7P(YSr6-W?5s*p8~^!+0d4_;dk!^<~HR>xT||$EsW}|CG_P z8Ie?5asn%u@8$TPX<&2@1Y5liieS@MBPp2LX2xwa+0)wMy|xg)F^#v#J%+}d0gm~K zO4rV;>@|#a1SZSY#N;-vJ0@Lvd9F%{IHD%~6I>lLUttmyOkmRsq}+u~;}JzAj)_~Vbn z)M=4hgY&iJYJMQ^{lX|=W~X04QDcHWld6?NXumCJ!~i+cVOnyyDwWYq-L?K)%^SU^ zo`c5}^3%4tc7uZA!->(Hb*iJY5xAF%K#=$LlJ&I@w%$Zn3c zJxslGPI5nc`PNrxg<*JKy<`;m!24M4&SY|8?KE^q*zSyU(~!NqfgPPs-<(HC>RyoU zky!R+RKf2Hl>>(_=`5n|@~EugodDA>?xv)MI+vZqKENKzsX*vIh8(*B5~d-K8$gym z%iq9W^JwF=^{lh^cn$ZQP4>yq+fWDcJCljM{{RtKPlQ&C+U-@&Ay#yC^gw+wy4mQ- zxDd_O01xL^t-a^Eg53IkH2Gw?hs=IgEhB8<2jVL%K($ZIaK?5R{(e7f+6PeX%JgRM z21_Zi{W91&^gp%^80B09w|EFM=>^qtd5qjvLAs4D0c9R$e1%DRSy-@N_UU18%hprV z+zd^Ui@e-yJ(1p$nz)lh=4sjUrn9U{oVU|mEH9#a%fUoQ1wxe_3C&8x-b`E&AM|ua z8~t~Y4xjLMksnN8tnr#^`Z(~H^{k0Pu)!7(S6rk9VibC)jyMC)t2sJr6mqu*7H54} zaPvV=>uOK2yA{BOD$+mV37PV_*!x2whn`zs4xaOn6?X}oLJ%EgWV{S|unxpWEy)N5 zuo?yN4u7TN{T9Q4|Jz1iO-#O=tnXs7W;VWh6d2HWG*KJ;)v*LXNV*7VO_YFL`bV03&2b5IP5!uU8{ z7||H~vC*uuIx?1;-6u{fIKhTfEh(GcaPMQr?^bKrpH~H?d?rx_%UCpXHgWZE5yJ2{m4Z*fQa2>LaqZ(!|`x(So2Q16?+InghHd9$;e0{BVMtvh0wTFd8J#eIuHwRp} z3@FwkZ3ZZNTY46jmc7}HAw8I19QmVB_`?m*^w02OZ|W_KpNvk_FaAO0&KskLk;qt% zHjbc%tby1LJ9GpR=OL|oxTEo~g+_>GWOFy^P4rWss1>whAR#%i)VIhEH-TezmYyWp z@UNrMn60ogX|WO+^s9K!RoR_p6*II?iy=$=3eHh4q)zc=5~0igfi>BPwYd+U^}P0x zShWn59zXNxROIo?5)W3x-`~n30Iw<|a?}Yskdx1+#_O)iye&W$=Tbe`68Tz==iGys zcRvWqJm$LrRe%l2DC|N~&#@XV$=z7h6-4#fiOF<$onxtSf9;khA{xd_mmo8GpT{aX z98Pn`;0+XWE0RZlOWwRPl@xE?3Fy{-)E{4?`)(?y0(+vCrm|)vdUhjtR~>p{6p=ng zCIvb69%L;OA;lI^d~0|qTgWCobuQp_^aRt$#rgLV6LxWPx;vb9PI}nNI$789T+ekR zt|Sb!o1k$QiTXPek*!A>bFzX$giYnj2*nv4<3%TV)qV8q# zBR=o~F99)YY0X2!Jm#2#XrO2<8{?V_30dS(lTKwwQ}(7Qj>Mis&v%2vdI@d21wU*d zkB($Y3S-Uwk-3nu1X%QAcnoi_*g5Gu5kzOkYN_=L#%=1qGMf8f_cjAr_=OcPR=z}EGBiH{{&&FOUlZ;y6XanKO zk3fGPKqH?LJ;<@HCC6UPxJ5Ujv}8U8;W>3CuYZ@ipeNv|HIRYF+G4bSA$;Lfa56{J zQzb$Ot~WEBxm#%aBchaeM$RLsEfp!*Z{{5gwJdOgQ*oaoz@69~!+YMLx8cZTB)<9{kZ~ysklUJy zc1g$8jAKN91nu1mL%+3NhLu_yY%K!jY5?9<7oy=dpf69z3uFVIM>1d(#W@McxW_sr z@O8_8^B#4(5hsNaCmx2${TcrCCw#T7Aj@0e1ic}udP=odFF1TrU|hwV0Wg?%!c#tJ zpR*re*~^j}XijFf4&1-G=nMCiZ z?C@L)kiq}%v~cP;13@mP5Gf8sH{XEcT731aG;S`_x? zEEaPpINfLROP%2~9*3uUg*e`VLC4;sj6-w$nlRY6gP8xlFzEus*z;fuWzaLi_onM4 zwq_mCX?-l;Jt9?4Yl4(_#}^q5o;;GgW+rq^Z@h_S_*Dhad2i@^ycN7Dg6z@`;|>1F z4f3he(V+eDAK2p-o%pk;DI$@9!+38SK@?W<`zhA71$N{ItYK2J9P6|IEA$bXdlMMI z0P49{;^k+@S6Lj7LI`&LdWDsnM6`My+53v6wXsL(@YY@iOH&`r~b4HHmgs3{<#jFODB^RPK=zd<%&w;J3Nsoi8fLq z^+jMl&qV7zfH64@4&N)Hfd%M=OL(m%^!(U77k29kbY4oXGod)Z3`UY$4yUt}q;o`l zR!2YLwo&d1?iC6f~2zW@(xC~v#%UC(jATvo&28%_Rss{D&9e?lx*4zH{h>-!)w`Zu|a z&SY`_AkOVezM}-Oa0>K)PUNzr*O5HQ3uijrn0|0>I$z*g3Ro_XDXRQ%424diZMFoQD0%JO(Et>W z)<)m^k*DcYLA2FVfcdteE7?1)vpGNQkex_0-U57u1N5!v%o@E1`_HEjVJ()$cU=ZI z`vd#jzS63T63lvW*5z07c@>fDX?%V&<5ZJT>Oy|+kT#R!1sP~VJSW!4CT_F#kE3q~ zvrdk~PZ)rYnNJH*i!_DRHQqbq#lc@5iXYNmn}mJog}>bbJna>%*x zeX_$uT#kp7J3iJb#!6epV;Jjv7+Jjb{GQHF9jx>{=BXBP7DOjTNee`82zR=Ld9^|7 z%b^2eczofSnzE|@L5DA7#eOD^8^&uXVU8ptdu56x*wlx}WCCpV6|^heypY+~=ozJ} zEO7c%aHUd_JNgr3C5lM!cl@P~cnbMhi&^lj*xQ*ERfqg+2E2*UpqPt6C2C;LYQRO> zL59JTiM;Q~X&m)2y@*1`;s^hYbZmsv-NFkX<5kFJJaONSNA2Q<=Me$x& zaw>b>(QbCu-5_!xDabEQLH4(D=g(L})nQS*ch9=#;7=w}>>t)*50KvL=(c-Un>Bbv zJwbnSa>j~ifH?ZqmIa~7h<+Kz-P8etFukQ*{bf3#ULm)6-R+7MY7NHJ1dpaa490D5sEDmNx?mQw zpPZSkhdd=E;!4Kv$WW#G9SJ~2ef7ODZ7OVOn^36FB{G}6(jYZ^5^_vkkepaJ3X3^w3)WM9954uMiKGM<}6Flq-s{WV27Jx zHM26WuhEnpJ&O$VY9fi#WSeimCercT$`E&`)p~)Ic@Eol32l0pOlCA3myzg+NzC&Q z{EX_vFmH*aD^ij5FDqvl8ZA50JR6PwH%3yd(JWn?YIWJww*b7iH^<2Ty#MOOEM#IT-$Wegz{L!++a=>(8a%@ z5qt8t5SVBh@KGBS;jMfx6Z3vO^z2eNx*DvP1X>Dy5^=`~VPqyGJ}ALjYK)Xmz)mzk zLdv0c!tixIGG_Z3<2jtSE!Wtd@tJ_Xv6c1ooY8y?))GV?CSg8m;2kw(?TkkH)>997 zkgVW5*34MOrz?^ffmcpHW4=2pk8mC&% zW2}R!mnqE(E>B*#5cic1&6Fa3BqPx{IwKp--|Wm(HC9PSK0A>0G>|M=XGXadanb+K z-qpC)TzoPOBN4#&f6JIYj$eP<@TxW-W82Z;tI0$i#oN2WxCB^r`FLc(<4M5?zQM=5 zhp&Hz#{rJtLcDYs59T1h5ApjH5_t>{T=|HrIp<#-vz4RP^K2!uwSjRz3DS0$pFO<( z7w_)kv5&vIId(Iztl;Pk{QaB1e{n_IIBpBCtmO=UfWiF1d3NyaXSl|bd}=G_T*s?( zk@uOr{}<;wfhK=~G=0S@KF2xMaIT$P;aSkAk8lo>fmJCqAsP4d3R%C!J9{}|4`;lG zoW0;apOH7X#p4F`N@sZe7-zbK9NtH>e?tZ(`dtV83*vV@V-#r)i#1?7f=luLwNJu1CqF9%OK#41} zdg@^jTH%BAK-z}K+nes_@|H+k<#@y{2WPOj<_K0za{f<^M#zT^%!BSPf;?75%fnW} zKWdJo{tSXvhu6w;l~vFj_0Z`xk-1`wb0W^-kJka2kl^B6MLMqACMHROY!%{|;_)6* z7Vao7&k7>R1>@x|10$D$?@iBH(#6}>Fh)Isb0y(*l@CbDeI?Lb#`-<-8p~L^_%ccP z&Q#2Aa;`lo_a35a)<gJ>%?R*5*j1G0J_X*t7O zp5-%2o~|>)7m+F(B6kOcUaAV)^= z?gJjTxXx!t|0_o26UW3dnu(aBT+B*QW+xZYmY(rW&F{?dYbXPfk(SxXM$R@nGn<3= zlE%+a1f!n^51cf4FAjsNak99IE5Qj*{5`>ODbKcambV`*ye&Bfx6 z&d8aPb9_Ri!pB_*)|y($I;%1wUSd*mPr2e(NO@$pO1#EZ&vS6^S-H}}oJZLeWyx&( z8;!qVj6f33>Pq`wLy{jMx#~I}#mnbSCpJ8>JNA{I`KSRD>vpPQT`w6dH z=g5Ego)!qbUSF1qm&-EooCvXtnxRIIR6oFfgtl{Qy;HW!jsI3DA!fu639uC0zds;(>Ah$j7S%`%wCq#8?;&-l4Y zHM)WS*AtS_Ov0J|ljF3Eho9qO7{geOP_|25gBn|pF;$k%VtxeY2=bot+@d*3MO5mD zAhMv=jEN1knbj}IfzohKnYs7z8Z3@up&!K0x4J)#nT_IIWuYI&OVnGwTdffF8TyQJ z7WHi!sK?Pq6qGv3p4xMl;XPJ(2mFF zN#`dKuP8gBWIP9YJ|{;j*;iw#5J;un1ph1VAZ`3=Q}6istn#_kSuEsS_0dlse?&UI zBRS8N{3qtWR9rzi&X|__RjX3TnHvA-cs->&KBZCAoGHDZoJR_dOUiluoI!miIp3X# z&j~G>d3uMYP(H#-M&k|7-ZL%%J{@3O)b3SZdHoZwz2JF(QLz{$9XW_bcGcVm_+}+j z%HO_?o>v~hGtTyov%TTJ7xB+tat38FqB;M2j(EgF=~*SE>d0qE;#H*j8lS(-nbhMM z?|^;}6d;qoLCFhCad@uPP zpz-nQ2Im7M+9@Nw50OjGcm(T z7b@9FA8%RnqajP;3lv4Na`S$Az9lV3q~M!PW>>9D6+!+dg=(JFwMTH>5&Ts)TFJkX z#0c)e;CN*d)O9E0?v-`1;%7IEqt%$HwWZdt&2jW*;cV)YN>a`EA0KD2kY_J`X4U+D z<8IWQC~fL6vY#1YB~x$t`-OMZ8I^CM)_r=$B^Bqh(4HzGaK=h$D)k+a%v2KQJuOx#Bkw9Lru-|V2Yvh~`y3JfogQaadM+}4PQrOz9pxdV zN@oSR27#7PYdH}!pMe?8%tJ*mYE>(lQdg#=TK%Y1p=Lwbex+H}YE{-itywi60nVnZ zVvythLlGp;l&)76S4oDND-~lYtEOi2Kkr$2-pZx~nSG@NlvPrCLiylIW2;rGd>J(= zN*-PQ7yJ!lY|o4#T2JcRLYztIMfDv@YCgn&%Nu4-MT$!AgqU?Tib=St{~nRt zePsMdr{WrwBrBQt?@s?)u?E&R#FfRM2b7*t*AW>n!)m0GFw^0zu0+g9Le8bms%HK_ z|3yV$%5o?R;xIC5wA5WiBMVA5sx|wWv&VA(evV7RDE)_8__zvXK?G+HiN!QKm*WrVy0qQVh#FdwLpuj zn)h(@N7x(>`#U1m_Hu@C?_<+-#!(Tlp2fd;>C*LAI;0`~tSG5h8iXCx$aBV7r#^L( zG8Cq$6)_YUoTdJt%n+-Lqzc)sg879WscdHrG%ux(^M7)D$M>7WU>pDM5`ld?@ad*8 z?>3R$<%|ccz>eWvtT7f8?c*I;C*Gni$4@Pm$BbS3HeEaa%;<;Mb(Or;i9BTWG#33U zR%Wov10Pj0CCOKC(Mr_*JhMMG4tkBBX(xEAT4XG>+r|D;2{I0L+{BmS%L^(KqN*J% zV%G&aVz^ljGeI$y;VZR_)BfURSxLpps@kuCCj46riSevQty<%>omJgZ=2kXF#dQp5 zK0dU=<(m8uGaN*n6?e-9D>Va7!6Up2GtbRa34A`)C1!=x#)lsEwZsZrST$C2P5nCO zKg{7roq0KAmVAYWIu#gYR2sclo>zEY#|W{krnrHZXb3a$k$2x|SG^FcC*(Ug6GtuIftR+K3afM(!Q+F2f2(+*320Gf&knMllMG(GTfypbxyN zp2VH{5nd>y=8nr1Gma(Gd zW&IdmS;6NjfI=7PMdp3VsL;sRkV(J75*Eq>pxA{w@Fj diff --git a/Mage.Client/sounds/OnBlock.wav b/Mage.Client/sounds/OnBlock.wav index 984ab5f914593d792e4d61098e5c682f737f067f..28bf3ddde511ba4f14205bcedd1d6f5528fa91b0 100644 GIT binary patch literal 41176 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 diff --git a/Mage.Client/sounds/OnButtonCancel.wav b/Mage.Client/sounds/OnButtonCancel.wav index cb0b80dbf8a9ae6030e81bc52b5cd00d49cb6fb1..9b0c04ca6f8a905d3c786400912594b6bff269db 100644 GIT binary patch literal 24482 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 Z-*^ADw@4bW+LQ0(r$AjIXbsr-{{e>qQG5UZ literal 27914 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 DC#sxi diff --git a/Mage.Client/sounds/OnButtonOk.wav b/Mage.Client/sounds/OnButtonOk.wav index 7c33054ce49f6491830a725704fc228f1c7b7dbb..f0e09ff85b97071866ff88a67e3f1c4579fbb1e4 100644 GIT binary patch literal 18128 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 M6=`LWT~zA-02>I!hyVZp literal 26386 zcmXV&1(+1a*Y&HqduDcL1$TFMcXtQ`4*>$fEd&S_Bv^pp5G1(sPmtijg9d`Ty9Bpo zZDzW=>irGh$2_|`(^6e^>)vzEJyk=?M)m9adkN95R@-_#2mFvTr4T~$%H39ox|@YC zL`u=U>knO@_Y~rtm~2+I8k]O(2p?K>!H2Bw9Mi;+fCbv0z$<;-}M*6tfRW%Y0- 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 PcZrh5TN$<~ZL|3o9noz1 diff --git a/Mage.Client/sounds/OnCountdown1.wav b/Mage.Client/sounds/OnCountdown1.wav index 5ab29bf462bf1fb178728195e5fa1398ee980a1a..08fbe61614bd9904c23f4b5a4e34bbed545eb119 100644 GIT binary patch literal 6006 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 Njo@fNAsN*{{{!kaqOJe{ literal 6006 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

    @twb&d(K~u zW%e>=yRqW#}Z@ZF2t^4Zeusv$>zjY`$a>#Xd4 z7rp9!4&B*&vhyiY7Ey_v-<*G(5zcY7TXq-8XpijxnkD=XUQYjlzgd4V6F8e#D0f2k zByLXkkQ1eD%E=-%t+N$PxX$h0@Z$N4{DFFv$;%h0l&q>^Ib)sQow81M)kLNiH+ZbA z0L{1dllg7^*qTgnyN4Ty1M-5J;dqYYPH|SL(XxoR%foCI&@AtV`(^xl{yz9+Zw`o- zvXzPl9w$3Vo%~9{hemP*o7lwG?fg>yZ+-(^%S^NZnj)UdTcG(Ey07HaQCa0Zn$2Zw zToa*N`9=LPetw~+#vc=W#Bldg;nCI{_zBT@mxBHYc^7PNb*%Kl`VVd2})Jt)SLow(PGQrvkVfuV%_#q7W&5 zVxH;@`cHqopIl$lmra1%(M1tZ&r}CzmebZbsjkR{q7KF8*O-}6uZ1qz-=p^cbH!+? z*dix`W)@_ARaH%yM%?3_c8xiyQ|mMSO}~}SX^Pk;yp}wX1~eNv?VZfdU}&?xh@>m_ zkh!ai>wo?K{AxP2NoWgV_w{109Ic+K_iDW&l^A&6#uM#0b3o_SAN)9auI_1i*(H39 zlFO{>p(^E+c3!FhTl9|;RAlY@+D_@4mr}P((w-d|--CSqV<@E`@!mP5} z`64|-jPIegsNYm+HB~MaBdHD-1Ll^4W&zzr2h3X&&RM9Ws4DZR6VTEF)nDzCC&fw{ z%*|~VvtKvTW%U3ZZXQCLQS1m7w`E7Q0P`HxK(0C*gzFXbQDjgR~ zpwA&{xGJdrlFvn?h)1zFzAbOg=!JT>PGZiQ4Y1G_S}r=s*D|}xq^`;8a*|j@fAdy* z%0!xFdYt|f`OFjZ7^k42m*Ov(8$32svDFy4OI)Bw{L~urgZWqQ&{uRh^Ugf7kN7d| z6NBV)nM|=g`6Q-KW z5>-;AR0saI`$9fuJ=4Sl^<$mM%r;eRX3j_{#d9%AUX^d;DcKQ-6R>(+9$}A}Eas}d zpi`NZrm3yS<*6*Hx^37yo$};-85Frh6B^E&?K{)j#5RtpYz~`2m|2$c2uDtmm*jtP zi~JFIzfM8U&mHYfQ_#H7QM#&K@<)kLa%-@)fCX>l# z`kL2fneD^P=m#O>1bJMZkaJ`XIZ|w)yPSxd+Rdi85hj6YZ$7}5Q+Y6T5;-CJdl{66 zWCOWU+@uI9#pCQf)58>iPG1y_vO7@dI!V9P+WFH_m$Q7t; z?~8(>2mQ{sZ9%)-)HZodbF&*!I~L#I?KA*1C(D!AeW3g-aQ@Rtj>B#3eKQ`MPBG8T z&+y9^yp_6(fb1q0L8sr#eImZ7PUH9xD(_{cv8iJEn@6U*Ex@1nJdJ}sCxhY|*+||J z1#lK@;xG0m`=6O^Mw@jekzHUbb2y!#!Qiu%93y+mRC1AcOZlk>Z?kFa3ey?(Twq-L ztF6k3={C&~X&})eIbIf$yG2~lm}c^0TMM%P1{9sf8F{R+N`jWnuYLv=!UY@uKD!#+c&1DrdEJliJl#~YY zMO)84Fn^l^Cd>}7;k<_Hk)`=)Y7~Jk)5?pYoR~w`xfrjssqKC<$NUK#^|X>VaZ`#X zR>6O zxt+Blx2ff|){d->I_8=0uq6w)BI(5WV6{ z#Ft`G$-I(wtE?BO9Ns;=VAvgJi-=>Fc=w}z`7$VKg%`nP)lY#G;myOVguQoei#2wu zUnKZn)RgFj{!=#UexOVEityB7chs-k&OZ{h^Hb4}Jqk*Tx|XN*4hx#;KjUsiivIgb-3ylSk< zu`-9Za6a>G|6X*7s5()TgHud#NS8PwTdV{TtK3;s+s_iU1}@C~QH%Q`xDtZW&w^)iP>N^jd!fpHvOP zHbwM`RVX59;D~5oP6Q`Ko%!->)aT#;Q(xS0#)jPwZyJ8f4U?W(?hTFJ5!E$%kk`!| zrbN!JKt%X}u!QbpA#8g;p%>q)=>K9`P$e|u7N4;&#EnjnNi-T;FDkm)cno( zj$l>LZR8GcR>=%B!JPD)`&spBvzfn$)Xo_9ANQ`4OiiMernXl<`eoGJ=o4NaGm};; z3d9e4i(1`v3X6jFv!CCeOl-rrs#^epnwa{1KB8%Pp( z;$%>-sjZE#H=qYl$Nx`%Ko@Jf3Ul8&@6-^vize6sx&X5AvwlKz(|Qz*s_KD?lK+VE zG|lEW$8{5&G+}g9Oi(wRtZo6PjQof?yqW(fI3<|P>*?1sC%Lbj>nwFUx>cNw@)CWt z^NiLwsZ2&h=~~FxhpJifC9#cXrui?tYJPv6%x0&~vY)fWUE~gRmdaj~)0Wlg{Zzj3 zhnObZ5#6D`od`FF(?J%ejJBU1<`4DD=_w`+Kc|KAloHTa2XxhLnnTE~-s`$HA-xqF zRSr~-Rou2}8$B^o{pZ12!JWZmzR{I=w-BfU7ox`4DSxMvw!gWlt-f!{@xS!F9H_#a zG3uI_$IZ=7|D5-ax7P1qmhe%rUS)C5x`o|tDoDL-Go2d!scU`N$b3$zuRVwo@*z(#`+VVd@sT0h1ax04Q)e94P2@C`c`0ae=_dX%f0ZUX zm}864a)_FxHpP*p^1gMFHK(}S_lOKNIbb8k^X zjYBUswX;}mpo6v)GW^u&S}o=vm6k2l6E$6xk_{*?)_w5~qfgez)IqPv%GOR&_ngyH zwGt8hTzB;iG@aA9{F1iFjLsWp7dl8YL^JMSKKt!Z^`PD0gI%;8M7n2BX( znum4>v~on2RgKgk`IG3$qfHKU30L^jbWPg@wQFyc%Bkt>R>fsnN?@nzBmNH5)v0V6 zWU#r_7gZTOoZ-OH4oF@@D?LL$H-B)XcqInPKV&YcsXe;#k;uN2nViUc@1vuY8+B`U zr?;9bT0lDM$MGMa7hB&{XHCUr9<@RhS4NDcBAmw#H*HM{JBg)8EqBW}>YjWdn$m9D z*ZiVmqdMwj@^P4GC!4Fg>JTdSr09=bH>>q~)NRSkaXXcg$x6y~!kx5gy+{i_2bcx= zXPp=R{El;?{uzu+eV8af(e|S$V&0>ITW#A>8rc)F&2vf5&ZDZo1-`Lb|j>xi# zONeo@zN)T9%4#ADs++iWDDsW|b_00%QN~yK;prWOd!Tv4o(6V*Q$ z{U{pIIXlWs(Yf`n`k<-C?`XVSh>C3{;!y(e7qZ;e=9-Q`hU?k#G)h#FP2@3goYwL* z7ww}%YB!-poKCwNZQR1MV$bTUfO1AEid zG>uHOiQs&cT5J@L#XgZ*#6chEq{(M8njP?kR_KSnmW$Le)mF8UpQ!?$0FrW}!mNv$ zAT8ArS&_dkmX7r4AKrj0bB4KOcGy>(0(kF$EVvXpMrG02dV{P#%#1LL&;@BKYRQ}O z8QxJ%7J2B1onua*PoQ;1yMQA=@d;{6iC#ih#K$f67V_|Qrn4Q23blbaB94j{VkZ5< zqwQW(7x`}*TaQmsW|>M2Q=Qalxf9*!+vtDXK&}2(KQQ0(LfR@S$S$Za`oa!B@jzsm zS4=^hfD2H4c3Yq9b{y=NQbun3dr0*yd=R-GSm^o*DMLnEMG?T?u z2b|5>Wu(}PuGdVH9I;@W>0x)WE22d;aJfWWrJMX3*|4%n>{Q#Gr_u^h5^w$#9c(LYQtm@*#W1-SRmOdxDU33L&jL0t zYLzyq{0fNmVv)!xdcza8+E~ca&zll9398)DVx)`<9JQ1EMRO{MuEsLc0(C(Ko11H+ zx_c**%flk0s78bMA5=kwY!B=3Gk%2q9Qalnv78R`N88jUv}x@$R7O8hbM$ov$TG-E zHqjzpj;e7mYL^pch24$b_C-+x6~(^kK2$6-xC3PuzltqbdyL{zJHBKm*y*Uex^WUZMm5EJ$R11lgdXJ^JH*z9 z1cLYQ6sjw3i(_DIU(xo4A5s6)Nc>@D2)+`WLd0&Fa_u4kJ$!t!$%GTx7;H9buco3GxO@#x9`jFpA3B+5Z=i2^4|qR{Zrf)_IS4Bcac{27 zb$B{|;ZC%lUeSHpKsC{U>dVRC&-)=;eSXTr=nGX6HAQylr2%4NTaMuCxEqm|mvb&! zM2|u77X3y)&@-M0ZgO%tp1^Mrb+$oiq) z0pEkTBah&Xh+~aF?K(b7sT}z4!Xnx{q*ykW^r!hbSe2w$M57KZ;-i;3Xe0XzSVErwPMt5o% zSAygk9n-eFA7~i}+nxqOTcLOKFTAlURxd#8$VA;}4SHtVs4vB%&DbmRS5DgTQO-fL z=q@D?VX%2y`oxQXlw_O)8lTRu5eMdj;ssg(NnP5*QOs)XAzr*(#{DB)|^Z*fSJ+-3* z@Y!bIGY2BXY<|K&0D-H)K z3h;%~z}N-otu}ekbqjQ(OTrTC;Ll}g063X}?-g*8o&twscq;D%{tCmMqwwj5C>F)r zuv2YF--$Qiu2el*2(0`IT#uleR@M&nX z3}_Cfo>-rn?(qu5kDtKJ2tL8dpsy8>{Qxx69@3oyR+>R8O~B0+$kzxvjRW0!l$Boc zKagT6Y<~ymZ)L>bKGcDVLGn{P7Zz;{F6Z+t&V%`=ZD}j8QXM(O0mOzD+yJQl16fcG zY65!?rq;kiY{;-3PnR=JRN%c1c>Ec5$_{_s2TXRsjjw^cnWLc1v5@)zFwqM=791+$DQ}=aaZ6cZS~{;W)tf z6rghxP|=i9BC0OOUai38e5{PXY1RSOX${>a12-4YnO%nna384s9vJC~(bBm2b`ji< zK?E5H^oI1+lolYitfXO79;3&Aguaks6t4%4G6DyEf#_!7DvWOPG4Qw@cKQNr)`s`@ z2Cup43-1Ez`f@KG4Nbq|f>^T@x?Bp)6rd0An<*IU$I}p5K0(*bG2RX9v*B&WdHBwH ztUt#dqE2l{-WA$R5B@h|ejgqJpFG4tE(2|?1fpj_ij45QW#F(gMrT1U9?rcs&}Dbv zDHCvuTQZ<}1d=OYt`1Pr9FoVU8;H`wq0NE7*(rEsd1!Mvv^gC16$m~Sbcc-AHe5W@Dc~{ zb|HA|37fCSn~d04*&Y(M0|FD{y~sIu&kk_=5tuFk+qMUG3&0PKfrC+4HHO#12I;Wd zSjfHmbh^mQzpr+Iko{$|hpJMGn@N^URD$~P<>O-3q zC@m1Z5Ak^{PPIiCkHXuE)}T3uCctxxK#J4w+G()QO00d09H}_4UJXc04y)h5v%`@5 zB~Y6OPn$y5WkB;4XwC;Gli{;xfUe1vq%_*caCKcTxf!0z{uy9yPh z6xi=SJUhd;5y4|qE=1!7us{Lm>mkrJ4_U-Cc*9xN@aD$A30l8PLs&nEDklZ*Wk&Uf$BYo1MfK!5hXjGX9cP)Xx@k1uW={#J1PhcD}tZw(B=#1 zYdviG2e`QaZ%zyUs0)v+i9OSzUbu&yjsh_k@IH=U>vW)(8Z;Poc>viTLUMt~mJ3pS z4;fP8P0w!pLC!YfsE`u5cCx2 z@;N>{I6r6>fqfDo>$(S82Z5&j(9AQAh0&s*S_*Sg;2qL?NOv70cR|s@eyP9GObA{+ zgYW0?t2f9WBEf$a*gZE!rwJ zQhtZ1X+i4+_CX8CG`vi z$eReGDeyfKsD00mLG=}^D)4(!NRS4j3BboY$aW1nyNx|PyunO?9djT$WB@k~F!3CG zJ^|g&*e?wHB?cdHAo&+q^W|5$1%6MCPexEp37ZSZ{ty&zKwmGhqryHRE2PAn1Q_-4 z^d0C%V?PJn#74x73mTz&-XCC{H$W`ou5?^HPlOe5;Rgo0y#m#zSoaweBQcT`=T_3M z{3yhTcUboZV?m4xNUy-F3;8T!%_nf7u~)pW6cgcRY>a9=4e9y?bRC6x;aC;t>n9dQ z1;#zB)L-p@mwn(O0F8uhj9WYlaqk0P4pv2AemHgvtqFowNLSI2!NK!LjKs#uu&?q7 z*ur8?=w5l~&bh@`=oY(%#bUlfchw`I-$=|4?H3vi&5y>HhyNRBMt~b!%)!jiUkSvl z4&6Wx-E!&b**$)?Y(PTeO<}P`X-GUKD>7f1Wg^3GHlU`bv_~pf?#U+r9jZo zdk};`B51+fb#tYZ&Hwd+|I6Utvww>I|MhS9+sQ-Tb_tn4U|IF_1^?$eiPmBM3 z{=a$sm#_cS|6BIYXn*VeHU1glKdt{W=D&9Sr|h3|0RE@!Uq1imuKy|dd-p%>|EHh- zOY)!D{&&y+sri=|1foGGwfJYo|H=^nj2eHV0;V+o(xDI&;y?^aMx(~xz7dE{ec}Ly z*btY}5WqprA;)p2#e-%`~60GrL5>&p{dGMy%s(o@$gTM zX7#<-=U~q-UeDOSlB?i!CWG-E`_Of&W?z9<*6we39ib?j7ehm33VS0c00CitQ z{G6~A&hJQOm#pz*Wm&=TkDH&qd20KTRyA9hYEGsRZaZU-3|Tr{m}HIn9Jw*v=BF28 z7EANY@`!@6%)~GLS+9$KZAvm1bB&(OAq%5I<0JYG>Z|UV>($C`u=UsSJM2|h=JA)s zuadGyRPJhBs$Yom+i<}jb+*#X}+IXlusZd(nTDwn^0n!A|UH14ChMej-B&IVA^O`9g z$^8x5ZNQq@CFZXKK92e-%okT2YoVK$^E!MtM)irGoKO(=DLOIYd_aWE1UGi?>?~*~ zDZ7{R@T)FoX5~lKOfo_^%yUH8-S{2-;(GUpFnFg)ec9evqAH{MO@44@`4_*;d*9zw zGl1IL}6(fSSc?o_&%Xb)m&k)AZMJ+UTedg zVwS{SkNCrHyDXJ$C+>8wZQETnxHv68>$`WM@`p$B^KL*Zb4d&x5K|Z172OiKFf_>< zb;95%^N22CYoFQ=WyOV~i(_hvl)#?OLghV!&c{UdUY0O6YG}Yp=K^NCJwRPtUsrrD zhn`iRbtP|l*|+99#{G;S*PWri$2s*W>n)1E-$UnhLQoF0Mz%7hLH#43$g9v?dZ>P7 z7h&(kR=9eGWyJr{N0Kl-Vwmq_iHJVlnx>4YO)pxRdpD;d?|4x|)#1*wc4r>$aVAU~ zvpBvg_DGa4IN5a}`zLIs&ZF&NP5X~QrAtd^S30$D^w-E{eyrD|2u?4jK8NDAha=vP zMF)}9rlj_e%H4&u{KWhr1u-SXHN8~TxTkQK*W%EVJxgNW#eD0*@Jo{(WW2L4(v&xg zs~P2&%hRgoHAX0`#y{X=!grpvVb5bv#)m{hp{u=yIPHM<>pPlw<;x1+<<}Rq6-ECD zXo%KMgAzrqo)bb&M6XRy#rZ}Q`Y^>;5Q{ORV?5Q%3nklr45`U&wsl>#FK0KnBm@Qa z939^tw>oN6&~CTEynR@uazV|I;*k95`Hu=8meyD6+xuEpGGm;N`d$rt5Ir@nF3K2i zPX3zHO$^sJwM?#RD_vH0vg%>u=+2jVj7SqWJcoofL@8rjV@CDp^v#i)=!ea+v zN;~Q>` zeIA89i`K<0jXe>uJs{HMG;6o@Ugz?fwxX__e%Zf%pYvl}Q>yk1ahFA-A|o-^JrSMWT?-VFlJ0x{KeRZ5zYR)oEI>5 znwcH)YE|LfoPpV+^JNtqT2l1sz(W}4=^rvIs$a~>p1+6DeQnaqjBl1-JB77(OMfoh zU3j8wW_^k(&vt{!aK7Zn>9Hl+J2pCcV7Si5LvkMFnwGS`s0u9llsi2)rBG5;-d1Cn z4%0=CJ(EKYMQ-Z(ATl!aiT8W)BQ(^M+wNK8Upk`DT6pgV(l}lH)zObVOU?;c9PwLB zX>3NcEWFZtn$s;<)2(Q+lt0cNo--ylqbQ+ferK+^m{uoA_T_}vMlI?2G2(gf7SGMX zJs?}BZBDE_Q5;_wU0hyaYNqS!$r%1Cx3xh#BBe3zF@mVpU@wnt{88jcT~*V^AF_gJ zdG!3ArH;CG)du?+<}R6=UuD>i$R&}waJQiK?gVcRaa5b$Jh-yBcnx(Q`BZ|I^6p~j zx?rXI#~@?m=a^wJWP~Cx*sYQK0DqtDazWJh*n--!?uH8W3~U>lCI9MoHLNva zSH$$N0{;-#3EVJzmS$4Z_KN4ls=}0#ma1v(BTQY$RM9t&qrsvmznGSuy6`*xGhNPd z(lF39sbS!cvxW46xkb|}nw#bN3^JKl=py%T4}I37CH!r$pHE+zo_Wpwy6bG?^@@un zr;7{A%4>ToURj!Hg-$0u&je42{Mr+aIuok&StaAJF55+2W%b-2;-VvkA4+PgBHQK} zV0eMR+3hd?>d?3zAHxa*H+lMs6|?|rqjF$FRr&W4ztSBQ=7z|wCH9TXc5rX?-ADMVf|Ek)gTDFflP}^ug?Q$lm4_R?RET~ItTQu>sAn2a~ZD-JgNsQk0sRQavm)_zuhh1kW-l5>661&4>v2~P<=?|n(O zms3eL8m4yct_KwjKe{Ts>l#`oXydUw)_!S>XS9D)(8S>i$hP6r+qT&?Y|9^)KJF;N@W@p|*fm9;d};nZ5BY{lbo`^_I%@6@k@wgP=3D zJCk_J$&p?2{OWfquutG6pSdp61q6D_K1=toy`g?Wby-#4y3;MPt{vuA@L@rrYo~8z z5FDxuuJ-%Mty5^Fi5zQnAKRG?YpZWpZK+LaUaxF3s(^(%!ddHC?pGVI$$zoec;_@; zCcM!4NfXz;yy5qnH8p_^H`)R zX*I^`q4f`1Q`BcI-SBMwba{qXreB+Xi|<;GZpl@)kt{a7?h>~xYS>X5Shu0+cxRe^ zmE$(u!^!Se>ANK`EGXAM*z1{WId>UUV&0?HxA`}ItyS0B8e2PN=~T9D=mfz#`E0N6 zzHxq6y(MmKP8Q~DVt{e4>TN6B_^qzEes0Sh}+z3X+&2_+qOn)-KBcaoUHUQ9L7%3bA=~e7JJqCZ1vgeStEZS?4a+*&UVKrLt8I2 zE^KIOJku7fPBvS}PF9{c(Y?ec*1yQ_m3Nuz0jE#Q(S*10h-yjOrl!*kM;c{qySj#( zwi8awbkP=<51uCP6mO=7i?fS`LO*?9B*|_nY*h`v{-!zQcVIJPfiN{$$!Rhe;0<>suc; zoo(`HO;X&~rQ1Hi*ExTR+g!Rl{Jl1M402(K`*3=~=d7o-^E&Ue>}#?#iQ0ZBKXhvy zD`{zbU)fOiLEgXkobejyCXn{yq39_4NWD!_-#W5+UGsvrGUb?VnWH~i#~mX?ftu!84u$5^rHe_=lAYPuV1~Fda7Jjig$4K z!rr#2y7`K_*3Zr1EnC}BeSJn z^Wc^q9i{3-a}w#t{8f0|`J#J>R}Zgm?ymClA|q=LbkiE3o2&?FyVkO!wX)-z`i5yP zA!4`+zDmcsE_4razu;0O8O6U$pH1YOUaNoU$Z5%H?%kT$S*J;}`~~)~E{MY9JKX1b zBA%Pv?#NUEH>QR>VoBFZ6|>tGwO(%vP(*1*S^U9SW{7ZGe5Uw2H-r|8 zk2F=OJ32PD=C$l?JFXzLbFF8fRctS(5V^biOAoF`q-(77H-0CbLCP)rv>O$=Ht)8J z?W2`rb%U)uXcwzlct+;sI>4=$Yj5Xpr%9ZPh}Ci2_?No1<7MlX)>rL7IYqz6b|2ov zsdJhtf9uxmu5o)I|5f~g8$&yT4>j-9qRRK}q3x1Rw=Pci6Y1H8+SaxiJAUgb?LKWEgw%3+iegxt#?{H!a817vrNJIVnzU zGNy~jWs36yF~Ua~B_z#ux0|I_bkaMHcPvmwXb+gUco0p_%NI|P|K@tjwM*_S9V3{< z90aYgyBaTOZYZ-m2Py2TW4g2E`}hRfZSDi7hq6QR74j*v{!S~nmuMFWwWUt~y=$~W z)zQ?6t7>%4mT80&eFg8JIMX@L<(kV@=S|`&UI4=%Y_}aS9Mia{9xL`K7pl#Avqeq# z(5tztoKj>V@)GCu(te_)oNMR{Jk&Bl|5w*h#nVo*bf^ zi84Yoky}m+AYWP82I{F!by@jdRi`;`*kg+Z97ZZ{n-eBYch<`$OU#0J_MgZ*Y>K&9 zx39~jSf`Mx4r=xpGHnH*j?tSxUu=^7E>}5El+s1BI8A60LARdjo~x-=O;Oc#h3eXj zZ|!}c9L8JTdZ$CuZ!$8YG+Qz)dPZm#= z9ds^``AJFyiR?Ng8BeiH?cS#u+=Z)})cf?QW``pV-p};rk9KO3R7<(i8BQ8r2=gA4 z;FxXNpv&&cR5mDG)m(jmnTBnK-B@(Nbn$2DX4w;IAF-An!zzN$U~J2z?$?^=?lqZC%_A0YM^k;WFFW3NyAs~P}gdo8ID@%L>_XS^^!l;Nh+BnNfAF1Iym*T zXJni`&h$W+rsj5i=^Ch=VAyJnA_7on_FzGi(;3Mv$vSbVa1r+GFrK&hkcZJCRxbafldEKhxK%Vm0N65G2&uN|jRSQbG-1XDhZy_QoMQ~KbXZoJ zd6pW-KA6GW%=wkq%`3(A6_kT1-&B0lZqFXEfvkr8tvg*uiyRM_4QBBKEE24 z`>fNI8xYU^?gZzUgqw^bcKUY0? zdb{~)Y5p_)M0sh#-4Vpd35juG#{^-z`(swl;UA6hu@{6v=lFv?kXVpyiojvB{!nZ3f z&i5Ui5u6XR>v(U)x61Au{5+vm$2c7Ls84;;{)7`=2gn7Dy3CMgBOdyGXl=A`JmOT7 zrq1h33m^ahcvRa^Zw>E`Y$n;$rvdx8{Z+-Z(MDt_n_*r^G3do zIq0-fn_klJA@bF<50c^w%Il0c|Dk;k4ZAV0H9UoXU(2a_oWCufUin((hc0km*i)Oh zf6(FB3C_E^#}wUo`Q$$NsOKk9^;PQ`xhP&edU>*8Oz(ti&PPmxtH0!NbGMW{Z+>E# z&og?3g||m+2v7>v8iZ9-vt7Tg&)ZPD%$O+f3U26=Kg4&)l7s-S8j|1CFIW1}>&vAg zOKTDyEPEJwGX6?0WfbBy8jbImUHl=N|6N_q=~(7S5bgI9Mf8b06J&SxfKRIy)pk_w zZ+PF8KyaM?^nV>y6CECw=XQaXpuAsr@ICQ5;!AO9iL#Y;+glmiV*uJeB=)u6VNP$o zXMIA&jq1GC+lINcZfU6Zbe{%SC0~bMP#7w*3Ij?F^@-ZeaFz42u%q!e;}(Z`y8|ZC z-Ckc=(zke4<KxpP$1^!*Jg}WdV!{#>D0=6^qI*)?V*$nD?^IxxV&0>if(! zR5%3LV9e;0w=tAq#(vO5;UOR4Z`C>u~YxcPu?7;KVm4!YNK zU(bS|Z_Y2#Q2n~b+VUgigX(*zCOLw6ghy7$U*Xb#CsH$9q3hLbsw%2F*LYi%X3J%s zaL)3%=2z!t;SR+HYp~Y#rc><`yKh0aL}u^%J?_RliJ0ZdWK?KoRHuBe%Y2hNs~l^; zWru}V{G6gT^_&sBMZTIo%gk0iZ_~H`rMY0QV$72$JavAvy>Q`pJXZOmhFNyL^rxDg z$_w~3;T!M6JqE@&M_lrp%lg%j+EiHn_J?~Nq)fI=V5PaN4{C{68s_bBmpROMsC9SE zk*bXPvx*E$E=}Wf(!P~RMFbEn?&@pvV?#|5yv7(|8WwMysdJpefpzc)sGgtemk^KG}!xQ=)CZ; z{?XDC@B(dZ!_!Ka8dJ*^?RE@hKamA_HF^z{tJ#qbt7>Y~qK5D7e#Qi(S(M@B5%wu6 zE8N#>7w3uT_eSTU9yt^9uT%lW3&$j$n+F+`8G79RptG9JHG3+&TJ;^T^(XLYtOF7! z&uZUSUMnRz$OQebjq`pSDxF``rQkRUIE}7~K%XA_L-RaKxsR<8?c=J_f2^um+PTxJ zV~&&8_+JZa3mNLQivPPKRf*QKtD0(qI&Yb$qxpi*@{=C5ZpBVZ(FaCp=gp>_%^#Jc zY&+QRT;BNq64oC6CeTOz1R0}wURz##w?JDuuW66Lj?%>zk1GG2{%73G+y(e29a9n2 z!R<=0^rgj#^zs;wc8?`8iz2^o0#K1v510^gtO6S)y zwzj0^aPuA=A3i2p?>@s11PFYO$wt#PCWb=axS`&&#jN>()7W=J<7IWuW#VTA?2ah?7BF4p?->y=DR@Xwh39?#I>#ZUYyHsjy=4PxJ}NBsO{{^Eo$lMbo7|I} zX4Bm51NHq?w0AHA(X7UlEZFC-A6dfc+H@%iLIL2@~$zeEm!*-hq$Qx zlGl2ld+wDYGjh&6M zh@F=$nJpb7%wd@DeMVK+g3d>sZ0%BcV|Z|j%Tup81l z2b=gvsi0i0bkoVVicT^5;t9q`&0k$oU7e)|?93Y@3w85!y(nJIx{b$ow^L7NLtERF zuT5*=K7to6Azr;bw>xj;_9Dl2_v*aZ{8#h3PJhD;aFVxAKG18cx4^y7=^{PSPS+JE z7Ii9B8x3>uZH#4t-r`|SuDtVTU;Av`SA|b!rV2N#Bu8_H$qT$~ezSZoxa{TKCJtJ3T{CDxE4Xk<|!4(~sHL zX)PTi+Y}we+B1%cOp{Z&%R2Y9uFJ(V<{`U}W2u0Z}y97d23d~^QI??VAcJNH>YK+c4ChyTT`zJ(`1?EfQ{@&qDRs! z*#yaQo+r}73TazA<2sU6wMHp)o-37Rxb$&7Asf#>0wvl1cMToxcxiCc252_we^{Tu z8@ZFkxzc#adVz|undoC0s`;#(teU2qZ>vBZf;-MU*MrV$MQfNV@V(u`l}_zb+hbMB zj4wbiueYq1YrRW=EJW~_hB?BFqqG+FWu23S3j$cv1s%dUd|y^R6k|))PwMKa5^7!> zPZO!^UD9&*WuBF;PsAAO1Hm)`)ys}e9ZOWJ4LgWxmPOPhSuf@Y;+QYVdzO&y&)WIA z#YTstipCYJlGI5ii6S@=$WFV5VT;C1-B-&rF^R{_MNR?onerdvzT9u{Yb(&kDxuET ziVNDFwm0ZH!EV_F`BIs$=mN_ZI&OUvrFl*dK=?bZ6#U44}MRVv+ETMn|3TP5O)CksEY&m)ttG3G#Wh>7IU^>lhaxe%3DnDB04QEy9esN>5`3I_8dgTeIuSB+bB`-o9TCPhUuav zT$Q6Vs2#@VR1H^!eCc>;xu}EFjrJnmSVK*u;jL-4od;cKOyhp$t>>iD&E#rZj=@Ja zQoBz7#cUvUGlNB)vg>l5tVVF2kw@GypVl2we^LAD_gIYNaONa_h47YO8|OIn{5R6Z zHT5$@7%MHAcnLa*lOfn3Jit>h`a+-VvrHk~D*bt5xlIIxvU&-VC5t3$g$G%KA;N0c zuT=YVg=oebtoF}H0cWG=Pw^K~C-)XT6|~tyE!n0jb07OUatf_4JBJ(1UBmnxHaHmO zXZjynt&TJvbv#5`IQyL@%Hm~K(F=AOyvp8gDAL+B)AcE4fBbh;#qQ#t6V!08F@A?G zJIc)o#x2H47L(%{bd52CdzD|sbFj3?Wc;S3-0(-Yr*XdZEb)Rin;RyI6nBVxc{gb@ zaM-+6w^z;9FuNyNkCEB*7VZV1hiE!KjAetP@N(-D^H9qedlB&x@n*(xyt$*;uW1WO zrS+xZzAjbgX1Hs0kf#{Y{2Zt2lELDQd@-Yucx1WSouccd4>ct?>Y;B8Avc!)gqO-L zLr)VSw$r9_#x(OB`)$&fc8|53i|`UT3yu{spruQSjvj!`-s+y*n&#d zA-KRk!sw#YYh3kw^Konv62$7k)AL92gE@dE0p0d|OOj=zZ2&HWFVWjseK`l%U5r#@ zCZ24m=vM2P-9mE`HV$cImGU= zG_b(2$;>j$>#j3q+cab#eFLYP-!53p7jj0>7l1ML-KIH)k;WI642*yj^f~O)oU7~s z%o213xZ|){u9^wU3WtK6hBh#ASWj6wj0@;fkcy44J~Z7jEwaYom2f3?g+w^^!7g-!;g`V%bQ43tyvh7dzkt+} zNtl!Ey;)>FZ;5lbf;ie7Rs&}V*GQdSCGwDb=QwU9&Fd{KwkmuHJcfRQnao>XGt5TP1+G&7gcLd%8wk{s-wE!jHP+Rt8xpMxhdGTD>4TFxt$kp3CU zz-9IwmNn+77Pj4lC&4P3Kl40uJ;R4K0lrKw#chsfjv8z%c?QRA1^_-6t9R_jCJ`oJM()smVh(36r1wS6l0C6~ zwg~GCtJ-!4n*tW2Qs#Cx$zH}9OWy{+Aa*$x+Fn_A*p54H6N&I88lCx(d4CVRsxQ7QdB-AsFrd<6OU97m3AneB+3htCBngvS`m8qPk?>dSb5w3Ej% zS9_f`#MWj%g+Bpz5gL6s!<%uG=7szQ`VnU^lj9VYMiha$$axx|`%pOAfJ_H*_YHSg<8lOdegal|VZ3|sXOF<>@V)7aGz^=0W zVV{P1l9S*R+6l%vW`E{$`p@W2XgGE1c3ZPe=opQM00bFDyGYNZ7tq*fCX_;s!G~j8 zu+MlN=>~hD%V}R|2yF(^8)_wvVnz0e_F;|%_y8~lG0@&KeqlBOAj`5XQb^TM|h>EHpp5FJmOOFM^J;Fn+yF&E=HzS-*> zAp{qyL%ira8D$JW52iha*796SpY5Y_ks^XvXphH88>Z z(SEcl^cgY(rbCy>G$If0O{^p7&piVO6ckISlVF31!9pu;c=MGaS8Jy+<+&Xi)5iSCt+7Ws#bqmZu2g7!<3*STaWh$16cM!!O6CR5i&^+a3p#I^+wI`C1^4TBIgtH34ih@a0%*!apWjE3Y8#ZpjBiseg*4+UBkNZ zuVfbVk@C5fzK8w`?I^MqT1sBVf5tqpZ*gM4ap(56K9ESjI?_e!#L9A#Jtr*QlCcyVV4B3ll!ezu`;v$&|6wn9Q8PUNr;cZYlctVaR z*O4gr430sIU>PzO2}Tyf{h(^{FmW4C!$0Fs2nei!Dq(=ULz~fQXfNb5GztjF-b4o; zOf(T?WHHsxEpQe51a^amLz_S=d53Huf2AsqfSch7NE%{?<#0JzMJ5uz;ZyOC_$$H% z9H#JBj4VZWqX^mouZ7$}AbE_KOS~eElE=U@NDlu6e}*^1Sx^IzfXn1T@*6n?#6m9c z2Uv*kC>)hT_rW4^CQ*xb;B$%5WCn1iPLGc+M#rKzk#yJ-Dj{2mg~UYSA+eL(4yHgF zXdJu*4uTIrc_18gl7O5}@osaVbFdfE4{^Y0@Cs-skda};C%g$?PD~}w0TK#AN)Zxy zhqxnwunn}3k))ac)Y zq=cMDxDzu7E=dDX&{B9A(v2vPg~(C(5VQ^KBfE$!f<+!6`%?_vuTV4`2iHN9p(3yV zcmM_%3`)U4Xee9__e4UFyYLt27PvvS5wnRvVgcbxhJu061UL@4ha5&MuqPZ1rGUHS z7;+GKl=KI6;5g(5FNBA|*%WVhJrIE=vX*oO_rMCs9X<)Sz@6|q>fT=r){w=-E^0Io zm&m)|6Z9Bfgk&ODkZxEBwE-7!kW8Y+2{MGrXE{_431J2FGxP~WgATHt^aCeBAIJcm zg6T*kf+DNn4bXTno_s{Cp>6>q@sPX-jzVd$681#2@HBWMbPQ<8d*oA6L5>0S;5Uc^ zPli)qHihZC04FoZYowlBLNSsrQ(gWOz5}m?TPYqg0(y{dD4a;hm*jDfPI-ipsmL_M z3Mat5pd@gZ96~0OS4lT;3&cU!p$q z3MmGeU>#(GhQYI`K4Z{Ur~uGGGTB7@Acm9PRKyl&1^kivK9s=eupSD9Qo%EFKDmQ5 zlY1y8_F!lcv=LelO{D5O4Ptexis1HMb~wYLB^Xdq?a90-N>K#!nz&=Y7clmxYcbPz_>XrS=UpyX0Gio$FQ zw2k6_&jiKfLb4}0jw~T>Q7G#LAA|40XW&_|6s6W&P@}t=7 z@4-Q^1dIbC!FGy+{sKydufn(C?QkG`2GW7?;5)g5jHP^Ll3PGe=p{vL7s6fCDGY;* z;0{qo zUvM$}3Z4Kzr8xdGKq-^R%^P?G8EXD5H zDXx+OcPuxGV~3r!d^pDWXDt^pA`7qB`z3o8FJqTgLkqfh)>TGZ59~oj32Y}e*+9QIcurF_2S(};u2Dgg zFw>Qm4Su{k8@v;)(xZMkmIimCkL!%cP#I^d)2sLvkzDRY-_qZ6UBp=~*U+X*f6d|h zqbBx83)xpT6ph?K{3TT)-Nn-X@>j4G`=quTWXVVi)1z5klFYV6l4QjM7-$I`nP}6A>TrB04I~3v`Epjrw~;vu!xx%qhQW>wyF!Z)JFvqR1(N-9JW&PJe?9zY4&csE>B(IlIMeDZ;P zq`PdZO|t_w5|!)|D}*K(Yh}6T4X*qE-EAE;@g7E@Dprx_W*BXYQ5(6e5kACpB$FGp zdYFLYbKzsQCb8L}Kw|I=luU!2A+Tj#! z;(}j_=dfJzqnTTRd-{{zqmBmP4@zK><+GxU1tW3DZs-x4hK}~7=Ef$!%@A*U@ujt+H;+X>#8H!9+IrgLT>K&* zV4vObn{|p!mbdM^eJWqsWG$xE@e4Z34!w)lthT+a-_rNCOF3I>akT#V)bdG2g>*ZK z-x*i`^i6b=4aQZgto!ktHn%O5LsR?AwjpZO-F3YYwzl>-iD77nuIPa-u8ytrKgkm! zs`5Q{>Lk*;S|?d{cLbT-Ij){)vls{7!*Q7|-6@$a2$6#O`l>ARedHsgNwP+$zviT7 zza7I7DMTBcs?F>>87R{*!;af(YlWyUCzoUl9{A^^2gX|;nPXKMua;ml?e&3{k`c0* zTIr9sFc;VGiq%G<&X;1$MN@4JGSYT;(L!IdneL)Z^(|!uI{MAnE6wFYA%tEB!?_yHu{s%b%zzx*(k$!a7`9Vf<11|{pml%Pv~rcYZnfY$#~0NmSZ~1 z=9A*`uBjHVYN#z|tQOkJR6GcO#f#c3Zm$25obN;fTi_F^n{g?{C>W@<2la zPzvVbq`VwtHf(3}G^cx#S~FdypG#q*?c#{Nizb@^J1`e7m6z;I`;D=+w)||p znFoHcntD;+kDG2!+Y~%uZ%9V_+t&7^cO!SXvD}k z&wm%Gg~aGBsqa3}o{V>^teMm%-br=q!bJD8tPTfBRy!9I3d_j%VN=&FNby@4zo+0U z{axEd4y8X9c^!AdZLXoVwcPFqy}lKOQSaXnwY*~+Q8!!?+>|%bJG^VhBZYlme;)gS zu3jgp44-i}0zpkk2hy6c#5WhCBjLQ8)p@`A0> zRmfl)t*c)Ulwx%4fz!P24ToBo;i_*J9T9wGh3zljA{Z8}7+ImUaL)~YxZDoAvc6;F zV?PJ=FveQ?3^Kzd`UrK~BS=m!7ikb}7)jO*{xvCR-Q4MLqn{bf*4AOAjNAN~a5*B@ zBeFkzyS9(~#PtV-1>&meNdL9J?{eTK?)ne)wChAH0oU4&hK(2p>(h!uDXn{DrhhW> zl&|L}x_!7yq%s1f! fKGByZNALN{kz#&HFfuG=mE3J#FvzLJvEQn?bvl}Ow6pdO ziiYch+UbjJNMyb5fsE3J*>+L%JooBn1zaDy?$6pNw_KO#5!AqS?QCCbBr-o7>$}8F z(8}Q<{GaP!1$~ELqsoqh9MULtJ)z7kx4^RogJTc9CvA$x?%X;VpMMdLTFx ziu;WC>?Src3l-JhWTW1bLUJ)$g|_h<4*Bu6BXTg@ih(jl&*6YivPDkVE9hbUgT8v- z+WAl7PWwH!Fu3JsGZV~U=AP!W2VL|v1K zrg<#^o$P!#6e}&2xw9Rr$!>p`xv{nUkGN+Lary>3X`{8Ljg!lIU9T})uha_2E~}AZ zoR(YuSh>5IzVvo^^lUNggO}Db7HzJhjZ<11JRDR za<2jve|d5zDtSQf}cLdT)Pb?>07`RKIQ4P4Nja zO=B!`r6gI7*lFn{ors#cuzDGYm+&h+=$!l5y+fqDL&`>)yF^rF9(oy{*q^?EntI~1 zdDL48>U4~4)3w@)a&2Z`*oW4Kc=iXpZ^MY}5^WS~t0$T3`=KuWvTN25AK+trfywwD zvxu3R<9){eGRRC^ok9%pG^&t}mAH(|@{x>Yop4dE$OFmXREoG$azlQXbuvMc*k;Hq z`9bE$AF@W~$`Y9-U8D~Y+I{RMdP>2c$S;+ooMhvbN48)gCJ{?jXH0()iQJ_W%CSz{ zVk_-gYhVxbSEA6-dPV=%fAy-SYi_%$Pg;sz&|`X5x9WZJd6=GdOi$`Py`;G;s!_fj z=lnue$cj@VZ&0_rtT%D&cg%w8iLx#dAC)I|txA;F9DUK095)~hHHhFd5-(n%9h|bi zId`>9Ls=n4;nxsFlcfF?2KKJNG zUBLH^I-N0Nr5@31#1K_&2oc{VR<_kxo6M)=w__&KFb)4uMi zk9VnszGy_t=}U=?r8ZWujibir5r5BP{rEe3^3b+2NgS(^y9)efBHAS;I4mvv%$g_rLQLW1IcR z{>8ixw^^h*i6fp>*?rQHgH=QV&Rd$L^2^NJ-*Ja{o{BtAdaIM_j+8_#()u*z$^eKo zM((`GLz)V*rz53Qi`HJ3^UFQDCy=*RoL!m{$jF*1E3wsC`ut96EVj#9?vsg?&K>S_ zf);beGSEMni@9nBdTSZ3_6#}gkJlNCUZMmmkdDHX+cU)3H#ifl?*)&Mk}Rah@f62f zL0aTZR&O_G6PI}1AWl9@uRO|{`80X{!;aYnO5p${yO)wW%yy7++wy4SEPZDiNA_^+ zD0?ie2G4N$>K=CZJsmTCyu_&c7-F^X?;q* z?(h`I@%gqDAmtHK9+Ju;lwEe(LQeh{rdIQi=hC#}5|sQiyo!_K*vQlLg~Du=D3y}D zin6yDEj(sJW%%?I*CQ8- z6A?s^UIQT^$!m9a=9~Zb%P+a_Od#B$g?0nw1CNchY@DL zZjOUeGQJ8w;?}T$Z}3q5mwn*F3ET`^PJq*#AA0ile2`z4nL5FCo(zX!8@1+%P?>YM zEf0aB&=lff9Ms`S{1OuIA-#gzP?{dd9&U0!p2sEB1nLj-5aBWZfF=1d3?(m|#9!Sd zPCru}8^KEb8WWc!#cw;cC>5`(w)PnPtMYMtU|aOrP)A)8!r?Xe4nlaC8sq!JS{O|5 zZH#W5d&mt2tEoWLxmSONvSa_V$I-#eNB*L*2R*((i@@fHZ|!6HjAxCh>tu!p_($V8 zX!|PO%%x4(%R2`%onK=X+WTML4WgB-9yp!63A9eRc~4($@a%Seq2A8xe9$6pOuMYs z-crtl;LUJ%r<#7wU(i!(HajpfYs0sGp{z?AJ*ivUi zMmQh3H*t|uA*Vqo$Fo5V4!2P!b)#_O$fv=B!EV+XwVpcKKDe(c*jIU|?qvMdth|#} zMnq#b3L9Im;oIKD?g`BG7J*6nP&j|gt#BZaja*XaUt%5Yq_q)sv4ZMc0y}=Ext}AaK0~>22n5AVy{zi{EDudyKr#{KCJlVM$fw$KYV z<1y?7_smw=)%UW(k#czSG&{51;5L3{-{&RhsA%Xjnz2*RvgPZCdHhk91^nVm8LUp0A)z}VNkIZS_ z?rDzmR2e2iXpP4RhUFfBHNoLQ3hq{9Ux-*|tKSK$32JG=2fJFQpckvw<$LVm>orzmG#niDK z%+f2=a>_9G=oAjbE4nH#r9a(}8>@~u1F;K#8M^B(q!Nxc8#%*XP3_!gq2n-0jkS$i z+`43DnIqva#@p#mdlSWf=xyN`6~%RRTXUEHQXg|Acp4lSuEeQ$l*@-Vs1o7dOn-IC z>@?G;v+_V~?+k7GFPQ(KlZH>>WBd%ydl#C)!DY@&Yes0CCq{)u0oL(3HjB&lw?9txXMX>gndxGFmV3{2LsPtrSqIr(Et$`!c$ws9j%o zref-6dfhuDT+Hl+683yKL%P}b@OA%K^Fu+t!1g<7g8Og8zkiM2wPjA)@>OxLVR69>)Ow7H_ z7vfg>*9RV}KGF4adwO@f8Bp8(%K1>84^5^}#Cv&fMo!3n-|IN#?czM>RSy^xSt{aM zcx!I+xc>gWs#zd2F4-J$o2pZyM{pJhOPF7=7FwOf8QH{D7Z@TQO?V>m>;u3F@^Nv z;3swgbKQF)Z&ffoYN8vLJG#iW;Mu%}>X=TBE%-9v){f1`CCqoZYx30yKMa%({v7c( z#94`(e8aPvbCOy&r|%j7$rSfh2C=z2xr1ct{Udi|U?JCc4p!hqNj- zHP{W?S%a_@{*&D=;;N}d|9UD=!_Z28%eT#4@9tG+V4@D0UT(pd{CUB^?EFpKH90#~ zao;mD-ye+ZMJaAeJu`Np>E=e~_Q_Wsj%9a?Npj00@Em(`pbB4)9+sOHG4<7;=&O0t zJ-=X0Dq&rAr>Og(OU^%TZ_hew>8lUCi=5f&S#TOniQAAjSe>zJxewHxV3c*y?(05@ zIh5PT{?v4}+H)C-v)b@{dpM1>zBF$|%nI~&u4$i@hzVTFdJsCO3VNoR3wo?oA!3Ab zUgp^Aom9?&Vw4c|DExxk2mJX}r~^NWY8CRSN05WZv3$@UAvGIb_QcQyekb@WYK;Gb zxMO(-y!&3gaK@Peo;&JNxQAzrPSuC4>d`@evL}>x(iv+eyWin2-f^51=;;2b62l`r zZNmHP@laR)Xgr=wDiBHprQWdm`=fko&Cjl5`a#HC%3F;=nyI^SJhF8<_=}oPJ?shY zX4RTrl1&ysH z{#({6Q;6PCW#O3mnNRu_+f!jZ`~!yq@vxUFs>PmrrYx67ms^?B!56fZC#q7Wi26{c znxoeHc5i%WhGH9o?sn5U*fDQL;5TD*JKSoQ!-1x%o5h>m!n901RO9q6u4sNUtV5dJ zd-NMj3OC0H&N5SsYqmnRJ5zP07S3b4xKxUT@m*SAZkb6mLhhd6M%E&!Xi=BiLuxdqi~kgO*P>NzXhY<2-LwA>X8~?9k#>5oXVaAPdCqM&qPm#r;w+W=aRF? ziEy?!kxnhAzBArwJ{itkflUis!vi`GrSVOJJRv%SP zUBR083urhB8PGsxohN4C$G5?x~yVFZ6Ra zO&@dL(;w>Q@_nuDqe*YpyLDaNN)OT{O&L?uq?N$w{1p!=r&PDhw=rZr_! z2|mU9KvZ4*fn!xJ##$Npk6NIfsikU_`di&nz0^F_TAdP{?m~MU5B<>(O>rb%z@zw{ zs;la#lUP9ISNqYYCa7uZeKpA{VI^9hTQSxWm5sUB9Un+P-VAne4=%_frE_^gJ$bg& zWIcHSzXq3i5Tw8fXfCEecibr5${pOK&Z}L5^%(18Yo}GuO0#NNldL%FifW=_MN?;B zmOK%H1F#&@VIxd{0#HwS?LT=i59dzYmCFczPo(n9sUh{$Q}VI} z<6)CTqL|u(Yj8ZKvn*XW8w`ysu&Y79gxhmDOXmMy zCpm{VNo=Nb7jDQuGSLKi-&DFoo#SS#+9hsKxQnlq!E3j8FYmx(h{5w1 zge7oF<=|qRimR{!_Q3=2w`5acm@RQ&KF9e)Z_;JG)x;P2QzCvCdhuGm$&2}{?EGV% zE1z0$4UT57{M|syDVrK|Z`vRTrcw%>qoMQ*^`O!;i|$e-cBnQrrjaz8&ePX~(*1o+ z$4v|`Gd<~76GJ(sA!#|Y6Gi(zB25?Qm>?6yO=S&b#evEe1=zt$c_Du$*I6)=9ViX^ z#KDS(S+cT!pr4HNz*SCRTcXngUcz^935rRKkHGhsiixtz(l|@HwnRLG_n@q>;wrYo z8(2!sk^fJ_PWVtFoQ1cc4<5$R67vGM7vINiI2aeeTNo!gdjq0zJzSMMcmh+PFWiK& zGS^ma2|M8d{39{`K^(Yx@RU0X#zVwcs|L12G6o7tYLiRoEjc-Bb8hTArCB ze%)ZG3s1O}pnhC1y)6vcCK(q4YXq_7&{1M=UOp$l*YF1TMDON_##fa8PLkMM;F1vF z_uzYR`UVMBl{tf!^K0Uy-KR#pSNOS`dkBN2GvW30IUg0amKUY0%}Ep`nNXWXP(R82 z)fB@&Q56|;k@iy#O`$?Oma7WV`GjHL@EESfzleAEjj;cB&ZcE@65SP*`j(fAige={ z;yL~&*}7bO!Ta1sI3FdEStg#MoYBG?fLh{mToxCxoH&)!`G{nMf)o6XI4a9|g;Wcd z#BZ=<2Pb*H3N)>2X8 zmLcl!rOYr6{*rG|;NS(ABkpAraiQMDB6uG@!IEf6&OL^LxCtMLOITODfpn}YzDSCw zYO=a2?#n@}rDh6mM&TaGlEauJ*tf(_u%qPaTUZ+l;SRz4JmkPb7zy_Ux1R*3H(@D! zBWs9Jd@W63VS3wNAo@UnLA2u%;3qKD4NuOD+)$e zXn?4B2|h{BMbWdV1!vMr!Fe|&ae^rPGxG6nIbXKX2fUU%TvV{TOn-|09-`}Xn;P;1 zxqFkA(gMmSy6MsqV#)KvlpwR67G@0R-dtUf`;J=*Ub}@~F{02O@qPD-=4Z$n&Tt0* zkNqFQ94;aItPj!RDK~&+qBXHntyCA4Jt>aoWEckhC4PP3g5<(*VgE2uEqwk>uK$WV zenGtWkVNK&cmr9S#`h$Xe)|9Wo8_6KyicM#STg0J_g#CFxG5lS!&Z)~64ukHu;Be&P?d-nzR zFWjf@bN8|Pgxf>+KDWE>1NRR1x7cpF*WDZLHTMd)i`-viyWpPTcG^AXo^ns}^KpJY z%I#R}?UZ|h$CLc+G}|fnJU?G_&$^enzs7c(?Gf7x_pSSmJ^IeR{^dLPU7hb0E`$ql zg+y$rg;YXDA+zw0kVnWV6cGvtrGyefd7%Z-p1aN8y9;MffiK5~2m4 zV6w@gBE}Kpiz&pkVn#8im|H9?mJmyc71^qZHN_fYEgq|ItHd)U`CEQ5kC;VF!+*pP zb}&SmGAbJW@CY;)E-E1mhy z9A~^U+8N~ZaC$l|oHkAar-@VBspnL8YC2V8w<=B*r?OMYsm5=$*y{4vM!c%6)1Lq8 z;|$^dr#iEFxAo2*=a6%rPkG?HaXvZ$C+I}Daom({MmMKh)Gg&!c5Av#+?H-F!K^ zU*Ilum%3{>raRp2tdZj!u`6@+SR z4LM^ig;qphccQPaFqBvuMYN3;CUP6cZ7jc!=9v-Pj}XT5(>Pu=S{TGn{fN+>#BXOJ zxfNS8R!eQxM^)my9P1;r2FeO0`P8C9K5lu~gB;xF}MrbSqq_q&_@_4OcE9eD~R@;#N1h;{E6_4xc)*c{uTU!A=t6WO(c;?+*G2} zE6PNx#_uXWg*Kb$_Y0rdp0Y-+2}gx}!djwtvM_<~-X(UGmnR$Kjop((e8 zCKQv4*~ENeQL&s@Rcs(O65ELF#GYbTvAft=Y|qwMtk3$ZES6@?BJ;r0#OuA z;Ww-J1>gD{YkiZjlKmY{-e|;UN3s{GIm;gQEfi%@oclj)L01vHLK-0(uc%1&>CCyB z%D(Lo&hS3J1WQOHW)_RECym4oVlQ#1I6@pJP7!Ca%@ya1i^QekGI6E2mdEAd9C4O7 zUK}G161#~l#kyi~_AjXzCPoSGITKfe{lZ3JIx*3etQbj-jV7uO6TPF{4sHcEo2$Do zSZ|A2gAJTW$F<+s`|LS(7rVHf*nVrBwq{wKtVqi+Z<>qEE@mk+nfci`YpgNG8tsi5 zMqVSW5oY*;--EB%9tB?qp9Vh%zXW|j-AHcaG>RLwjgH1JW4^K7xM;jFf<}BZr&-zT zW==HMnn%n>=1()i%4$`$+FMhsP1Y6bljXIu+tuvO_85Dyz1zNFf3h7riIb7NtLn6J z`Z`mb70zMjwiE5dbtB#8?!T=&eP}PZTzDjvsSoG%*7iv@S?u{ZxcALXT=YqEvA!7N^PW3(sK6Yu_VZu zL~>jU3n`XmgmX6$>jdpPHrcO6R=;}7wld3JbN~0 zus>S|&SeL?t=-9PV|TTC+oSDS_6mEGz1==)AG0s<>KpcD`>FkoGwrvdY{`k^ByAWOqDSdxg8r-3Law1p0YJ4g3pka@{Z?LP#tmBYUJI$7CYY zgfd_PGKveHdJeAHw4WL8GG4+8AT3GtL|D4Ao3;)-ZdS%gh7jL-Vg0$0}e|vpQR2tQFQ#>%R4s zwUfp!WS6v?+8sI03+&At-De!rL{3iXac5_`vyQ!e;8>34=5{M`bcVXqs8h#4f6=ao zj8zMpUGfQa-7Y z)S7iULYl>zJTBdl-bgW0n4C^7D3_J1$W7$da({V@d`_;U3|6))x0UZo619iALoKN_ z)DP>`^lw@MeVTq%zobi^^`5L=DQrbpiLe*m{9!G_etG}(uJFDII}_eNJZbp2@K@pA z!dHbGVXwoCu)$$Rz01AFyg9uiJsmw|JrnioT2HOC_L4R8Ldl`5kn767q=wQC@`)<$ zqN2tTmb!V|Kh9(4gtOe~Zwv>k29DTEAw|7C<*zl^mEG^LKbRC)#e>>})Q1-F;;!ES9Iv9egx%y4rgQM@2nC8!0j2gU}<2V(pS{VDuY zePO1ASRR^9<2! zZjLoqn;Y4-n)A$dW-&9N`G%Er(YV6>2BW``-MAZ^5KJE266hMJA7~NiA6OGOABYMh z3>IL|TL-%Y#{~~l-Le?n`H$38t#@W=YpQk2N@Gv8KijRSow?loZe>bv(i}Us4P|9DW%kPYCLU*7OwZ#-{{3WlReix z5#AEshTe|ezTUy!KHdS|Cf>5%B;H@1OP&RuW*)C+wO(9*t*zFEYMr%l+JD+-Etft( zKdQ&~boV^*RQDe7{u4Gm>{nQc@ZsS*!oP&4ibxlcF(PGz9ezE0Wq70T&tW~oo_ce8 zCwcDaiS&BfO!W%quz=h^>LX4S*16Z5Xd@b&j>f~n5(Sr zc42bOdAE;{kV;unIwzHvFUu{JpUOBjLR+cj(D&*2J?lKGcbxa5w@%o)u*YF?c%1M+ z*yXTAtl5lVPrReNg}h%p2R*|*4LrF$j{aOfuW!+3>3#JodJ_GiwpMGXrPOY#6VyWL zGi8brsl1VQ%H!p(aznY6TwiV^cVO$n?@i=pa#Oj7+*9tv&sF6#@<-`EsiTxhdLT}w zmwF6pPA8mpJA#Wg(6cx`;~YCH~}3GNH-37!gG4L%M&2;K^w z4Q>z42zCtS4+aB=0s{iMIdbd#o&4$jKYYi0yM3#D>wU|8%Y2)ChkUnv?|e}{*`L6l z#-H3D*Z-2;>R0 z3rq`a4V)s<4+Pc*W(EcZn(>Kh;J*L3f2V(&f4l#P|CwJ46bkeSYzw?1n#%_J2j>UR z1%Cu{7z2zOMiEv-PHTr%!oFrVrizwwSAtH9(bMjxFO5fs*^iw4S&Wp1N>`-#9IuOV z0cEukPaUDYR7+{gv|n1JK1|=NztC+xfhV;ml_w{+P5&paW3LN8_VA_5}^E$IAc(}ZM#Lh;?d*4aqR&#r~6Wqn_20FrB zup-Ck6EDYdDIe(cLVU|>>gr{B(tW&UIryV5-F0bdgyp=XhhE`~rB0M{GC8{Q$-WJ0 zm~Hp6E7(cwZ`K)Wu{FqQY!$asTe9`Vyloyg*P9E;Kts%-+{T!5%r)j^^ShbeYGy65 zo>@8UzV<~sKJU1XzPT`;wUVy$E8S*1Au0VvGT4;_bWXAW!~pY{pdO1p_-|}y@)e%w z4SW59$9FvQ_y2n2APDITOwj}I(r)_RY3>NOy<3-FJfj=eb@?RHyb})o%Ij94rx*{K zxX!z$g;N5s|Fgwr;Ph9*20GQG!Xu7n z2e*(byN{gh&Pb=Jlb){R8hCLys3y|RVu#sYJA&>czg@!~YwxiQySlT6y=cf;h)cJ8 zSx6)H1#`G!d1;b#M0zi2aw<8GT!C!RS?(?mkq5}5G=v9VxS9iPym{L+A!`!MFSX%O7U1=h0magkcGF z>OJY?7SqWc2kCzlRJfd+eEX{WM;CDnMN(E8`#K05(dH)9gTK_8lfBs|s=l(c> zvQ*|9fegX%!4JW@#y%q@v31wXYK^ACWdytLwtw3>=()Cl^V5K*#}NY`Tp1pq5S&2~ zAwO{yCVb(H?;yH6x|P7-soZdoaY}wFO{7eOG5O}Ehr`%QpHq(-V2CxO#nLA!uiQ&s zCqI+J>166E?Un9IbGng&N<8JAyj|`q7XxqYp-amsJrSqT*M6nHu0!9yhtEmoUUo*& z7la~XvpvclVAr=R+d1t_b~u>(yY=3BY~8gUSr7Rs+6uQ**+uNStdDv2LHoO%(P`;y zaQ-+AShM+sT|#cqYH2#Z+VWGmj&e=OtIkp1sQ+l4$a7b;zgj}Q0C}vFK3-q0AJlJ< ztv<3n1!L~i7gL3*>nZeC+E%TdmRE~X50N8_tA=t|>7is+uE@jXr1CMTo#cR>E7D1A zpcl^pckzPE5MorX&|RpoD^1~24hS!WxG;Nd=_faVqhE+oqA017SMso8l1b^M+)_@u z*GQ=}-C+@8GJ&K?KgCDj>}BFG7=V&uBJmCHGY(EPyWoQh8|OBqTZ!ZTaBk8wZJ>9W z=ge{@&Z^G8d-_qZX-^cnF`;Yn` z`VD{bK$$?>zzFK!!NASH+kg{D8jK9q3HG7R9SlB!frxKpGD;eaKyH(aMeq-&jeEvd zLon0AKlFrscw~C5TGo8)Ig#Gp-auRwbH+GVorLh8%V0R-rZhrSfjAb zVV}by={io(aior@5YaJWe8fU(+gff5Bc?};h-ea#jhePCyc2ZzhOoS0=e?D^cRb}i z2lX8K9L-f*fYq`pQ{~T6b?J;)NZbJ%x8BX{Zg(m;&+QSQlm{>Hni1*>p)r-TI5`s-p|n2rxpF?o`FRhE=utj7f) z)~`w$wHoofUVWl^wNhFSZMk+{d#fpWN)<0|4L2?7N5?Yw{7+l*zO{czA zb}0Rn;!1?_Tt3QC>mgT{bIIZIcesp`(iUm1^sm&1Uat|%N?|D%y`L!ki0vLje9B;0 zhcfWrNyKoNtRFBax8X}}z_J~nGhG6|*%z*-7`f*Ie8d7WLUF3mE24LpQ^SexJh9iq zI%Kuq(0#X}g5EHvm_^O+^wAZK=-`@Qv!D{Z7#I>L32J)k-{YT7bQSYw^-KP5zB|67 zz5^h&mA<*Yg}xXi@vMAk3PY#`?L6q_-p&y`+NCE`^WpI^1pNall>F?!~K1E zt_wJ=k-v;T(x2P^k3XY7u|K|F^~-+0&*%H;vwa?a27f7Dx6FUbF9)gwCX#=X23rJo z1*3vhj2XrYBP%@HX3ky;tG@NGwUs>Pvr^dk>?(FWyE)&gA7^`%J<^^+hd6&98o%=QAGEMQ4#Zq^F0x#z;RdUHgC{b zo`~2Mu^^&1 z#F0;$ETxk6!^gfybxAH9A;0<14$3$`?X?`C^!9UWH`u9xmEBUTN9KMoQ%f_y>C*R2 zHR>4&jf=s_!BS+RQ`E*bB^q> zfeNvZIx-F3Z!{RTzthj@4g=Vh3ecGRQqQRa8(1w?1?uPwb|&%K-OdH}@4F+oY25O# zXtP+iU)}65`>R>mUf9nOa6@0nv}L7U#Nq{TTezGV3{)E=)_=DX&7Ne1Rs3x~A_E?@H`+_= z$@UC;Cg*C2{hz&;Gv>3?@v70zNziOrQ2kZbNPUje10gxO+X$-hRWTsOAybu?>hamV zr9sjV_Oyl65+qj?X4u2tyn+`y4W^wZ{)=kRNGvZ#idj(${((cy4o{K`#jccCA@u9Esu0}@M* z#f@-s`N)q)L7)}U6z;q0smbMGCO^VJ%|l%);n?;qdo{dk5!)a>C(}`+rUzPQ_AyJF z$<5!!O=G{Y%$RA6G=>^I+1kO^cQyv|`!r)Yi13>6$4F=vFgu!)%u~d9KC7p-+4^SX zvxmUn2JQTu`L*bR;lyW47}8zDdbFDeTv$LT7^`K~CQ~;gr7YadWM!jrM~P7~sb$qp>Ns_adQp9+ z`qVgDaxFiZs)&|LOGO?0soqhy!^788lc=v?=_@LK!n)1_6U2knjiGZx)+HtTRY z7=5%mh+eiEXs$J9u|Az#F*iFXJA!rpopl?^Is3`6b6M@Z=sVi5)?34Qc4Bppfcsto zYCH%RcF%dvr}$xfBFI+h;Fv>Pd>OYoTP=`cHF|I&dgh4B--N>G1pW&$0;9UK2Do|;Hu+TfHX|2U=^!Ih7 zh0;?g0a{X5c{&~SdHJm@uzK<;RjA+%ls4QqRw^r{cqWq)u0+W<PpCx2=w4P5cPX8ha3oD(0b;;KYhhx0fO#`pmiZh_WUkr4EMq1x zzZ#c}wZ?d(FA8NO_5M%rZg4*x@%UhOkYBA}`C!RliD2PiY3?I~#lZqKV0$aUc-Evt zsRvtD0sc2Hyl~v06>tO50W%ODOdl*ne=#(;629+eFr!hQPq=|5Q^p)`o-lQe(hTdi zl^UgMgZ@Usv1Wry&@^U6YHV6&z zGxdEa6+J%Z`J}s=HQo-tL_t=Y#yShIGIdvRPDm%0Cr;q_=p^y!9Tex*t zt+}cA@!<3SI&WFg*Qxr)S^YcN){p^)Q|VjNbrf_`!>PrCyRvK-7RI$LTPKGlbF#65 zdr+Z}q$SS^YnKvffJ1uKTnj+DN(%MLR(zE~C22b!D2; zHkLz(LM1&ZA3!bL3Kx8U)%igFDO+*^C8d&wOkS5LY{Y$Kj(R3I2futzJ_rjmOl~gc zW!2o3wo>0KOX;M)C|ZlaX;tBJZ2I%P!VD@_Nw~DzuzJ1Vs(v`T_`VsOul5?d9ohSl zwa98@Ww73og+`i<%z~)qf@vDjhHZGr-bKw8<~VbO`OGxHjh(D@^q>jI)`P(E2hc)a z+tIedu}#O3%;6MZr51AvIoV;t5<40w_bEKzPS!zBvRE?vhqcF=V3lRfo~O&H084#^ z+FijAjl;n)#JCeU3`1NzVA5?*^*5l)v15CjRlZri;l3We4!-8Ty1s_KdOWuC4TGyb z=L`CZ`bWVg3xURg3xRyWMc~~5#%H4iK7eB6(IjZQ@9c`KNyDkZQTXjf(vj^aS7re% zO@`;XNsbJoo|XVDH3ZvqfywE`tv!gTh15){Pu$kxZ?*WTF89@?YTRl`tx(%1NE<;q zx?B#1?uML7>7<-QNCSyewz{ybtUr8N~OJ(p&R@@oiK=&&-UX^f%e1cIMM@^1PPF~B}s>wNz z=lmfCZV?HmK?D~#+c)hy_6xGgZ&-@o_D|x&$BGl26mZ97sKsM(aBRah^~`Z`MWiDp zD^unBv;OD0TR__P;BftJ1o%EJ$SetuK3J#AeD)f$>u~yoF1)@bntnX@Cp^(U>fsnV znBHjmFYIOZFu1cOb~#uE-Hv0&w-eauaA^eL6;{G7OeWe3Q7=rQxxLlPs%K@i3ZhNt zg#ps7m*z>3<2iE^mAN9^O9{}+UDUTV#&n~mk<|DZd<(<=GI%F;yN-+GXD|tTQB|Wl zXmq%-!q^CVbHq4fTrf_d+`R<#q&JJ04Om;d%osj%EdAa`D~_E57O)Gw@CAU1R+mt!TRB~!hpb}a#Ab!5F|r1GiueOUc_)@y28B5*-vR@D@6!F~I$ozy8x zH`B+N2v_gGs5hn~+J|Q#I~dh3v<6QmLm&Ah)sxSl`YloXN-y<`+D`kRHP(;l8HmdG z-Z9>n-pH^~VSB=&!m@?;3O|f4mpGzSM5~CYus^#{X)mB}oMGD)u{mN@M4yPP5%0pc zhPMjW!q10|3u_aWFU;?~5cMi_cZdv^IRtXRn#N&x7u-SueL#(tZmUKX$_y@hU@YYfCNfT-qb3es4orcEcKsLqvtV1w`wPOPWcH`>=k=HNH}wzp z&-3r|-}nFUN1$a@LF4L$%C#bJj-FekLjN1wOI&0#S{ieW6HwcEq^b8B+4?O2{8}NB5YR@NM04^pDTuecKC4XHs zpswgW6XC|M`dxo9^5vm`7p!m~C>hO+&3sB8vyHjZd~0U1x?1~SlxxyOig>0jI!Wj@ zpMV$VP#e;tWsJdVbOx>C0Un{dcpHvWo5!Mn6kz4Q7cS86PNCoFi+67k+2sSeXl1&^ zt#m0mn6fF^Zz~=oOG*k~RtG+2hP(m4!#8;HoJu*6Q+smOSY;F{^8~ccnVipc$|=~$ zFe>0!^^%%EYmG+y23@VGK0!aA{~;0^lOs2JZh3y7v&Qo#^``P>^kzm|{_T0-+2@&s zuA12Mnrho#PpF^O+R(ooRNJYE)E!E7D&tBzQ6D{d3F$5#r#RvvkW75xEO{f+jlr=w zgmspjoOK^h&muUfsW4On?8bH_yNq2FRz8cJ%`RY<2RZiQ?-!|UHDRXSJB2_7PvKdI z3nzsjxTq`L*aLdunjC`*l26Ks+hZ!V`#FB6xJm}lbq%E{tokrzhO$99ro2@oHIv#9 zjeW2BR+T}>b+wN0kkhq!+B#I>P1-j2%HgQP@wDe~`W4mh%5o6ZD?B8kyk4pRZkkDc zw$K2&3h9L(WXjpB@?0RLn>bS2k&C~=DYb=DdO=Usjg0o4UTlWh3DlR}jGzk>=s`Si z%2~;64a~OY2y-@B={WwJ52nvlas5cJP(FUUZtjD1o?`Ye8?!?4qSff8W&9$aJtKl| z;x9OB>|({t09Otp@AWr^unos)H<@QQk^dgUUZ*pwp#H5ej}nWPnbFFGvnan+6rHf5 zRfHZXFTba;5?HDwSW)I1c*Gm%@Q=**WJ;C4L|QdL9AmBZ)-mgj^$u=PMN7*_W-o~L zpOrI}kB*=;=dKd^S`+xRwss4$We2;P-G>$5lS(iEEpDE@)ILFtdTGm?`@Cr7HJs*T z+McLIeelBc1QB&)>&)X27@|I4##Y?A#ya>mIal!S<)Z4Wa(|&aFQ;M_M!&czCP67# zF1?`pZjTnGfYO%3MCKu~@2g3P?6ulcEs0(dHKsdy%nW@QRehbl3m3#$P~sCf%A5Li z{i1$SKMg*(z;E|ZYQF0}JfRThRc$)qbYSYAIM!a^Tsw=;c^y@IEH%FyN2@DGDs=2d5_b!n z&FC?gU{xM-yGLEWPIr3H*$UsclwNxo9e0R(o4{=vZn#zWrni95_o2`n=01ef7sGoE zkHzY3aAh}&^<9@?ofdI&Ihpb4CC6iz#8DlQb^8^M*d_YyJ>1T+KJQT_H5_@Ee<&1ul0%;TxU%}zb?!g`3_E4Zw@z`(c34chr2_~Uu%rR|5gc~ zX=1~qi#riq7n~IAhqhTGST0yJn2{b$4(dUPTRb|p!sP4`!9&4s!Aw-14MxDI!>UVc z4Y6KY^}z*2IX(s4BW@|U(5h%=k$&o z&|l+~IH+$TW_##0^~CyjI-Qy1+FW$*m(`VY?xo4NZ_o`VC@pcE3CbNZZy#7F4}I|z zaIzQWXCN+>*TP(;8B7$M_OLAH(LBKx2~2}Qy-D|%ggj6VZS`Mb^f0j-;(9Bvk7MW%F5`So z1_#~@R(l~1-BU1oZ^`-*VrsbXvaF+y^oA3uo%>;0Ux+4dszg$9nEpg;Hah4t*u1T% z;A7whDvLSLIfJ0=Thxx#bY#Pr*{Fx7Jr5pd4=Ye-X2wgEN)@YBS3;d{3!gKE$&BOZ zNT2b2hr=l51d%u5lLw2#@gXc`MPI_(t4al=4%EBj(hn(z+y-6#viw_4t&~Tjo=860 zsO&`>+s?K|nM$8tPD!nN#6dd}$AAvQH;axZrSuJkvM2nkgCk)&dzTvT^&Z&1y!6%k zIcJre2c~RVJ~W5OkfGt}Z*jmjI2{hV5ui&ixm*dO7v=jQzm=!RpMw zT5drG*hzl)gEn6lw7&%2{wcsHA-a4eYIH9&p7A)#S2GE+O*qJQ7=B=>Fq>Yb2iji= zJm_BGFCLWxOe_pTMXM3(>Wznj@6g$Og3J5J&4;Rx1|6Ul-R`*9sfMd)1b=as#G#wW zz`JC}EgK&-P8WXTBf5#My$c`5RM>?YXp~;}Gx=_g)66LgTkxJdF^Q^DfE@4?-f5B5 zhnkcXw#hO-QmM{SJ@=Yh%x(BvwwN1m@a^FKuz40f@2lzHcPU|Yg!wrR=1&F=n@N|X zp*GASujVG!?z!3c-p_@CxaGg#I9q~}kOvk1u>4Cdj010#avFc02p%p2Ki3&(#JL_1ZVvk9 zozhn+6Y;uGz6DyWp^O6;Ml1Q@9S^8K)ofY=ZGyH#yQclr1U)`TF9j~Z_`0aaXpeDd zEz|~RWk5>TU?pp-in^C$l}x#YQ>LhFNvH6^S0k!_!?rJB#gt(F;V+%;aboHe3d9*! z;&UcGM11cV(6CD4btsFEtTMfCG4$#p;NL>rGPB;}qHqbKkEy5M{Kp&gpPQ`W6U69$ z#OeyPstqu&yV&;PLO#g5pXIM7@u2TP8CXQu-H+%kk7|{c`27j`-b%dJb+Un?{9a3FZ;B3*knry(_aKWi%?Oj{?`$X3{~C^s=GTzz<@$uI*uV{=sK zc)n&H<^ky93`b%MS$_h3Lw7WjCQQN=!lRyy@BfvEKaT%q8Sgb3N5)WYePH$a@!Lq) z{b``=`Q(PsB+@;!UzHVGi5ZnCOxT>|Gh%R@WI>N;2DYC@Y@b9e`3(wBhwG>e`g{*~ zu(8rqJUg42kvJvYgx&oa>!~V%HrE6Gay~wu&2YE};M%s}pju7@E|C{=Tg%TI+-5kk3WKP!%kkxSFm68SH>>OnpRx$QRY$nD98w%m)?IP0I3512 z8L^ZbPQ?QY7sZjePi$=Fcn#oa6cSP}|MLOn{t&Y*)6nmF!+cgFXQgsI?pLNoc7T({ zF{RcKwxkKlSU+@&d7!C7WTtz#_)RA{JZXJq1?IwvT%pVVOvQ?VHTed+^$u0^Iol)h z>s8!N7nliqiGwG^s>C4*^P|7Dfd^VcjNTGHG4Yg@8Ibz87>0ro=To=#qf6aloqiR4 z^mz%S)O@>0I-TY?ONO(yro-gU#c8$$e0hqAk85mC(H6c)-|2)5Jn&wQk|0M*kEDat zrq;NB96I&+VsmuGw?s#0j)KEJ?u5_n1dm$~g+&IXJ%z=64iEi?n2U69dHgKiaAwV+Ur=)5i_Kp*H$f4Gut zca?bgz|m3UgiOa2XFjGL*}4UhRSnHFJJ0&1hxm3TbBs$#Dac)?&~FA1>+!@#yk}32 zSdeqM6z(e@o$N*Mbzi4G%yt&gv19*19lFJ;Jz;*_7d;@g+*8T!JWZDTp(jlKk zH}-W2$L~7TQls9LXXa!m^OPru8V&r>h+cmuQ)0=8h{>=<(PB1K^A9MqvJYAUUZwnh7azqYr&Lw}_w_muSX^UUxZ_T2V-rhiZ7&EYNYt>ta)?Sw~s z2ww3K-eKNu-u66K-doU{%bUg<;T62EJy$)OJ>%%@Gtui@)z{E76~K$T2h}L6_C%em z=E5yKLP?+;L3;^Ev!#O6wlQSu&t%~iAg9;N$}|A$UxN!Q<3z!DG{9eX1kELdbqB7e zrWwb4XskyyE^DMSBoO5@{LnXp_sEK$aA3K?I6Pm1?AXE>gbQm8Sn>!ytQ*E{;}+fQ zed8(j4~!4SPco-s#z)i3M{nHKoJr-shJQ&x+bMu5RmW;!wWLqzz}6FQ#~AAWe01pD zD0;W(VjbAOVmSN;!R?)bA5BcZGmtg^6W>c+a=}V+-)r2i>A^fT@jdiptuCRK93r#c z2MzvZ&c%a^AR&>FfXz#NGMUTuvzf$RH1`&_0H`rk-!h=&=b)YyCYD0exedVs^>{2z zg$p5536A#`d3!CN(+aGf5?pkeT-=_Fn+ng$F1$)h_P0Gw9xuiInYD~D-~*f8XmJ-xvgTLs1DXJCib?% z%YMW0m4+Uy9-Vt=;%bw9(tZqQoSJIbjO;f7eP%Pd&L!r0ZE8_AkXkn?#S!KM!{}rC zP>VkaX_;o5jg}rG{v$O;n>$M8&q8NDM?NbD<%~*Ar7MxU9z^v_3E&P-qZUyssEyUu zY8MpF>FOdB$;I?G3)PwGBs7{)M0g)Moxb3%&T31w4XCT7+CZ(L7FP2zy_QCer%LJ< z<(_g7oIL==Fop6N6gHXOI}>`>Zfa2p$z>f6Cr*7JgI-j@DDdkrW|k!)bq+^09d7DF z;KI%vzZ9_4cc{Yqm@eD^>#^H9!EbLZ!%D|rd(btVVm+rNUdH2@_zQw;P6fCEy3GO8 zKOIfu73V)WIKC{5Xj3wJHyk@7$?HSJ{&*W)MR9J5U^b z+~O=*%ooL><164+C6Xq9IZsoMqUo!0(ff3PN1I4hpUPg30s#-?_c0)b`QU~%!dBr3 z@%V^|Ly;Pq2Ygn8@6v+m5!&Y>I8;(Fk^3IJaT1ksEY++m8Ngvi?kv4Qf1)EBZtu@9 z0SDnN=8_Rc;r!@?a$cLQG*Oii-vg%B){Wx|qNC5cXKhP>);VWylII^%vgi z3M&3$RMSD|we`%hOvB|d%fYBMF*~E(FQpQ^0RI*wnwPP@LuaZY=W-TKopZdu-;Ut3 zic+WAldY%YMA}B~y~I@8OX}G#YFo&G5QUG&hOtP4FQqxt*++47{(}c)6d3X$#~=mq z)0kQ?hWOqnvh*t5?ix6WesFO`(D7yED_ZFhc`5yF2e}4yH$7eN zAL$0Gb2|E7aVqT}{5HF&wL_Snu1<8NXU5ydOzv^K@sq%wq1gJ1_jxsSvObK`A28TP zl$yHeS(5XB95|Xuvf_3k`wQ!J3I30ERu!BG37ABF!4&0IIM{x;Kq{L5n5n5kE=c|VGBwwRbn&|Qws3ldFR+CBnsPu(-|3P?_*R%d#+TZXqBy{pK zBiRnFat4!p7s!hWlNuG_D5ub0+z08U1UGkLeXVAVJdO2*#An^)A?uf871d^Hyd@FP zGInOX4S2Nyj);2Xj9MVqe7Kk5P*WaIaaNEM8j-g=^o<9Zm}pJcBDi;8(kFqxsxtE$ zKUS%_P7Iv1cM$ihQI^-!QU1qmFDzY14}1hm_XQLppbDo0vs9$B=mVd)2sZFsEGr<8 zMRG9-+kgrI7~*Mb4=fHsU=b9chINm9k#Q(#! zA+FFZtwQ&lM)ZZ8PkrGvI+G)Ke$(Ydma5_}7f2d2YSe)Kv0p5;ZaM%s0U6%ZW4rmu1GN1fT{tMGsRhgt5 zLBpudx~!$dSDxUJ$*-(szN#7RR}*fqqXkcUZwRvd-PY!~R4M$xCl7mm^y{UK`( zM#XDrueE-e)y*}=NBZ0?0iVCR|GF=euU|~^m2z~6BU6(Ap#qBTT1+}-5UQ6vk z411O8>Qi-`RuEmPy62;(xA%j$d)Sk(2H^w3XNMmO--kZ>EIeIAWBl>|p@?pYSRBzV zB4@DD$50=fMZsWYV*y#G0POV<^A%S# z$O%I0g@f;^l@RvsiXBO(DbkVdAy(3JR*Dggd6+j3XLjZy>ufUJ`T(M_7fL}vHwdpj z1Y~%Vs?aYM2X!TB^dk=6KGfP0jMzf)tmu%PhL9la7eZ0|2KdKBJg&Pfi;N| zDskP2Yhq%m)M+}%oN@{D#0GRpW#t@9RC}4PxgOhXPo%c3W)dkN)xfd!O)jY{V?MJq zSnYuN9xlA3Ru7)KEv~b^^bW1@q2<)#Yd>&4u448&2b}c=G`R-EbpzZ>Q>hkbV9`Vn zT|Kn99qJ=Bz%)&MEmAA4mD8$mpH|bg&+1MvVNErt%vW+N2kF_a!ka!|()=y)`-z_H z4lbkp=uwBzw+`Z(xlX4M&o~uq6-*X<5Lg!I5y%{fVoGl}(;{>6;V)o*VNKbF|w&XbY)f#-pvS_*UAI+gov@>Z5HZg-zZ;-A_y;sE9jcsAw1^i{2riYH90O)GAb1~@%w#Xqqw=iA|CGsU3jg~AKT&6U9W}TGQ%KpUJ}MpBZ6P!9`#?;~ z)i>6oh{u-;F^9UAW9wB)D+5vHVwCdgTq3kE)6f?*NiVH;X7+y#UGqjX!O6^()?|9d ztAEw5YU|-X>uVX&TF&x64b;r)CuKj;nnzKTr|9cz>BGk{{W1q0>kN5XB&W0|-`-N< zfQx3}&h%CBgDr!+qkVY&5!Ok)?&(=(x9F~zzO-MI|9`5j!H70KEg(3u~wzka%= zxYAPU-F~jU^BMGC-u(@NZir&G0bcM8&eS;8Ixz4{W0aAFDXG1vFauy1o8nY#6YN2b zS`|ExR+GYL2uJzDsLVM?V=ZLXU^0HYVc^{+U~~^PZk}+SN~+SsrsngqflRW4y^7*O zuSA9JLVf5@e1*KvtKe`q5qXQL)iaqj8;Pg78~s2%UR#u!o{>&iriXb&ZQX`m&>rO` zF0r^5-*8jvp+FD27Nk@MB<=@^>_wXx23u4P)gm$Th!(oCYlYbv(37izw1$JUc2W~A z;>PjMqF z^hFuihvK-D>wv5qgKui$Wh}!pMd^+5l0hRu{Z*)Pjo90s_!?)?EA8W2SD)Ne^tK(r zpu4y>&O3Ozq#*XJ9H*opk#F$%b5N+#gWLZDGv#!n>5!+=;}ph|6~q2Mh5_4zp656lGW=T= zj_@=->n6Q>63%-~s_a;h*=ba*S76<^vDb2`L@z%K+~NC#56-t``R=^cLhiHa7+^Z8?)c_TsNM`4ogk&Z{k`{|?6}KQo)7zz{Eq<1+Sl&Q5dA zji2s(J-vA!DoY*utC~DEWX7o<^<)!&dkYbk8mCEJrW2-c-I+ty4YXhp)iOJ)zZ(A6 zUi7bvSR)r$)dAeV+3|)nha>%$Pn$x%8ph9|tHc$HoqG>maq1pZyr)1lC*W95+vo8S zy`r=E16vgrpF(z22TZO6kf8K=aMSPw==IE{AfUu)v3 z4L^4SVU6Ik{^focHFzkFi0=HQA-!r*yt(O|xO8he+1vn;h2h%Gh-;`2``QS8VgT>F ziqCk&J}NLep?z%2`d9)t98zjC5I5~WQTe_S0r%1SHiM=n5iwnur7o=$!abfuNr=nd zr2BZw`o2kQABmlDA1`-fzNIv7=fw08-|*ZV;fhzY;L7X3Xe5#h@dxa}JyeU(+{_MK zY>SDazC?X-I=2}3&BMYh)R$&(s#%Htkn80Qo#Y+5#?aLwuaM)Ok=s6kd2KfyS7nQ& z0ygJAX3&uw;s0N8^(&Rkk(P9pC!vC^A)40vycnpP$sg7zA zPx{1b{-c8R;lJ{5HJ*>?SZiRqI->uF{5Rjg)azl`y0F%=z_)&874D-i9t`tRiD*g# z<7(S6RGw$>`B$k+d(ot~+go8>_AwuJf)4vqY_+<;<0+mwO!e9f_Fe}*TF-4WU3uu) zQ$+4PBKS4$CNZ6mn<<_;L`WYx`N?pR%ZSkZus#o|06*BGnZQx;*m`01LNj$=$y;Y& zKIRjD?NAc($MPS3wBD02wo_P3b#c(8vIYAUo{P00*!noUWaeOwn~TVw)$z(G=10)q zCOqGLad=eWnroSve9j1#$ZnKj0-_lnjw$^87}JVhxGGLs{OC2oYIDs)T+K#dLb$ax z(b^AVoRV6$h`OAR*d9aW3phono*U7W5^|2afCG-f;fVC_WtdPO4r1MpoBt~_ADOs1 zT4VUI;qXwa$z5mYI6_xY+a+z1)>40_az&@kXjb)L%L*{Ho)k=Eb0vTns@E6h-+ZFQ zH4#F7kG$|l6;K^J(zQ%Lli1FT!xLC%SOqB9t67yYzJ7hMY%vFi zGt9??!FhePK1Q#nr{*eBN3>B|ZB1nIbgWvEtM{x^>L@n)Wo7vb5m|tVnh`J*$B6#F z?j-oy<6spF{9M9*ZOw%1{Dp_1rP7-UM|i}b|XJ?Ddl*kwJ{Kf z-%PHLw-T4mQRY@|Q~O@fOa5T9m={oROQ*+OSOM2yCkRs};jUMuc)p-{@xfL#DEU&H#lMpWaf;~A3mKslftp+<1#>{nS(r^HCpLy|< z{lRyAmo;&kwQ&sH>@xb>0rPzz-pxcA7tRSv~=SsK`$E4_+PP@>?t~L z=-MrZV2gI}oj1b1uBOA@4hlZPb{B5!2^lVw<6g2Sk5HcLyv`II<1PatR)IF{`a5I%!_knE_V3N$0r> zZ|z+2_k`H%TGqyyksp371!|Vc84tj^{a||!)_e=Q_W|+avm!Ecs!h;s~|Rpv&+Hj74Z)l;}HJNAt)3D=pnvx zL}!56^Po+?CQ8Q<6B!&IId>7*p)ivLKge_&n57zqf1;*Ufysj0C_o>NRG`DLPM6cvt@HTDUf|n~W}Sp_ z1k-XjL<49d6)|R3gj$<$T!wvO@sT>;X>6ie52z4|kiNR0Q*Th6} z1(01ID)M61>~=gkm)XnraH*kd3oBv-*P=;4-45M{p>O(m{v{r~oiL^Yah~KO@;?x( z)0qFvLydX>E}8&_$quf$Nk22lu7#7^15UgJ=KGKSb1r#q5*)%3&ek@bJC4rw%=%?1 z_&bZCIu3zJI7lV?X?uB>s$%PdIIQrS>S977eW(PkNhKa8PDrf~Z=ns~j zOLVRUxol)IaU(8_b;RmynCYQJa929w`owbqm}r+{ah8=hm5wWPU5Ugn#a}>ZSK;Tk z!W2*D=yw7?mZHDR!JelgC&j@78%_oc<7g2&DE|_5Jpp=oUf8%g^dWlOw`-7PrvVqeaeYa{Ac3Xc5)nmO6_wSe@I%qwpuc=?)Wv=nBy7lp^9v zkyUb{ad{*k9pnxA$(>-SIUKDqC`z5cVJ$g=A=g$uF%vNv5vzrNB`>_7XFkDsSwrQR z%*@jO5La_}=FkXO=eUBxWV)g<^bZ#3@fd4mG`{K5FeZ}y5shju zF5AiE!0z}SnlN8gmHE<&WWx&FSEBZ}Vj5u(YjB5kj@c#E&IS805ghv-)}baV_XtNK zFMGC`?~@b7a4T6nGiP=QjIa*I8id#A7OZe~s>cAXDtnMA3%{ILey)PYHMf!m7Qlwxyh?vLhmN>DJ!T47LxZ@^RjL*+)!7X8A-(jQo?#==)QP;9 zicE8ZYY>m+3IMrTwomDN7IO`;mYm<@@GDQb;=(4-@?iG596si_T!Zi>nEEQ{VJCd| zG%`;cI?JMDl|;6S8vG5v$7^)ucif&?54p zwB5dL|FW~97>}po{BUxDUiPzO8{*Fh2#v|vVeI>HDGApIJjkR;6RxTIM=3#{eMXH| zvuiDwusW!H)I9n>dO5uTlL!6vA^KqbU$$Xzj*Xed$_3B(Sli6}Nj~i(Y;j{8lzW&~ z(UqO}k;3Go(g4=rW3D<-23~C?`g&rnR56_ln8baD7V|GvDh)1>OMK^nb{+OT+>YX# z++{n%gxX%~6m0D&uHkUSI?Men>pD}TPw>$HhSgTNCR!qVjoD$#i{NXhiFc$OSA7_a zk7PDer5ot3&)5&?cRtZq`?zj{M8}!{%`-jSYEhWB<{+~PvHi*sI+9zQm%q3T(viz* zgS*DX=CKp3pl4jkS|We_1C9z^M?7@B@}ivCbg};5U*yaaaA%WQEtRPw9$Zx~L5QI% z1P`Fn7obN9QW37w=}+d&*2N`|ff;{;YuA3^yF4TE@5O$%Tb#`Ye80EW558gO3SPyy z8bJ40?q@HvkWskJbHN8RhY6U$^;eHLH^>BG(U7o`;o0=~{TfP2jQPRD+Oac7y8kfy(0wap6Quz`^yT ze(WTx8e)3cb|p+K#bL-%%e^!}nBVwziEl5EM9-4r(ireV6O#e!yS(o$U<{&XCJ; zE)m(1tB9qS0(c*`qee8Nf`s_2Rp6iEVBuHf%@E(4h5Y=Ms94MT=@0i(gX3O`sL4a@ zWZ{g)haL4WnVj571=`97C)bjGb`Jil%eW2=c)5I>m8QheFd}{xHT5+0{yokWkxxk$ zi@&pg-qUe4p9E|+%*YQS?FuZyA);wntW%~hIims$UrLbUADni#=@Rx4Sqt$}^@p#i z3`3O0@q$;rpz*wbt9=gocu&OpVU|VqFdTL!ElPPI+>oIfQwtp0ocBya9=b%o6uN#z z9u!_5(+k`2g`Q_!ULcSDL-(|WYo28%``03CJp{e%VBc@!6gAvTpf!tb;0IlD3`jB> zpNYt^OT;R<%Z$c0*!f+2>)tSKiTEtVJp`vbj$_%4POTQ4L1K(aVW?86fB;%90@ByRa_Ov!XMcNj^GUcqC5#DVetPrl;5BQcRNlek81Ow_rk)lq}~ zhp9UOx4Hb@$L|b#pV81{&XlP^p)ylu8c-4?M9EZXAVX2gSW2Zbl_YbeLNXOfA|kUU zMKa59roGSP_j>Qo_kUgg_O(yP;heMg`~5uYS?j*$^NevB z7cyF9&d4m2wIJ*H?1yvih}^&%EnYX+#r!`DwiM30^hS{<;%=}yRwcZj*f&&`7QAE9 zwxmas<5DK3TuON~`^bYC6bf~W6!?~89)AaPm(%Ypsc_a|AmEV6S@Ge z>Xew8_?f+vkgyC!P%Zv2JxOW_5QBRr@ks26s4Hzt`i`9U*-Mi73|Xmc#zirn4edcUaylA{Sy%_K}Tc*F?w*pyXu~k z1*!TXhEO7((h)bpO1e@G_^8Tol5BpYSoM&|RaQQ_)+(AH*LarpYq1>^c74XGO`^K) zyE|{^I(HApMS0wpfXfGcGsV<@r*+e8ljY6!FYc5tU!;HfQRl$1A|=!uL-o9z)IHFb z?l=T({ESyeSK5Rh7R3V73^tMI1Wm zwH7Hd#V+|02DS@xU9Mm~y#Ep{=L0l4b8>rOZ+AxDrm1fhEgP*EEvH}WVM_adxY7>D zU7342w-!a%M_9@mAYJ?N>tZ`E@TXl{Sl)a7h0bjd#x|!&6R~Pn-1X4GT{ITYQcomN zBECvNo8sIZ7g~$0+aLOtv&sjdi5S~Xp}P7+uhw0a8Y&+u%bo7J(5-Y&Z9?tzfHVwM z!RY2;tbgFp+=nKkMB@2`A4T!`9t)tQs}j~H`~WxIh2{MbR~Rt8d-+Rj#uQA$hdk;! z+(^Zq8NZJP>J8VjvC2DJ6+d4+f3FH9hmXt*8GUmRE=o~;G&Y^&m^|@}I2TkIZ;Fmp zFCF8k(2g!_nQqIg3wEk&+i+v~3+D4N-t{Rx$epme4f3wa%c7wD9Ag;xnH`QUiayS@ zBt80fWSOq%`*;K=^0nKZvy!jk5`ER*DBv z@(Q2e&XLyG^a_z0I;C&(Z(fQljvR=TqHuVb!r@G`V($G=svkJ*bhFd0z~r3C?yf@)oDcUW8Yw&p&B%Vlmf!vioyZuX1hu z>Mi-KHws^eoh=$pkUjmu>0tqV@-y@UbtpnlQNAqWNH;!lm~N|{y5khj51Izz|t zi_Z+t@d^&%Q&K~-600PB3s*S-Yc3hTSrt__E%y`%zgGP>W=U5>(`ou zv5L?5bGZ*=wOi>@Yzxur0neL7*L;N@;UDsD5iPETD_3$~OGC{rTxx{T+gl{;jPFS4 z5U8Vu;bmV^{||%y5A?NOP@p@pus7jwlkL`nSgUy$%O_NYP2p6>oH4JeI;uFeRyg}Q z@L@SF!|N;iJ47+rE&uZTpG2W{dByYoq|P1+1um6aU@phc`X`s*mzQv_-Wc5*E!4U4 zNbb83$E&^CPq~rYPCfh^FOsfy-dc4@A~vHTuBN;AG}@{4E~ag%GjW@W>lAG65>0Bp zKEI;svC?+_O*q)VRpxH5ue%eoi#oVH#-%pZY8iO<3Fyl@dBiw~%zdh#y7JGI!bCMt z5&H51lRlE2(-oZ1o#l(O75#*fs>omHx395-9#*4IkhM*byN!kJ^@RCdul779 zJKgA9UMOFf>{<`=U85i;{iwBidk#Pm@2Z4|M^CWtquOaH~xtJj$`o!n7)$G?e>1&WX#M? zeQNPmVl)0UgLE7|?=eZ2|GVaOOix^->u_b_cZoY7-=`7_bifx4T`sbf30)Qn*(rZe zHGGsfoOe(?9uIrfX@PS39Q^P_)ma63=9;*1xWFso4$6A(leKSgrEa+NhkUKI$g|eu zirNL4DvhyRpRUa>bcU_Zo8?q&=kzSC=RFRlT?m^F^Z2ilSBnnhF8+#xXrG>U29C~q zk>c_Nr|zR7MGLy#8=be;@PoL_Bb8@YB=wwxep;@4m5ShNzJPb)JxN9q%OWL z@M?I|UHe4*`Wi#K*xj3)I7$p_j;FogGOV9mX%DsRj0IL%#J2dR1zmQ~id z`h%D;3ewUNa$Qa)P#MZ8yn4`oO4)Lj8Y& zVtfq$o+$E6^zO&0uf}+e_IycBKSo|M+ScgPW%CC8J&+X*v$Hk$^G;po;GL$TcsQwSp z0R;8%LMY@?dj8LS{)HaPZ}QjZe*Q+4{1sm03tInqbW$Jb!Fxad9Uo_Ud?a&Q=x;vv z_$r2DuJk<{Rh)n6Ce6uDDk#eZ;bv9ooodrQa+nbXuh6c{fvf}$JW+i~H>j5TtJi0$ z5msT4PZg$PlN+d$hl)HKp-5#Z{>RD7&QOGQhLf+P)3_qO4*qgHN9(^umg-_d;Epz3 zma)-}KSV{AnUD%$X@KJ$NNqhQaVf8sZHfEr^k4A0YiR(c(wy~9Y|Ys%A#t~Ux|gZ1 zOPSa64oyONy*o4Q>-4xEM73sWsMYRD8IIt#^6t!$h$u-rIY2#Vg|4vv$bc^yy_} zll$}!zQ+@+1DC{N2~l0U2h`RJRj^O z{3AFYBe1t!*3xpl7N1cue~p7#3zb-lli4J0?8H$A^WpaRH|zXe!0Wu?-gSjJmV;Lu zaY8Mi((fT2UZbi#>D|wx&F{_0pj<&>!6|EHCuQeGYiNLo*9bc5b$ue`)?|tL;bMw+mvm55}hwXNzm|2Q>6Qd|ED-_Y_yNR;;seC~Z&R zTpRSwU&FyPKpp1N1sulxUI%Y@RHXSr2f!J9p_Oz5bcPO&vbtBule73`H&jy$cgJU1 z#Vf7lZ>{K`|~g@5Z$Ee_LeE0cNF-F(lhU1>ER zfMK7G&6W%1IGlq)T%;g7Xl?KGx2xd}pV$R+sEt0rvP>1dCwso(-Y=C!?uU0LLGpt5 zJjxjpbi*CNvBXmlR>o>I#wFZAbKlvy+S@&U7(x`xm}`w2sH>_e1EosGot(!NZ*vkY z77GGzyq@AuH9W^ZuIh9-R|m*PX=mPl74{@~v6xKcdfRDVy+y;2Uj$2tCo=Mg9RF)E48v=X2A+n4ohck!Lo%?3EbP2)pa zg$~%*44K3%>%KJ}_BXL{I94T{IwnA$+skq;Sc{`+7)ur$7uzOc9InsLgkpS7cQB0p z;C8(>scMRC6b-MLBhxvzDMdq>+@f-~By(}%d`!l;i&B(1HM;rwO zIFxslyE?{+dpf_Gb7&Hb{}dee_QHPhuuq|He?!);l8x3;Gc;32bd71bo|a?0D|Q9l zZf7W6E8xu9%3U9npFD=!=&IYHhtIn~N}h!3zALj`>0bVW8%w1Sy4|XM);atE)zE6* zT)&80XJeBUic%A$>)tAGZXKq)`%)e7jQXp-wVe(9{aoJC$GRy>kN%x_Im)?rJKaM% zkAWaQ?6jiSdu)bu{)*R$7MAe0&E-HN?XoXobw){f+hZ{1wQ%H;5Zh<)a$CjClDg|3 zg2BG%e!Xs0y{1xrjaqmVP2yATU|%S18%$lf_)BsB#r+1S`541I(0Z&3#VPLGI|8Bp z8fHD2Hm4gT{stIois>%@i2;9$a=@w?$i*G{mN9&Dv1n?h3p1dW>gK)7=8izsaAjQ+HN^!Cr~|j29zM&^Ycg0qq+q z*QL(Q1@_>VPS9O3&08Ekw6<==0nVWhM1y@Q;3Ba2TKaJw)|vAGJo|TuK{@$DFLm&% z*6Qa_tX-66IW$3OddaHV0SzE3jpP6=d{&>X;ad4ls(CE=asS{jH&AoVpgwroeQtuY zEOh68g5$qwr#~vYY)SD_#vH#axXZ8VfbYc4MNYm6uEr46&kM1$a)zk5Dz?Us>-!IJ zGYPQhqImHvG4^Nia)uq#!`&@Kfqd5c`_Vgo4~{#G()9tT`0Wt!pn^!!JAM)F{5NIT zZWzgK%*!@e#7aoOyYk8BsD>YQo_ED;J+9t*Eyk4Z<)B&)9{d8$*a4OGO%TtQt@0-J?+FIpft)q?f8HKJ`GYG;+omR_4rVDY!T&D&)0XwPk`lusbu&Tz36%%9KiW7Vs z;j523se9{cY%Zddv+9r160g8$1iZsT)@CgkRWYiKV=%&1R@ONCsVkibwt)T-j-4pb`V?VkfGuJv~1e0%&wk*te4 zs4CVu4_CWMF87Y=WB^XKku@5+bk5rR&IvkEEpfNAHI*89E9LeC>V&(TR?7Xi)N!J`aUvM)#_tPZ2V>-@C z4n)72ypHp)d$?~UUpyms=@-d z?j}yr24Zm?G3{DAzBpBLp~!GnoIc`t%*QhjnjlhKCvSSt_w}qRi@M60wX_l6a4lFJgB zz*#4A7}=I^oG;wfs)lB|;R3EY(5PRXctv6);V;bF+h!+qN~ncl`x~Y`$!@q+Mg5l( z{B4k|E_q-d!xkhd`%?f!QmOFqZsWatz7tdah zy1{w`-cnUAr8`|uU-K)*DsXlUi5?YV`r(#-Q-5{acy4fuv75W;8?tCjt`dXWLDq(f zA@7~);??FYptA@O(}e8i@c?s5Jk8V9HJch-j12> zPIY&t1-#Tb=hryPzRKBs(sK{i1JUtyj7**7q=v(r_lF;{wramHca;PKQWA zf?B->2LC>M>?jdzBL+FnPrXxoc-L>bc&QflbutF?1U9v%=+zqzwODp?M(ny)Wbefn z_(|v9vm(_CI+{mfg9eFK_fY*dwEk~^Yt-OMQi(A9t2^v+p{1+#{B@w+ri05(TrJ z6Xi;OI$c-9)Q^vgSk1+mRB`6Gy}O<6YPKBwC98X&Jo66w&NVFhGqvg>nM+yOE8 zIz2+Q;{KF*ES5nJwazYy{6W;{=n4eh7GKB$p0#(Xt7b~*SzD-c@kLShd5VO4p^H}* zWXJ$d$>TS|WM=5e{uEBWK{dQRR#$KKHzz4Q!a9krGDWwuGjq1xG}F&{TBl7y!2vaQ z2fWCu6t-t&nfK-%;0U-iazkWQPMw^k+4Zu&&bmLVc-HL9-kGH`^D^dVbjoOk5p8V7 zXjAhmZ_~@#Gh=YZl#EX^4rN@*sFT?vb8+SsSeUw5NMhR}h7@GJ|uSDL9SO zA4ngYKEvd~pG+{^<{3<3U6ej5{o(Wm44HpPTc)>lmf1O@)5fPgopw)Jle99XU;do> zLF(|-2C2!ZzofjD@^H#EDSw$~drxv&@`j|YTwKPP3Gju^{a;{-C!i+DeE!>u_it0@ zpMZpXWtRp_Sa+`wF&}9jD;|ZzB2r#>Z(TEL|V$sTj$?LRT=cz zSIAH19(qbWyOVF}Mza*Q>HXNRi}0N8!7}REKz;n7pK~t1G;X?`d(_p5*p*l4BkI~G zM7amWytY&uwPWtDb?H)?&}KI00C@vGHKpLZ^Y(l7@N8Pb8IZZJFr&%-#c=BT+=A#{13qhOA6zH8Uc}#i4hNhV%Pq%>606}+;Ue|a z5i{jE8AYl%i-*`xpF*;B#~s5uL?c&&dFOlnC@_GA}BW}yk5xi;L#Ql1~DkW^N-;2e6qsq^QELSe_mG`?H4wmV(Dpj!1 zI@yK?D4+Ke)q0KGZRQ}gh~}EV_FSYUzHw*HXS#65#^zzo^!Z;o#Y|V46*(HYJ^EoZ zHMgI>&&C|@;^BY&o!}5jlFr$owf8`0kdLB`GpVpCo+T$qw+kQywR#O8$_4~(QWA4(udnNAV5YA>9 zB>hd%ahU#?2W4W-DPa^_c^16N$y zZ69`aqHY((I>TW9lU2USODUM~a-L({JT-DR)AGu2qdTLI{uGWSNq27}zQV(K%B`Sl z_!ZW4(&LD#d_BhQ9Udy3^P2jekS>sYX8FwGv-Es!f9|IbdUVX~qzCsQ?D}AS!Y_Kf zVrtbG|7H~4^3mL`xgGedH*`0zQOB3kH4^lV)aKdL(M0lr=4E~Et|j1b9^^T^jb@~d zsPVSAeNtz8Bi)W;dYQIgT>>3~%w57khO>c2?%B_ds$iYPNm2#u= z5Stn@m=v(ps9PGKJgJhgVZkJOcsSMgh=D zH^{HKOWc=!xh>qa6us4ZI2pVX9UARI0Z=L$ie~U8I2hR*`8#qv5+5xYt*>AHB`$4y zaBH=kl*6r&AE{naFxcI=c&*8c=GD!A*`6%tbXcTvZKekOPR(*F^yM}A`X<%YG1*H* z7WbcMb_l+>QIrc1)7N8hZm>Kk=rI{2{|_dL459EGq7ryPW%v@c%8Nb*J{u3ya0RY> zWwn}|ft>{P^9V7viR?LzL*qa4$<-8)Q>>QmPL(#a77@CLuLMnYL`fSG>FHf-`-8FN>tNJ{(x zk?3)%o?>zPVPKExxJWcDb}7EDr~0PErGM2Ct01s16!sO1+Tix<*@-vCQ0LYvn#WwL zw_vn~^r_t_vz>@NIdiEB<-ufpV1AJs=@s6Wv!B86R zS&3iy+j>ZlGgdCRhQ7Lk9=E^`?Q2z6E;jEr@A*v{mg9xxDFH`W(??+9H#^xU(SZI_ zWh_0#%9gN+>md{2f(x{-$GrZN zG`F2Q2O}uPN~1|JZxHOQ&~y;VG+NrRXr# z6?n-Nd(QJI&nL08FS&*vI)66s7dWRHtt5YY$U2{{qW`Nf-aG1SZ7p^+N^$^vRVJ3^ zH@-uoRM`$+Lj70^6aPlSI_FG6Vo9?W8ar+7mo+>=2R~Re4;~LXNtocsr@7vwyc2;W77*Y`Au*>DJd*!PcF^`1uR!c%enq-{t6K?-ZLyx$mFLOpifdD^km}qcH4gjX&>7yeCq8q%L3K5jgCw z^<3`xnLmFa(_BM;w98&S4owg0$~4_W=^{)5g>uk^as-;PO(nbBUY=-$JR}pY1~(1d zSQp5DpA&o9K;&+MB30qsP{seN!IN*bV();b4#K|9#7KVQ-=Ba9g<-YjcuL;@J#1qC z1S<2EF!<)K=xy@on;}N!tdT^x)jv4PKyUtmcNpk{gXvYZ@dwrY^d>Pxs=wk_B|E2)Dc1b_Te=y)bs6KvG z$A1qCUS_Aw5LZWInF2JuB{V(gYl*`Q{8@O=y8VHR&*yXuvtWT^IMoGSc@MWRWX^+^2YUPe{QhDPp1P3JPVm?<^8YVon1|t| z@$k{0@23);s)qW%acsI|YaCrytGkOzqZ3r4fxoTh-&7Ep%40SvS);e<@p%+3_&6M4 zl0K=x31k+AERNHEdW*dm@4S9f)QgHLjLuYr;LL;X`)#ruGGG}Y9pz{Bsj z^Ykoc;G&Nw{CPJ-=xcb;H18U3rz{scHLn>0jJrF6G&yfaS8VC2}tuV z@Sk-a%Utb`J>FHLOcDPAH^q9YT`{zr7MZ(}r&5Str1!6jr~f;fg_SuXp-2 zg|>H4qjh&C4wgr}sy}nOyx{#`fq4yxRZ;Bxka6iw{;yek1xldof-58>J&Y1F) z4}}=2BWjKHFtaI`j-E6>73{yiAx6{ey7u@{cY=d!cyva~;(w|~IX&zZBBubwY$MoTCE?AF& zF(l|6Q9M8ow_63r^@AjMg+<|~WuS=V{l652LrH6FOx@gb25!{g%?rU?SPA)<&BsC6TTc$k^~%!z`nNX z$9&xh)ETdPnM!W6?CE70PD?0Y8h-5;9LW1B;pb#h!EAw=_@J<>987LsAy;_=3o;l- z`GB0Z4QGe?V$b!WPv99>4f@x>*YEVW*9p)=emuxN87I~)j_vH@_H|j&td%(YRE!B( z2b<4`WgK_%iJIt6fA5|b##NPvJ}S3bq89p3mr?`1azlA+FXzKph<|S8oO+H*Vm%ku zY_5(qLajO5KdE#5?a(4B=19gk zRanal=s71>OG>J%aQa6ed!MKoN5t@^2C7}12XqpFi{ngc!KX~fyUjeD%hbImxi{{j zY~I8rc!PfUO`NTEnLlxgKX53oBmZrUv*B0Ty1&fb28m^aGip}U^aG3wayT^(I-~bSs7q; z_q&%^JA>|Jr&xOy4x6GYp)}1yIggS~!1P$O2%Lh$v?b~MQ?K&X%hhse_^LeB#c^7K z9Wv+d;k@6ASW7W4!Tj>cSn6kR)}66qH##j#W8{PLCL+(uqgKdvPGySy2XrlNv07Ha zj~B>^rekP=X|1DFRxe>KC-ZBZgUMV?q4x)T@)A{RW&J4iz52FJi*8Q&-r{9nYpjoF zf6oC{^8jCa1hdy!G`-#F+SJ(^aCG@g;xG%C;NX+{9@j5RjgcHkK1FcV>@X1 zgC5;HI*5C>J9lpJs6#Un;MBpa)WG|^zg+)CJ~{8I8Rl8dD^yr(v9(*p>3{Sk26;_jAHZ+<67>Mv`mVj94|u)|N)0b}LUJyjLW zAe9X~Zq-+EJ6xlCEUO%6Eq^Ab-07SuEGUkdX`)IR>_lJgl*=j%9EZB8bEmsMKVz2@ z+{qhcDfhYBgQ5ImWLUvtc?1`k zQbKpsa@CLYu_&*4d1tJ@L> z!6$+oe;XwCFw8e_ZLNr-Yv!Emi+7qK|J~$uar2;5#y|(b)`^X4hfTq6gn!GLdnGDaHVC_Edt51lV?^SI7@Fy)oXL)%-WopzKT!S0y zU~B|mxQ<>tRdsfp{_+QB&fD^l4)T~}omuN#p`q5=^&;OXHPok8;=@p@igwy>Ufmp6 z=Rl|P%__+RHT-wD%h&al_LbSSli%Ge6TFPVKTa3uzp(cJmH%BHxLZB@i)>)8uN~77 zl}!s#f}cnY`>mZit}mo;JgwtGeoxzJPNIcH)e(*Cy+I;j&||+cR-+cRQyPnVgD~qe z)GpiUxN_`}YFMz=?sHcwy)%@ykvN_lx5ggrXRo%5ai`tv(huCt`PTj~B6@kw0aKwo ztL0zc${@p{Q%5?Kfe`Aa%mdnz_-5$d(4W+dm+>)A3~ius9FzEC=#OwOy};YTw#=wmFxUeSJutq*>s9UgsuE9qBA3Phx zzS7ud4SgQ`{lJV(8HE}5W^T;9DeFMirtD2Q`y>BF&*i3=Z_=)?H>cO(aUh+wozYRUhfXiJEG8xA|PtbQ5jX z7xBI4x4GZse&x9%Hz&8Aev0#XJ>=EB#JtC7S~|!DGSxyQX*aU)_-i0KeW5o8AYe^1jNwF?Sz#$rr4NVf;}SMb|`sjQ-7=^S@{$S`ZC< zI^!_`cjzmdn|nC-S{)tV<(1_Wx=80^inu&M4N*lcyS=ci*!q(hL|+xTMa@`-n?PgS zNmIGw0X->I^=;iEn=Bbh)>*fkcDHk4(Zp>$!=KSbb9+J;eAAAEN^td4i9JJyLcPL! z^qhW~R57`K@)ya6lCMf>meMVycgmwF52W0aQpcpqX!3#N&yt5G*H6yl(=;lnbyCDE zquav=%o<1zt)~(mL{s@PCGpwB26&%uLzhBr%?dsmZo~oVzofg8-%kE3`P!5&DMRtJ zZ>LO6nVB*tWl+kkDMhWA$;pkAk8yvhnY2(={BmfgDbYhsT`L)Xf859LyL&G!ht~Bi z_|%l;E_q+@G#weu=0E#)PS2c!*^gzP&YGN6JL~t%VVRXP|I~%s$DRpxQ?P#;$97Lc zJE&3YSwG_*tn<~pm9NQKp4B#cclLms%$%pJv}dAO(U)^e^DA!!^LwkHzLRW{$)X2} zjMUftWqc#unUxdY;0)bSzMd7jE4+de=}*;GdncOsGddh*6D^uI1zL>fy^=N9D zv|G}er8P~vJ}n{bhtwxhOQwF6@=!`b%ADke$={oxd}Y!%;Ssp9JpFT1Oo?qstD2v< z-!+_xv1p;oV7va5dmzmRRjXa(YTsjJn#paqiIT6&Zbr*Rrm2s2=%PxZ)Vjs_*c)ar zfVLvY{N9&oERp+tqB+@7Pg(XQ?bdw|jcl332dewqXeRbU3`SVJMGJqWG8w8u zO)S`I%10;Ny@xrKO;MSSh`HL%R)PM(x2%Q?{~ko};^N4|*s9!ZE^V!KD(n|%8e;m$!n5FCf}ZXo~!Nyyl#Ksqubnc;q5#w z26MWtrvEI?~_%J21RR#=yf!!yEr!#CNb|0FdxgF7?1eaeiKeJSNrJEV?HU77k% zYF=uA=b6+Usnb&*PQ4+uAmy8s;VIXq98DhYcO6Tboz#{G+t_fq@Dfu&me5I0my-;S zKShK7gWBdZSlKL0{bKq0Po}{Yn&cR|8+r5rJQNmS7yJNRUvChW~a=; zjPEjDwlAC6gZ1plCK+urx@Qc}n3=II<6K7N%x*g5FJ#`AwIb`f>^a%jnOJl;{_MGE zaZ@Dg>*Q?f6ut>gd%B<%DGM(}K0q)=e9$&bJ zPHYrSLv_|{J9VDF!WHHo>iDYp#d$Ix&)cKhJeVdo$J&40PI<>?pV4gmX_wTYnV(D1 zSQ@hYA*EI=n9v5%0o(h3E@5Y6)R*+4T_y{y2w@B=#yUP;t6B~mmIC~6C5(88YP1Qh zM6n`gR6iTBi(ji>S9-2;l6~z}edA==qb@p6g?pL$xP>fjxL3G@TKJ&)E-KcPl+)d) z;%h434Rl*KLGLb?lOLB0e}H#suMR!~4|`1y>W#5$x?27?S&cA^8uS^DVJekzkn^cH zf)CXVU#edA(l#c;Zdy9srg}vI_to9?I9a4Qb;5;mSH>%M4pbYr|BM#=}PY zY^bcXD*uo@GSt`Mj~&I};A)?9opxccKDXMY!AnQECVlDH+R1_Hs~#%GT&S*6*Ilh% zsiA7Q4KLD9M4tnx_*ecL=)8K+%e}2qoEOv6ji(ZB4Ry?*Pn$09uWmxrOn7w&Tm2}! zZoNLeqFgFEio>%w7M?Pzy8*BLDQ30)7x{pHel%x6PS>1p&f4q|*|%k_0ng_%n-Kg(R6xhnIk%r)}OjhVk?W@lE+YMnJAYgJZ!c8BZ_ z&F}7FkCuy!ja-a$GQ%`o-}RQTv`)r6T&6?(G?`zlTiqLCEPS>haHHU}xZ^Rn+Bvkut8rq_2it##+i(0{ELPVb+7UwZTOis?nubJPAw+i6n6 zCutv~jY}Jq);q0jTD7#C)cvW8Q%9t>Of8bSjcZ6d6Ug=^e;}Kyn_S3CL-Tm(|EU)+J@I{>?pr87i^PARw$2tKpWulWvaY^|#084{5AER{u#pf16H*+5UZLe%)*#M8krnGRO@tugi} zA6gd7O7J@_nmVj2DK1&Hc(bkL9Cxn|JwY>xSMUI_(n4jq3X)`hhJS9FfEd2M*)|E6lCs>z>_ z7k-O7FB{(u@3BPxUMiKt9T?*G^j00#2VWKsJHU*wrHMb9Ns(k0N(&y?FNEHpZu^=i z$*E9$xMKK@@F4S=7f}FR3>Q~zH{kr=m;e7*vG#5G|Hny-lGd3D{s$M>_~ffOKs-$U zGoKRZIKzQbDfLo1qzp7k?}e1NQr=DZC}m;F+>~i4uckbia<8l;JNbv?Ny%-Jb42Z? zNk>c@s2W}eEkBevl&|vZoIj?j6y`eV){CK;^uE`}ytQvGJd3FxMEO_%_nIkJz02H% zGWn^x>Vr89r=8Csa~!Uty6gubUnA?UfF*g83Z@9wY`8q&d|@rx`A;EOm&tpcwU&Q| zMAwB_O~qGa#N7lheO=$z37wa9V!rMJ=>SLSyB%y6VjHK#71Sty>MmaZ$r%Aj4HVUP ziwf-_u5HDtPOg0mYK|K8CvoxTptEyDvaU|=BCv=>PL8{s7N)*oo4 z%R+K$>&kC|CFv`NnrzpvkU^b>a$TWouQmko4oG$vcy%WT=zFlfo#dUl;mQlmq#fLY~F4&+7_&|m5 zidisSOn5CHEsUIsY>zCrW1fz5KJx!_gO2{y#>~MpMk< z?o5xjH21IEGHM`ypsI6uLaeL2m~&-- zlV+37+sj~h-PG0ZaY+7-mhqUb>*U0WF&~1?lobq_kV`{^8- z>S4TDW>GRRtf%%*-~S~ai)s2T-bk2~@TxUF+0UKD8~-yM>znjo9H!9B*RfubQ$j%E^?|DHl_+Q~p!=>`mE_@|7B7WJ>Fl;wgWai#g19 zMUz$~J+9{eL*3Lge2(W#cV7CdDOQpaKhdF|L!s9R(=ZqITd1GxA?NiM?nMa>UJt=A zKc&?<13|jcB$mN>SLgjG2dSBR66V%7dP6ivoSvX!ye@JnXIsukB6P=`8*>V>4`eUS zekuE*?7G>-vd?DylJ#ZQ`&pB+UdS4p^+;Ctte#n2vwC~<%NmgNWY#lTL$bzZP0L!6 zwISZTePZhlbEoi*O`H7cg@ z^2g^eR)KF`4`*m2`D2nvTDxS(??c!JtAB3OD;W5@{A#@}mQ{~dy*#2nrj;2OwVV#Y zMAc+DR-P;@kH#>VcbO-TNhplq{|iKqVmRQkxS3kMqpd9HVan^tIP6bM9Na|X^fy#L zN)ZsEvbdVUqn5Z)lCHL-KV2QumD~z7??R0+0$%=+T4ErdQBKjt`x>JTTZYa1 z7pqlPe7hH8@|K+J2YqmXN9s-Z_AVa1Vod#TohZ+E4vl>rD9(2GcaQqJfxa?SR`)jV zjD_&@HTtnO>&M-KQQoB^_dlAwTvC}7y;$gC>?$Nz8+-{mfH}p%wS$netXa2JM zHmln|B`K53_;Wd4XocovU5u%c|DjPnOi%TP$Dj7|-+UsrQYd}EIpSeIGdbZf|Bk_w z$mgIe{bc5Usjs?-ng_59k3-=DTxGFH+#5r3jq96(Z9fJ@{4>U%oTtQ%xC<$m_FJus zq4=>)u5xv2e6qg76t%)|)zAJS>CWoD80mSg)dg78Z8VCnahg6v19_uv|6$nZRn+IF zbY>+bRx_ilK34iR7}D)N-iA%CM?YKB`zw~1<9%#3Q)4o>%{JJFJe|uQaVu;~Czuj{ z1V{Bbj%un1_d=}4MWAOoLEYw?zB{6)_()aAq7zb?+ZYjh7~a7O!%Pt~MY-4skU$idfcQtM8VMK@I! zMQ9RVms=OVw9{H_O~0}NUwCuDZ~9MeQ+t0QSE`z~o36T+Jni*p)95K^QOn51ocD9| zkYqobT|9ej*5g?p-9dZyYheX?rEg&qUDSo=VYe?kM=r(Hp;4W$ zpS-9XqOVo@h4q$@c%9SXIeP2W97v9u?;6i(sI<9|m-8A*7b*YuUy)FjXnrv98!k6f z=$*S#`(5cSA9Pl{XAa5z3C$^1(@mJzW5s+VTNy#$awkTrntMTx6$%luvNqr=BLh2&b%YUh9X*FP_ z9n!j`^+0m=SQf zyuAy@r4byMJ{JAAa-q0D1yN1b)64Ig#;b6P>@rZnwxBW{uD)5S1LnB>Uy>TJxjf?; zQwq7TWJ73!PB0Wyr$A`DvUyF3Z1y%X}SO zQIF6Qza5*Sd^o>|dZ$)F8$BCOP>_5;iMd4#%`3RZReKb>xs;CmLg8ifhL6aQzr=$k zW173cxEIm$oGTK7OO>aq zu(RvklZs%tGk69)<_;KI89(E09PBJz-)Z{2hd6&S;%ke*^Y{`LNxVV!GD6?XcXsTh z#L8HhmZrOQ!;%aR4S^y}Hj#N{=$Fu+)IcE`phhNU3tS;*8kyEt z9fOt>j)cyHj&oDotea+%o}!NWF0KxxS?_fl8 z^`$tnR5tpJow-GC%|Vg>JoLICA&fV5dEPVFf*Mf$eUVQ@;*Rih{D9p8++gGKyU-9O7`Z>vlub8&nLC-F+;Wq%6(Jk3PJPgNg3Mt17`$c`kb zHm;4{9PMO^+$+)ddH(%`qsWYgF?=_u`g`Y2$o(i*^{2rk9?F}@=i?7(MkS7_Pjf&0 zR!4k(eiiF}67=i@{YywvW3QcuijDHUreaT$7ht4y54N7R49LEPMzc2{Vl41bgS<+eQQsJ zUk%R=f9^hS=f9mBF3N$sncRPP(!`{hN%Kq*UG1@0eLoow)`JiC_0ZPydcxL)=Y=PP z`-B^YFApCLt+VnU^gH502b>S@R_C7&?$akdq?kq&Nq z;`dIq4N%t=+==Gk7{_uS>MozDCQtj1x6!ve|K3q^4dDd%xQhE(PJnN!lRj1{ePTy0 zbe0arcHYRH=%V-kiT!$)>ybyfvS4V$CyR$OJ#=I@^4pZB7R40`Bziy2uT#;b9&8Luz#xRZ@Fyz6IoP27= zX}b0r=U>Tn_+7PgZ;p9Q=gl;4lHcFi z|3`jVNb=i|vnpz_Rc6E8Oa=5ArFV5YqJ`>{QdG&)WWsS2Z@oF7t)|wgz=yIQZ^;e( zA&crl=qlq_Z}Qi*p+0&ecZX8AsP=_|eF_CT7LJDFFb~C((vuRBqTzqSJM5zO!_S4g z+F9}3msf{{Ru6sjqMfZNiI?{^xxhL)Z5X^n9Z$d=iUV*&XbQ_gcWQ!>N~KTm z&pRlzF7fKViNd#^Gy7eyVLfIma4ATZiPpe_H1w=Q;~m9t9Tee~#gyQ|1dNeT{618Z z_d%#y!{=^>QdgtPNT=buATA!J@jIrY=pP^d_VF||*a=+(XLQnqVp_pF^odTf9)IDA zcsVq?Bkp{(zTd#9XdC@{zW&}4Dx<12&9^}88aeatq(f>h^Su^gS3>Ok4la^Eo?(QCwoRKjJJbpBIhIwHnCvHXXzM9R%$axbi)?^GeYW z-AtgIIp>iTJBO<3LcGIF(`RWX;`as zf6u*`TgJZX2_^r;?>;P33smPfz@+=aQeUU;UCoi@43?(~&E}o_8eeeVKe1QOQ;*#O zK?wMf6SRPL!1(9ue<^Bhjl?1RU8Ed@^Ftk`$*$;-81kHG1^0n@{TOqsYbwqUH<9~W zdn1^@-QC%=+%C)1^WPlWJYJ{qkC?uMq|!;(Cf$%oS8CD;;+TC1@+l1=- zy%qQphs~3{Kt;2~Y56YC#E0y|ig1EsvDuXG*?&XK^6Lp>XsJ7}I@BTFl(O9_ov_PGJA&U;D_~>g<$B=Mk{qb(ktIzem(7$(8yrrSV*<#D{f*U3TeDsO>~5=_+F1 zRw(vx9ZA*YMf=s1vv>y#x)|+gbOPclm_-+m25~X(;yZ)XWnppPT9| z%D3Ye=xXZ*E4osz%1Mq>@kLVMaM5+Cr{rGlFzuiyn z)J$*7Wx9oa<8UwyV&2i!NT8qp-pTuxDE2T7NHg_fBmEOK?a^zoE)AW=cT&Xmw$dl^ zU|FgkZXI`)y>yhvU^>6WoLW9`w!ENPdB{C$<;-e?1-+S4q9IjHgIIszUH)H-*J)zG zMW@j^mCghznm+DmZTkE~O2c1pSnsP%2bl8Q!j5l>nW~P%s^w$7yk=OUN9gV+Is5lu zGOBZr7%6W2kzZ0wnM9wPQ*ZVlK z!P0&(MI-1UoTz>{ns6mdx-Y-SFL`|DCSIwhp?;{TO6I{(k5Kb#8@TZ)fN9_OXgIvdZ$rs|f06V(=NdqKNC)oc5o4E9?5)T0SwxlYbh<*fEI_nGwZ z55(jYXQB(Ln-Vd1qSh+0;XErpah9H-6eubGY;AWBrjnWB^)A$#vDD80G_;Ci{ns8V zdF?OvwU52C3I5f9P**igLTE?geD9;RnY@4TKYAX^b7jII$ltTh(}eiFYQdn^zFO?x z45c0eyQ&}Szx$j|*L|v-6L!~7)oKD>^KHCB6{z)U@x2p#AdgDq6R5$x+?@-=+$H+M z@6%acH1{lR;ySp}TVi&9ddTL{#?dBpOP$2|7b%|B$;%3(RZN(C%G}>v1cfdz( z@wl1xpb0%z0~||z`Qt54m<3XlIo!(zp4s}r69n?A*Lbzw;8JABY2zNp}xmBNM`}Z zlVQR&uqk(_O&)e44e)pzlhX^2-`;fBy4aU1{j_{_^`Ek_ul$aw_?o9xSr6+H>Jpm{ z*pfrR?NGROymdQU`<>08c}QK-kC(wKDwySv+oQ09Vi3Pp5VRhCS1N zliXru))$8Z@04ybr^lSe&x`7V^))^j`}n9j@*xOF7g<#+Z2c`%CZ+U4T#_+ejCF6G zz}#ngp7zL)*%$iyN&M*d*oe2}(RYi@Y19iDA!6KQAv5~QT>mr;6igCu2X1?rf`r6PPnhFqCK+Mf1PtVPLd??zdDpY za84TxabM*OPL)A+a!o#@vDpWqO@6eJcF$|VB-u|`xe zeZ;!A-TSSaxr;c9YvGo=#Cq>0yWbx}9}ihQWoXa_xYyft2ehV?`3?%+l zJ=5Mz`!?--TCwz-sA#&RKhEpv#q`PP6VoT8k4ztu-ZlO9^vax{4yUb5n*wdFLb?8V z>XWJ0rv94pVoJ4?ACsR-zASl}Ikbgpx&GnHXe~!W-A=>W`pNqaKpfhdy0#t*RV)5) zuf09A{9DNEEozRHR&_m-gEnB_d$=N@!oOU#89He0(vKIRWtyA+BA4pAu+9r==&gAx zX+4(0p%>>Zq^#X3&(6+Em(?|MR~~^K59he?iaPrZUJD<{xo7F#Sws)ALA4M}9}96& ztVIvfNnSEY9sY_+Y>N9eo8E8^27ZzI_BmzM2AR!XPKg)YtAKB6!8`8(r$C^@d%;QY zJWbY6)q8(fbXyf$U3!94`OprC>pSX|e){6;IlGe7DrfnZ@6z$`ljm+e+JE}<37%pZ z5bhLMMGf)0qYP@K*AjG^eqq)8tk?7?&!KE5P@?Lw0@c?Ivb~#-uHVk%#_470Cha$FBb=>49SBlNT zD(kcBypJZBqo9ZNX&uo)Bv_7R`-4U%S{ToBu$owO69>7V6S02QC83RK{~%lNGMXkFn0SEY(s)uk>chjh?Q=YvSa3*Pxhg^k=BBg8VxPdf!X@ zo2!fQZPxtRLSR6Q+wgZ-^iuD^jJzAy$q(fkY4@`T>*X7RX6Gv z_y=-5(cZo~@ub%^6e^j_#o=8T#Wh?UmdH)7qjLO`R<#a4-3>Y}+gS(u>GKAwq7w=? z>l?hAi`gC-N;6EwcADG1@`%gx{*{r;$5gzO`ve!J9&)L!lqT&sCD-MZd`)gO&#F{c z4LK|gHs#_g)2HHKW&_NsT0_fQ0xvX3KhG9xxdykqNp{bF1*NQ@F=E>J!qO^==jny_ zI`fj@BsV*?Zu0SF=WAVV=4H4$<~tcP@el{F5%bkhPgqws@Dw`fTv~431{%XV^}v>< zEk0*Q>{C5#vCsC4smJ}fu;6laUmel31qS~Cb##9-@1N0w^(uYWJbe5HJK;24N;$FS z4jO`2_2+N23bP<7fw%8NPWB;c%aP90;Si3eeBRfoeow5|^aigxm=t={YW^-@0xUV~F)?CqZ>PYl?jo)lbn!-Mhx=Sq$#f9rydXJHCep&owycfmZNh znf@8oNNLq{3!0jzW&6|2FIq$SvPY(WNVfDRHseQMnUDE?f!lpAxm6QRKvg*N6ywZu z#LrkpAMi4+vpuJzbLA%hg1!RG43sL8O-@Pof*HzT?H#1YeGzd3G3q%4kXk}91Z=hX8zK4 z?s0uFFlWNGllt@3`ki{Nj@e2>=;5YO_J5YVEO}}2m;AIAB)@Os(#YhV$#*1QmmE$$ zmGm98+|Z=HizY z$+{1T`DF^W@V=_AUwjp9)WbXp%9}rPB=?|M_TTA`T91)g31^;T$4#Jq8JOGMB&PaQ zI9Ku{&y40ok41llK7Sis4{usa>$N?4L>`i8%1j;D^wTPr<)$?y>K^E#3R=YN@O)l* zs6|ip(M&nf7OU!Tes+GG*~i74bd}th8w=_>iJGdZ124mCI2;t`QdNj8x#Zs^(hgVk z_wB9QNzSf4GL$Qv0{1yBCOJ92ppe-`wR@K9S(+Vmz3$n->3nd^r6s^5|J6rak@ljS zeG_!6Zc$+r7AZ?P{D4YtCOrQ)o`Dr0f^B#g^u?{b#zA5Ml=v4FY7v@~I;IH?l-+-1 zLfOAE`|Ge`!_8RuKJl2DK~=DV9XJFG2n`Jlr@tC6w|T{9gVmdD%y+98N(yC|&#;7E zESQH@D)9&oZ?dYlfnK0L_=HZxFWk(N;vo0w$#&2^I=@SCBRS)h{s2>-t&99gsAywo zXufs#9R=ewO3)snS4~;(1wK?8u+6hXlu=IoffOoTX;f|%lTy`zf5I^qIQ9QG`?ZRz zd)7MN%JFHY`|^yt(+RdzB|lwdSU^j8+|0P6^pq#^&cu|JVcAV(bHf|PvY7jE;E%!# z2SPMorskdMr!3dc5oDVuL6ylOd3l+|&0H$(D|ifs{0_uxop^Y*AW2<%t7zF%)STj6 z+(d^IFRQHQy$lxjW;=Jc%P9X9{Z8oHKQ9KJR8O4ud6xZ_sL!E-8m5)l*N28`j0}B= zYqZ;y$}f_pYHA9pdPWSIANP&vCIRAG8baPYrgNE0=kf)W%dfO8mvjHRD`61a;VaGz zMG`9|cHm1iH*qIjMx)R`NXV{G9M<#!dbv3|5q^dG=ZEv?VN;SWPb%SKVp6u9{JX!K z>(qSI`C2uc8`=hK=xZ8YIP_EEYm|CbDFC;@HlBuaR9EjEl@q_t%jW_#uYVJGcnvevc({8!hO5Y%V*LVz=s_2K9mvyEEl?qApN zQ$ChEmWNu+bN1b&AK){YPgN-B9Oq}?+u4%_ZWUcnu31lwxTFt*w=AcU{oAC)%P5i> zQA6ELQxv$n3{m&L=n**h_kn8N4WVgDS5^&vUkd9{nv+XO9-E0Voaqp5ZVm0rRMD>w zO-m!Ip@iGWv=ge23+m zuis*_c>^Pzx`SX7y`dBLi?2PP!h^6rqut}_D(JugYc z=D5wseVNkcQMqn=kCyPajy~SweC?4t$Qk>J$&m|nIsRc5NNH#I0R8Ekbx+im#RcCd?g;{Kfc@>lBc#&+Oj*ve5_wR$R#pf72&tDadTk@rFwI7m%gc^!HB&7J`= zay68sgt-_YIOrLE2zxly1*pioV(t^T--e=az{(wrWu2?6%xQRlAy(;Kkop>;SR!}6 z~^Lky^b3C5ox-Jp4 zQ84ev%J!jkf~#g35qKFN&Pov0mb^HBW5MmN$HUI_`8J{h8#%tZT-6ovn=~@lH4`P+ zz?sZ!aubq}Tg&%m9+L}2`Udm5 zeP?{BEyM!5%0#_MUcpFtr!&w~L-;eZ7PgW3zn*m?%Q{eL8~rLWPGx&Jm;c}cJixL) zyw~2b9m=?s!L4=b)`MMtGrHwe@uShk8+u0`pZ{oza>b&9i1^*BBO*fe- zpcjuycYU=o0{USkCeYrf^XnSl@keorktB5@OQ)ONbSHH7D=pri&vGyR$=U4mn~ig~ zy>U&)=}&l?5m4$Hwem>_unX_VB7T><_)>O)OJ>5dx8Q+&^a*ONug`Qjd@mZgcL=Z8 zU}Ll1CHi^)!bdDGK(`+)oM>L$1q+*qyR_45sN16J#AV*%n@ir>n)K-I^xzS!gbQiR zJMq&id?J(h+!vHt)Bhp@bPSo@-)J}EjIUZ-EwaJlKJ4b0J;!C|UK9 zT)^2zU|YZ&zL1{$-QLgQDsvtGl8pRV%e+X7K89Xy7RNi&XhI#0Khp+^Y$Qiz7R~TB zlyMIa`z2!RN040|c#gNk!>bt+X9fL2xzJd<>#}-xV{snE8~-2l^)Nd7NI$TpwN}M3 zyBn$UP?HyRG8PJbu1zL^;!_Rrs;3~ zpTYFvYJLDE+wuFA77uS$3SF$nALglB^GN*g{`9&jNsbz21T6dJ?7USGq#7lA_ zF3%`~yOP8k$)9dq`$ro6jnZ=0kY$JHZ@MF!bA9~q<1@a5 zo8kY?{BY~x@bCEtKY}Tq=QVsplz0%E_9i@ZsrkOMUckF}k^gUI-w%X9o@VjBXXKda z{J@RGZg=MMJYTNE3ncWyr5lRBb~XOwE$H_RIxoElSBFFPB7=_S{XI+H>1{6)1lfBN`3GGlh%!V|rP9Es6v?(=Zm)}o}-#7OUybNes-_O^#I z*E2p@t3|8Ie%g3ZTmAmJ$jH6in0XJvnj`h@|J=xAf8g582)CK6id|vieHI_4?^k#F z^(tPUq3rpwEY2U;lFf~Myq&z$W1#5)tdZ%)#MyvP<|zLApsdmQQ8l7Z_Aoj{MhUt> ze0eDE_J=6zN72^wo!Y^7b)oss@trrqUH8$4FNrKn!eM{lkoBSYjM#9owtbmZxv2Ig zvIWj#b$leNbYo-ET%yvOHVwEwRi7_171RJ+S@>EXE7ijsIai_7agj&;Q*V zJ<`0*d$RM_Gk5bM^P#;a270NeReRB{`7FsB#KYFDJBuvtfxG6zz-K`)b!v}>uzKM1 z)s33|p|O_07*m^^8`YB>3Piv3s`G)>oyv3KX9sA4ad0tI?1u?9IqW(dfU(Iv+ z8jCDBU%PANn|<-;dN6E@QvZV&UVtj+8hLCTxO{(H-d&dH6?DTuexD(9!*EFLT^MZ= zefm|M`Ihh1#VoxFrkOSMV+ig=KF&e%nl6)jel$yXH(IbYoVJ*Rn}Rc6)`Q_bnFs@L zRbMqb0RP?VcYwDKaOPfEZYWNEwQ%uFcP*;Th%4B3BbLIZ?1eV;PIF$PpYix8R(5|e zwk{+>)7q2eAN_|txnive@}rI*VLqodkD?nV;)%m#D^E2p@;UkxuDf`#5#vYj?O!GP zxhs0y#fXk;$V(FvTKI!ynh5H9yeQ8aYwxjzPl%%qmNEUP7{;_8y4OnQ@!89{$`hc+%@kSdHx%70ZkFFNZk+;e}FLxDlO4bylXqYlNEg6ccje+tn=rfjDhkmF6SLT2WKBd7Vm|w zb|RH`vA3UbwoZ~CbR#@CoD}~88mr4gxtR#j{>E+V$u_u)z49_Y%%|+JA7zHEz+1Hy z+E&rA>gzZ=lXbEsx28@>TVwxc|qlST1wlZ)`C zc<*evbgPK#Y{e(OpB@)SmVS9B$R6l|WBw{q+^F6h5!z>Y8qZ~uZvmst(w}n>>g$T~ zTH>H7wAv7~b|qPTCb@l*i-izA);!DOe2NOpi?*Q3Mg%aZ<0J1s4_FD;?kw(vpvS!I;kN1(Xz;^EEZ=j=uo z{zv5TS=jX(8mtwI_>*T(_%^|qbEPESwn7udK1_;|13OTLJ$ zdm^9Oep-1GlHpgBHk|b6$;-42OgWE*^8!D`e`O4w!umK^R?WUfT<%cDUG6Lc;W)bH zY9r2NPJ@iRJWYSK#pW%DXS^*8+6Bj*&T`I-=r6Gi634lrE$Y+OVN-YqgPLa*y_ODBr_d}jL&sW{lk7FQV~;4r-_Hg->4 zy^+76E6327uhX$v-Vy=&fdBtfe&Y$wjrHFsM_)Ax|B&JV7{U^K$oe2{JXnooJIMNo z|DG0`7(p|=@6IVom)?D=z?YkeBz2&PyZes&=;HBa32Oic{Z*ZGBh^DQGvwlJ4IliQ zP8!d`*^X^-2HZd~WZ(>X{WVnv!)qdU#>bJ=8KGld+ zJL|F2khg0*FX`R#j*jB(U%T!?QvQB9L7ntaS{3U1jMr-rtaKq>>H<$@q~(?QTx!8O zb698->C@NI{1YV9-Dal06t3vT_jwTcu?@7`&=_4`iqDN8*#_|TUyLHUi$)xeK8_{x zPDLMQlTKH_DfhZ&m>BLTyf~RhafaC5T&Vk7d!Lg`U&7#1`5M2J2~o|`yIA&WBf5Sa z`3swf(Y1xRI>O6cNv>0A(=+uMPi{pI__!O-#|a`c$J;*zF9j9!QQoWMYg}dN!#{a8 z9zGZ+ZvkazeCJp6q`X|KwMV73*k~`o9^KjL8Q*an-uN$E^f#Gg3*eS#c!g}&4yX}aI}{B(^VpiO!8JM;QoCaV0LaW>L7X;uF8J>i}6&5L_4 z3j9F4_V*=g;MfC2SbOunzA2K^fCqVB{B)yw8fS#XjG=oVjMEFgd5Cs+#pn-T$f5qB z_{bLXEiGW7%wrdRF53SJ9g^`N&Q}Ya`2;pJ%H~h%^DTPfKAG_U)+&)2YeT0q@bz#J zuggVdjzrPh8k@NB(mCeBeqZ!-pe*D6$WAz!1Ubf>Zr#jT(VLx>8GR?{FVRpGcz03Z z3m}#u`13QFs7sbMf!Ma9dG;egk7E&B1h-|>+2=%fN3jZ~$`k%x+y23Sj4fCeEm+H& zLeYPdd2+DUIji&s8psdzF4?$5ChIQr(0Q=@GerX}(J!bKY_o?fq(fOU=M;RCQK$Ps zT#vALUt#}_f@Hohhu{=Q?-T1-UZ+^a!`QLpFTAzqM`nz7@SU1^5d%0?DdTXw?43lwp zsjT*nvKLy^S;&HUkMH{?nyV{IVkhJJw7^?G`?m3NTZWSS1Ih@S7oynA@fsb!1Nz(y zVsC}+S2c#s8ur%GgLze%tj%cu2J~5K@Mpa9Jzn`18kjA+=3D$TtMFAgDYJl&6}KEF zr|Wk7*Monw1M6)gzMuwtLEo7^{RAKFyBVGDT*TZ$#^B71p% z`3fh=k?X_fI#`y=XjHafdC%NE$nb7t{WWZ*2gQ$G<(nEq<9ux{#>@-dl5E|PHaVtb z4_qKxeKjq3wdE4@)swX8=1f=Xq4fF@mZMSmk^VoN6w3ek?^GHy^muuhDfVgH^)Z>V za9LCJx&tJAD9LfIER!2(;)k`$bMoXrFdD^Y_-aP+PS>veJCa?-Q@&WH{7w(~Lc;Tp?+UJ0PeH_2_wOZs2TCYA$+L7Hb zkoRr@yD)itgUIARmTdszoks_K%&Wc;+;JJ}dJ=#0*6`c;qG~U*1Lm3~Z#|=<9v}jC zPKgCSUiSsL3?IqZn+v@)k)^i|{I(su_IFX4PWnn5d~Zqvdj z3rpnp&5$|zGX2(1M$Z*^r<+-X4x#fp$g^w9Tep>dvuo8|gNL}TUedGJAMfZ@@qix9 z7qih0(gUEi5j$q^2J~Y=9l(SB2W|8)Io^p}`%T8kU1+*JYW~{1jyFNw`|_zpf{l?A zbQgQNyOECD%d^@*{A&eKwq;^rwU;zCic=z;n>yEte7g`$4-wb-f~UVO|L~Tgvxm_F z7qhhQfmdExXmHa903qOBK%Zx#`l$l zkFUd(m$)Wl1)oTBbfQ1@phc2_zKvxI+s){e%+I`;-z{yoghV%ITdfEGw$Lig&05{m z{tD<}b;mbW^KI48o@8EUdBS<~Ib}BFKBUK0JXN=#pL=oUlX5g()N6c{Z}^N9odfUJ z7FlXZ24~EOgLq!gRR=eiOXPmO>z71G#)>_BO9nJhpBq7U?PcsA1VNq2pVWts_;#4; ze!i^7Xsw6!U%B7^{aCrZ+307O-JlEK*I(3sQ-0QOJnMC>br-#Tk(%yG2kfDiH)kQP zrj8eo@n1nlk>{f=AF}&KvE)XHrB71g?@6)DpwX5FJ%;AL8d7_l{WDtY&lXW=q^;ZV zgzN)@p2k|~%`0}dQa#6}%N$K(NrWlZZ}~3gu<_>cAI#zL{>EGrU-Al$r@>xh^FPct zb~|gZ4{dxhyX!#TypwO=RBWOp>Zwnw%||<5iXXj8CT14in^`qIY4wBDV>_1EmNePA zJW(r&(=_HKPu^>CU1$2j%;-JdSANQu^*NmIEnPNGYs@WYKbI5q0c}>zZJoXbS82`e znW3RIi(*ST4coIV+Lyeyf66rLWZlow-o3jTzv!=!+t!}3DT|;r|3oWK zS(8Lx)$f{~yeY5W?w-)m8@sX>l1q0XDSZjM;aVPozU082vS=T`(}QITWQOtKbn#nq z2NIvj?CbA~%)ILV5#+{j9-^T<{# ze+@$4Z^M$amn~kl5}mX&Jb8){Q2OKVG3cY2Haw8G^Lo_!G4E8a>LN(yNpXb9 zvV|7cX$s+NB=e%JetPX7qJ6A;i?HlNbL=Li|iUINR0Q1W_v)13cet;ed^0ODB@ebi=MG%O>>$Tl=vaN5` zdi}NBV_M`@)HYtsY@UeO$|BJ1$mO%W=TUE-sn&xq5>dDuLU;&gz5_RWODZ=ucH~w( z7oF6{X*>g0;;?}{9YaMA-rzl(i2uIAjkEb(el}CaZ?)_2f;Xtc%_Jjn9xnX?e~!V$ z=^JzhEACvfWq)z0)};JWvGobONy%5ao@6;iP3@(I)~VH0Zo}8`&#QVw-AqECMm}~R zZ8wHbnu!xGmbbl_e}wURP>knC z`@Cf8{Rks2G`2?*<0q_#pZ;37sVh#(*jpKyVA}GTg?6HUkD^1a)z5S!nK+mIy*`P! zpUBDCwBhwIP{#O71pF22^Y$Neq@NbKQr&bXb&n`imHC&}fwn_IzmQHdSWl5W@9>_z z!~^}5R=uAsb)VdrLHcjq%}aSt+0U_u>67PO`8JDdta8lqggWs0nsjEo)dv?{axqDN zDqIbm@ZM#9r0w~^!)fzGT;HQ<9_EL>(aczvp~nj$-k!W# zJ$Wj6+3)T5GWBt>-+w!MR#{G!-I#G34lj{}J!r+va9LCF=AV7xr*zUt-~6EOzrLXI zbBZSKhQChc1301R{?pJ|PkR1pnzz52dqQ2lgaTiu$KEBKM#B&v`27gKzGHb^9cHZ5 zmpu77`Z>A6oGj=kr~iP~kZJkVu4sm+w84I8o@w0o$so~87?)o{jjeTGl(_XlMoaXVrp%TF}QW@J-{|i`CT^W!A4pNy*;442R>Kt=M0S>ETg4 zJhzdpNAPZ~OHzCdA3jZ*UoPf&Fzv7f>ECGSeAfL$==?<^Y7UffbtT*9Vz&SJCC8+v zIo+mpGtyvYdq~Fi-T3Dn&z{3KxhC}U4_3^DFx6e^<1Lypv{l!) zuSH&NiMld7`o5&%q1q~S(6hwcZiNOC7kRFDct5H&nTGyebfhkwy&ep*8)SWyc=lPm zn7wKDzHrJtJeBwQ?QiWX1OHmobVZpj;#_j-WD%9FdhjPMmh6PJpqM`(jVVykaPR4d zx_gzVW;^ma^JtA@gJvf7qoJ`)VYK;V#7J`UR7L+?8w02R%u5)*$vz_K7qA*1p&>t2Pfhhu+#P=GN$WjQok#`IgjWZsshjE0E8(NdtQU%N*%c+!;=6RpylY zv5e#SUcuK-q0m8Ste>3STXE&}wwc?ZuOkB;zZb7&#)ilF--fB%=g6&RLQ zOL~Qqd-HY06LtzYmZ)Ur-PsIfG=s5zCBqUcc!lh`S36|x=Ge{WLr-VGPbcHhV@c1W zA*n-PsYAso4yG6X$&TqrFYK#M_msu(H|uutKemD~(kHYf+}#M?TEa5=m38wi?eKNc z4xiHwleNfLOOVW4{J!s4KS0f6XordP#~1nuP1k0#>5sXVS=O1JF#~O6hPg@ZpXAC( zw9aRq`lU19x*}R;5$mV1KJ)7;$&LlzQGsbH7pCI^^SoWJ~{XOu+Q8?mk zG;p;VzSA;9w#F+(DvXDcr?T*;lMLVC``JZC%<%g;88DG0G`ir~ceK~b5Ytmy;|@=_ z)^f4sOwaA+>HqSMgNl6ITlA`fW#7V$ogF>a*<*1;%Fqp8_8?i)GwdSmmJ;2jrSI0F zk7(;BOG^)@8Qw0m`iXLUMng<5CHo%l&f|Ib0S$enbQ4Iacj&XBGP>^el+4xA3-6ys zn;ohgJJLIAqk_d^rc+7Pmx?dwD)RXRZ5$8%X8QFuFReIF8%(y0(N1qdn6Js?jc@3A z$n#ke?ooX9kY%uKP|whUOW&u3C%9`0oG_Q9TDG(a3v3-!k};M#qNY<&*?%C>Ygt@( z(-KdS;ja}BaJ;V z>O;C+U+V65To4YrlbpLt6zu`^_=x&=0@n=HV#BrDNUiv>cK%A;{lcqQpT*mPUTm$m z_+N}kvK#*F0F(ZmG~5${%61RG?Zjzzl()D!S-A$?(6D%0lX>>8T7N{FU5EQl-nMQ(WXE()&ob@DLfLo!PgYS$(>iDSJ(s-igu^vR=c#w zs`wKQhluvn=IcZ3O%k+K^0~g`TNdFQ>rZ@~3-y3pf}3kW8}S%R0Eg`Bq3HT#TSNaf zaBpLtwv`}~6>VcP)Ny59YyEO$P4v}9$+l-X>{>Xp6Ye;Mtn60e1QjQyoPFr7Yhl8^ zwzrkN|7zi@mHWTeYwTU^TduU<+qD;I`}6tNx}(Z}k-Ph#*v+BG7E1P;wyBWO({#}w zT6+L5Y(HL++tl4{VvDysa+foMA)yywpm-l<6l;E&5r@`9P08i>2h5mJD^FIN=aDxl z<&AX3?dbh3$o^h>U?4iY6aR+?`Z+T|+3&RWrAuy5>Y%#rGC`6TdVpu{N-l1xl&h-I z-_XzJO8OCf`3gP#gf@Kyj24h6*5dOUq`qU~{ftH)T6vK)zy zyP%eiDC%#l(7zVn&DLb}7WBnd#eJI}9l>cx)-2M>!^pJd_AcGvgna|~VsQfzD_JOpL zgVck+=r~V{v}sq6RBQgYRek7UQYzAYRFN`ID$j#T)feadM=Kt~?%kW5+#1(p*0P^j zxu5#V7g;8E`Sw0yaPf;ArAGHu-G?N&a8`ToAYq3SFEEA3%#fJ^zLZ>AH}v$26NX!`=^t! ziRUGvcLn;tt>B~k*fN=QVkmu{8GRok^@Eu1!~xgQ4VU4UbF}Fx@}Q5vMfEke+T$`%w%;a{Vb%_;J+rh;Mv= zM!N@B_a$L(F57&2UuP2Qd=wrTPF}y^?y;!wQ%{^;YrGIxNCxT!)K~J46hme?ul0}Eu zKbXIzBc9odENw?WM_0$Yx4nAZ8s^_f&9)+Wo08P&tvAbC;@eB9M_3+LFAvCCyH5=b zQJ>E`_G+>HCcAQ`y8l(Z)FaV@3|f2UR=BjCr9+X32WZIym7=pYJq(Q;E$$n9bqZv4 z7L0W4Kvnm; z>sC~D6D?fZo^bW$w7^Z4d)N*SpzDWFcKjUoqxAUGuEFsalDucJBu-qe2Re}kK{y>r zpmvt%g3Wm+GXwjYJZx)-i6ncxmH%3k^P7|R+mhuwvoUrn`AdH%QU2j6UFem>@`8%a zBH=IQ<+&P~=|{#th=zuu`B!|+Yc%LvDD2(B9q}N%gYVvOE}ZcqDjVkNcyAuJeVlH1 z+JE7gH{COaH*7Nf8(s*0GSCm(x}la_k(O+sR^zwc2yJgtXgqyVcZ4SPBv1CEQx8Rh z!KTSai0|ZDls5n#eT-as0s4H4mvf9vpHE@XFM0fDmH6QjSaca%JW<73A~eD@dLJzo zVN85+E+64^HpnE|<>O@ij`EC9?;Gg#CG&ESXNYzGM07 zoymx8@cbs04bb6Q#jBtB#_Q-)yco6pTu|x!;=!L&vOK<5yWhY?)713Xf;dKMl_4l8 zbaXWvp(k4**rE%B9Gi0|`fD5X5z5(sy_aQep8ou|iK98&4%*loZb;N9{@lY*&5`Ih z@#5gsGtkWimfkeuEo5^f^HbXW4fHZWyHACqXDHcRCH{#dURd;##weWI02MUG$>F{R zcq)i8d>!r%_N?!0yfBUMT{CpDIxb#E{66Td9m&`pb!6P}Lzdfs$;<6g>iz=te}VmT zw8H6R%duq3VXof0=%{VUmDXx?74NH!gXgQw@5t+~l=u@Rf5#ULN6CXr?cK%mb|XIQ zZ8_h!_P{Bp`#sI?nZCbQv5(_Bx*z4gOfyWd#Qs`DQZ+#1D;GHu8gH$y^_E&UlDz{- zcc7({)=z%M0carGj{fgh^yz-C*qc<|)3@$b?g?dV@9U!pHpVqAd_#RWIlWfyE0+12vTVk&$-l&(bL8MGDAr^>G1Vp|uDUY2vbnVx3$v+lOzQC_ z{%)DgW{;oYQ+~2f_@KsFA`w1fnU06^CfI&NGmRoE-V$L<_UCYXK7#ak-SWP5wCg_h z{*T-@$&;ojMS9WwNRIrZ=iCBPWRZ2DHGS!R_s(B<4C2$6M(RxT?s1+l+SA^aWBMwc zILucCHT5SW`miugM~4Ub_FeJz=A_;l=({$X_D7UA4bP52J1>*EkJ8?^s>#ZibO!r2 ze0%tE%X066@Y~|wEiIcCUfrnR^+e9sx3&@|S&I*8RT0~UvM_(=)rlu)8mu`HM*Wb# zXe95$bK+vjP8lpxHpom?ck+wgA@Xv&rLP>o{0^|(?cBZc@dlTe%wQghM=e9F*?U4P z@M&I*VeszD`aC7NHUYw&DR%Mu(pvEG>dLbX`q>YSoq$TNL?aK=knyx;?&)95?y?d| zw*~yzfjm5(y!?;6+#A_jgW-!8wNF}cJmfxIeaBCecKLw~G1vZgWtm<)O<$peX}qPM zYl~39d+vO_NcE?SOn*pwq($yQb$z`dHfe0rE6DC%WOv3Mh&`A2u1_R2(%bJ4JbDn0 z3|`xhH=?65R`Ic8NS+hXanRA(s5yT9ODtCv@6#2Yn+X49zUD&KYJ zBgZ4zzO&5p{2yqbdFc0Nt@yL&|LU5>o?W-d?q=}R>bQObl5Z?x-qgaSy9K}+2m-R;GUDo*yQfU z_Y|M-No75;{8sxxcio&lW%;>N+e>Drzx7#6U)3~9w|N9JKrJ? z9#@Lw{{I(eo`-vn#pC;;&1AuDf?7khjUfERzA?0&%)cqPEu0uj>kX26Bw9)C_zSe{ zQ2O?1zt5qaXUXrO(8JTv*E6Uow!kX|6UA2j&=cZa%xJE&JUPQ>vHk|&wd*`_`CC)SEmSbOgPp-}r@|-U` z;frE>e}?Mg$^3*|83U<*;JaR9Eyl_n=3Ab%B$oIvdwg)QyZhma8&Ss9sN@Qq(Ffi1 zF4S|G$bTOw^Ag7|cjii#%?++iM6$no?^i2Nl-hW~8)82PBfhORKk)99;WMSmNC?Sc z{aIZsF8-ty3wp{p2=OQFSa4GiQmn;fB*%I@xA^bQA-T^XQGx)wYt_i(o|X&BdI8xS zU*x4EP9$`%BJKa}+&NI=X;Au!o_92Cet@SZ-uD+6JXT{fT6&R|`9{6PllQW(h}ZWf zUwl595DwiB655eQPA1h_xN>F7ihOAe_=f5)TeP&^vW2{Bi)h0-yloA|c2;ynOL%*| zqPe%joADO!$1>|e(;r2G9B=7n=?-Of$E7`a`s1-qhURTh-5}Otv}iTb(?}ZPJ^J)x z)b&Ye;~7f)9SQvtnp#LM*CCUe6s)}(JlYDKXYR)Bppg!ATV(R->Mb>N9j!Qk=ksCc zCGz!6h~`83bPE2NRWQ-d_-S!1DTI(&W1QQxtc_u^hH{na7LHrW`dV1fQ#kJ%yq;M< zgTvl}j`H024h9u%9G~#D-g|kmqAt{C=a!aCw)tsV=2UHS5?pX1PCdSOuDa5^N27tX z*paq}u>-PX{}@-rw{?7J*J$%Itnu?6Z#lx!nf{HpHmG`sg2v)kX~7<7P}=%?{F1&Q z@1oL|al%j>@Gx0;4~ck}y6;!4onYN?!wvk+i6Y#=)(YZ&!154!e+0!3K`l?Yf2eIF zM7B>l9$tv18S0AI%gN(@ytHN_@y{0PIi8zD@!u>Kct-O2P>Dv9!DF=cDBI|)_wi9| zmN)&rsl4Igk?wm%$s?bJm*)-jmdBN-${|dK#a&8zrxFiP?mK+N0AF>d?cMh7cJ6Lp zF_0X4Ku(RU7zv? zOe|JXauYuCP49VbBu~6+!%EGhqz~e=fh0%&Qs?pO2NmC>zHd<9H>mxamX|!W9&2rg zZ+v38#C^#VBV#`B^!OkqkT6q~ca|~+t^AHBf>avgij^UPc!oA2XSTu>J3$M3;ESNW z*yo3%w)jhrFLW4dJ|3}C{D!VVUERr`vmuW2anNPt%Qco8;MZFrn!Ae^;W7O5G>U%# zP8kl%ya3G%F9_x(2$)#ndXw@mWCT%;;_9II&D$@dK;WsU> zTI01Hv7AOjrSTM1dNj0}OxK*x^`qQ74$h6YcCsb9E4uGXRF{#_D~$Vn(UYgv z5NnX@QhUoty`|P#_A^oO zn<&|nMO#D%QTZmz5(eF{-q}mqkM-b{M}+ zdQh}RPumuBzY}WP6V=6w5uP~`*Zd3DbS00E!8wu4IUb)^mm+~fq5Hb4@^Q3>&@<}m z&SY|s*mfjyd>xhNd&}ZI*r@PmYx}Kf=M9Q?H`@*TA3I}1G`?wBwt)5jQhY_*dEPFT z-Ps=Lhl`pTaHrBW0mma8p92VuWj$nY%^}-mX76Vn|f~i2(59%+Nfs@7EDWWeHBY{bhH8-n+Sg5 z_>GsZjs9mFWVoVhVzW0_@>SfEXh<{92nJ8oBWIeIYgTrwg(GV@oA+((&6``cR<5>6 z99j;#s;t3I`0TLdTy_EsmmY+t7Sw(&emED0^@KWm;;#$vNNmMREmzq7xA;+#8<1Fg zxGCGpV{?`3lS!GLhv$|j#*RDMd*ZM8r*|ikvdacIo(j1)BkHVU(>Wu zUo=Gg9KX>9m3KY;zmg#z6ccaC9Bb7dEZc8zVr6%IRrFzUS*PR7sn+PK#N@`2#G&5k zz>LBggjQKtmDUT|c>za;H=n?d$yP{Y^I^Y1kja7#-VCn11-0L3?*{Z9%z0D6oVTO@ z{sp%UboB%D%p>&5P|q7y@LJI0Yvs+c++%x2iv$fNVmW~hiMCF(a)Oe7>Ki8G@2S3I zn&lh%cD8M0gMRn_esickSuoMTGs<=89~T@L{Fm&K^gPW>C3EreJp0u$*Z)6kY!lZi_!Fn){cspV4d+=Z!bD@^w5Qmzb+{M=pBP+@-K--vZF z9X$kdhB6Yrj-O+${}Z#B@4rw_d?i6;v%Ej!Db6TJG5va`dQ-5{SoB`mOv##f)f$BL zGVS?t(Q@I%5qNO~&It+)XAUde`2zk7MtgqwT4~g03*SELnrMl{eTJ6%lA&JZ2)tOH zJ_6Uj;!PuMqpjmTddJ(-XE*3Jy^fN7FsAV0I3=E>P7*guEu<#HQ{kF;hW-y%MRMK0qrML>~zk4_#Zy`eQ3D2b9M+rL>UX*7L} z#*c=K?r-9^TATPU*EYAV=vX52c}A?W#0Q#{?^;D!Qkv-1d`qJ9tqNCeRJd|eycUfb zT^fH;Tilm;Tb1p&D~{R)+S=JR$J*J;yaE+R25AO0ZjQsFPuswg8~aVvYJEpGEXOu< zwmM$@Zd|U}z%}bRvyQcuBPr8*{!1RrT7FkAYcO4OW-Fy%(|4qHgYwq&b!+?THGJp) z>g?osRJD^#hq{(vr(mV}YCK00KW(zSc9UgNzpPDc6HQ1CU#^ZlS6M`hms>S|prvTL z$kFJ#U+~Y*XzfSq926I-i|rommRy|~_GT8IjFyY_ll+#Tpjh?Md+`Va8CCX3A{XKK z#6n{Y2Cr6J7_FGG$VWStBcC{vJfIqRFvXLCG9wG77Y>LAG+H5CUu7>Q<{fWmGKrF( z`I9w1({M>pX_d7Z4``5C&P5B&v*bu6J0dfpQ);A1BuW08@BGi!Dqpg?BhQ@U$UJK- zz`QFygw)*cj{IRS7Ul1jSc{Q}Rd!`;(M9rY{(yRy6iri0Yt$?4Qct^uhtpp#^q!1} zB*!A(k`>~yeuI#fq2Xly*7sXUp(>}Zku#0>S1L(UWo|TbUG;xtPpG_>I!kTU z^P9L^@{42dCEvI%{7@H<)YRf)Z;qd4iIQY5eyD11Y5A`@le6*mWKI6VGHY#5$=_mS zUF03fWloec+?H&T$i(E7B~5`294wlnn|W&rKKwQ83|kEL08YnbE@34$kybl zgoC61YI{O7V$HGKpL1FA%&gTjlgHE0niA#SN={eVE-77Af^3sv7Oj|)%Z!rjkwB)*zN}cz7(FpSOq8 zR`i8g(>~F4e`>S%^degqmNi&DvbXZ%1@FfmuPD8e=s)6wAMo8A+sdk_{Fs?jF=#a& z>MF_>ev0l%RQ(J4v4rAp%yr?hj06&l8;ul?caUeLMJoHGvU{Q<65IPxnW7`2A0ibh z9TDA|+|(tuHJT!HUVW2K^B4X|Zcn1~(cp>S1Z`K8m~E&hbyCq-1N(K5zQd&r-PgeVc|&-n>JyMM)GIt1|7j3J{Hc+7*-PJnYFp(&rcJ7H zXV#_gdX-<$(0`E$m6s=!Ugd38Zx0Vu{1JK%)g}`x8DYVGp~WD<&|>sS){NpA&qSpa z{@jL2b2eI}X}Kd59o>>Ag_^40%I^`rkKPRitx##jsVQYu(n{7v>gCJw)v1N0MZ!d@ zOPNP^@f#%TA#ItQ|45`{I#>GO5C5g5L!mW$`9HY_@#;ldRZj}4PiAClHSY>$tJVrF zRG6=l9F^=z+y8G{rxt^$^INrXFmHC7K*gx>#LGk$-SUlYEH{##n~WL4wQkI{tT>l&`E;qM&#KbM@X zo|J8MPsOb@Z>ioFiiyO?Rk=R$BYQQHBpewJY_;ZG^mz^6N5^N)@su>WF20e9_QDm> zTb1QeNuTWJXcN~(Mn@Kf%0hS5Qfb7B>at&>Lo1n+{zSPyS~_n{z2rTS7|HamN|!RF zPVyZ=52@*jFDo9Y*{^Ah%BNHP24w`JRgs{|10DYIkn)?ov~@T;QLnUj_1~YzYp%@s zV4*xYSLfOa!{m;dSW~E?I+OS2FYn8J+50mdm8V6zhSwLDQs$X?SFXx^*~=TNQsrp= z&zYLNKTBF^kLsG_PSo5}-Jg5@d{U)n@*V%Xm;ZC5`pp|s6TxLEU%sw-Z*?Xmsmh)6 zHRY}O!b($A-<;pnNa~=HY~hxg|3aD7f1$#(Q$>@JMcEHeRTLT;sQ#~XR3#lN3aL3$ z(SGiz_#jl1zHBvmH1DY1Q$0P`RsUD-sqUzC3TOo{?Iq zc}hx{+Ds3_P*I-v|2?1QR$ozbraBUOs-9DQea*Mj9Iwirule62HD8}+R?n^88TnDQ zMAddx&DE5@=FPdgrtE)~HAgB;^#4EizpeehHSvGHuI7z3El|C!s+~NkqKQAL<$p_B eb5-?>TwPzgM8bz+tG2Evpr!_^Z_f3(_x}Os@$diu literal 117644 zcmYIwWpvwE*RI&icI-gIP-bRkW@el+Gc$LJQ)Y%KGc)6~P12@qzyZgMV%`0{f9}$f z;yAWrOXuwK(02EBty`~ngCc#J^=>tK;*3N+f*>et$-NPz|aHWDy;G9ZW{)h!sb^|H*JSw>ckx^ zx`p0dJT^6%GdZ}%Mby8Fr z%XL#HqhG&XS5y02Jy9hpcFWty5-5TU;|?qr%|nVMw}^{`Kyx%}WOa;w^yhyuXoux6kQq;Jx7KETh~HR0TF?a1y3N)M*} z^ggB%o5L>R%JBPmnJ_~5C`=S7>8R8T@gi%{@|YX@g+C$=ku$0BvRU$dijB(7s(e)) z^>X!I^=b7ib#t{!{a&>}rB*FaepA#?oRQa%zmlz$&6aJK{g4fld*%NqnkaGAZ`FDA zFin*9p0=&-y3VX0sXwQ;>lr<*kLU~Zuk|bSee}tCr*5S#Nq0fpS(~Sspb4s{sh_Bv zN|UmZVw+qoKPy`z+bqkH4U}if7b#+u*OmQL2K5{De9Z`LGhKPT#&FlL-PqCe(Nxbo z%lzIfnCn;uTWIq=^D1+q`Jf3g%{IO^ywhLPE!0-f>{e-%r{&4AEo3g<5&Mqxk{rTN z{vDgdERAG`S_U8cJNdkxE$#}gucgZzwMvj;p%5*U+lc}yzfs=m+&_QX{aO6`#;?x5 zl)sMW49^*xGbU$O&ZC?fzw&?0{5|8(&fNUG+6B+;y^1ar*K?dG4LNJNCwb0$fBKpP z{s|J{wUG+UZT2rdTD&FoM@z8v1Vzo0U6Maiyiq<>omJ1#)YG!sY~3yW0mEA3R8uc= zs)e@XMV+*^wY{|Uh|Y=b6Z0jeXY8rid$G@AkH>b7y%yt%j*jkPTVuT*m1FsB&M_HH z!;RMrR>Lwqr9ZE$uluN7q3xjMH0L!_HB~eP>X~YvYPO0~{-qQZlN5gW0Qqy7Nj8uA zL-r&e5R-_qP}gW2B`Ol#iS5LB;tzq631l6zHCda~lNQoSCXp4%D3T*`i2Xz>;sKt3 zAA&l$9`ztikaH3v4i@hU8et0mf{W*tvc*h0<}h6p=^42eE+1YSDh)Odo(O0I6Z~%9 z3}3v@<^AEseF?sazWcta{^Nc_U~1q>z!RW?vB9{YGWa#HBhVob_HXr9^FQ|u@k!pl zy;Z$$Jd-?n&u8~#_ha{Gcff7&BzQV|HhR8$EZ*MUt={)u!dJ;x&sWRWz=!&-duMnn zc@ggocvd}68BfHW zZ?iAchx*g~b^TTRQT_toY2Qd+1z)Cjo41iS-?Q42>M3=9cl+F=C)qQ>^T{*RTj-tQ ztK_HshXbvGdBG*2r10%<%gCR|D!LLQF?RL?m%}T>deV9%6RnJ|CUVGhSsQtOMQ3HI z>ZfX{TCG{HacKH#|J7o;@w#kXC;el6L&GIQMdM*(hUtQ-h1qF7ZW$GoW-Yd^v^9)= z8$BQPXs#aJ}1W89dy?Q#3!rpFD5!{ffhE{iQ6`yi%Ej4OIhv?6+oO>0|kWuhiU z{j&78+%dA>Cre>9SK^H@_=`&!#uXV8Ds z?=uWErkX5fwIyhI7j??I)K)3_RrJspf6Ua_!q}Q|gX6}+J21zci;ayv8B-%i@Xz5^{ZQ5qsY?z{Ns3W!K)eTjT6usovs7mA|+={J6g5r1~mz&E*F~1}G z!XrZ+gB1ga|CM*Kr@s5Cvw!KYl3vCC751`!&7Yf>lKcDjhhO2G_Bl6yHu*{ZEd3Gu zVffkQ=dqvs&xtvqoCUuuzu)|x{-<_sN?zUkK?R%a1%-Wz^^UWpgIsFQP466krQom7 zib#m=%bw<5@vnuwVq59E)DZB%PUHZx2iXO5kMvsw4FQHMB%pA)}Fv$X(<+ z5_UJuGbvqPTH{4f_j9O*<;%s1vNyPRvs)BHVQsz{6Lq>$7e*^m5(7|}$u z9GZegqd2_BAIMo`Gcp}MRUM=_bITD91K)<1tv6V z^YL@|N4x~5aTy`u1W|?n2?Ym0TnDq=;kuGm-{C+>$UVUqevFQv-JC8Ra_72S-r!4n9EC??-gS7kfo z;}s2*YSm-a5_K8PL(O2VLpw_MLDy8jUH?ii>Xn8lLqwmYf2Y5q-=<%tpR8}MucgJhXh8|ouDkYoT~4kawaCww2AiPm^DUWi@BR%27({EUOG zH`WnrhPA@FVV$rxu(ic{z*%XA#bPm-9G8}vCYqhjUSQ>1CvFvY zoy+A|j^Gu133s2{%Jt;RaQW;Wwkhjlb}}6p9rKRf3v;ax-I#7ecco|02k94dH1ij8 zn~7qVusHV**O)KncM4rak9bn*k0{YIXiMxfHU$5HcOf1V8RSOtCmBceq6SkVscvw^ z%v1q+nw(6=lGlh~Fk1J+`Fo3v!~}FXYD3Q<{SlwEUb0E|#gU>yJT3GTFyTBufKTED zu7vx^{ot}Wnv3UK@e}#Q{9*nT|C^5$GK8+edf|jnER+|Ai>E}L)LVKar6U^<5*>_w zLK|QwutfYYoAus*jstdbS8scpP9%lg@R&U(VS+S=1v%}PgoiP{x4F3J}5#WKU9wwyG_ zn@^d{rdh@uLp{S;y+XfHXV7iY#%gzIVlc;q6h!Vt_D9x7mPDpT#zaO(=0Ovz!J#u|LfoDU*(_f9}D|Z|4IK{{{#O| zKNiphs>35%2l@tv1V#l$!mWCNxPUPr`V0L({Mr6r{(OJP&-vwn_&{o)L11`bZQy9& zO~4ie~m|ln!*&}jF2ld5jTrov6i$`@&Jptjg&#>qXBdnTr(NI5YNLq5<7_R zL=@ST+)I8X%~W%0CH0n4$p**{$$rYJ$*0RN$u){*iusC53WuVMa)@%L@~x6nR#y#I z9Z~&IC8+zWSE$dZf2(moB*Qf;GC50}M`U32SXcZ59#3o~TtqiGZyZ^dnonJ!UQxfOLMlMLpzcxU zsDG%b)Bq}tilwxanxf%RezKJGkPKN!z9Vmv`^hJN;97@?ZbT4*l}5T*-Dgf+r3;U8hQuuIq|tQ8gtV}!}VcsR}!rU@Hh zv^*6UAw%pYE)ma)-$h)iAa$0;NXw)}(o$)r)Dtk1QF4i2#G~S3v4vPkl!@Qr73T?^ z1-bB%-^usmySD0Be*ZvA!rSLhIz0FW=%7g7q&o5zzRBnIuHxD%E4{XU+Q=G zbNnv9+i&+5!AvUkm%y!T|0jQz|GWP)9PR#q9}PqWDh2un76wiQaspa-<%Pjx!QVk5 z)Fd=HbTX6!EPP$~Yq(nE9E^r#w3*q=RD&}+5%~96zLSt63cCe{%FVkr5HEK4n?vZ)5LMY7j2URFsyTE0xaTYg#oO#W8xk^g}0v;2kp zsC<*WpS-M`mfezVkoA`(%W&Bn>LfLdYC#cHCV7EeLJlSyk@aCrv?kk=y~ru#2yy|r zlROGzg~9vMr(xP&Z+miIi2=O4e7lRJKlbT6RtLQ1)HslgZ^t^4juR@<#G5 z@}~02aI3z&p}eEKgM6%f9n9oE@_5A{#XpJyMZ9vV^06{T)lYQ_6oeS{0QCm-L-l91 zq%N!Jq8X-Hs@bQxuKBDf(Wtbk+9ulJ+Fja5+8iydP1p6(o!9ww9rO$IZ}gO*r(w6@ zy8$yM8yg$@8AlqY!_fvaH_PzAFvn2U@E!1&Tz^1UO?O?}RC`NPS944qtKOoDD5oiZ zDrzbY$bGWbvO|;`nCxz%1aFU@!X$J&`XAB|xh5q@C&cpNNg-M|!Rz^DoWPD`Uool7 zZaO>CC2}L&F#ImmIrJ&GCfFeOKCnDcHQq?Uz&H>3^!|k~=6VEf2NHrSf~CPep~oXsVh9XqNJ3(Vy5_Bye;k)H;D7Zo?=_T)LJo9xCVS? zt1v`J6AV@RxD=4;BIAH*yh6fAb-*<<0W&QD)$}U*0d&{zD2GaDGN9an*h=go_8#Vi9Iu79 z#QWfr02%)cSZfEq9$${H0o8R5{ue$39|Ok)aC;0qrVHK*Z-ke@QM?G&qAS=2sC^T# z!B}%F?SI%9!Cs*+&LG3nC7^S3Gz?NUg!+^(Ik}~o?Vkgm+Ac<@6X%m41Yz0MH zk7c9l&@QMFeFHpZ4(Qm)2#JIxuT%hAo)nf8h!%;1aXl1S4Xn+9P-shZ26_{v(X!ZN z>^PQ>>G5{>Jp2VN;FX90@LnGgJW&tc>l%2cZn6S3oLWO&pzIVTOOrJPUa~?qOEyO~ zLe@jpP-c8tcXx-1=m(RWJvBPo$8@Gc*~*=&W*hBH|m`v(ic%69@3sD;EYU@1Gv zT(UVele$GYD1)rBthsEoYzn-aC9*BD9kRo+^RhFtCx9b%%4W*C%c=qT%%=`hlc*%> zExCeBgSC4KkwJLyQ+ONPhpoq2Vt>$)s1xalyp-BVkHwbaZ6QI}&!_Q=xNNoqdx-JV zQ|K2FF5C?`4h_tEL*Rv9?(gT@=KbMe-3E74S8wO~(hrXEj>#pDi)$BO0zUJpa7dpCPsdl`FqdmVdY`waUs`zyPpaD3r|LV3}IqUS{oiVqgsN;a1$9Wxzyj^3po zOQ$)DoFiPBuFme~?s}ewo~BSs`ua+IGyJT7OF$Pq9*hgE4h2HJ!{5WL0ArGLOL{$B zMAu;cW=fcL>?JlHFj)eBm+vJM3X{Yr>3|diOuinR`FLy(7Qn{fkMU??J@J)jMeZXJ zYBF`7sv=u13(4xsSIK|L%PCeXwkv)sdg)PALR|DQ^_hrN=E5bepB96?p97# zR#N6Fjw?neG8CWWTcFmb$^Ehip!v1|_0UVbr1rz>wxINYLB0YTS^(>df-EAg6AOr{ zgd4wsZ-DvQ5$}vw0(O)JqazAOfXy=)j+3|%FAF1bH2x3%43`s)i4Ab&E0J4BFF6&k zPHR}rlI6$bO2r~YP|-`7sT{2OsA{kNs_vxusA;c#p{=Id3(UKv{Qap>@- zs>xLkR)1F2Q2hg+xTE5{T#${IU4_}%hdfHyq590juA>R)U&wo@vUCWPotr{Cp%|E3 zHU1qpk<)VL*f#7hW+PJpxbj-MHfW!p;JPi2%#L)9^nvxH9cZE5B10o9BiACuz!z%J zL+H8m7T_V5p{hTi!?YfFLMNsdvxqs)+yrL&k||;$jD;=7wgtP)NNw}ecgK;VQpv8mWy>>*A9rR0+M zPIQSzse#l5u-6t?1zt)yk|dd7p4J3?rxVf*83kI=D$sjIg4&aaNU%!$E!CD#>6AD^ zEGII;b-;Kdg%rUBRelFQmCxXFxy4*Hu8>{EMzfcgO3XRnRfi&FBYVRpaIfg#3}7{@ z0_6jzK+nDJo9c`6eef>zrg^hGi#*jmh3+-(4sN&Wv1^TMu&afuo~xFtr)#n6ueNd(b3pa#Pp_8}+SZRthReB?(A(N3i;0O*t z52IeRHZ~D^ftm51_(8lBZ$-=_ZW5)09s^DrSiGbrF^35tMO^}XjQr)x?-JE z|Io0&R2-FJdl_}aVu{*r?PKd{Q$-6g$KqNgR80~RzQh+N^h=CMI9f&*PbJ?;{hV?% znM{pJYoFFNwRbX-+#~sR;_!H5{D}C=am!?*IHZL*tHU89B)lr&Os{Y{4 zG?BF+bwn*Z7E41DkSF3O;SxWH*YdkLjI(hcx$k^8p{nqOH}Vel33HK_NA#f!fv5hv zzFi){+28S`sK4El*X~dGUyXi7XD`WQzSqb!WX5EwGeJ1Z)WT-SRKfoLf7fSf;4hlY zOt=9F0qRmR>FG%ad}0K3SngDQQ#aD~(WUF}>M=vIp_ZYF z;fp?9KT3C7+f4gZvqp0dRMzIY(fXYRpK-C7v2?TUvE7b76SFk7eOz{2g))Q6tS+;u z%-S-G%QP-i7&jrVG5AFcPGA%zZ!QUW|l1>>b|Lu zfzxhQ3yS8lImBr+ORT}~XUIsG;9XyRkI%_CJjHhlpMVQECimg*{G6db>;G_O;aS}? zS-4)pcj0@5%uuE>d-;##oJ+qZ{1I{|=I0lTFH9{KOHgNB_Z)ADe@v(_GM07l&85C* zU%WEOz!|Eb{I1%onW(F2a2U^-M@B{2_C>QX4dO1Bq2n7RHcTo_nv%RWxqI@}Bx};d z#8U}xd?A@KXUDhDVhDYq#1Di6Un8}3=8JOPgC|E=y#l=l=GMMwE;*;(o~`Ixwj z@5UygeUUnnRdn#rxy@_`rXtORABH9cslZj=bZ-rh&E3v*!#T&<61MTq&CWZ{%g)2j z8P4j?ccooRuQ}L~`Xzmf*A-nW{BBp-TNG@`C-cANUCcY1cQ9{T-ow05Uj6(<`4{qk zxV~fe+%|&eCY(Qfny9YLF;p#%7Xirg(VqM9< zC7m7ljv1wHKwXIIuIqsNjtBEi_p^aLq3#h2^M-BD?-ibjFQhZb6f^~UjrGJCd>zq& z#HjDoQ`sr`Ud1WpM^&t5s`j(4jA5{GuIZHdv}IFNAFJQ`w~eVy{OLC zdA8%xo|vI=Kg+aDxRIz&Zj~}DwSQWTbRm6ZMrH<8mdzl`N>I}r8QU{zW*kd5rH@TJ z4^{kW^1-CWiTC0)Wm?7dik@y=ZP{!(WZ0nFtvRjws$gXGsR_gmY$LK-?8%et?a0hf zTEOXj3@2c@mj zB&j_pz;e)l?~BX9lMzAPZY6x?r-2TBlIzSl*tKj~_8l_|G}1eCFWM8C68Rn;6#f?K z8Y&L13RVk#2`mZJ2o(7b`iJ;a{jBdl-%H$7DA!}13K+#)D&7gV!1AGl?%uk{=u>`*d z8g_ZK6*618A)3Vbf`jkRf8siD_u1;~NhX=uL&wu60Yxez4*}&o4CjDay9sdQ2gnSa zVlQwn`FueXGmu8;SZo14j~Guj0Os^VwpxxWrYo*1+=^<-aiFkXRlZVwR^|fM_bVw? zimH;TfvT3Om8v_at|L{WR6}8}ucB1Hm47R1D4!`BC|=4t$sfxa$SzP-s3VXA_=iX% z&VfJm8(WLj!w~E#x*i<^OfC(r0?6qA`U^EAw21`M})=}blp`TDu z5I`SIf*j8QK_xB)o%e<`9%+cy!P4+#q9R#|%8*5a^35nNDhH}$kglnyS)jS9d8Rq6 znWst8oKaU)PglKA%9T|VqvT6vC#V|V46DLX;RLufFMJ~$ge1bQ2oo7ff2S8Q383;`<1X@fLN#eG zl8Bwgdy|Ols=T+7P%qX5v<>t_p~^KdF{b0@`j&q!Nl^=<9!Dix=UQJ`<86a&D{ZH2 zw{2@}U2SsPHET=jE2weHEpN??sgvn|@s}aq&_}-+*83m8s`6Bym1h-epHRk2;D0-c8xfwH_e*aI1^+aavx+^PHD^&Hc+A0zJGfrvg2^kae*# zt`^siy9yrT2>v5qQ`irjI|dx)reZ@-s-FNCD&l+cSK!emwh=RgUK6^^(Io^StZe_}st zpJK0RH`qM|g$4Nq1qHqW%3j|-*8Zs)~k?C86Q0;rdMpkxVB}w#`jO?o7gHTEm=&?N;#F< zCGA_O|mDUx6UWIHlwU?E%t}P{O|?N? zNpnNfR(oIDPsi(4>B|_78(JE3jf+h>^C@$>Wwpg^sS(vbY7p!hka0O+sbjfmPBt$y zWgFWW_Zsf$amc#t)8>LAeMD_iA5lfCE-PCrixo>0>56Rm9(h~2T>ezHTQ*A8UKTAY zrJhrpsMeH3-X~|0)kp`ii)cVN@I#<#)&d>#2jnBxV4JYz*dVMrILu$6;&wwB$ZaGe zr==>=X)#`0CFq1%d_H(K`&d8tQrqc2kSb{wo*6n8d>i=f7kp}88E<({lw0nyIa5n3 zI0lwXEk0kQE}B7ql;EQeY{N z6_n&>=0C|lpMN6%IXu5k!Ty32`+a-gLJ|^|`-^9k^m8;Utp+1j2YISe&u8y`-!Q*1 z@Eo#|D7ZH=@Foi&$v6YDjMu?q<0A=lEM1PSM^~qt(mlbSoldW$pV0w2is=V9;u*t$ z*D{H{!CJY$fbX05f&2qLMi?z*3GKxzpoyQ6YCNy8GGBqYS!<1WVbh~aF9tW~0Zn8%w$!%n?Qw?tD; zeO}pIktf?hbtbjMOKc6=5s8z0!bAQDw~SrRY@zQ&Lg8BB?V%uOE@*H`01d44OOUw> zdwY40c#7P$-4k7Foi|Fe9A-zmk^{xXMV*Qs7xscN@YH_HzQEqg-qzmA-rGLHzS@2O zDwDZzW#O;F{zbow#uQT}$KYBiOW%~PaMpIo-M`$IJV(4M;c9gbQ~(vGH1sUIJ~EK5 z$gs>cb{3b$mjJTvB!pZ97rnNg%N&2OceKn^ZX9d5;gb;_Y&&%3GOuHHcoNJxNF>34&m$Y zqxpY9*BJ-YtOq0xDofV@`5gvddKP*PEk+es9jpeH4v3`~eE@3uIJ5zzq&&zQc+3i9 z0Wt#AuSCQPqhl^;e80f^=pwS@^sBXW8TI8TJkvVk>fkxh>ouE*(6Q1EAE^6HW;U;y%bhy^tm# zDQF&4*#>wvet>972FaD+kgt!|{ z^JLE`BQ=@4Lij=DJ^{{FKlBl}0F$LJkc4^*`1A_jk@rH5IF>sNiSi%J7N#~M(4Qeg zGl^~w>4yQ3N0>{W0;jq>bC9uts@#E7fU9#>sv`{Y7CnFsh3j;buz^Ztgw^&T z;I@Xcsi3@{0flyrY=W$_EM8Vf?W6iraw>;B0d8Yg(n%a7dK1Y+0Kbp#!58D3@Xh#k zaBL3Yw;@qq3T{awq91XDC?;x?>q&_mM*T;1mtB!1%2z<@>KZ=a3~f~kI6)G25|+CU`-*1`U%{R$fPCm3&sfNYdfX4(=U}B=?w;cQ%e}~b z6n-yqCwNABZhA7jTfCxol}`>i)qVke@O5xqs5{gnC0#%tV|qgd=_1#U$G{g;h}%R1 zxY~B995NPJ2YI^t;2agec~qd>|FVNBNT@`CjvR+p2gj)!cr>-qPS7nd9-Rv#@?Y?! zGST-iA~-YwYk~~}hiMyjAIpLiS6O^Kz825IHK3HwBW@5*!c4XxM}n8TfLsQ88@4eT=4%#kqbeGJV>4;k3rh&C9EvF$$8-Rq?01yC$b^O`wsG8P68*5ph(V! zt1FP*A!pDYe3d5h`|=u!6AB%i{ol$)s`DzndMV^ET5IlW%4oN0CG9$$Tt80#TVKy` z-e5EiHeN9PHd;;HOk+%=;b<}aG;T6hF9oGTuHZI`%3TqKSGhqD&c7#;9aLHH%y1b){;s4j%~FZ?ck z6ki)^P62n0TgJ8Ltl$(o**|P4AjAJlNwk6)wjU}|m`jHFHkm&HDUU*41-ZvI!Z2Zu zupB(oN5V_t1*9Zz1N&Vp^cGqQbwEE)5X=HDIAO-!=Qn~XU597jf7Id5vl@0a^M4xvE5;Nf5>*gdo(Q~+pic{mf;z}AQ}GK79ZcVr$jUDy(K0hh=> z<|hKKeJ%C}Uc4DeMYp0VY%!LLH3YZy8*rBq#8rYOI)cV+hGaqsHAI#tnTApzhx(Mdo4QCfPE`Q-aE0QE{HIJSt4vKIM-YAS zx>!TBJ+fHZC2kOo@aMP)8xQdP$EyTXzZ-@uv6Y8>TiF_!W zrQgbxDnh+Tovm&PJotd-DKOzbnrzK~nxmTWnnoJCdab&ZIsusE5!E17OI5lmTe(h& zDUT`2DmKU&Srgd?Di697mJ)~Y&sZup2YrcDLoP^_qz{lf(1wYMbn+{G{TEGDnr8MzpcIa{5FA3cBES(=bTc-?H?L`W#i?ddSLItJu2O zCfgR+_Szl-=RRPYYino=TGv@I>&U357Sz(-JlFKf$biZ|UVl(WYwKx`L5BZ~dZ3z7 z-B4|Uj-AP>MXG&}a3<9a)brJs)c>h!DSR&YkB zeE5BMEOaVOrr*(8rVpfcUokj%iH#uZ)sGzq+i+;BO11hbhv$vxxW3*W^5q}|9cv?AnI*Wo7OHu%^lNRk={`2_*;TTQ^z zn(G?O_^<{NrwPkf>H6h(lUX~$Cm!-(6%Z5Pb(>GZMd5(OJqP!AS z6{$X|A8Foc3w8PW0>f|PYttq3Cd;5Go%OJ_mhFqJUo;cFD&~7k-`GR3Ut@{5sJKRP zv2niGTd@mb8^*FRcVmXegre6*Q_+9fa;%lCy`sig#+tjD>KW4wW%MEKAI&HAWz`wb zXkN%2GOKJ5bp{?Tdbf&Whub zMj9{P5J+Jpf0wJuU0@rqf0(_{KU9gKm=I(h5Jt(wfv?_{8P6VA>(pAuW%OK?-0Wt)-I#Q4v z$UL=&RObhAE4bP%#8l|gdmkr(w1^JV)M`@01y1u@9*HiO(_Mr1Q&3+B-p$cRmXdK6(6 zfp%3M=H|c9N!W-5gwG6T7YR5g5-NChfVFa#L4Ry6L@fi!s4?&oIn@K~C_5ew1DfoldoNkF>3{ z=OMwqN=>UqsD3ItK~iw4A|U@8`WY|7Ts%gl!wj&In+OfD61U-Zuv*wH7TzvQC|X?fqbRPp zZ}HyZqT*g9$4kmNvK+fgyEsG8AJNw>x|e(8fcl1b`#^82$y?}o?AhXJ?a6abbH}=` zxJJ7wyCTq?y3g6p`KDA~+8mUgImK&>))elvzlZ<#GyiD*-{8Py=d<|@3g#4CD0o-! zyCBxy1K9s7d)GpL;i;mL#WhN*Ick+QceZo2b+`7E@fHCCYV1!6qPmP2~=450x&v7fvLiHK|D0Z_D}pvSNy@feiZkJxa`gPwpa z)?joE`XAaJ(*6JEww;2^*9WpEl~47SWy^ZVKgxS34l6v0uF9KAGk6kDRSnc9)uOuR z|5D%u8jaSVt)NYVtv)0_=V`w}U+4qylxrEZM%q|px@=wwzFH`1ku}ct!8SEo9kV$` z7rQ*x9a}A~N8I?hIdSXbcE^o~i^T4XZ4i4SMjz8K`k+m+s;%i!7K_i6Yy4`+)_>6* z)sE7PPv=@Zk&Xi~F(<8ydY6vVw zh@62gff13`krY5{mPnn*gvh~2Br=gEpnK&AJCj?&FBkTR>!nS|BD52x!2iRC5(>zW zjHSxUa%9Kl%@p~HwMwOGmrAQ13ob#ay0&JbW}D`{hJlXJMcVh;#=29`pLbH<)bJ7X z`p?E8ru%@7tC=U8H<@pn@0eeiv&@Ig9n80(BesQc0(9X0r5mJesWGWvDn}{m$c-`= zB<23YWq3N)6djH{lxhLibPI!o4}f~6aRspE&SZAbPa{aAQg|NVV?5Y8Z~+*|PQaP} z0SoKx9q#?hyTE(Oo9j*U4fd_~z4w*%Px4>%`~2yF!GV>5ov<$n41+#|AO3azPJYUN z+&2z-Gy~qZz+c*X6TA^mj^`cl>;s-Xp1z(~kJJ6peG@u0kGW5}FSxI{-?;PL22UH$ z8c&g@tM`GoHvEr9ki^vo<^?hX-T)hj4JHL^1=|P92g^WDv=sOnxD;3&SPQ_4~yWD3Xw7q73|d@tu-t%IWir( zA&x}uM{Yxh$2&-Kl|Zt;5V}MVNSvpFaS61fD< z1ZjFd8-XOfimMDP(a06E-(aQU*ko=XcnlTz8~gm*2W2kO4n0}dVo2Of1qRvL?tqrWx03klK{2U{as4cOb-#@c4swgPr6w53E>h;H;hr+Pqi^Jrysf$f;BkFC@? z+p4jyiK-fP!jfiLWOkc+0iLXCTn?!XTt8ZORf}u8Y4!n^N>R;&&hHq-c==0N71=3D zL-i-`gBQ3Ex(fzlFCp>CKo8+C#Dut{x8Rr#kgSqNyb2C+b&-Y+fQ6vn*`fP<3FvfH z_*m$0zXPjw5AaqhY7n@fUHE#yzhihG_%x@$z1hv} z1r$C3Ium-q{ugB7j&k?7H=GBy5Qp=2E+2TuZeZn2xEgRZ^4TBk1NI7gf?W<+VFcTe zO@^L&AOx^JeuSjmR_N4e2Z-_`{Rp(NAguzdF%DE@lpO#WYZu#-d(72^obv}>E;JDa zLc(q&MKU6R@LO1SXN0SUpN3|Itf4)C6}ALwLRVc^|1aNYAL85OjqyH#HNUFo4PXGJ z`-5waE5-G%bGS3gdAoFWX}wa(Q34!ogQFiLQX%BxNOg2`90FdKT6z#x3f6hTHPT(* z)5P1;x5|GfP!y~e-X5Wt@oa=!C?rVNkycm$pGam?_2g?6=aoe&r3Qn(W0n4o{*Yma zG2Uc1Ei@-u&V%V?(1Y(TUL&qsv8Cj*bHK`Nww7w%S(KR$$#>Z3wA|YEl2d>OId~Z0ce< zXpAzhGx%VQ&epZk-PERN_h|^ta&@7qhw3V5e=`*qp;NLUVAEOT2I36<0J{r0XuA{^ zjbb^WGGBo!%eDgFZGL2H_yK4owS&C_7yT;#Xy0dVWA6*k5RU*AWxl&7 zcXe?oU8T+^gTL_ISV7E1Ed+U+2){2Gu$xHdh0{qs~Oa#0kf+sN-^d1?qXo!SbS>^0P1 zR7*-heJ1~g)Sw6YHTw}F`0Cwp1MuAq(C6ub~>Loncs2PE$BoZf_#9^f|}xV;a_0W^|-&G2YL)c(;H|TeFU_FRJ|Tt9@n0~4Bq@H zp^sU~50kc!_7+N%kAiDw};vx0tcYuG$hxoeC$NdiSF0&y&i$V9&5=gXDNGfzA zk3wcbT6Qc_3lwM-k|kY{#!59LQM?1aOiADlcLx=5GoQfE=5pBCpu!JgUVwM?CQ>tU zF`N;;20bRb7i`Yu+6EBk;Kxz^l%mS@^C=b@K! zHe`9)LVm1K=xcCtFgo}!Ffq_Rpb8Ygr(EZs0tudu{u=%?e@pnRWBv2t`yQV7fA}?l z?ty~=U*NCchhRsTYkR^=Kyz!$G-hi`dpHk$pnvNU=EIVp%V;V7FDUhXya@UkXxxdv$DcsP{XXi7<1k z0=K5{5crR!pzm+T;B)+MY@%2Q%|#t3hN-b+EDpN3D*^v#1J$A@)&crJ%3(Bg0UtvL z!hCuQqi!H#MczUOU5u0ieL6N6ZT(>MUWJZV7i1fTLnb!>PSg}oQeH4iAz^ipwm>eM z1oiM+C?4GM-GTT10DND@cvx-XJ+s}cYn`j6>#=iyQ|A0ydaHC+>HlNt9Khq+zP~>> zW5rIHrgnSV-rBZt+ukCzZQa_oZQHh$)QmAU{-0mp_n9YYniMl<_St)_uU4Zhb=J4c zmtcfXGaqF>$h?&KDO1QQk<~D3b=JqM`q@vj>*id|DV}?X)8=emeWS@ZfeP@mc_}*4 zYu2u|Y}*LC+_BW*bIf##U0Yq%-M8FH9*bwOH{7?&7wKQ)ep2E|NOy;f~k z%~6e1)yHL#tX!&WtJEo9;k}7c+>j3eeLF2{EPE}C5vm9d=^+#W<)x8QtK=%zrz%dH zBV3UXG*RtIxjGT}HxSQCSm_@HmMQb!^^K+GvZ2v$;(hNKO}&)hap4+!;?8r&QXNgF za?14-gtge|edbN{O@a9+>EB6@-zKm=aDpA~eIOZa+*Mp+d(iUD56lfrrLOB3XoBKt zSztA&%8x*T=pS+ht6ZYosXU{+tjtsjs!&yNRb^Et)p*r^ss-SZ zl~li!0U`m%Q-bwNf)|hu#4qA8H z9@&!}7N_3b+B43(5+%;Zz;97Ntd!?N=m2Z?1RYTPf)jIgn zV09Hd)Kk>6;fb56<6w$6sOqS`D|;(56!R2f#ZtL~y~{_HVa6f1TOyUT5pNS^1nLGZ z;q6QE-Q$ef;VBCH)Q{AuJl8d_wid1;E|DwK`N8?Z`G&JsN|r(m(4}dhu%}&_u5#|7 z;QSICDQi$rRr4X=c{$x*$d zUPUHEPKr1d{wpjltXgQpkmkW9gGw1h`t#Z?n)d2yDy1@6ephx%cp`lRMiC`$E7}~m z>Hi5=P{G^IGsV5uMOvHViv5=DCW@M$_(1EM=7RB5&0Cl&&fS1-MU?Y6`)u}hs>)Z{ zdD&68SbD>gWacDLdG5^pm0J*$W<1LKvw3&GY*O-G=Y8SvI!`bbG}fVyUT8dN%)kk{ z)fC2Qm~5_US#9|Wrr58?ljUW{Cuo*6)KJ0oM?|hc1=>RG+c-f zw1SsY?h6ST=!XP zYtim>brp0yz}5W^YS&+m!;UGA1V<{0#>RFzZro*X!UkKib(eLbwShI<`W1HWCEflH ziyfA(h;^j(u+?I%W?Kl)*?|r#&t3zK><32ylny(cSze*r zqjn(mR3ZI*{d4_ahS`P}B*N4UniaGo=mm9EOmNrWvBCcZ&j_B2Te*91o!}b5iSV9Y zlF(f6qMw591lmn0COv4JZLjSv8A4U<3+)d3I53Sq&J3805cdgpH$47l;K%L0z5W(~cY!IQ2=M{- z^WzdNzS@)QKU$%hP($c1%p*%?yReYQcwxCP3%6filst`uNt%pQ=k9}jpP1J@NEnDm`)BtN6zW0)X6%3mhZCfsBb%o0j+(1`4UJI z3wZ6|`N?qbS2>?vdf$0Jdu6_=@N;)j)=t5kA`Bqc(?c{9>`^U zJsRE5GB}AF^jq0zl52uJZj?Nc#Bzonl75!Tgu3WOE1)^D;)-1(9f`)`rDQ9$hJ(LX zN_>Niq@2J4RPARtO&?Lm|MbpBePs4rL_yjbrJc&-23xq|-tC@`(j?JsbL}DR!|&Wh ze#jjVfE4=_dkE}QC!5T+mlf-@9JaJ2Y2b-@zPXgyW_oB^X6k54Fd0y1MVX43`k1zv zo|<0O1gp3cN*yn5wymyI6uiUS2SAe&KucDlPR{X^_O|DQ zTkSpS-Qzvsz2vjdTE|&u2v@HIR=}I#*%+^LVc~u2`k$tO!wDkav~8 z!Qu8&s4wg%Gh?{qtGJu^9xUv|Kz-Cmqx~M=e=sXEykW4|H9eo)W8H<_M);elq@`pz zuW`rsL(5mdDMSCSBc-Rm^9-SmBj9%yqP|{DjdI^R8m{&lOln6_197w@Q*vLr0L4^> zY?3@eu~`wO9HD%t?5H}g3RN#qr>Yxh)@rgff59C;f_ZPETdI4g3#NBnN~)R2P{z>H z@Sov=K@n6cs7cUp?%B2EJFOt~X%xDaRzVR#vY^j~jfP?TNr(P~emF?;NBGj>y06+r z+G<*>X1At>CSAQ;-9jC%zD0FXPIXh+4|nWHg#|5VsQiMgrOY906uObE^aur1QK>|_ znL1u4IV3K}wdo*wj1&1j>;DUSkPB33H$lRVxhuLayZ(0FK;L+Sp7=d}?r1>~nk9?-L#uLVA#-7HiMkQHyxws^4c_AocMjJ0ui`Ou1FgZ-! z&9}^dSuR@sv8KYcYEXb=!}MHq1f!i?hnAr!y}>my1v;ZyO9h`C>ACAE%)XfFZRR`a z%ST-;kPh%E(1v8O8r)$HaU*K;bV(Vwy!q0L(zoQKYJ`I94o!qs>;oNnG!{zp_)91u zBnn~Zz^+JV;>?#ycX17Vi-(E@@hVY-XmKDYFx_tlQG3Dq{o?5lPP!c@t=V;moF0SA z;r#BrOvbxxFf(57kO@bg1`+A zfWO3n*DdvZ#0xSPT}!?|57G}Tfs*(^`ibUoRkWwo7|(1I7JSi^L-(~oW%WE zk5q$Y(i7}VKc!Zw8+@pc5W_VV3pxBdn@K+CfTuc}zp-92S<;34TB+nS+ObC@(59du z`zAK?_{r|K7Pci!oGw}e+o}@X2f1h-2>9=kn>N?q-QUaK$zRc53GBn-OY^-$5pl}5 z#kbZsmtA%+sZ~k%iIaR2eDm=WANL*eJt6tWi+-^_SuXc+L$pFI`8MDW^b(yCZWAtx_*~6!&~U;~*D%3Qj-0jG{4OErjzMZj)hi4w^xbqGZH{)0HeFL(Q(rwu z<)&Zgq-Z2xEQ^Di`M?@mAW0Q>7FQAnNEn#MBTk$l9zq5}64lOZ@q1B8QQ^Q{-%dQs z`8{h~TO6Zo4K4LdrSj6Ve`P8&-lg9BRpw{0@8&OGKL7X>{i*TCMIU~ov`G1tyga#M za$&rhvgFap#Zrc*_)}hg5Iz&vRH)^hgtL+u@s2LI(__ydwQY)}xVexi+!&TuFt=k)YWBwL zD%m-7_*1idnYA)|!cDr;>Zff^jYA6__xtFtfxoK!D*vnFug$-Le;@qaJ2fYDX4;pu zg6TEVr=>qjubpu$!<#WE)0#O2j<5vDCi*;u(P{i(T5T>s)vAO8e{QX7v)Z29pF4tG z|G2l4eyQ=RsVn-CW_FnLujwRp=|nfV^Kz*Ls*}mk$zRfMrDuJLH>|v;lsf@TSLFQU zH~}Xua+V^;cB*ra^R4rvGn`uSCCN(L-9j1f&8GIE6EfSNzR+lm?AfJMm&r5;QGQqaR#Z^#S2kDGRTt2d)ix!C zbEKgM-N?(};UN*BGefV0=7i>k77R-W3l7T;-Hy-26f!SFPmX{!s9;bn!yLVv)8Sv; z4BdNOQT-(SCw*DNURaxLK{bQ#2UiI>6;dv=I|{b3p({i8hK>s@5Skn^F63Tt&ET~` za||8zGTnAfP4!h}ZN*Jlec`^Ot@w06>~G;+u9l^4v4Ma{t_bOH>{ALqDOW%z?wBnIe)Cbd{=uI$ZNvb6Y!Jr`I3Rw_bh8Pc^@VKAbCHGU#0Q7g+*%{f&oMt(vbLx>>`z7zPajdC64CXhy zi*0N%_6++Y#~$Z7*JpQxx1H~RUnXiNo+nu$JuO_3t&@*dRHRp)qtb&mb|p3a=V|J*-#Q z_0Y

    q0c-z8)dZubbhx{)H}DH-l8lGvHQ*$W0Pp`3AtY$D>$`(H+xu(5uL@+!53= z*bwq5WJstkY)e>t_>J%a5d$L@N34jL6VWK5P{fDuPT|kO62lgR{s<`((k^&B3d}kB z+B%QsxVpaTi(-h}C(M%;lcb@_JAg-SulIuIf%}weuXCECw%usmfgU^5WXZdddoIV4 z-5e+JG#IWzSs_`~vj%6K&Qjqwc4p7WX^>kWFBblH3~RZo?YbSEimR??r`P8z87L?+ zpq@_R^en=;It=`22WRa;dejt7P>-}6nC(2)+)Cke0nosEZFs7lF~1z-@R^GMen2tDGi>;8NDZUkvr9l4tsk)U;!uX-C~f-Md{?(dtfe z#*ySY2-e~q{>+8;>Gb5c>~4EL$2iAbN4Rr{^E_H6nX5R}T{9GH4P32UZQ%mCP{j=9 zqqpln^5l+??vmhc;GXWD=w1VIo8tDOBEv4 zZ}j+^d^>z=*agRuxi*f|dJ`!fPdLy0oYn39Yp7-ncyliVn!rJo1!avTRrD4WOh4%g z@{~5v6D3MNNgC0wg^Bx%P6fjNvnINz zZ)75FM29!lG1;+(l&U?BAC8jFrA{sNo7FYOZFWzBqv?hEvMYHcLH_>ug(CuO@zXBD zYr8M7g^Fwk={5hu7dP?M1^AmnkK`^omtrXC7SW+RCu>knV%a!y(|#$d;+}Z*C-G*Q z`mFi~s^#XIxtfET*W{MxXvErh_O7}l!ThJaNM>2CHbPfPS5&9hWoR#Hr)o=TZ)nO> z^>WdHf530I5xpq0NRPtBsarR|4 zg>A_nS5868QFBvLrAL{9Oe>5fLEmTQRmls^6Y?TR1zVPPm36+`Sj+U&G{s!la>mla znqnPov(pRa;|dq2YIi%kqC6;1)$4Nih3~FK=a-0n?U_&SA4+ytxxkRXhCo`Nm}szQ zrRX)O#S_FPaZkx_{2XTKDxn?;OQYm*ialgdUr=^X-Qskdul|hMrl)4V=DkKwtyT>u zsz&==vl1-(yt;^bsp^R`QQ1>*jw?Qatk3eo4tDA(OiO5t9<+jJQ$WQ1VI>8y9QFKO z?-KF?+wo{cCfI)OWv|y;j_&?4`ul$Vdvv5z1F3=TqPwDU^z1dLsE3nldLMo41o<%B zhMiQc)k&IK+5)=ox>fo{hC7CeLCeXIR|S_0jw93r{B>Bzqu)2ot3@B!VPAo~gcp39wadyp24K+^t-loE;r~ z!FX4r9qD0tVQ!Dp;JB%qsReqydi>gzH2*6mEnU|gb0NzV%X3R22-F*LFnZh0**vyZ z_Ko(}_9#am#{%>se#c+V$#f|y(m(gR{I0t0b*Sic==$5^BCSnjBSi~xkvlxUJH>Uv z)yq{D7jG83!$;>g&={$!5_`jB5Y{8EA1;l%n!7Ff*Ccl@_hjDfO`r`oVLo*vn$E;^ z5DM3`$(shwHxk_S12w#p#Ghz?4BU9AU+xcs2gvmOWRG~oE^!Za^BOAqN_Y>x!3%Un zhw+LFxJ7zJtqYn7ae7 zAr%euJG9S-(d>S33GM`UJ$GyOVmwe*cVYhJlb%R#Z+O%n-UK}ICwvO{@Js$u_+)Z% z$=?ta109ybft5umI!w@zs?%Ryocnf~vV!V|YB?3zUQJ=`O8SQ8x>dR_y2ASQBnDmw zFK%V%O_wkU&T<;bfl=hsrhvt@(Z}h3>#k6XHP%Jy^0ZgASG3!iFwk9FhDs$@^IUTX zE~b>msy;#*Mqza>30K4MW&S2du?@_^GDS(nHTeX2aX9y{WTS1y(bP^>Lskq2`aQ6& z3c@=OPM2hnq>|*OxDV{hInfj{wcR8I>?ZGE2>n%M7?QSpwHP$<1Q`M*oM?S;jHigA z@X8+nkE#y;e}+`HL}rKVq{~y$G0&h1s*MvTPQFlXmbX%DA#2O4$Wyo!GAgJuWU&=d z+>V=-Q*T>D0_8*@E> zdERlVv}0DrJJ%`K8rMLu{GzC9)0_{%V9q&DpksLCOmTkU;Y11JcB);1%Ra4RZiIzR)3g$Parlu_8Fr#4H1Rs-;yN-G*E;l3RXwHtD{W*t7Uv%aa$!&|0 zES;3KxoFG`=+G}1t;Uw*`Nx|#fwL{OD8Q2=Z71<`IqauU&o;rmcpTM_n55I0z6$u~ud$Y2hH*tgRG#6%P~|axsS}w<*_>)HxrH zraq~eYLwMC6*D-I>XB6UnFQAbq(Ib>7a#>tPj;F_9xpG4%YCeTISEjC@-R{>$K$Yj zrBKtKY*c<%79zvpgQ_N}EiUyOjf8m|PNrd~^jr0%$s3=>p13u*TF8@-{$$?%80Azl{yZ2(Oc8A{(ks$Nw(J}oOYSHio7CuJ@RJc9n8DVEQKuIr+AcsP0`Tyrk+2Gvnjze*mTYmha%#N zIhK56m36o^&pI6neT-e_nB`D9XE}Y&8N7GXac7Of$Nv|}Xm3G)dVyQW$)3G|YM?7A zAA)E&I+=o`INlU1NK>E1efXX`(Tyf19~sk;(jci_l0$an8W@Zy^df6Xw)hC!97Fos z*g!Elk|{8ZH^7$6B)}=Wi#&xqcio*~GB%*EuILKop81G6@E3PSA@av3!j<`Ph0J!p z0?q8;*-1s@N3Gt;JKVbiE^-@K+f1}>-AMy)>MiLlMWR{>(h9o6r`_j%i2@N{=)3LH zf|IvG)4sv~*zX0K`j-=QRp25O({IxMDw6%UidU9N@`#e&sWKkJrs9s`HnNKmrJzj1K)H zkLy&CpFzd+DEksnxlAVMWl3Njb=z8Uz9+HwjRWJaL$+KQK9>y?4ruwiZokiuXqnHY z`RRCO2iOCxm?!WNg-&0TOIC3YQaVGZMDI!~k$r0yI^$aO%eu>tf+f{qKQ<{U!MtBq zI+V>+Q&p!`Z&Ye^8Ip~9@X?M`w6b)Wk4Q6Yp^`9{W~4Ggc^!|1M)3-lT1gTiw~@zI zTc(tK2c0`k570@-C%B|n@gR?u)|Xb0hLT3;pfdVE;`;+0n@D0_NABi4$u`)JtCD1i zAk9yf$!sP*WimZrDE|DT^bx=4S+%k-`UpQh%HMqFJU^L-KC7hQh6foXEsNJ-kEA-Y z3&!98UB@YLmaDRyxe!V4VB_!^boAVJmq0sgbPht3U(fN<-rb(ZPFKO^u%2d(H?S50 z_jOpZEKbWWc&>m&N&8Q zN0A*mjjYZe3aPSzvJ(h>FJ*sr$Brb*Bq&o9Q*aJnk~hQ28zY-bUgTiu2hic`;zFqH ztBJ1hoUBv|Yy5*zb5z4=RLTE0={o~RTAAZN;eQL7REG6*m<*pvqLFAi5;%>IfO$$l zLz_y*^4{G8rS?no(o#&3=s*r-A8A_{&ZZ!z!O|S^<)`Bpdq|fd7BA-R-pXp7i|2a` zI@RvpH{7X@P(UAqlU(G~I+r*KIL?qvS?In1HT`L&*1{^t3+}T zpO1?~^2R6#F9-hPevJrZ__yPg{o5bpe+!p1%hwTSc`;^vNPT%;pVyC{F30=c`_Y@t z1O=N{kFRww&bl|$dF}m+$(uBhxX>z)M89_&U2p()wX&!qd(IMA!R>gYuQCbbF8kI? zQ7S5u9FYf)kqT#iUs8dui1WA(U0HFDc>Q{I<^ntnsHgtNN&kkC{|A=l6IHGRAF-~ONRAv^8Nc@nVdI8Gk zqRgC2<2BxgQP{xl*or+cGVs=ajQ6;%Urc`TA#nBHxPRlxPfqoIVnWJuI^$HY2-Q|4 z{KEBo&B+z*OBX+xYq*)mX`I79>EpkVYVa1`b3fnjNA|iDUC#~j4z}YQ9_5|voyr-q zm9ymLA9rIz5cy+`5yV*yA zsCx%+cAP*lw1#}qiGlWk;(>Ioz&PC1*XdD$d@o5-i1wai=lkxS0#|*`)tY$>v%z;? zp_UdqcGz2xU39|MojEvW>uu{M>vHQ9YhMt!_STlxCe~KWNEmJ1ZoO{JA=zb%?TxKA zQxr;oJygLx*u&*??Sab%GRpS zsygaB>Vmi|4BA23TUw8{3e%5f>voXH^Z*3xuN_pAIJh|D(MCy7Me@P>(tzUCUghm_yLclLcPZ z$5)KK(;X0t?P5V%mW1FT^2LhHOmN$y-m2N9-K?9TA8+UuR4UjXyd|V|=+Dq8VWRLQ z;o^vP5ho(jB8o@0ifj|vEwX>)h{(>7iIEu**O(j<2p<@JCrlpJlId$}m>6=(ut&c^ zw?;cdGYJ>=GUZmqby5bO2*0J@n3I@KTt_rCu!4J{fNzTTGu`n{x8A+lrFG5xv)2{| zF&T%lCCu)#{Y0~H&UVdq$9B_}W6R{E%dpvODiD=KUTbgo%$>OX-{RsZ;3!K*+ECo> z2OX~*UmbF1X><_7VGvX3W-3yP4dY5|q_e)@x<|gQ*A+v5J%ViAWOvk`%Iq$#-8gSe zDzp9Eos~gU9{S>$By`4~=dT#(OJeTZfQAW@6G;GjjLP_-=ss$ZS*UB4WE^;jhiS2On#JSAbC0iIJR02+AL zcun3$qz(M?Ri{Ed%`*;R_R;#ln?N-6-CCZnPZUYcd0TM{+!_MfJ(I1}krS!0L1htb!`WCH1Kb}tlQ;zbZhb>P1F+#Fk@`c)?hx91CXmiri zpOH>74BWsiYd{C}28CQL#c;)L#eKyuQhhq0seGiAsRUISRT2CvQq^7MYC3%%l}Q(L zaa-v0kD_TlN7c3kRqiZF7XIdwFvDAL7z`sltTTyjGrW=Bli)XTc)$0%m%68del)^U zS>CNg_wmd1mI;l1GF1L@cXO{KU#&b@5$`hBJ4W6_+y*Wp^bp_1{VkD28wLv?b(y8r|_ z5tZ*<<{forrr1aFjk~(z-EVQCj{$jV0m9tC)yUP8)wY?{a^98V`iw&%p4nsl-NU?t zeFHg9eleHh5PsQ{-g4dw-a;UCBiP}ulY{osQ@|U~tdjy{Q#A9nV3vRjZSh0qMi%n* z;?8jRC8B--1#Cf@IUXtNTz!DxNjtZhs@;~^~ZOg ziblLQSF$wq^G~U&HmDwG`yc@vS2fNBSt2!>&7uZ%> zmYDkFjmjCGRWGAL+UVc&eh&No@@s=H`cJ+O?LVAMX`FI9c|>yY39W(mN^*lu z$qhd={n-A~*Uvk?mj9vrot(Bmvwu#1<6O%~dn;Ed?`J<6CE>Zem}zDy|GGerLTd}3PB>6xT%td5EHh1|#arT>y)M@GJAI5osse`n6#@ze~Zyj49V z+;Og2&d!dhq*ml|BHpl6K*znv+yt*cFY`Y0JM%a5ck@N_cyl~{q9f=DN8m^eG5MG? zk!*Zr{EAyI%b0F_Xxw0IVw8YB&&unN*AstnuTGVzZsK&9(hwTVmUQ928^Zj{F?i+^^6s_AxIt-#7nYc8ZrgdkfyX z@s|6R2sq(L+h$t@oHGhX8W-w6&5sToo?q;g15$b#U^prS#I41@L4bV=H7n$9=_$}4U14YFFo zcgZNRShUOE+Gq0Ycb9j0969#qwx!kymI3DRrb))Cc^z{{=4{CRnbjie4QU#qGDoAP zZ<^)L`k8$uXK`-7yduWW#?>VA6@WkYTVw3y937ksTuz1;f7ihR1f!afGKqk z3>K1E#6bx`4T3raO$0w55Y&ztD)&)C)i8Y1H`AZh)z)1gZ{xjYhGqzR_ApW*_GnIO z9%)iEd79s(yxh=yC$B@U&D4C*Y}3>xxnvtED649@ss^bM1C=%=$K=TuGo9!#2~8`} ztZYEzGLDJ8ZE$Th7G;81?1lH)3R-%Ls&g57^5DR3@aopSMc%!hZSHHXhtBWhn91x_ zY+cbj1zFC3$&1YAOmj^wP2ncLai_78@n&9U+;OGwSHH+EmOV7BXv;fgVdO`0cp3>V$w&XUr2YP%QA{&h%>&X-$-Ac-Z9;i zc0X-cTAQ@-X-m?sl7u}!UC7v$(K%C=wI4s7D|<~&3qXv$d1H;kOf${rEoxhL`*%kZ z*AaK3_aEOt|KvcDD3K{-y_g6x5=HD%oCHr~V>u&#DURZ?o2ed(hpGxXXNUf_VL?#) zU(D}>_K+(f(?c4Cguc?Yk|6P$z!JaMH`MdlRo;2d-q>ch+%`WneMfONEzh5OFgGc;785dpa>K#+ zdg9qFk@q%lyK$xI8i~QXY(*UVoQdweo>rA7}Lo7AW1jJEE9(1&E{&4<7o=Z{Y44%O=5znN-KJ@SRJ!zgOCV7s- z8+Hd}>Kl})Uzxn4V*Wx8nAe5A-SD#SU}fz-hwlfOgBM|C2jUzpjH`MPUREFTv^t<1 zz3g59Pf{31*e%$TqvToacHN;W{pJcrfqxn9QC*Cjgx2b+>MrUU z>c-%1<4EUStG=#&$Rk~CRm(KxG>tVKHC;##Zo$_PnxE>OXl-=rSE?PVp446+@y#4z zhR9a%?AiQ!Q2AO(L@WM|4yul-Jup2@)Hl_^nyGlVT4)z&Q?(7rNxH53tjojgUmTzR zKl)z!f%=*Hz4}x7-+HN`Dy-iM!*Rp?Khrle4WCeo4PdJDEp%i7y0!$}Vr>@r#$(ja zRAp7ul)+vIXOKJAn#8Sk#sN%!x`f8Eys52eG^gxq(>GHVGhBX{jLiMs zX<7?nUEEZ}lx}>^Nqfh*&N!Eu7ehI51>-Xk8`^R2oM9SqNbZlEBdA1LlS*zFv+t)g7IRma(nBLC54rEN%q?Z3CUd(>80yT31bTiGk zn+gdM;WoHMWALrXu$?DKYk7@JF&XWng*0Nle=oJwQ|}aSg7*bZ>anO!BRpx$(p(OL zT>_r}7ntF7*HyU7XD**BA1kz?yA_Ird+s7Ig^kf4oFvg`bzlaGMw28-(m}$%vR?9v ziek$AaO;cIQq6I6x64Tx>cw7_rK`m|x0d(pvi=IZ-7Y$pTfAkNn;>Uk$ftqCQ^7fE-?PxRdRI6W4U&r<{9Z*7fIb2j(XWAugd(Q#|n!gKiq$FFyUp&UCK+O>UfnVrCDiLrYlpFN6`*; zP?lDHWuj0CIKMvfkFst|&8r}6#M{?ba)x&aMsNF^R0_zD)e!ao~7*&43nBs#1S z{;@nJqNALIFSIAseSLosf52A&2ikNx#t1l0W1x%Zwy27D9lFu_R2~mOPAwqHSHYKu zGOzUufu0r{KJn*$y)~`J>?IXY!G#TvXjej!$AW+9U9fnBfFX z&JJ+#Ghp41c7`<;%v?U1~d;tsiZVdUafQ9o5r z*NC)>wL0B+up~FB!Y$avdg*KFWAtKuIw;c!G+58H|Dv5+rKzO3in_#&N~N(%q58&7 z*;MIP>}UE_km8Db26Mx1FfS$w6lE;Fw{Kv-t#Of_A#=$@o=Sf4HF~aGDyu;-&~kdO zJpU&!xu8Hk()mjSs(?uL;FOq%V{$Sb+h25R0?GV0Sieo^FXn+rJp@e*@?L}Q|3Q~q z#{C2i!2*7g&-oHG$qdrg734``x3C6x(h1CDRn@W;wB=c^TGv}=(hUsbdhWBX0H4dX z=C{>n{jCJ0JIlKK0cInB=tS6q?0#G1pMNEj)%U>m#P*4FJq@YljqJ_seOZZ}>>Xf2 zM%WkF|6`t`&EDK`)DiC-@BHd)&Z(?}XMRJkI2h!^=c!GXy&0cKJ~A7((xHZ+1ntcU zIFs&uoPQd8!8$yk*T5&g`rr6}k_h#Y*#PgDkaq_+_iK6ylV1t1*9<54lE6t;@NcsJ zWhDM|gi(8hUuvNE0rNSh;U0;jD)|YHxJL+*03O6#bPq*#XC>?vh;E zOMOxOljO{m8i%H*_Jy{rZVmH#3jNs$FX*4>U+CZKt@<2({l+A#*EkHO=;!FC>ig;k z=&S4hw?-=IOXw@;>+x$-eJgz@R1IC2pHfOMXHNTSU2k0h?t(4a2Gr>zQ10!(`*%y# z77fE#Wt{RDsnVb1lc>P=fc)n$Q%xt_BtNtu3aAh^O3oUE;d=C~WG;D3t1)BRj}8O_`X*sppp zF~4DG#<069QQ#lMj~h=8?_y6{fzBj+(OT|m;Qz4%Vq-h9n`8hmSAgHl50*{OS5Z-a1P`rhq9P+ zEh?k&oY+msH!0+qj7G3L|BKDr0u9zTe1Dr@YwN<#{s4^`jrT8&9Ec`he+$GL#i!`6 z&x!ZKvApKB8^xih|9X=#z700^qU13X*(>4i*ecZvGvSfi$*#-Vk_#~$E^mjjDQblA zYQ5%|rjqtPmD&ki0sSyiA-?Jh89JfKS!FmvRhG*vPa_{$Oh>nhhLWz!C8vJwmRwhETQnyX zjkk?8$vf<84zpawgA>j>*bl6Fr=zYj$2r;+aFHH`=jJmA?mYA{CFmoj!VPX?zKW6c z9>fY7hHLJ-zXA^IYk^4WpL662dqstqM%h$c1rDmHxU@I{r)4ym7jx-C^Tfq)&|hXP z*Ml9*k=DTJ^#qQ(ER)El$o4X^Oe~K?GnphG%11YOHF(atKxN8@) zwew3hq9V8ovvmX}=pKIhF#iGkN+RDWRA&RgAj^YphceatFK=h`e)qg;(xZ03{dMwh zT9je1#>}F}~0#}$= zw=ysRUr&FYcQicmOIWbeJf}%GUdod5`xzc<20lZ9DSlVM`WNHv`=1wlpmzelt|Xo5 zyH^J%*NyjL1x(ir-!SIt4dA_L3SL@~bz}FYutzS3DQM^o_Da2}I!95q zCZcNXgA(jC(-5ub!R)A7RSGK^Y47D%ig zr+yuP?!yYdI!jawWyfpSzUfo|RRf^`6Aqxoyq_(24CGE&#tQoiUr-a)?l_FW|E7sn zKvPnLOp~ANsRIJBfot@X68|n=ahTuTr0N&*rjRnx8cm?a^Bh0o9I)JYx83y$b=f*s z64-M)636SJh^gR;`lE^2>l{lxsdZ+ei9SX`+5_?m!^t9Fg1`K4df+JV;98!ip7zX` z9_%yw#`u5u8-W)Ua0QSU}6qnd$C@;oBk;qwCbOLhU<2ZU3CWaMSXlz|8q|L#Z~D~=E5DnDDXG$@cDo< zPy$8GR2Y{Na4yg2vp=G$_{ALA?=VKG)Qkz@`kcV)!8g;y5jayPvkLOa4rwHvfPeag z^fj;Une-`)_7s%tgUJ*rO6J37=G{-H)+;O#OJ0!X(@HECpAiie#iH3+%Q}|@j-!l7 z^nXMfUXNVq{Y>Kx_g)3J(BUks4bm`#oU1KNr~F9HViTvs<-_1W-ySK$ek(aSnPO@(tDEgy0fIK2WrAku2}cK ztbvCplIwfsd(L~lqx|g1J+<3=n|8sfr^CKWd=qBt*PdMyuMW2B_w$7BL}l z9@D2A!tLBtPE;0EJ|ef{E9n_d-rq>sW3>NL;Q;y%r8EWaUPDrVGSRm*6n_&<;4Jva zny*c@{Dd^{aa6+j(9OOh1AHrbhozwIqqyrkpm_+eJHJ53yxltu{AU)AMW`Cj^4(DG z@-sdglidrk8rm~|xg&da5=eDpR!C*$#Qep-+n>tio^I^HK@y7!qeTeg#EzdY0ZS|YiLaJ<9xUZw$>O`%1?h2 zYMVEKL^Ny*M0+?DuW>DJi=LwedM$d&efNl6;|{;S%+IzmbGYxH31C*L#N{Z5{-KyzG2gDU5w;`9Z~Eayv$`qZP(e{FTW^XL;;Gxv~p&)h4uU z!tbD)#91IBJ*u$sgDy z?59>428R5%P#B~r8F%e=y0by(yUL;x`rpLiXOc?N7t)zRKPGIKluu@cwN_C`(NQs< zD&v=;s8Xa_#?GNt%~H1elRVQ>`A#vJwC4W!-bYb~%vP+B-$Bz>L-vfiqqTG!D#0DR zcPFHWB{fJSdcqWu=dhi2W`%^Ik1FY_Nj3Q$2Xax*MAmU*w}Xkk$DK`>_gmFj(D@Zq z~86YSmK`wQ70+6JH`8v65bTIdhFF%UWBUbEmtd?|Gn&KBE37cK~UTDQ>if@KO`F5t}HCI88MDeNNG5vE3dt+9<6Gr%%>3KX{ZO@;z&smnK%z!zBpfF?_iMK z&v>n#p(sD^$mdv$R%SNY`6sOdtW`)2t!%A@rl6tJKH|T7RLe7LZ6|z$zYc|iw<*= zqot#?Bfp~}`L9jkJiDTBYUGG=e6k<1kGGewr`p!o2HTp#rw&6wSlxcg-qE2!ZNJUc z!fkR71!4P6n&mZ4)9N0`1T4gJ{COxf4ChcGUcT*AvHx-J)!Ce9NgalhFlB z0+(_0j)ke6i2g4hl~Wi>zrV!q#S_6k=hIQnAa$Y~oyY;EeXG#H*OE7(3+XPeO-)-| zE|uSBqDcqlxTmpqwc_5ML2|$hNdc4@r^V-SPt?P^)|p=7lCVUUB(J6jSLP{ys=li; zHD9$?bvyMd4NZb%XyVI<>YB%p1BY)F1M9$jIOUK`jj> z^zk~8HbZ?|wOPrOGrU5T1+nz3c%aA-*yO9?{o!8es_6WT`k;*Uo%w+2jPYRJ;oM_6 zYqOtZrDggvs%LadpPOceVa)oy>-T6TVr~0)k3;J-hb#~l9$r1XRrv7m4dHvjZ-%eqt196sVH3hKL%W8) z2&o>jkF=R3K`AgLr}Rbjhja~eDcbegPTF$X5Uoxdp)IVfh}*4=wz0M{-WZ+MuSv%V zca*HMhIn_+;g*)Ex1gFalX^A)oZPMWt~f=G{lDbDDix39D>!!~@-wpG@Vt*n`l=@6 zk#E;n`i{OVRh%Tw6x9}83Pc6wkVF>YYvvv5xr9C?%GK7n+u^YfwkO+a+a56E;2z9R2w`1DB-FQI=ej z_s-%tyFRXRPSIQVgJtB}-?@u49&b6bU5!uLmXjdVmFk7^wKfz+(KF|n~z zVsFJ}#_Hn;Ms?*)KCOGbiIr#)^z}BosW&h{^1gc{{Ue*0HQI+2^wx<=kf;;*s3KdAsvuB&2*{ zLblX=z}&%79Nhn>?VJ6QW4m*WYnr>RCk##V7;2Z9>~}T65)M(p{h-#oi$`@0_+n*F zmkj@5rU#5Baj-I7R}3jZ75(9K0FCIWJA(>vD^+`tOgdlY`%odL%M$8<+IyiaFQ2R5)PnKf_`4jL4=4(f&({nt zZK3ik99m^MjD4ziOqTViV$>08wOS5>_eOO{HHj=kr7DFUttSesxsy{QUw$bZl%LI8Ty1n64wI8U1Ycm0ZtWBH(JC&bE0IZ`*Qms`TAmQ$( z%E8psG*vQRUnUQ*zDiAk!)#?GzqHEV(Z3F6 zs=#ydd#lUL!WuB-cVNeE(nHIFM~)VoM5j@drhr*za%viV!2YI?Cu=A$6cnuZIjP~udPbj?`Byw*+b^Uh=lR@sFpE<^%eNj zcN9OV)CAv9Bix30zQC$Kg9r9Hndu*0i}1t0bxwD-c50j!M;dt0ImZf;vucA)JhSgY z0o(^(vW2~keIm?LDpS|yJMtWVJ2&7=-0q6QAz#(=gjv*AVIX(H$<2h-iG$fX&*K>y z%5&)4ci=Vumz2Z&)FofZ0XQNvf$*NCtF^({kr zpGP9xSa6+^@C+G&uA&FzlYSJBh3!j~ZWcO%q285GVP@SG7)_IEocfNsw&olYeFx$> zRqJ|yaPQY`)vedf(N))ZwP#^CzcG)ekmf8Zisz~xxT%{dx3EUW$WO^!r27n_tN0|A ziQ9;l240}r80>rCt&LK?B6_k??%U`(Lzq~#jLx~Lv#3+aDWh=unVRDy$*Bz2a0%y+ z4IJ%182niG5cg+yP0uEe76c~M+n<@W1N=t+dUPLIqQl~mlG>#9WeLw@+vL*}ZItCy z=_Jm_Xbx*C!md8nN|{eJglP+xboX?xn8oy3_fGeeSM#qfPIp&3S*zFX)a2K!RQpx` zs;;p1hbi{UEv$eMOksLKX2KvbS=XY`fmD#P?_j4++zHjZcj>Jq^wzE15$;E>O(2Bf zt{+sW!IC*~CnF{&B^ZWm!PB&31ltM52#8(KM^Mqf8>g8BK3`4palt2bsT7@Y# zC&)}nBhe~9y>59Ny=BSaEkW9BQAs@6yG7{o8q$x>B^T~7XnG+Mo2rs-*8tw95(yFE zBrx5V>|jb-GqlM+P*eXaj^z{^gC6HJNvTFSwGQA5*UN5dkQ^m6e{5Eur*6S4{z{HpMn{_5Z$D2J`av@1hwsK7=U`BFwqCr zc3Y;ao8dNxlCm$R1KmXK=|7;>Ghu)(fJhZam#`Miv6xBA?a?Eg$DLv%7r;SglMMB7 zIQXt!B*0e5L(47vc%3#s4V;e$v&?V0KO; z)J30the60&_(FW&@uZ9b8*YGlSn2(U)@d)PsvXgoc)*MvyI-Jedh7my53(^+m=Aky zf|b_=d%xsWaPJL4C;gR_?a^Gf&;Al14a@nTJ>aQHqHSCU0oHOG?^hYvja!l^GAjpx zkj|H`lrAOj<18$EDi0qsm`ZX##g!$0RVb zpRVFyUMt-X{>+Ey%S2NNtip0mq1K>XiCpI|{x)c~N{Tje_x{Z~3uWr%bhP<06f$q{ zaO@C%fF|uB!!L*PRF3a4M(#xse?xYHxsaW3ep!W=%{Dr{ICyM|CiqIqtP3f1$mXOLE1Zne6@;Zs|GKUjn;Omt5wfIMXED z4Sl4?@SW8nMdgW5l78Se=R`l!IBvn*IXTlyDC#PDfUNA}d^D3Y6h)eNA!R&BZ4qT* zWkIC@4M#wc0Y-m}({mMnvJSq0;_w|m<(F~PjG;4($BloE`SE3BpJ60xlYcpi`|m8c z(OWb$KhXs}Kq0)BeRC`Rsx?e)JLswEdF&p*Uh{*RyRIwPbrVlsjPtOgJ?heb?72*D zvf!c2PY2SPO!6h@yndUu!}PT_m117938%QqBr}DYDlyw+wdpt7=Fa9l-~bgYi!JX+ zXzWfEX0w*Db+K*26=<@lQRkEfN$+YOgcoy({Q`O#t38rBE{SvPpyQ4sli48+ok`9G zB-#Bh$EqIQ`Q@msez?+6TPfWtWM3~Rj!6IJ>JOBeWnl$N6i5 z2^);g!j4jCrRXO-<_Pqi+2ST-ecS2l4>RR-AYR>)OfyZ9)sgSR5kCP2rw0nIvgirb z>S5~p>c2QkZJLSNXWFWqu^GBEOG;?%+xxokG?z zOY%<0?+|N9Y-lMSg+rCh`8gLdl}`C*@Vx(H={&%jtpBf_y?2vz&=xwFKlUCXOF0s?}v_eQ2H*?aGypdhkaC}nkKG--C4wE5rozE`eFfeNL4p6B}+=iJ9w z*|^J~HH_0c(OO*6)**kQ1pV_dG>koz+hHg-A#?Tw?DyJe2j__X5LPhlm=U|q)9*bp z!(NjEx|Z3=_;5ayG6SBiQRq?cQ@hs>Johi~cjQVt?)!?QntR@P-jBR7^!eX-8hc7h z50dzihEskmeXqsscKz)-j}m_g3c(q!tvKSZxjZfds=<+{^^cL7Q{WcR@y3<5DeY1E zdFgc2{l`o1mR6MNJncN==w>{g7Nm}Oy~BJje8ccfr397+#7v@Iz$IA^m*?lOJNz+f zzH0OyF)H1EqUn6s4ssIptk_dgLGthQm_;y&v*v$rP_u=Z%wjK-*=!cKV6r+=JOWSK z82?xN{Q;8a=)sXP{Ij=f+qMAIn@mWq4e10L3mY-5YR&5%_C9U@ z`?-o*%ZY>Q4j+A-GuA;>&`LO+*|dhN=rQcii*c5ACqEMbRYLKv%o{4Y!i5~L0JPjYyMQvg7-yJ1b zvaARW(i&+OPOZm05v`K@oNXrYc{YUkY!~zRy87AMzM?8|via?6msRBMazb=1{3f(IfQXq+BMP&C}y2c%Q9=Di}d?*o#)9C;JD# z={}O==Hmm{Mb&d2D!{4OHNJyRJW*1fGD#$J)F7{~G28NP>^K+jJ-RAz3o5g0XwcDfA zw9x;*%?|twMeSdF6&jR3M1__{wcab@ESt-jvxj+XHv3UMSsxSV+8zfc1R4dR=-}4- z$N9%H_x+X*ZHGVGFU9%S9~a{v0eheZnL(eDKJ_*Jm}N}<4+pOXbJ>?Ah1xScn#~sA zpO7Pz9B$3VY%_D)l5jeFpr6Pc_oB&M7kNl-(nOT$36Pd;TQh_qVqYf)mL1txp@5U@U{7!-0uzi&QNBso!GI&u>*;) zm)^ns@E%+8C!(dI0U{~63`@|RBnpFq+kCCoa^3YrH7h_j@RX`?5o*KtsTtFtK@@Yh zo~_u05^Dv!&>xtNe8vtb8P!<;mBbmU$gSn;(9mzf=X?Y8yuZ8-_2now?g!Cu1uNo7 zCYXyeT_Whm-y|YCdmdFuEvmtjc;i#Z(m9PfuQr>l9gy9saTQ#Z3fO-BE(^*&md`*D z&=^YZX2lIQKlPRUmGhOGAVEG$_kTh!yMQjbKUi zWOgx(Yi5=tQL-7Hz!U1DRMCE@JNLP&OL2Zy;fh#-0{98lcMDv4Go#7TKVaK*W_Ew4 zY&$1;U*VBMO-HF)(Sd+J*ps^^)=3z@=yQ??CnY6X76 zQE)>ZMPw*T7NfI~<04;0hgy>g{CB=G3Gg@ap?!^I4(}Fx22tx3w3?Yzax%yVtJ$8F z{Kt^34DZ^HxBYASmyV*IJPRZ2NO#d&sBnZ9a&1)Lm7XnX%GWYQDps^nPE_oW4dq|n zm3c>F^jHhzX5|Id$C?t|m&Q$oruv(@Ed3w2eIMyoXw5p6X__TwRa@&@j#{M&s>D`_ z%M(oTA6k9Z74e6yH_gRyf18h3j+k$o;!S%^V@-1nO>_q}UZ`UqsV*wC@~~u$Xple} zi?7%dU0F6Z6c?Pr`I+hej+Emr-XA=BIV;m3a{XBPb!khK_l{CAnyL|O%>w947mykL z1{Gqm=ej$^bl%>xia6T*c zM8MC4{P@;4D9YkXf`c&jM9i;B`4vT0gTCk^i9*>8cs^=4|W7iH78i%7fAeS6xzFTH|{4!sc#B07S8O<=TcjDLTA;|4b(LNhHxXSG431eV zZbpBKyj%7xbTGIi@Q%NVuQ93O7fSQoVVA2!Thhuo$8plGwa>NHw#jXQ;@8FZi#HWd zz%8}4D66ov;AOrq&y?5c&5qZOS6{x0zC8DG?8}BP-+kHp<=&T>uU5T!=XK(n$eVik znFV4zRb7jY6lE7VinPT|iWe0>Ev{;N$2Qb<*e0-dw{Np2Id(g0LIi49a+I9YZ(KWE zYh7!2TjZKeQo?L1q4w@FcUfr*?;c;>z>VPGu)AzZ^w09*ihHq!)L#u?-%ml^e4OoT ztMWe4ugPLN9(JLaPlYAEE!a9ZGq9E{;%?Ayo$jHo$Icy&r}owMFUhgKY)^9xbj)+y zcN9BB&MMB@PPH@N(bl=knO1VSq=_r&dggwNhv}O47>U2{FhT1LVW0}LhpLf=Ov`Fi zd=|SXXeBx(P9n9hy~3<|tbRw^OP8oWpw}4M^0F8T_2=}9^zr(Bx+U5ja0A+@FR9w8 zYO02-+^SdVd`-Hpul|;yH;I*lEVr%62|W{gB~`9;tEVAFw{QJTk9{Yi_!4IHb>oru;92^F-Z2-5C9QhE$`|c)_$g zZku_9Wxe%y{Nn^$;=f53Ds4$_mNGBpQc6LJGsTdqPo0u-C%HrNN)j;7B%Vq5EB-6% z6|+9Bj?tk1M{`?sR54ptTM`lG#$J>cN8W`032yPv_I_R3&-ImaJxk6GMQaNJc>~|L zUVZnnn{V;n*mW(?`lqKOllJF8{skoc8{7lCd`s1we+1H;o%<(FSK?85tSQ z^fBrC)3#NaS$S}3`;=PA}7Xte6vF zE7aq@!QF71>-op|E|H_XglzXWcxxY&8a*G1_9vy10LFz2ZpG-$mPsW)zJnYEqO?lu^{WXmrsQ7|^N3 zyNgq7b8UK(pyZBk99fQcoEw~Wr@o|NNr#deB^796Cz4ut$iBb>MM4{+6cp< zQe1Lu2DbV?EPSQ<-UOTxr~LbEf5_rIYo!b!vRogsg=1 ziQ|*nR%)GGBPAm>n0lr1m@1Xi-lWY=7i0{|IGjrxJ)aX6NADe+>$-|<(iTP%ak*0^KF`i5n?SDKdU zA8}=tOWRAvicScGv9{$KBj&Pgp-w@s{{SB2I-ck5?_83SX^vc5%i^C4U*Tk+cQ za?lIs^MyI1o=tqZH`|-_1Nx6B_hrQsWmb!wAiEc*S=pe}7Dt?(gJz9`jT zGJKdxXiIOyL@`89;O!7Zwle`a4PW;}s0O)ZiDWU!0t@{X{|&t4HQ5Os@{S}kuawld zO`hSNE}mKtq2tNcc;7RFggK-4XRqFO&^Hb}&6~jK;DXR-I^X7z6qrRf%I8!bK4mT&$Nun&zhI+!h(z;FFg)WTDNM~9k<>RR zGJ&M?^^pT8O&shzdqlTIgSZEdGB@5;k2_?OrQDC~jHJ@SLZjQ5bx6HI`wft^5YWdUh$dYX-wP>xCtu3wHt#e4NwOOmg ze@No&_V|18V$QK~3ELC$6O@UWiA@q)CN@iqheJ3cp=QE`_;&GotwL*i%UtsXT+ww& zYno)(s6Vf>YxUY@n!)NNsz2E=_D~#=SCOBRwSp}3i8L3dORD4ydf5c#@>fMmM4vOe zjPRY@OGf=D;k)SAo-tG3fR^o3W)9t$qIY4|J{lJNa=J?w8kJ>2r*JSc{l;|sE^%A* zCwY>Xq>{7}8=6a!!DPiuLy0>^^n~x?M8W#l<%%4()saXA>POF88Z!09XkTydyPjI5 zW_JbJf&xdb{i&_6IH%}kVQxWAenFn?jo?k)*Hd3Te%a#Xh8LAyY{;#b`|$bq&r_dg z=bX-2n=?1($DGwUJ93WZ?9Dlsb2BG9$MSsI^U~*Ia`i7By}0ml=c_%hFT8n`mr~HR za8*%Zaf-dKW1Mq$$w}7^_tw&1Jj1;2`vSi8WWwJJbPOI3#=$gy5UR_Z@d*^dUr^`@ zNQM6xf^1Xraqq%1XgCDdP*<-yGwH3MO=p>MmA4r=? z7f5o%EyXL)-@Yr{4G(EZ>?T|DU64W6MKhS#HjVrP3B=D-To7K4dNc@0?HpS1lW?Uo z*%KWPSxNo45w45w)XFx=9T|+y@iKW97I5=JwY6@t-HUlD|>mAMs2y3YOC`yKpT1iGMGdz0k>+fvu00guP6jJ2p`}ScGS}@89qQ zILbC-A@szmkS#9pH2R4>#W;2YlW_BNVPj!p$9ze+h|a&d(2o~jEo#|!1Qjs8Cg2Gy zBnPBP#eHVB4rtB!sQLGkzLFlE6gr7+Z7B?*op8ARf_L1=CxW@Zjs())-XY%MaP+5m z$CL3r&^w7#&q@61r{2!q3`qMqo|Vw8b)L(m>q~o;RxTBnzI5Mo|K)zj+bg%Y)L7aK ze*V_dzwk@@O1-6ie#|P}MNikh)aG95t^?1%rfYRce91yQHQA1-Wb*!HA8MD_*V}5? zZWMPeE-ac=lv#AWaByL;U~++>;9!22{Ak{mypeg0^Xlex%^RJ!JMVd3M*a*E5oQ(` z3U?JYDB54txwyEvyDit&&wk6^&+!MH$8_givMZOBI7>#6%BFWu#n0WRbPu!CpFHKB zX=JUw$9}*`j^*zpS=JAHO`pA1um1l~{WoNC^$zK26WPFi&4gm1ES=p*S6s={nLl(v zd({eWRaMPTcn90TGH#+TsPH<+a4E>y6u6v ztL3akXYB%+|E@JPzDNAj_yuHy-y{tnLOt|p!t#V03A)67iPsWqCoN5qR~l65ai!$s z@yWN6lT*f|tV}tW@+Kvml9F08wQ6c8mgiycdII}{eNa`O36Csm8WE7vIHJ5cd+Rl^ zny?Q(C)sAID3K{ocZpLnm$a(8vVQV1`67iy`7Jy6E~=S)?H;IJs2-}0!lSCIdZt{c z?1(pPouZ>cpty>@dIGzsYI3tY9u1oXf_pPg5G~2J7s+k<06p6pp7n<%jU>m#>Ecb~ zHBINP>4%O@hoATkbG}t5NTx=D%w>k4nDp?O?uM{*5WZ4E*}KppHkUnMUX#u~U=;rP zBT%3`k*YYQhCo4Iffr(ZbT2da=QvzS*zYOIYqJ%e#NKuf?Cv-?PfIKASH!`Gy2{?O zHK)@?CXgi%T{WCu5gdG%|I2u;V1F_JPtLz=RGN}f_%>brI)0B7CXn6PdUavH-h#wJ zWvFX#L%` zo>`n!e7dL$T$F=_pB1JQx(hB9Y$}*ru%h5V!M%c5L5;%Rh3gA%7WxYfMb(Ph7ELSK zQS^#jOJi}f;`hnHTu{8ccq>Y*8^u?PFBRV{ep4*8{m=G=Z7KI(2m3C&*0IRpbqs*O z(Z1wXNnbLyXSiFHmX+T2T=Jgqo%Wv!91LC#Jqi~>zfqJc@Bv+m?HBxn@-ra%RosN_ zP#=^^-^%>5rFi^zDbjFA#Hl8!Y^48AQ~#;NuH(C*UyqFtmNscon2psl4xITvg8`zoe!*O>I`|)N#C$pjy0- zc5SkHsrsz?r8-&D85ZDn%@vJ96VoK}|E6hEwM|iaWNPbat-NY#>uVeF=YEJ|eYAGC zc9M3p_D@pQd+1i^?7GhSy?QHYV}*tWqywHe+KkDj&rAzV7flY6F0N_ZKvHLR#@&w# z##J+SL$!Ly{LGwc=|gt0&(h6$)M|+TA>J0>EaA6=#KfbCU6bAYCJx^gFW3NtG*CHdl6~o==^X`bnym9z&YaHTfjDm=lvOB-#?HB)k*f&pOGn$UHM{ ziD{4VoZ%cC{jGGq->JV)y{~McXeCdVS*4XF2C-6#Di zU$|d%e0kz!-B;&c4Pn0Y_|5XXA^GhJY8P6IyhT~X|JW|u|8iV(?k7uil6!3FFwaM5 zw2%0H^fzPwIswwu^pFInY+1NJz7kdBhlrH>urXN#web=+WBXuaf4r5kpNUPyw^V_P zgd6Z@tz(XQo$7HDj)f^~ncE1f2}_`T_D3`EFLUiwJdqQqUtG8~YnA^AQNJI|vKvq} z-i@dtuCj||%b*K>Sk@LNeFas^L1y+_d2L`Hy^M^rKbZvYgQ{>Q{4AUgk5Iv=uQM~> zU)i!am@|!y{0_6XoQ|a<1iF*(tY6^njbobwDXY92d+y}7`J@n8TcTQ;N}}>>G>bhs z(;rtP7?M%1Hj&B=BMn&uOYM^ml|Xl`pB zXzpsR^R`DbNi!Nva&Jvr^vNlxlyw?8+s4A&`QF@uruaW-? zslTCgpkxMWfS2s_S_;0SF0WcK8&6Na=xx#q^2>fEsh|iB-Z(a2L*dJJV(&gZyp~D( zp>S3>9x~&JvNYU`iFnm|my4mMcIBG5Bp|5{YR9`czCUFrl7e&JJIQCNeyYE?TSO|V{KblC(X4PTDjJ(d8YYYGm^ZWZ1vA- zi~4s+h_{qI;5@WY9Dq!_Q`TEnfXc2juKiNFja`yo*}>d^GTnw>&69qP>dq`5h(02Z zys9y%vM(rZD&CNjtV9V}6aH2sWgBHHWhJFr=~5g~EJd~5P*Dk8Vm^w>H|!Fx<7t^8 z?<$wekK&F?mi;B2BTXfhX*S!#e{r+F_0)dGMrW(A7OvmXu)2E0)=?d5$~#2IMOKm7 zb2Aji(NK@MaTnhZ?<}}DH{G{g*Gm3y-sTLsYkOS$PtgrhsjlR2%^UJ2>2==A7ccU2 zHMupPcgtD%tmJ9er~hX6$_`~M%<7s|HOs(UU6oar_m^b-m6evgGTZcY(NoE@`OmaD z({cpQ*FTRuUzMBoV&#hlFE73P{*~qR>DM2;DR?tGFEjsD{@Q{Gg#(JZ6n|=KYj5mm z;A~QoLi*u-_qx(4p26OF@CMHNe+hJDkNGlmGQ6&Aa-?^(U3u$@2JA`HbhQPdzs0*G zBc-*`a;}qifDZG$QViFq5`0&q<`<1pJ5%e|j?!Jw#p&PE&nKBRTW{m_oRro(WYitf zALqZ@_0#y>6n&O%neIJZ5Yj_)?Pbjf)bw-JwbU0?qg4M>WhtjCGn97}-=Lrk^F5eM z1rm{+LKphJ>GGCYnm!K)v zMm*Y{-m-}7fPA1L0S)eR)eZFp&1UT$-4^}th9$=FrrvQq&D|~US{uj5C4>?lChkv~ z%`D85JTIk6>eH!*}|Ix&qAxbt6^2 zVw&74JBeHBm2jNE9Q&8fZboEy*{twc@*KJa*9BrQL0-c0-Q|^%{Pc_*%iECtvt7en zWoY-mfhOi7yso$fh5MpVNS5btAs}58x!LNhG=_s3lw|6teTYN)0**$60$) zAYR~P>4BE{fb<_YH@Wc7e_|FPkgg`>Y`NGhUX7mc50tP`@;|zxgh`aH-uJsI9J-W_Wr+ ziM-@_;}LlkUaL11N=JKdU++)eCG>S`y}P^@y+t@2hA=bBgM_vc?{90Uk8hwWPYCWr z5zv$k^sSJI-SbKI&hz2Qe;dh;yo1v?4py}ecfAy9cqPFeI1}@QD!jG@q6Xwi{~%sV zpL&~~bsO*ff}Ur;ZGrZFMu~|L0Pw6I9%9;xk@6>@C>0|s6f5Z5beM$rgN`_ zmFQ`UMI*)6@eeJM2;sdBqqjdSAF61ij4E%dhLc)1ohR=qZA?2$_eR%&`&CG~>lnjA zQkL%+{04)uJ(6@yVJ~wSLJu+2``z|gk&S-9C?qGi3+@H5hvnTFQ-1N9Uan0jY zaraI8O><1+P4DA|IBfjTSYg=2UPnyg&{Tb6eX;JkZax*|AKIQ;vG#;!rlzqbrv8I` znVnD*SF0DOf1wurg`Z!9pXgA>)RkdgeXg0N*-R>}SvwF{gb=pNaa}Y0Hod^m+i;%E z%|4@wzww2sOWeJj8B8KwS_)A6X{r2GoH^AI|fzT)piyKu$T7wl#ezXv|?arBlCNuBru z|NgIKmAF4cc*pXBgM*^rc+}-R{HuIXZ$Ixrl2(?L>d2|mxF@+BB@;`6&hgHWV}?WH zm}M8*H`=P&HWVw0zbYy%oD6qySwT&zy+!#0^4s(3nBOG7UVi8Narrazr{#a0|4Dv} z{8ssG^SkHw&!3)uApd55EdSkt(FJ1)CKRkKxLy!0s8%?F&f-d8tT3^tUD2GPt#lS= zi~cCeEpiv-6+J1sS#+W3K+*1^c}3sTb<8Q+$VcoiI$ZQ8{fCO~V@UC=;$y}B;s&@u z*4QrCRQ8Vc!`u}gIF>o?IpUq2oxkA&NyGhfzoeyW7fD+`xMTQx%1h_c^MB+0$NLE! zsE+aBiSAtYG>qaSv1d3T2;GLby11;pi1~ftI*BUJ<@f8j#9_4$KW<} zH10H7Ov_BKOzq>Q#XXKoqVhj(e!*PzUCT1dJ&W4f)4I#5kM9}3EdF}@oA|_p%!KrW zaQsuc{Lb;3_(Rrjtd*=MEJG}M%Qf>zbAZIjplO^b-`Lf7(oom1N1sG}KSF2Hor2C* zU#no6D$$zhRhrVFjMZ*K>m8>X4`c6z&aaE=^8OU&}OI0^je~_nknjghbp4+3F`vP+4NcETWO;?~Hg-Pvb4IT7T=Cv8}-(=O9 z*Y-uXbR9Ru07*?8$X=#d&%}p#KAaN&1$U=9y3}EO4d+VsNv@&D4f2Xf8cRD#r{KT1 zDV3ve{TgS*W0@G$)O*ydlW?XjCU0V*e6)Ndzw$PhdW6ghIi#=DOKwx5wF!Qq- zs5Y9Q(jLMFZU}Vx+4ul9z_b_{Eo44^8z=i>IOKcCq_&1`kZso>C=0#{Yz_FL=L$u$Ap!gKJcQ_J1m>|9$v1kCT0K zlzfRpkooslRD}&8VBUR(nrA9LmH^t}+M;*aX7oni84rv7CVJvAXldMZK%G&QPsH8b zs$wH9?(w99B}B%TT@J^G7o!yWAh;;-$luL>n`z*2Z!7O1=6nuP%v+U)-8bCx-6Pyx z-L2dW+^zBM&3CVIUv;aQ^t~$W?AhmO&$i}&z8h!~YX+QwT_n%9apZ_C?3 zD!Lw<0uw?BBX2mw8n0xXv<c+TIBYa4gN)YJ6J*x#r& zE;A$=4(iA0TkA9Q6)?FTb2r*`4jgs`T>Cev=zi3-)@AD4BmvCS_NJ2mpEjU5jsIaZ z*S`io#|(8BwO;*~YBJiPgD^8|LtQ9T98zq-CG{2QPc;-uasn^WGxdc^uEr0PC%c1! zuZ7GHZ)XT8lt*Ao-JzP$iMMfO9;L^;!Mw>wu1+<&%W>?7ZC?k#TzzJ+C zJ3yBhWbW98Dfvl~k4A(Bgx(ER3u!}@LjNO4p;zcDJTm@JbNZbJFdU~MqUans8EJy+ z%#6OOu>2!fhQ5k-(cvD7mB*Svp(q!$VW0g-n2J(!BYD(TaZ?!U3(*zdMDg_ty3ROp zDeRTuTs=17IW~ARPz-gZBbGClDi+*lGPQ|R?Fl3arK9n?iLP%A8o#}4vUcOc*}#8~ z^8QXVbSGlZ&~SakM;9>DyDCg4Z^tbfhIXNwG^U4{h~j^T*eL!ESAI3&2AJgCVynqn_ypQzmFUul zpT0VXf22eBB~JR9p|appJlkV~4TDm=M*Gm;b%RZp14D5h_jqf69I3D8eJent`)FlN3h}f#vyeaX0L9rpRrA})w3yWTAQP|u=r)M zueh;opl!bGmMv&&ZJ%o2Y`c;=`IL25mdFmXxSlKI@_MJ3f- z-@6K2_1s(BFoQ(* z)1gY?h3EqNmz9)_WUDua+`Uufogv6hA{+TH!Bi@#i|j{QpibB+{fG`?2aNnY#Tca= z!bp8M&%HGFH19$g4r?dCrmLslLjw0nLucb1V)YHr3l;*MKJLV>q&D>>;tplt} ztp8ZEtU;?KzFzzX@txua#{U?9HvTcMJMrh@FYvZCepq~B{Ap&>`IcFh3iEh#Y24bl znsKL0BTOdKRou(lkGb*ms$JG5Jv zs=d@qg&bBykM*uvqkhbjVUB7joLZmqmU0!|s#N7Ix~vRNudHokHMtzkAW3b(sTIe*b}5dbK>3Fdnr=bsZHHD? zFZfg8o6}Um?WI3Uf0Ztf{vw@*W4<yBk{Wi?O-r}D3E2-9UfgqK)Z z4bH@$VO!~=pTfnu5sgKg;dB`X6=y2B@bl1__JB521^#gzs2>gR0HrdE?(rWtYY#L= zCljgO?Du~|!?_7+%N$&>)tFds#V@2TKSu_oAHG3cR6#y3zn?!!v0?YH|5prKLv?s|Xmw)7Ty zmU~)xUY4#R;W?EZmZh{1HvV;YwmZiiaVL`sx}fwzsfu3H<@w6%_73(1eZTl?L4(*9 z>>7%L$tx&8D|(< zaqs+Y_|zaZT-OiLC+hF%7SdZtb?Z5`{7l;>k>>ggs(ZTnsH(3@soJY-p|mOH;={Qw zAI2`^AbimeWp(il#c(#t@!K?pz4SYt-1;!H-10v79BU}2DDy~3-$D*ys=5QS@LlR0 zby%&^RMDiu6=jDh{Q~_PeQm>!hT8^#v9@uraVnqn z3Fh7xjc1K7j1JzijXB1`&;<}tncRupANT3fgkW#9%jHd87bC~;Sl#oHh$7{uF@u=uDJ~sannlf4fVccaNlP{(pF2g)eU1^1YHaT}+CR5z>~C!U z+8){hHjDi;nD8RUmyT>lE9WL>HP`}j*ErWJ*I>8P{V7|`PdxWL{kbMS@!cWa`-y)5 z2?_&)*}>1zZuel;YryMu0J>3S*vqC!7(d*8(p@!Wdr<-(h7@xm*fe;9grC*^O8$Mm z`o7mZQsPT<(=$n2j}Z_ z;PW8*$gloejz(?G;G6Yw4bAY7?|J%?-^u&3F9YCQXid zjd}!G#ZvX3s_m*ps;?oCw^p@a%9;toye{weg^cxuYB0aEfGqW+swXNXSMdh5ojdLa zK9iWH5Bs2<{7w6`C$-D9{UK}J(ag}i3um=E+RY@@Jf%a?RdEL;^fA~=Ug;K+1@B9i zG3(hyh2*AkYDY!An#{!n_^QS13iiT9nE{__3EsV}OyUnviD%n;di_YH)S$@P(AfvcI+=4fEQxN*&{#u@BOp*GD~A#XjW&a z7T?DuvlGJmJ*q`X`PyhpuKG1(!?Z`|(*u_3T)e=yBlYNVE;8R5T7IXz3%Yt|MI}6> z=ST<|&gUg(+F}#7LE-c^-_HY+?iC!U`M7uL!m2(+|4>Wlz(+7e&{`lCTt~n334iNV zTn0_yKOLipFZ!^N7*7W88DUepmyWQXx1 z)k&bd30|ILs>2k#7G;9z@JNTDWw41_kh}OLzLv=-9u}jeTEygN1WKnSbaMCjhNUG0{!GrbE>#X$K1FNrtNSCK6|=ePo_N2)McCKB1^!bVxW_+|9e+I#3$zI?$A?o9w1(QDd|3%! z}Tw)q9M-t`C?Ge(RLOncE-PPg>44vhaIVRGVcNoOiuO1__RHg#X+JypI;Yr_nAaYmEOvza}r zo~&xA)~DK%YB|+p)sw3?uimJ7jq1wk_G(+Jb*xre^_QxdRkvrRWqzOWPkLJV$h1vW z{;d3G>d};S$&)J$NNSm=O?Yj6ZpkqV&4RcDQ$1q`!x#D$y6f8K8nLDhDYO%ns}+FJo{*ckjNpbAWZulu9V z=sV}_;MIF?dscfEdZu`Wd4_sMdw%o0_E^1xn1<$f8^L%whKDZfOF(g$;crUcJJLVG zKNMcqeE)Wy>jwNhqo^TXp^O@UTj$SUeo(;kyM3r{XhLXCXmMz1=vT6m&%?R99kR25 ztPLA)Y4~3>kqYhWDA#|qcxS!NzdfqCr`Rqyexstqd zHyIkAM&{s)E{Z;r3~{1Rd$;72j8Ert)>+Dysr%G~?e zR$0f)x-O}D9_H8U;U*sl-6d;XP7>P?ND{^2%4pz*mR(}&+JZg6<%pH@&VVbj18Ev> z>+g8MHZp@}Luu^Dj;tP>&O72vT+~nd^Cm#TrxC}z_F{Me>1uo9t zRCJBiy>P1@Q)j^gZ^@4EmZl}ukqY8>p>8~c@qAf&-`xlQ z>MR&cIVD@!RCFn+OS*-rL{##^c@whIeDvTyILA6CJJ&gnI|U{EORnOx_|;XzeTObL zRQioa?w#YU;@j_Q?f=`~GvE!(3#LO<8c06a?6Stttrt>FpMX+QQSlYpR6Tq6t%8Ga zR=1(6+5#i??OCZ3+cH~tXLu4% z(Q0_F!m!j*!l~hp!^7AKXNPsr9Q&7zhi`cvW`VuT1J|)S*YCW@9!@e5B<~d{pc~N% zU4&`+BSiTYT!qhLO*!oyTq&J|!%z%-E1b#cK8o$nV1A`CisvWz7?i>(2V)K=b5y2M=#bI z<>4s2_jk~BkLIgj@sIaEMQyRAnw6B8 zv^TLu;-!S<347zM@n2fcTBMea=Gk$3+0#5UJka0K-PG>YY$cnfr?Rm^BKJw3NH&T; z5XA(iW4$U|(O)CI%QWHp!L@<$IN#QL|MiGHqv=4$xYej^y1Qz-q^>+DW)DmLE;&|m zqGW7IpOW;F680L4oSmF0&Nq%djvuHwIykKKFV}Er%%xtLWnW;wXph*NJH|V1IAqSR zoDWf7?JTM3I_RoKmQCl<+fdFkpaVhAMw2v%#ToT;qk4QQ$YH{>(*zu@&C)*OF{f zUXH>HoF;S2T9P3B8#)nky(_lY^9p6%2qXFHdLza#w@G8_LR0Z=`$VJ z*Jq-iEHczJPBU&ZKBuD5n`)Svo7$S{@XRbW{*JCP)%et~-S8Q?TO;*Fx^Hz_-8AiE z^eAW5bx~}@sV38VeyTVxZz2Dcq}SEbOzCB=>QeEqP^S#yEEooj=|VT57D^$nYBH7k z!dL@1I6ErZRyd)uw1$x~Ia(=tH?kQ0eOe?|_JqCChO#MmL&aqWxPCi?i#VYgFu_>L z9O_^R>eEg=8J?$-s{F#DWBU2&JhlP)CbzJ|{` zHgp9(#TTfQV&P6?f#kATm_=RLo|It^nP-o17mwj|)Nwk`$Hl##6ZrwYkAHD;pF&-n z&C{@qy?K4;+4JaS)NB|Qk=P@Ks56iJ8;7VZK8feznv!pEO4TDxHS z&D}UB+gN|MhO7*(w0o9HfG>;(6-X@15=I<*&?H>k8(C{tfRdn-=Lzig!-=nTpY{hz_z9$QFK0{&-iW ziM5!`hb0r4T4`j%Wk=CL^_DM@AA+VELGRxQX4_ZXiIWwh$#6*H+5cF6Oum^Uhfn1n zpt7yTn}y8xa%jeX;1d|dgsB(?+)$`Hm&t!?4Xft>JGwsbd*9M~(@?&cp-ZIkes#1j z9UuXB!(Y=y+zK7c=i+b0-^2A;CEkw9W-T4!2V#Nvx@am}lx)u4WZ`4M&kzJIQZuHL z966dT-vt~?;plO4P8G~O7e&TUBdQ}0(ejRm)*B0-fL>jLyKfEq6f5`NF6fPI+5gpL z_A3v9p9|K4G0!*Ko9JWC!rsH_tsR8 zW*p*s>G@kjm)J$p?*Cvk%plqQwMfXnwI`qZUU9Lwwd4!FzA>I~OQhGOUTVs&u+|RC za@cx^`MPDu8$f}mFVEyF`9BhY669i3M1{~J_MqPD1OeI(TcQJ;?@3I#Z$eFN0E1(j zXr!pKNCU~`G&`GxuvUg}CpKmJP#1b@cY68*!ZSFWbfQo24o!pIIUHig2fUgw%V_=| z6{`+83pLmlHsoWbh&G6Bh?IQZqr|&#AY}5l9pI|y&vV&KV!;_UG_#o(HdcJExD0tF zUD;IGl{wIK5+WBUH!Alj&nrum8eFjNF^gG>-fE}noa!(W{B^3)Olk_1zoUtZp(X5( z_x?9|ZTSN>z435HCzE2Y=UNHED$J6cCGm4V`{TKi5hSy8z<1dMZ+jW4oI8-97m5cn z`F;(@s2`uT2WnJXlI_o+;;ANh$+VG8BenxdO+UR6B3%U=~eDAMb3u5cmY8O`VF`AT4!sg*m;;u&WG%PT=o}q`>*Y# z_9yl-yUbC~(aSN;alm17RCE5sM6L}!=Z3C3u2Jsz(%jN{ObJ{2#8fa_0&~dvtcK@* zaak*pKo&&bDgV2C1YWxB=-#iv_&F_XiObALBFl0(S1(AIG?8{ygS@wf{3wH85x@)f z2fw$PtLYu?8<*&;XbwzmJzI{S;Bnk%YNID*YzjF?nXw8;^b0E9Ckf+kvPPP->pcyx zpbG?xvPc1%o>Mp(Rz{XFw^;>MVozi%+rvAN2R#38QHMXJ0#1r{W@9mrPBEW8F`a3C zM+j%#(V{kB1E4Dpvdg$cQt`UzGJ2`C>^2TW&qVD}BN_M8NZ)u`-UfA*y`oWU8mSm* zBx*ktG++byT&QO=y@~0L1V39-zK=`UK|0wCPLMp}-k2q|Ne9WYWS!+_XG`@ms4uBF}U_iKT~7Uu3Cop~(3|y`Ne8 zGW8U+-t9@ED@4C=QMF0+3mIJXRf#G&{M%Bc4M)aPjAHCBVHZdPdTT8XlY>2pDN}5W7u(3X3Hhl*7US-i~?zw#at&!LQ zJb#qSIg$KB$-ztIoCE3)kWTQSJXoP-i6rVJG#MWmD7t$-Q`hp0qKV+;z&+$|p)6 z?AD;t&wu|^URBN`JE5I2jm`C4zM3Z$8x@Nb)6ti9R9K*Q?jU_k%(Sz+EFk?|I*N_; zK}j#kbDq<;NTOIKbm5~r6pOIcImfhMMD$SPRoQ!F={yd#4Q&rbsVt8B_5M-5vtG6L zW6z<|gwl!b99K`*oswZCijwWl!A=PYuIKO}Z{RNa($R;h`}dBY`1vXHIvN~6lbw5< z9%r|bT_t5G{!TJGo8^AuZj4{(N~y`y&9l^VjB~XLPNYrV2T-}XQ{x+~kx(1h}~OwHCXm&`6# zagU6{i50DA0{7}BKCE8!Z+CG;{wORKcBYRoFp(@4cY-(~l70dCOivB7k<217r(G?c z)-8B7Wn*2LowZn=OP6&PqSZ9nCos(nvOMW&uITrrZuGuiLlug04=*Nd-3Uc_85#|V z=nhZl_ede};{(}>8}uVmSsKB`slkq;EBEw4Qbo+@=6(_WDKv||5uFzWMV;`UhEXRj zLO=XmqLaSI_iefK3Cy9^oD^qeMY2rlnJ?f9{Vu;I7qSED!JYI2s)b`PSDz~Wr5oC- zI7|-ca0qQq`4OJz4WSQx&2H!b8k~zT_YaFJ!R##(4iH}BGuZ~`c_-}KYvm)L;JKoA zc`huWN8TU3k7B(pYW1b44w4{-{f--|He8}5B!$a?M*VH9x%jdq9^UxvH$L0m&>COnm1B zzaZ@~Gnf=q2a5xb0|x_}cx?`>hbgy!+3>-@KlEQEq-Zw_4hgOyOGgS*ZX-M8Ug5vO z^~vZ+#(9*AU!Vn7ak#t}Rk{@y;c3`PgP7h|2--1~_=#%ZjPN*FvXk&U_@QDpN3+os zqFF66e&pmPZonIwQuZk`h@HVZXd^oNm#~ZK=w0Vgd*+uq-F@BH$qmmU!!*6*`G32m zZ=920GLL4?o#l)@`9i+j5J1T1YWKEDb0|E@6qeqNeF?=sP| zot;@SJL7P)RV%1OFcWq=1pdQD|G9dc5k+p~M z+(=drQgA0;17*{hmmZ~uSK%s|DBsKHlOr#u<7-b2$7i^Pdn)Qv{XM|z@Uh$`+XV0I zB=_1f7#iKsGdvSYgtY~q#YR<3EuRrx9$8toj=9kqk}-Dpcls`}E6w!GEPdwg?f%>K zxhqz(6lF~rl=o52n)s70IF>sGlL1}bA#*&&i#8E$UN3uddkWMWkzH(0=Dn`=_V(8H zp6q(N@w-jzsdlB^Yb(XQcHMT)cF}gjc9Z>1xh;*4`5Et=#PKA zot3`%cR@_hm-{pq#>ikM3n#gHudtO1vzrr%i_n_xgVi*MD!mxLQeRZlE`03Yk!e)G z6lDlJ%o04r3n6GVt%#PFvcLVA`FJzbWO3y-x_A$2lNx9>mXzPa%l#FuAtUUD>oF~< zh}%i5s*A?!4%4z>=)PWxl40R3g=&xwVQVnNa0k!kA9$)-@l7t1-R4O=4Tnig-j91I zj4FGw@;9od6m&VqR08&=2h>sZ*KBmFLPox$t*2XwGN7q`uKu3BvSFxUk>RpIY-~tk z{V-J8Bgj9mVze7}kW?SjZ`9X<%JPoxxHbuInnLrvI>;9HDLS7&6z?%%9E!hu3mPA> z><%@`4)ib!q!XpRIXTAhHjw9ZDktn&c&?wL6u6AjMMS6gg{VZhRoD(CXiqX+R+57h z;A_=~Z1LUfB+O`2CPCXWp$dHr?=C+QWGnC)+TTB;Vrtzb+QyT#t{Sg1{C4_cZVD97Z?Sf?^&tqMaN zm?+c$rC;Jt^><~@b;=*~w+MV6IL@T6PH;5oCfPwrsD5Z16M09dDw$u4@vODRJMkDN zet&kn_aX{>YCkd8^F`J0$@=p-yd}Avf#vo$9MH?Wzpi`%{l;*5gev8cXfDsJEzp14 zMiZhh;5QG&HFp5NT#zidcf$oJ8(WhVcM2l(AU15n(YWmo76dD!4>}Txh5F#6yBn54 zlU@bWK*)T)9oz1%k=nR(&$D%^S>}bd+bsMd^flDi?BF8!=LuA#HWJ>iGV8j=xl#ld zy>hS`UysC~ivB(ra0Tv@Pr4y6o7a%QB&x?jOg=v$`RtQGkHGuPrJIpa+n-;Z%H(q^ z)6f?IRj_JsXmACr0x8O)aqMafLv6xyVY+_8PN{NaMI;*ein}}m)s-CfxVPe$SUoEC z{=y>RucE#<@$z6543Yg$9+E#*Y*9{9wMSF)OtVQlOjk>PO+V65VOWSV{Ckt#^ika2 zIH`Fwy6~X6jb)_e7t3kOb;~)+ABMdvSW1M)umZDmA;d7Wx|k)D{dnsxpvGweQd?n!{KX+d+af(qF>Q(zfGqb&ZgrI zbx(aX#Y?HBlPa>=^{pjKaVV7a0r-{|mj8;^=2dx&C(swDQjb?;lUdv<)*HwCg4lj$ ziF>)mXRyr~#i=%)guTgRP_08t`W)ij8??>w)WqKkmO-)m7k_j-o0btcI9EZizXHD{ ziy885;Wb{z$luz^Bw#!5o#%I73QL9YF#OU`wAP_Is0#Vz0ZHATak?C3lXMH(U;&(X z5B}_8x`X>9d+meFJ2ZR*J>a*&Y_5s*+&7>5ZleR=?6G)$Mk}_{-NOBsYpkoKtF+`c zd$3jkFo60ulLukS! zoEHZJYLbOs1pBi+em8sy`sRJuJH?R^Y-G1EeLYvv76r&KL5`p`OiUp;>8J49#G{Vb zijvk(UREX?(iZ4q%Xns=B`ta&p0Zr1jlD!J$W=W#EtUyd;n*Ju&GHl^K}E$Gy7LP3 z84aT6@UZ5U&18?e4pOy0w1X_6Fmtc^!8~fvrh&&~7j^I}(M;s~Zu@dc&`9zRLp>`Z z-}fjf;`4*5(03tsXi)e{xD~r$abz(0@lNK)-%*(cNfR0f75x@-e`cr<%*!e=Q92If z`@0q%=zYGs?wE>vy1{US4)Jf4Gd&y0XZ;uY^?q~-0a1T?rIt`D-_~zUWV>bW$WOBi zn5np^P(V9Apv+aql<%m3 zzN+5A)?he!v`Oj!vxK+4hC96MD!}ase>x~o>r-ArkkYO zM@IQ8olviZ_f}J%tT*Xp`VflpeY)YgMBQ!fEwOejDLXsZBb--#sLCPrK7@1Dq}VC1 zD*v6X<`s(Y_en$fox0RYFR=mVl$0)e9g~BmA{CwBUgnx@=qX-6=Y31soXI&ofZ5_$ z!5Hp<;k@6SQ=u08c0bPFhwMmC#WwR=j=FU@>9Mm>!Yt&zn$A5mnyb4xv>`7Zftjex zU!laQ$$7DkXSg43`?qlQ4d_DGLl+%V_72+6$GDd#pgnnlezgVq=|6(gNRbSZ(=aK} zDo`o#jBUbCsAJpttN4xnJl|gsk5~KV`i3*hPWM$JS1ZeV&ASaP^>kh{+2g(Sot=QB z?PuTA*7pk^uR?o$z%L8*3+xC;pln=5{qi|Uf>GQ8GpYRrWvzI!|3=;G#hJ zgF8I)=%2nsn?A#{#q*CxhiB{8|I~*oeTKIih`_o)Z4|RZLNz!oe=QqK6_XuZS>C_G zf_7r9-~${N|A^L!KawO$OQh%FDKsN><)pHYDxzAWZlT!+-C&(oPB!^nU5b9V{*+#C z7|w?5jX`JZX>2TBe zO>ayGO><2jnl$X%&ai{4N>?$v>%<(R#poxCqHi+RGVwQFQAHU@%Hc<*`yux%;)Pk)ic|(*t6I3CwrRO z-tWB6y*1dE1$<-Ju6O@GmhJ*h%JO>~`1Z1Nmvo1es6PooLP|st1OX8V0V$CZkd%~? z5)cf;LTM3$kQ9(^L{bot&Si6U-|x)-{XCzU-JPACoq3-7K5<>wImgttbjrx}>PLqr zo)7~CI}v4qBTX?4GmDAk-BYHRXmB_s+0>2VScX?qdzp&7#Ej5=&iTpIOJ-7BrKZ^l z7hPo9^P8#9>dUno+B!^rcRzWhIW&cmFVW}>&^&y|}iDms4#(pa*5S5XlJPzi5H|n6rf78XV zZ`6~fDx5G=VUQ_{|LK9&7e^4GBi3?V${MpyXXOsV!dmmo0eZ!S>`gHQcJ1$D4d$tWa`V%>NP1Vsg4$z5Hd@J z|Du#{A=#%>9;W1yS+`Feu6lKoOsJ68?i83{=IeT1X&>C=k?s&xOmP}!F6^qbL*~}z z)UT~?`e$rwvYNl{VL#I3KS$%SP0!p{U{_ls{*5Swqne@<_%+OC|EQnMWoR0`P?i)a z1AZ%J8T>DXdbD%w6sX#-CM%s#9rO#7b*8+aJAUjOPu4}gds z|KYix)1UV@Gv-S|k-voo)-$5_C?^9+xXFYh2;DfL;&BA%=_efT(Rc+?LpJs_^QWuz69BgdUK$j4^wozoPr7 zukzw*)D9e97oBx7=>hg7_NWZK?02e-ibQOOM!lrs_qJ)R(^WdW#x7O}E22x)P251R zQ~1D;zp9G4sGeQ}gV9EII|=W+*mS{9`Liz6VP(_9)AzVmubWB`YYOs@)HzK81@P^w zbjGQG@c zLu{sL3(KD1{#>@Jx+SbM#js1ZdfBpOJCb#L)_PfQWm%#-#$DZZa+xDk+eElAYDA~t zAeQK~x-_fe<&5FHkg_O`IK9BnnW=ypf z{q%%k{=!#h2rmYC?L>VwMYO*({8Ou|cX$)k zU?h#xDyF5WSotO}JkX9c$QZbkx<$p@d^zpg&RNCOBop4}QP(z4$&<1rd46&$wW61j z)~d35)@-I!S8aXb9$d|KY)!nWoB8G2-7z`4l5QkbGHvWP^)y}SCrju)Q(ml5%gpI+ z>9^A-!g(f!XQpL798pfS{Au;C6U=KV2E{lST{dQ@Nn3%KS8(n7REpHd&>lmxI>RXw zuWfTsdQQmnV#m^jh(f4vD{EI za8htvW2p&`@MCrPwqI1_=-H!l$A{FmjpEBu>n1$BqK89Rd_i?rC14e0d-!n`V?*VKxn;J? zWTdUq3tB__(&kx3@9N-HOYfOnrif=si<40$2NLD{F=+)+bW>ki>3Lr;ZZB2MlNsW@!kc)@ z-_%GKiP;z3J33eNcIa3Z>!E*SIn!U(M9k5#bbwxhZ^|q?Ms&ygkK=(RI9o&AK9KFV zUl$LJB+!(!!$^X$?#Vm~0}+MyTX}X-R3}&ha&~V^Y#CP*v| zrtL!&=jS3LWXf;D2UkV?9rYhhAQEQSSPg0)^Ey6>UJ$*+WTlmkCF;+6LKFXv8jgKG zY?Wk)Tm^sKMd5jxT{*?yo=B@lFPl9uKJ`*cdwg#7fd-`O;pHQX9M_Kc?2H7~5Nf zaxyj|LlM~g0M=)Lxk8gOjFxTp!xKL)i;XpF{+O6%tXlln^pVOcl9?`|D6YfJIFZb8 zv13!+v%eI{T$a<8iP&p5Z4av)_Kixd?$oc32WIQ7HwMqqKKUPh?*`p|_QV+whrc0j z@$pk3lUvNX%=z%BTFc(_pv4~)*2yIKe&YQY-@m4E@9cvoAI^kDw2R*z|Ky`xkDisK z)=%7pH`)Y0*>6V1rIbF<_Rj;=tf6iu#!L^(6aEoh_gFiwzwRPM^$Iu|RnnxXwb7TO zE11yoQ_MpZO@ry2PR8b9N833AV=~MzpYkXAwBU@&GBhsj`-r3`yTP@iTP=kH$A0jRXISXfu4d$DKfqh@13O2-~hYgflamru-d$zqP;`%$%` zqSS?dtM;W0Jx7_yl93rB!>O_}QAJfWedB-hP_^0aemKX;y4C)uZ^FsQ?W(mmP!oL` z*(b7-GaV;FKWcW}N;|hZ_0H1~2`1is7>d*P+77*k`#~@kjP4Qcr^s$WoZ4;=Ulj}SU?`@FulKB_!CVc?c zU5&{+7K(K;nTeIhWTo)r6j9CXq{Hx}RXV6G)IsfIw}m>_{>Yo`6a)RMt|1pbwV7EP z-{|R6)C{)IQ)20R)~b8&8#sw2{5UO4^tj#xymn&Ev!M>vt61G9OrrmSA}dz>{)Sb0 zh~<5eO_*cO{GTdhlAKJMbhrsJ$7DpS{C<*76|YCtXF+14ZaM$+Oh9^0 z#(%@yr0>|u*X0JK^r(-K$sK;%ENwvuMI_441>MD2{H--}cx4O1?L>Jw{0<=4T}ySiTalhV~8ofD`2p`PNW#8rvkid~18LHTN8Be&P7 zN5>~FPTZaNPht#3-K(zi1UoQ3sfy@eeDW_kWY(0SZkB~TE4tbO4=fp)TDT2MRn@y# zp!02MnD1A5beB=X^|2YLmyL*u(;w(@RcH<63w7PMP&wC|7ynEx;xSW!%J^j67A4Z z>gB>^u$knuCE&5o$aY(+mTqgl;`{KfA57HTqDCi;&F`cV`v;NyWeSTL&faXE@n~8m zl^e~?UhNAlpFyF!Kp(4bR2{7JQ@`}4qLxcyp%HY+7jTd5?D=!4-(q80h;$=Uuh7K& zswU`Tb%UR!ERjWTOSxcTSdxj25vlhum;c)JXYpde%D!lppd8!KJ#`9uaYe1@>ul_a zKz_*9y0n<|cIp;0Leh4HWe$G>j+q)>EuugFvoYfDh*ZqtV^(GtBz4hSe-b zv$))~%^m(r*hsVIuE_*`k&(R4Yu00f|K|#q#DEmg&8oCdP|WxF+3J|cbk^j$ zUgFtIiV2qAd0KmQN4PGU1;lUZVmN`PS=%o z4lbmcC^ka%{zjVpKI}xrKxE*It^gm=^Y^zpYg(sI(nD7<`=}0NrkuPxyY-YUH8aia zJzioPE#W&UO;Sp$`Hv3vO;5g-d?EQ#@>RD7CLLxnHS!qon5dZTrfdeg2JR3kREWw*j~9#-sz&~+cK3O__PX$w^<`Nix(evG zQU}UEDXk_C0>ArEKlwO-QNw(d^RaOX+OLD4jd%63B&OT58xU% z-ADMj7)4)Q9pZ;jDouw|Y)t$GLU|SvdPTl_-q#a}_osxE9v4SEIcFhKTu$z;>l)cSpGK5cY*Vej&FwrW}WK2^=(_HBL`(Cg}fzi0c8 zh9!iwJng9AX8Ux9VVL>Ekd1iE_vIvu=$!YeX-YM*?`1vu7exL+4;!FP4o>2071c1R zEq_^qUN$`HcH~9-VlrI5YGh^_;qCl>H+#LP^R@+V__nyT939SWT8dRx!5DFUx3H&J z?yM}vKi=PZJ(XsvLu{`)v50efT7L7P%JPVTfw`mWP<^skVF&#)@P+2;m<7J=%j z&}z`ywxxy}1NU5I1qPgh2ByPLP1|DzaI`qAF`jcUY-=gK)znGT%i&s1^+bWP=IsFA!WwEJ@`ROFaneLZF zKh_zFyb`bapU62pBGPP+V(JA;U{Uj%xsXW>_8EG_O)UL%)$o&GG2QWv&(k573r{!m zbFX^6Zmw^dO7`*ayaGDW|EUJNM_L^!!h3-OI-o3e{09HMrYf{tT1TJhfK0HoiIDH8 zSih8BgcftO>vJ7DQ&}7^TwJ>jI(l4>t7|$F#Y3iehBm}R6m?~bV8SI1{jQ)Mvy9Sv#yD$tRf zrnVkWpZq+v^=1wuD$(CH4(p)<*BcPfLFPQq_t}2H^R0yq>^EC)kM$V*`ny&61w40xx|(5d zuP$LP!@oNCyI0t)9&qU(8#ow_GmQ;j>R4gE1EUr+l{ADkw%;g@)&-m>-ksb53NAEyn!06kwr8NQkwKcA8Zg5C#Xcr5i= zNHyD%*BZ);eP%Aq6yLq16HH9th?&T}ReU`zve~8nYcy`LC9QKSSZt}3>#W1~?06@- zkJ8BjNZDbr|AwUHqWX36h4V>i`h+zx6=DR$Z4H|roF9E3l2$+^|ML*t_r)l|Nz(Tr z`p@YvFr5PBh6toB54tRHOkc|CR(lKlb`SW>P&;D~q@cIG@mg9#zblxQg9pAs?YkX5 zu~Hv{HTLFC9Kh*7xIUdNpbPWtkke^#5Sy-|k8e%UzQ7AtbTwZ$3wk<4a#`3xwS{5k ze^n5)ryqSw*1PKh3- zqga>dI??$YS7Zh2qLxH0ikgf==;ml?-9D~LqP%#wsG5PCSmr#s1YL6+bgaNQPlEn* z(Sf!a&a$v0Jn}(AiXHQh7-%1U<69i&2z4TFLl0WnS3MoA#oVu$HSv7Jvn+Cy4D)pO zGIsQRcvk)JBD#5=)ooz0`N3VCuR>v|yzHOs{3mw)1kv1J`?;^LZ9+$#^l~E8t0LI> zV#l&+7g>Q0)Ixuyer~RKp44;d5!$MhKLf>|txCR5at>YikI626)n9wHYVI%L;H#5% ziv{A7a;xjaNf~iR6--@2Icj(MyU)}$oTlu`A*1ao$2~?{QA1R|$~@c( z;++Nbb7yH2%8R6ju)rVV)DN3d8o&TW+P|gguq)AHm&d%fHB+WGT>3ftyQJM6+~0-# zrlje%wf(*qwtkLX_$Osu8Md$sbov)|GMe3NEBcxx?mZt7$(odptS(opD>kd^I#gB3 zk}2{y_1|n~zOwVXlMdo_dC)`sMMl{DS=F?Bp^l=FN~im5_~+L8lW7^#j*4@7Le+|? zdfINb&--SRw^VzWAZ|a+AODuJA?3%EopOz=lx`DMXr!C|^LgO5y7w6n%4cZakEQ4I zncikOeijd%HGe!i?z*GgaSd(YJ}e}?(8qLzZ-}c(h*AD#83#CHciHqIrXi)mMknD2i}M0MW8*sVnVAC*U71y? zP2Q9RRlw~i)1McO zY!Y`@r~VJlQSBtZ4@A5yr%a7}RXtMn=$Fh}57R}d4<_x18i0zXYrhw}D0ZFMqgP@d zK<{&_s>q%puW1x1v8VLOS*WM_YZ$@ovBzUp$u|e6A80Q3tb{)+8B>~qwnR*R>Z>9# z#ncO=QmY@QQePImNawHNj;Ya0>3Vn4q@RG-1)}qKb}>5t4l(b*?tWn{?y1PC8QXwL z{#~8jC+m{=LF`AEy0$7;s;W`QqnF;rm_K9I`0sD~-&Op_L_OhmL7XQ>cZ{wc9WZZU z1m^B9QBygSPshh73X3-O zY(&Zhh|p|INMlzdQ}SKCFqT7s2I$1xMeY5o>P=g#$ZwYPLedjS74>U42fLf6FKu&3 z;Ddy%wDHX_-|;3JeXIAzvyU=8x)8r5evvxmx8h%juO0ss?Mc@7@c1NM*DmYcaat$i z%lP{&@kQe+;0>PBzoWaV@%Q3K#gC2uApU)~iSc7p*UpJw2Qxeye>Xl0b<>bXi&Qt~ zNT@+IcsQYwzQ;#QdYPp|e-A3Gr!n?V(4JSuN*AzNRll$c)$Hz@s&F=i=aKPUQiZW3 z@kx?Zqd&2K)Yk6{Tq&?c_OATzKu^$k3QpRMUmkFzk1oCsVaHQU!P4l-@t!Qs0P5`lvsCS!`Qa|M2U&EN^7T-)F^N zRy|cvHhMx1`U@=oL%sid!t*;r^IsG3j)mbbVbu?-LX4Bc)`fe0K+*S$$u#HmU@c&p zRw=$BKP5|=8OsNuqhG1IY|9?qgKf^lr8KC+uoa+t9W_> z9A{nHr)d*S?S2_E+cK@0$l^s@TL%b8C+NdSGrYe~`-7Ez1ewdB>t$)UMOA9tnpA)l zeOD8=-N7`20qnyJh|t#bEtD&l((jP02DA9QqN&Vokzwhwx4Seu|KQZ_$RdKzNVjj} zsp0pk-uW&4dkDxxaZU#_>>G=vU#3lXP2SO!^&HC|eMGPDlWTb@J&}Jejl<{+dsr=A zjet6}!YKZsPUU&gQ`d867)l>c+iUJNj%j!5q@0SuE1BYwBqpFolv44^6;F{oK2X^ z5#p}0Dd8!X^tAYdj;as;`FwIUd$FX+6VHTLyH|8f>6bj*4D0z+duy@B$7SeOaLA8* zz3jVxlmAJ+o_t1beG(7&m+bwovQzsVB^lFs6= zC)({zl8WO?|Ail}NSvKGSytI8@x{bv^f1kom{k=_O2RdK`sIYb+>&&+tswWDpqI`W zs+-nHlajV4Mbh;2R5yQu^7nC{YcPyzlL^WHsJ{(|HaiR)o=x5B>vGCj6s-qX_p0iVC+p~ZO;6`0Cd_R& zkD-;mUrEs~#LSJk5>sB+m*cUSGjz=GNrs~s*;;XL#m&_9>`y%TLvy98W_%{&OD4XK zR_Xdf#-FGPujsB6o+*o}#OEjqTj`eE+3j`e#D?k>t7OWn&f@QkOEXT**eYY8jOVE6 z`^1%tyO`m}3b&JgPGkE^^v>_t<&S{O(N}9$V59MD+Q#3}8%Gc@i>p@tH;qw0z zL2NcpYA}>4xFeEOv2K*jEKK=O^zg1}P5nas%7&>5@5EnCfar#>i)tpeRR^p>? z=(q04EMA1tErMXIb_Neo4BijqkXbjUZCdDEJ)je+EtVZ6Yd%GvT-iSTOsCr%(7#a_ zfYk6BSb^^%E=Ls93uQEH?r+vLJu*{Nab2pj;b6nm^P-+b=LMtkscNq7cq*zkd+@3_ zesI(%-uQjheS3S`s(*iD>&r%*#WMUa{F=PIwt4JB({rY; z@=j0FQbh#5*8Ov*&w5q%^^{IoA0`z_`ZIANoo@ksujeJS#k@V1@PHrulk#oRqv?+( zyA6Ldi#Br=4a?0(*;U4ONtkas-z5sPm-HMyV0PCNN&WOC+o7vctopGU5V`?o1uQTb zYdt%WOt<+0OZ1f(v?A*?g*NWKdCF}9ljy+zvOB9dlU-cX&#jWPSn`q~1ma`3^_lb} z8nzCy*O@ZfJ7M{q(aBc(eQ5GzyR{gXf7BqV7{nl zAhTTlM9OZM>T((RD$1bc(EdFs_pJ69jKh=igtt=1hH5x}r(fKuSIb$qlc}eDz2KVd zNZppYfr@Ci`(66^ZBO0nIORF#uoCI)ZFZKUW}vD1yzZ{;c-Z4l_R9_y_zGs=t}Nr0 zy>o^>aicCuOL?uOcGW!g=wo#Oqx@Cpz^nA=jp=lY>J@v(e_sQMm@Yo=feWeWb7V~o zG7|r(S>KOM+Nn?Ng_JY!;+y)4N2bPjMlrkn&D4={oBgR#G`7tl6W^&u$;?{xq86C0 z`%-Y7CGiKD=-~6RRe`i@zK>wDQgIhC?vtQlTcK-<;e2DoGX4DRYiY0Wx7E^es<^oZ zui6B!@6U!-^vSQ`W)?bsea%#DK${pTUpeM%e+R3W$kMz;8Sr|_09nfiY|W>x!C_oj zZacCC9Q|Vo`EzCrtv6ajaYA2uQiR*ud>TiOq;scYR#+WWN zmP%=I>~LPOyWh7}zxSN%<5^YEMPhTrK8m>jy;!c&>0Nn7K^-(#tHd1={VKfek^26H zW>P&5ow#Tpe`}KKtC4xF^6m5j-Su(E9C1GUpo-Ogvft;zp9#;24~)}i^KRIE?BIU6 z**e+e2k@;HDsCen4QE*39W2Ku@{>13eT}i48TgV@IwAfE@BBi>GLzbS5PeE-R;QEL z^hFg3m7tK1;XhK;#(*M@i z^AVKczhGGwek)Ap=BTh+=~tk^e`4%E6{k+;b%*h>L#%@dj%jW)aeSYPaTmb@zH@96 zD<5>*rxIX!`dYU+qTFus>^$kW(|&;ewxX2`@_(=ELy%&Rd@)zh9ag|vpRPr;`1r6u|8LF(UWn6R2W)fsi< zqjevwo|=)S=Ai6r4Zl50kH5b7pf0e)x73dHFf)1_eeVzKz@?NlD!b;;$qC-uHoZo3 z`+P%aLjMa?@TqsC6^1%(#x0Kt#eVOK{nEmp*8AjpTwgZ1(@2$$=Ogb$X5@RT*dL83 z5gXvrtJ^y%82E$y_Sa(bUTk+Q7){U`-;4N5Ui72bajG1-zf7wYPOS#aCa>A9X{Okm zQgOXX$CY^)>%~xnF)BLV#Buf%u?>M>kMhV2DypS$l0EQ}i_rCG3fcd8ouRVI^hzJ8E7`4XJraIUF{Xm9 zJB?zRIbM{F4zLryi1`7|cpS@p1!x4?JKC@3tuBBhyI-!82ZssS1VoPoDBA zwOEtrk`Tu2?8O_-&Mn%LsTk2pk?|1rAdi?ymBV6O>eH&gwugPFQ$e1vtJY*6D=#j6 zpVi-nBJQGH)gLeNA8R?4p1UEYFu&L=-8zfGAQtsgN$agvYNgcw;lQi#UFAI|pT}~D z@XPxyFNQp)$q2bqQ?1dIl#3}>and&((SBQ=_3clAzt0LNYd22iYp&~=(S};=a~ab= z;){anCmW@=rUm^#7C4%!co=Rum zTR+FzUmmeau6i)yB>hDSQa+9UxfgMRy6QY7(pDVxx`?%&vld_SUBoxymz6m7$yRsU zh+6srM&Zf#Vc_S`s&xx*4olC0LAi)C`Xg*(h{sq4XPM8=Pxp0}`>DQugi#5!)vSfn*fQu8J-CXI9RRo zdDT6Q@q=@yMD9iwqYimbe~*18CRBmckCmrirVn{8rcKO5eXRED!4#nCFTgKW+uMt`Gs#gIiz$Js-_Gess^nX=%R^VXkDiO|_+E?skGbDci20?T1?4zm64 zQd`uAq$Kik2ca)NnLzv@hH(<^V~pEq3`id;k^YWu{80zUOf3vaNz7%mJ-Iuu!3r4* zb*~-BXVw10etst=8LXbAAx1xAD0bWgcb$aKD%n#~gw$%F?22%5?>1xG4k2aNH24Ay1 za3pX}ZWhju=SeHdr`N%P*5QMnwC?kIEQ@?GjSAqA-Xw`CP;+}u10Jy(R(iVbL_hM+ zTlk8@V!xoT{?qLfXLBKzbrDWzl4pJ7>jGzYKCd#utsB;&1x7GdeJ9?t_$ z3)VkWOn-vKdX{Rh2m3U~72g35iw-MmzC(A6=o&oXJ=*5NxYl~Q0=%nl?KIiJSK%k< z`ZMZJ*xHU;W;b4qh@x3}-n!~e$vPsW3K>Na`%&cg*q}A)D>ut2cgs)D>C|^b?08Nm zrpxY6(#IX7Q{U%y9m<)gn`Uv$Xa}{yBdE^4G@tOk`;S378$+L-;Z=cy|4=m^m`!y6d} zWteJe!9?oQ;l2*Z(A}P@rD`BTpPCgqc+|p@?KjJy5nk*&3f|n&=b~omEq6~m*-DR% zJ#1Ao^{-ob-zs9qjqtsOdW5gHZz}5-yVg~DOl{ISSyN{#DoI4QM!nV-a-mT&iB72< ztirZXgzhR?dx=YCVL+FO*n_!IVrn)ON>8gdtn1bQ2l*-_yeCd{e&B04!V#6u53R_e z*2NRz!G@5OW{`_oX|?@aOeS$t4*Wa6I0A-O0Q0(4rC2|aR<6_=GMssAdYzPlDd&@S zVJ+rT(>KL#6iSXxeyF-{3v_J(P2{wsQPdpo=x*Ch&*#objU4rDkK%-JqqhA z6`hm;!k#H9heZ}ep`3$1spa-Obgny8eg;HfWzshDQ4^qT#r&V3s-{zNUkbj@?ez5! zzw7FHbETBPr?nA(jbIU$DqQq-MP#GN*yE$E^GWtfV~*?Q& z;;b)uo=K z`ynr~(6sH%VLQYAmQf_ZYYOsv6=|Weg@^fz|EN&5>dC*3T5LINZG~?BpSf*z{K4bw z;$bf6`F~3m7SQc46CHe<*Qgv`npUx;|NNFUHy!`Ao*%s^L(76AYeY-GIN}iA?+Kmm zzll7qFHLh3S%1;vF0;u-9jT{(RX=tmx&)8YF=jB-aSCpDR?M)N_bC(`Vu=FLXK(|v ztoEmIHNk#FgQJ>3jEYmFhDDvSUoXQiA4Q(=>eqCJx~@CLO?lu0kKJ`2z+WXtKJ=`A z?C1@4%4~Sz2sK)7h%^6(^U0{U;yqfuV^GnhnC!_kHzP#Lo%E<`rJlSx4SZRjrX;>E zzgYp9?68aW*nBmCElhL_QxUM4YGJr)e16Sc&K0D}-&-2z7cc9K>s|M^_-mrU6{4Jufkr4Z)EMYE8@oqWX2-=%6X$jc=P58@q?A*F0 zGRNT!Z^3?lwnt~B4zpYPL4@mzB=d;E{=zx>CdeOp>y+_KN;x$yF)3Gg zwAIN=^gbP?C)>-A@+XqB(;@#ug?s|z{CCooqz6eU)MmNiXEpWL7^B{0CBJnkIU{Yu ztD?MB6mL0HdA?8CeF?W-?0%N7yXa&(RxN z+23r2VSfIAHe(^*7_6*3CIh=2NQ37_;n{29W_sJ73)9xC)V!nm`ElGxd(7ultV@tL z3GyyyF)IoBSr$|y)EuKd$iDf(>OV>QkWU=d*7aV4|Btd7UWPwR=4XD=5oL>+sVDJJ z`_)cw7a#6)|EFB$H~7SM?9?hq#Z3IvD9VC?>Y#>MTS09>54G<-?BxO2kA5B>El!;5 zex~&|hf4GdxzY9VsnY9r@3%S2wu644 zMOa}||CYnrpMZ^=krxfHn<}O~utpYHKP_|%x+I6{&8CN^Zqxn0ubBmjdh3s)*(s5H zi}rrJe5I5w5l2OIQ`K!eOD&j}f-pci7@n9pF=JvOM;<)Rvv{61i38}vKTTYjc$q%D zH18CgWO2g2%7YnxTTR*Wck52s;`ONKILUDik%9Z8_tH04PK%2>XkFxx?c@pq{9>b7-v5`VP` zJ~kHu_^x%@QXOPaFCXvk{^7k2v#NjjY(X!TC_)TQp((>VJsw^SyIIWF3Sy#)9;<0y zSYvo{2Wa9z(;<7oCHkxFdYAH}J#AAn8jy1QXi-NoKCTSUT}`gmjqe`E$IXGKY@$;+ z;ys=5&aTQD&*;MT6GhZ#@Qs;XZyfCYJ@>(Sh!1@oB~G1--CQUaTZ?BsYTDTYs7xLn z{Bi!}6&YeD_Mk7%GdyGsM%ts}C|>8Ol=zu-IYa+^2b-PUG{xuO=zSswQapbT_54c= zn;4nP{(8o~X{~4McvE{8M15sfZH(Hax_!5*pS`{ww%3kE9f3ve=7BHx?q59=&%*Ri zMqS6c-}CcjRoy!%xBhUfb9_c)^}fofjxxnMdVc1M%7BUAO&2l{8&fRurWj=el>UKO zW~@4_MIdiDk|Fk{V5fZjZruTIFFic|@WjKd4>vvBtB?Er zhdI@owU3__zfV`Er_BlZUEib13EfQz*{x?$MRNmZtK&GW>bRnbDMP5K{zrqZW}k?DKFFbErjOXfu=VKF*bY6W++dkItCB8&CZBV&qZNa zpHlNpDxa?)wEOw?dts?mL{HHu4-gT3!)hL;Bn_y5%|Ss{ii)%xO;lxwZv&inGgrPT zT~TAV7VK#KP`{oUbf)>(*qh>vKWI^BTATH(<#@Z~XZXMX*-)jh9CG3a)h$63_zxXL`Vhn>*^(f+NGwjGE{w>eo3dJa;hfm2Z`H2r<0LB zr@F|k8->m&QQQd8+)zByTdF&|>73ULLRW;w`zDpZ3V+jG2eXw&b2r&@bv?r#lk?nTTMxl=*TAe6V$df;g~wnsdeQk0gsD!Il`O#u z9ZP+r?@9x>__x+U4iWwcI^wjnvM{utoX3jLv1vM&CaP8FOz*ZwpXtX%<`ZEUmmou> z=-cW-`P=hZJspEpR&-W}`zCMQ9s<+F@jAt14bgFVsAn9-_JfdS?CW!BA=-PA; zUiuE}^+?P(l(mdD*>{a={3=VF!m@skCGJI2R$q=)k}fV>amYRDuA8#4-6F;>vEVbs zM!lSY+ICP=6O=`K?+OIwl$!3Z72Wh;Weh znIBLIzAdJ#2S+Xy9x00may^%1Vz*^j59DY;l%twR=2danY=65$zppg-WUww^iaceT zZn!zEo>%bVE8+QJQFYbyeTd^a8x;k^4$hOFqI3D5I=g0!DP-q0(9Q5=Xm`Vy+NSiD z((yJ`@7JGI{*H<6MVnJ0Izr|A=BTA!Ww1`jO)V)Mq$MzVW z;tLkFBMoY~^sw~*XjhioXRlMJ=1U9UmiE94rck%MCKjp?C}s5~;9zenl}?B?j_{@}9RZ2GQMrOG~jq-Sk1#)~Dz(E`@5XZ_`{{$4>2ofvr#b zIfQfdhaA2HN2>_G&rEG`6Mwr;_OeMF-w=BBfrBD zzhFmtLQ$H-5^F=l%Ruil!tVc-k6pH+k5KSjvt#1%&~bK9elcG$j8iE`VYNg>)e&XK z5TsK1-1FQ^xT)QI(>}PvE?>7g_PXt%P+tj+_)?Y2d|Hla_RLgR;tw<*+vH_?bu&Lt zGae6D%!yN|q5keIT)}KAj{_L2l+;4bS9=-S$1<~vJlx~7jiV_}PU^2(Rsxi1(tp`ui8~q|e}9%HeQ} zM8(m6+}Ew+knDY-|29VK(?;%IMO|8gI<)x^%_l4s;tMpL*YZpTnnagZ>{4 zzrtQ5iw6p_HFf#?S7@@{pf~I(FYNAX6A{64P=`|Dgb0@Awiw_?k?$l&dr@yKQE9M( z=Qd2?fSF6HX!w?k;)BPRV(G6i2U8$_1L^yo$Kw>D9!wE!|E~Mo6gltnu!U?Ydk)%Z zGgO|u!LvOLM^1!eZQv^gnIzE)zgry3n+f|H7RX_p7xG9QnRySn_ISDaQh49r6b?56 z4`6;-?bZT#~cInsTygqMH(ST29pzVc~aq!JGWxRh0yP@z=l0P#3~6yQ}GG z;QWY)4 z#0`}a0aq=~6)U9Dse&B5maF!-qr7XIG3+K)!+t8(?`W2W$Q>F|d}S4*UXdAZ=a&{+ zS(B{t$uf-27?i#|Pof6a-8xZQdJ0aEaF-nW$j(zykZTN)We4~zZnFifBFNK6;X@9FY6_=1&%L~_m+)9Gh8VH|-t8h+=KwpDS@-|C^fja5 zEIZ)((YVNG!dglnU<(mfm@ahLq9Wwk*Pzx1LQ`M9z>)TqFEkeM z6@^&ehvprHHg2@r_d*)?;-7!UH?Q(_vn(Qr^Bsmm9*{Hb;Um{ZY=~G*CqGi8)(mEs zQ`?EtV#)=OzSg{Z0lCyYo^k~nGYSgy0^d!O^-(9x4 z|Fcd`TNy_}D)gWZ{a5JD5A5L#E2E#Q*xIgX=^R$0e}A0C&tY{$V{qd`SNtlE5Rab^ zr%8)|COzgEPdi?M&-S%v#(1?KUH8MzeUj^4ghi~w77XFzX5utf%ZPt5EocwI4&Y22ct$r{k|hms^r{G@54UjFq_5UL1h8 z%8x-kuabH$l<*~}c7(3tM{s4cam78<2G&b0D}pOQGn7FO`wODF^JdFjqA0qr<|+cG zl|wvNO1*e>&wWKq*n-NZrM#*GjPD(p)kI$Gd-(l66*&RiS~>owCER?BD0Vpo^C2pR z6gq}VSly0d;*aEd8?DLfV%Xal)SJFWq(^$^Db8N3&rsa?t!h8N8p5`_+dUuA>8|#f zciOpELRT)Q{Zh^uY>rj$=nVBxxz^9F=|W}K&8qIF&S99dJ5X->k*Mi&EYMal;BkF+ zuBjAA4J!ymt10SfCx014+0#|5HBgQ^LbNknw(^EpsWG%ImwC^@2r9E^B}WL2s~w7< z#^S10!1m6DCxsUj<22wSI`S34DzWJi3$5VaX)I3BRisAbkIbdg<4O7Qn`$$_HNpbp(JiIAM0DeHL1x~ zbYiJLl_0W1U@+_W|8NLuP3Lx)Gq@T`ahi@V6I8m2bJyP48bd3!45oQX zJ?~AqUh|>evL|tX&1r6wl`gw(qdB$&5Pp_vFIN+84!layGA5ZdSXZYGX*5yO1GTJVV zf&pi?&+|Jfi1KQ{s%!BwogA-)kf~Q$)YlwMyw|Gi!ehK*P>Fg|1bB;w-s6n!=ArgN zk5730OX9*rT7hgTv7WZVU!nsEs(F_12`5;h9QJs1D|!G!$Cf@7+&JRuCo$9FYidGwZ0!KBMPNWOX#cOoFb>KkH zn{W7x`+9E8v0QbrR4>uQHpWgh#3a=7ycgWsQJ3`fw;$WZ`$Un+kczrgDU)THe_@Er zh#kkdR_FMyf?-edCGWFjtGv^T*wy@Y&Wqxsp4Mlu$KMLL!FGEkh*890dvmByD=jy8 z7CO|{@rJms56o!-Wb7N6(9h-%?qc_M;9Y~(|Co5}sQcZ1bBvz|9=owqC;W6?PwjZ! zKN3tt59ad^?YJaAJ&L#n!TQtlmQkmUQxDrgo>CR=5mYek_kNa#koXyJ$w53`8yQk{ zF`w!?8X~4bbY)FE}a05NziluayJmX5w zcMVHNTn}+$t?(Z=)!_GY_EUIwEx-N z19i9iGQ0>T^?9*SJ8VT8y-D6yOE^0Ac5E9RAn#CH@wGp)}Q zZ>H~ynY(8mo_TEM4>NzIqi3(ok7vG@>9Y%#scj-*>UAh*WEZ_p(my9tjCXzhE`+7C0m`77Gt z^)!)xsU8lPno~%A+(fK02zEP(j`<6Hg~zK&8RdQ$yt^N?dp>>7Z#o>r=@Q<_9$Ic6 zoZ$&hdDlUeP)|0mY#HXI+?cK%Urc; zXD9>8QxuJnWB=$=pN2Z!5#^MDB6RnEe&%_qiMrRo)1MaSe<8NaErOrHa$gL~ASY~( zO> zw{Bj=oqx@iT~VWRb|9U_Ix&+x+3n#i{$*m<3)y~NJr=%DdlaXOSPxwzw@0Vx-uiOPn=$=pcBWEWchTp+rk;oyL+s8XnDR@y z$`#OG`-uJ{%hY_%fijH4^N*sWo2a^X7^dpWO+C&(Ew#(0VqJRMn{UVy+Cy!7gp@slF)$laoJDP#f+qO*(H9+q@P$F@%jKgrRHFZgPO|?Frzd2(gh&JIn;bT z=~@SSc2w27qYAZ0Hfmtwz$v*7@OGQjAbg^m-Aa4yXIRrdYap{{KW_@bU}*6njA3!C z#XD^C#^|%rDbWRD%CgnZScT8UJfRw(kXrw1YLVyaKvEwga?M1I(J-%UcHc64xUo)V zN9gMs>1wkYV;dL#4aEDjTt7?tul(R;7O;};95bQ$58>@^>fUur#cx-N_LC~+o9Gs} zO@HnFCR*oH!+$*?F(C!#oGG!aK7kW-4m_TiCF#ke!TMXDF_p1f@?w+1tKrJ7r~FT~ zS4O<#oHj$e>O$AsD8c_nTR28;XUH$r#e)kN1_a(S>J@H5*Uz@v1 zj@?qvj{m`xb6}z#LNxYJi2NLiqkp0p`8?E;+!*x#&#?!Bi+aBJ4T zG8`>3gqau!V0cCe$$dorA0t^7Nf?ZK>NU--fx+5C9733MfMM2%B; zlbLE8=J>n$aEK2)yQhq}IsC4!Sgtl5O9S~xeOS=*vXU2MC#_{7FS|AKjOSR3CuIiZ z-O9QZlXDbT=UZMRm`hd@!@p-vPnPQ(gARTLK^zJrZVg+@Cv!Sw?*~zX1#sk{V$z^S ztryOyKVRC9X#=&&kLqx(;W< zvN>-JW!#J81J|)Ik3*FHhnsArhj9=7aj=~?*=;PPS+HVZs-Aftiu=9@)h(=q3T=rv zt-j_0ZB~-reaF-SZI=^#N>$d+zOBK-MMd0|ac&gVOp}3hl&O|fbr~gEJm^|&unN8u z>GZ;v1W~ry5VoSB=sm&8y#NV12Wi{rs(m9q9)OK+Maf;6Qs^E;e;sZ4WH@FAh+?pf>CLJnpX@jIcLGsxM6Rb!bdq`RiDb=|nl&9IvuSX8sK> zeya@e2$c7%yz#6I^gLYTuFhVG6jCSQ^&4c7zq(&Z5iko2G1Du|re`1TyN{^>zY_7T zz)Y->|NY84toHqSx#upgdKI>k15((Og5ooX=f(64G#6c|seZw{EN7ZzUyTauZ(nqUe0RrE^%k$c9Xj{#%cbV}{S^Cdkv%!j3YjXi>Iwa9K-E!L zK9vreJ`Xk9;94w!kdLPc>2D9Tb2NujRI{q{S>1W%-9fxIDJ?tIR$^LSeH)|Fv&*$g z!MkhO5iQ~BLu6p%O)nZLYyMbPHc$S%NuQ`QAvH;m&!{eoeFJ7R2O_$MN;s&1X-EMx z6YI5)J~>Lp+Q2#+EkoT;N%BxH+Jdr^QuMb^=tW*uU3Y%nfubW5F&7uD)cub2*5^`s z$I+qA9xXAC1!1WV@O$5gnO5UqlI%Gv@b9DeI4J` zVP9&hcBl&LtP(;rs!`UpVwHO74KT&^`q7m;g5$WN&u2DlP_WxlE$go~?72KvC=Ob6 z-4)&f*Pi3LwDo$qSf+om*}quTi+u9wR{K=B@^|VxHrpGQ;H{Zl+hYD}CI7pQz1hGD zuj#1f2%@e}u#Q#y=6NVm$53CAL9Y1%R(PqEw8DS;7LGobt)0pizsLT*<@0v(Is3B1 zBRn!ejoA#JVI+$@!)lqq7R>Q;@TUo^!h6)zG z*K`ew^A8p%nGPa5ulAH3*ATAQ8R9UWLU4&SuoQw8M8*z=w0PHGBoVaP8E{RJ5n0^w z(P~G#WrbX%%D8XyoxxsBzsoFs6e|W*hI1+Urdg-&*o#B>(qX=ibRX2djtw1?;4l;A z6LWdwMgHeU@{AuvJwN*XH@%W}%QKG1;jcpR;v&+*i?gNA>q65dr0ji{j_-Xoc@m5! zXp?6-X0yz5WfO1XtQ*jS74h!QQBAC+9}KD+-{3u~v%K*buwQxBvG#q_5R)6FQ|tkV z?gHziyR}va8<`9K`-s|d4=eTqMk!eLJ(9f~!D0s4qk$p*@!Ki9`YCkdps}8+(1{cg0|y(3Z;3D3B2V{ zp0X44>_stY6Pagib;xB*&M8f|RlyD|Ddx^h?-3{N&g(uGUb?UyTovlp9_KZak~~=b z7p?DIRSJ+dpl;LI`EN0Pzr)_nggnI^IAg5OS`h9ZL=xLrw_njV%Zq{2#8`$wJeqLuaeJAJq&N`WIwTxn+Cc(tt zg^j-{5^8D%SFw^4WLc+0N^2o73s~)L<`#Fb>g&0_#l%0kVKNDP{{eW?3P{sr?{2V; zLtRBYLG-i@biV`Z(#7r>Y!ytvkSq?>MX$raoM167;q9WsqS%alVYyTm1iLRjE0SnL zC-)|lf2jYw1m1XzAB&)oXiED!-FiMsmyko1Lr1yP2wc&okd8Z&b*=(KZz-1V6*)oP zJWY>=c{1oJu=i;yss_NO-oi}10JSQrRyb#5x(MSe1b;JY|20q8A5K|^hfKHseshk- ziDPPrHnZy9afrv5$CvfS=~Pj78cBD21DgF8T`= ztDwfQkq9lnHG7x;KLGDuWp&T8>iWQ~>!?9`TK#oRh<#%?erJ)|40e076&qn~*JYtU z;LSG5cM@^%<-LOj6e4X+>3PFD8tZ*6rkmbQ5pthKvS6q$_v;iM!(HVieA^DO_`mjj zgy=k+&B?;v1mkpVx}f@}oYM`~#W-j91!wv(?DiJ;^ejw%Q$91d4z?Fuvmbn(zEI(^ zc2+V=eH3Rplh(VfcV9H^j%tQ)@VW!+iSj(v9onZ|sJR)`+zbf3rRSTD;Z>@ugYA>(sqDO9Dx8AgMgZ$Ll(K7XAbzdFS$G_|d zKJvCqbPD8jg$(&0sA*6E(n9n)OYXceRPFUBkP|Oborir{T-QBhaprjMzu*T>gzQQ- zzPK8X*WT(K8PZ5BbGHBB*9);&+s58*pdwhWZfZ6AyTZEt0y;R+3Vxr(?jg(Q#fo>f!g~6tulqi7kp6aIe|z{n zKlS$AAh!YjQ!l&v|MurVzv*SS4(DAybj_C7)xWsHC#V)K%EBIm>IiD4ri)DC)Xb{^{u@39Bovpz7(;#Qf5-okWJ6AOc2{JS?FO^ zh^uuTTcF0gud0or!Y^#bY{vQyae^a2t8c2WH;-Y%DS8O-Avimv*JCPrXX##&zsWPY=Ko;ki- zB>I@lI*t~Jbzn6cdwwI?UL!lLmiq>>z2-i1dp@AO<5h85OHo=Yzi;VxjpT++S(spl zw$5_Mcf8g()@QtkWwAZ`GdB6K80=c8i$xx4k34iAWm%D0j@ncSrPPuG;oDyqvyzK1!T ziyaPD6{gV3<&iJehbO!#l6pUc4Si=9?Y4(bvxc`ZSdr{wHX7P2_EBaUguE1crNwC_ z;H*V?h(Z*$x$UfK9;pUTs;x@tSw~%}xY{tu)*_}Cecvdgm~U$TRdah@Cj2Z9^JM6` zk9)0(c1R&ySx|=?#7p+VOLnsy+gXjxkdyiB%S<*SSl!fzCFmH+!YaW?NKbk z)o~)kAqIW*@9Ondu-uEF6+t#@iVW>NOnFZXdRtbk6&~*?_AGe4gS}CUVgpL}K6uok zMQLsK4e(b}v0>|Zld~d=D4L7vyl*$QXq<@QYw_O}@AbGC^*Z+Vo-=k&TzFD_=OBMwjl(o*oNA$OvgLOMW#Nsbk z_Gb~=H+L#+x3Ryxyv`UQji#{>iVHJnvLP0gr z1E@tts=pGBDm*|V(bmg6?#t{%XSsV%tEr!_L6uKyzPA=8xvbq>5UZR`E|w$2qgUgZ zYqBfP^3l(DM)|Z-GOUtbv#jqcIf7kN{wIHX7B=v|PzRN2-f6JiDe^dGNo{nxkpTT*|&1!L$B@fqQGUmh`1rqPFfw7cJR^ql%KkjnN`HhINE-s>1| zxtLcADp%`T;b|hNZ--yUL9H+X!N>deI9{x%iD zd6~!&naB~ku7hHzqrUsgaYB}JmO|ko-S-1oi*|H!n43;sim*qDj9-IjR25rCr{8i0_lX65l+i7sLz;~# zm?X0tV3!AbLNv99pR|9AiB>Z@B5CIzvJ$s(xL16=Ol5L|T?uwYyQNFf1K-`HJ4w(v zDiRWy+rBR^T7N-*f+40=UKLIsDx!Dr>)k`u z;IBnC_nZ1yi(2Bh%4%|o;~O(ZM$oigq@mkFy*GhMsUtsBMJ0H+Zj^u7vCHKGgYlJh z=$)d%uh3+F&m#A8zMo|+B6Tr649}Sb`{-aQb#bfjU+Z%%8$8cv9mGy{VS`)J=QMT> zYCD%TLUu7|6RWa;W!bo(J*?;~Rb%m<^4q$e-4YVj*%cV;RTj}JY!Mq>(a$?Cg-LzU z%n*6f5_{^XD;y8K%ne7X#FhmoO1ALs+FKL-te^MgIUhPc3ay{{veL!;+^0O%FMRCcrk_v|EnY(LdWii(IRTyiPCg;3e@>Js3q*$WmpI zMD-AgP*WuKqA2TiS?oY~&}it;G*MfyBhgrqXb|NeW~cXe>n(41%d>jZS&wADKa>G3 z7PD^gxei&eXW5%;KHp7I)ooeDdAz}XG1B_~SJZjH-&nu@--^n}%1YUrJ{gsjT}DQT zB+9DDOfYxLEBv0%>*)XgydU>D=X0O?+~>aE?`yoS z*LA($hhtnvY&f477`UxhoWY9H;o!psNcsk5pX}#zm(lXfj8qc$){edy6w&`iavA55 ztsMB;(yYi<6ZvX}=Y0f^T^}o222Lt3nZ{(~OHMGmWe>GR-+>brGWwrJ4~_&WsQ1s& z)6LQJ3RsPd*wf#+#vZoXKyO0I!OzXzGFJjO7N8V=|{M;&h z$X?bVx{1{wa>LG5VMat-VyIWCZ5sl@`Uoy$K9SnyKs3LCW-c-D>t8bZS9x^_A9oI% zb2w)B?jXt%<*X#4n@2qNArasZVzEvjvs$3C!Z0V-s0-gtA1~#*$04h4Ai150(;IRR z_XqOIf^SMe#qSwV_CfA*6Ju@-Bew^z_{3gW+a%Gcf)3Cnt zkb}?2pU&mg7ra``>o1Ux1w7A$ayyXGw7R*~n$2x_%Y!cLG1S z4KKNt?8#R|>I*q!bPuuLacbw!;#V(`Px(74bkE{FeEA z_qkvJ&ta>r;k`z6TP6@!DWt9$*U+2z%Ur=%Scjjfl)nj2S~`5(Q{44?^wlEfqFY&d z5}x;ZvgBl7)54PEhbb!qUsfHhYe;6&%%-!p^P_J!C%+uXd@VgX1FQ8Cz26AGTnu@> zf;ZcaZCF5W4ZvzV3sR_$hSk9CR%5G3_OB}KVOssj{?%t}D+T|Z1S?(`#xoZ!CoL;| zmNDv)@1Xx&tNQ`YQ6K*88RVxAk~9o9d>*#O%Gy8Br_AVgF?hVHf%+PO{OaMa>tZb% z@%#j}nrhXn*wS|ycXMfTxrf!*jUUN{o+ctlL+p`q_{n>M zM}H7o)&g$idCuLJHh{?D9ky5aHaU{6@F4_ zZ-)F`KKU9W-y7afTiO}?@*GIOS^BIlI`lM}{3`NpUTP)h-_Q4?B>E}BHPqwE zyC4bgf)=!PUomHA6MWw0h@E$l#o5KH14O(Bk@Ed81$$^eV#$AiH&}&5oDSL;N)Pow zLmna85@U<4ufv18Cg@tcx!I?&cy8A%e4CLP2v+zXI&QXXDCoic6UZ@5;2PzK$H37H zgB2f1>@bGCBe9?##aU)jq4^nl`vuv;715US%60Kq5N~|V{cQvP{{#d7CyemTT!+77 zR0i)|8hl=!tExY=}zK#mOg~a~Tqo!#LY~N70-@$AH`0bLR)G&=_ z9iM6BQ$L3-SPEzG4Sdpeep%>u(ETlNPpbZ?!D_E%^VC{)S$}`|YWP{hSZ6$NI zl?>bt(D+{1lHF{(c)go_o5AO1YUc8p39zKY$;Cdw6-bH3_T)mox-^$L$QTagcB?8wy0Gm-8OV$jot|PgzKICaXU>saI?*Jb6CUR^^ zM5e95DAu&hfUWoz6n_Gq;ua+A9<;wHvegTlGK~HbU94wT;9h3Tonft_RB%IC;g$;E z7fQh}+)c9rs8m!1mBe3^!M`TOJ0++#FG4GZUnmF8dH|1G6W`Mi>)(W4ZwaD%0#ETM z{-zG^CV|9qasF$3lXJSa!!a+#9!}#*24EpOW2+hwV^+pKC1E{_aJ_e+&3Euz2)vXR zOXZCG{Ai6FS#I|EdtsS_NpLRYHRjZv0>AA8!EM5ue^1*69@@pW2Pr;+O*p|Z*RE&e z90kxuSr((?C;0A;*wq)%xn5Y49${r$u>T=s%ik}$kBBS@?Jdiv%188Vtla>s>rszk zi5n3iKgfF(IW9lfd>hSQ+&qO{-GN z#UY@vff2X79B8B?F;8=FM*||Dns}gUY&F0YWh2tI=BNTbssjI256{#B8F(V<-#dY2 zI^$705i@nfV>#RL36Oouc)uN3wj=NM4vtG6d~jI3iCE1USiRXqW{cruWN(d?WOGts zwX!l6VwSwvvQlitu@(6km;CI{N34>K<{Z`RJl_R6y*un$Q~IeLQNfF7>i`hgP`um- ze4Xo-j^_1f_Kc#v&z=$dZySged^NZVXBZh($X&F=r?tYr)yIp}Vm!(s+r^NRqI|m^ zKsM?s*Ln`_{3qNuyKpkYiE}BvmO(~70lx8FfA_sS(Wx0@) z+mM&r7!#{~l$t!qLlKU;8{b$Cy?T((%68V{^HtGFwN1vfI7byjx=J&yck_4;G3Wif zUmYa#FyGmnD`>@)C=<_dhrPMOSCOo@i8NjN_I;v+>ENo_;4ANPDfcpu2yiwCYYcbO z7pZE`J=8`vmEW}3kPE?SZ2~zgq@O3C4{yMRJd5r%2Jcr6{C7VLqL{EGwzd=qKR;Yz zRuF&ssDemI9TX`FDr&A_kFUW*rRKfN93`Jz2~<>{2&XwUZmnRJ+cL7xpnJ|&d=*@x z2FfT7#~OSL?wAQ4Gn>6O7*TEcrm!Ykk=t*G^j7ok9HNPlAec9aEkteV`E#7ND}K_d znKzNK7kRG-JVrPEe}Qj$CBADgwr3jOunhg)gT$V_o(7MvG!;ai?CqM->ftq76RAE= z|5`!jFEB0wmux^<5)lYLYYyX)mRKSuQAi1_{r&igiujM>*!_I)9XW_4Zc2WE89uI5 zvK>sbI@S_%4T8CWdM89wI}oP8k?b5&)*Q*GhE*+0lRM9dO-+{U3_QdU^l5uwug|bk zT2bpA-rz2uBRX#jI&T^FvK~5R)b=2)8k}Gmn529}XBojUDHt2)oLRZ%I63z$Blxu- zXtx{|)*N0tdh``~cRX76C75Fe+I<>c`&KYpfr#RrkyIC1lo@Nrb$8_Y`@jVa0~<`` z-jzJ!{yS!@e= zwFLCGjvVb4nC=6_>nGvClk?eJ_>nT;helYOuJq4vKR0ukl8}b-++j^3!v;i%^}q^s zZbaz!(I+K1CO2_<+T>SR8R-NST&~Twnh43*$cn{xZt#hnkc|%XwLEtvb{N1qmg@TYRmW3kMG z(U@Lnerx2X9-g%%Qj-fkPEP-xqStoPvnyfVW>K#+2^97|Z5neXr}H?Iilzl{BCFs; zegFd=qKE&Yhf^VUd9fMyf)8sVp-r*)GD)q_)~AuQZs@7M<2?)vFd3XM58t~J4|0Wg z(n`sPv2{JL;Uj`0S^=Y_TEcJ!Y-I;`2roA%2in}-3uLS1qzoT zDgxrnP98bg^(#bxXJL3w!sz@8R=54hT~pEn63#$GU4;9tNJYnE+;cbZjn#@Xus$nk z<`DFn=eXCK$rWYC9+%)cDl)otKxoad@tyEKqJ|Nmg^y`d=!H+PM6zTv(USRC`LC$4 zU5D@5z_uPaTon=a5_E709$-GQw2arw!JZzo2?W2HKHN=gxrM5xE%eHI_OC(e{G{ib z&#?=`Z%pGGC(~Qw>9hB_h7aQ!K1Dlc;z#GiF$+0GZ)~SBBmjx-wgrV7Wzh?b!D; ztuuYv4LRx(cE5YrfBisbyg_^Zvpo|>KFue(^7-y~hF7?Tfn14|^2WDcVpG1t+w26f z?qpOPlhbI>`J|4La|0nh(vQ>4k6Xh65 z*SIKzPcMj`mOz^C#nV^ey~^}XZO-5soABAzjCWgPQS9;D!7|+#TEZJURn;BXYQr zn0zA=xdyqN4=?-)k~aqL@($YYIv%+*J#K!k0X=05(v*H|OpjTyQx4Q*RzE9v_&THL znj-s&iB>YkpMx7dLZjcs;`F3{nuk6Y#KL7poBu(VPhq)!#DZ(??-SK=>6v?Qh&iVa&re;sC&Qlitv80-2Vwr*rM zQb$*^!2+5ZpkC&#{} z;qfX*ox`&I5-WP{LU+H!Yq+M-D0J`*dg^7q)vSaoeKbUV#j7HVnnIT$ zl?~{@2avn6AdkDklUyX@a}eD%lA8s)J_>8t4=>S$_8ju{B(l{Q%uyZdE;C#P&ag;e ziCmEzFyow={6Jbz#w~c;l#wk+ALuX#oN;!vzECiY<@tP7@JdZQ@uUAQQftL`IHS2U zc(DiHI}krH650HiYnh46ufS7(OR$vJqitLsqgAQMf*2GHlgfNX%i*wiW-lIN~PbmKl8K$B{+QTTbHJ=dgW& zEnme^t6{@jXJs3n>t{ZHitj(qH|vA1!gl+sltzX5um`2-;kt~-Qy}=4@k1lAsjfDw zwO)y~d=s`>43JoRZmJ$?YM@Dbym;8Q>0l~K%W z&b^RNe!=-xg%8jJY(m$z(YB(4B90&Njz99+6}R`Ik$ZXG#xWbw*0t#DTCQp}{zLv^ zCAR+a_|-9}p^8}*w%u~Hju~u5#(?jmi6K_tE-(`Q7Aa*+IWOESha50@7IDY7>O=BBD0VK zM`AISd=-{(C661p4y(MTsfJa2lX}6L>Z+A%pNb7Q8n{K8+k$@$^tc@ihV$G>ELVqurhNdlJie zzPC8rd-$z^e6kO^-up%~ukjqR(1o*g0o|Gp?TS45yWqBGk(X!qmZy=SXRzO`&@vgf zC+JI&K~1Em0{2iDW#+2U5t(_+6HjdmKd8OSm+}l7h_rDsw=e1VI`9x|7jTe>!AJ=AjVsHOoK(a z1u09%b7uBf|CtKuxS37fLYwNAmc7=NSQ^m9DeT@ZEZqk1!vc`S3~S?gVY2u`FV2zXHM2-+I?Zo0Q!+*@c zvy8+~^+l?!b!Z=&{1~$MFxn#)u1mAdsxGoA3X>hMQp*akQrO8NY=uBV#qof7xX#?z zyIUExe;EC9^y#rcXzRHzv-qx2Hxe8*5N4=9kNvUsZwE5{ke;1}#h-`QUBuC@Z?=V= z*cWFw!Wf*uHl2(rl@y^DRu>kXBr;V+@&~nU7)rd_{0Nb|7adZ@!nwM z>`fvFW2N@QS+0%cJiJHnzE(C@p;dxWssbBW3HeNL@^z8YM~QHaIeO9h5KFwx*~VdI zJ_@Y#8RNB>Ym~kF7Mr~dd+;;&b%fD6jh_997G1}u$i-#ESBuKbSID{K#$w-vrITIF z9xV-Hs}}xF@BB<$vJb2OefS1f#W8X>NBMcM`E#*PbC9aJ{68O?rghuQv0G_-!L|pY z9pUjWB#FCN6T(OUehx=j*%WD3CS+c2$o0N^!~Mx`})XM6RdU1@Dc5i zu=X@L>1UCGPCWMv8?S9|hc9&1xT<)fvgk%3?l&v;j&LCE?RuR*EUl z2ev&BqC)+=@58e3o! zt-F%Zb2Bd0k5|Q~*NA4EAk$ta-fJFyQ76eGoJ~z^N~;@vQ9k0`0@&d!^mXd65Tf`$xYOUj0ejJReg1!=tV}J&=d57F z9q+lYS+jVaiC>z`tJ&zor@^;adomZF^d&KZ_>Z-p*7`=UxjQ-xzDy)_{@@FUKsPYW)- zMqb#eqTi@HI*iY-Mrj>wDeT;Qe9Px-bE7Sc846$HS++#Y$C3Cwv5PT-F#|E#?Q!0+ z=(L>6WAFmI?dN8U5!Pd3!)-r_qzYiLlIgm3+6lzTLE6>heIz2 zKWcMtE_mYGVbwEIxs!_en(KJ2-|=BTVU4%a|6c_sW!`2O_WTvbN*mvj5p2j7i3m|`?Ce>_Ukk8qYVhG^%lO%Y^L`21I{v&Gp@nn9KyO>gilV#6%^!Z9zeGm;~zR<8D0f3 z4u=Ns(hax`oSy0thg>s;*U z9Q0}mk~@o6^V$D7+hY8XM~eRR%-cAVbKcL;5*9Qi7Aieh?oLqFoji;09D~bT*CpCT zUOCgpIX-t{zsh2NnqV`mv>brGO`r!pCyHHz*ELp^Z9fTuISxm1gti9`>09JrIY{Sy zKJhyJ+KyhSiLEY(RgpnEhb`HI{a=MGn9kU}4OZ(8JJ=K-R-J5DN!Un#mE|8$m~#ui zg9%y$Qu}~P?txThbYqp-R@7BlebtOgkQP)pbYS(_=UJ1sA2kmXV2l0W1Y0@#xbrNKME@}lfGC(P0=BG>1@oRNI|CM)~IpI z%<6O5sCUZ(?_}j$vgDW1rjzvQVfuCl9KmMfZ#CFvDUU07y%zpX?$`|2K5)=a@pyne z+asI0f+H8u_hwq(LGz!d_eDMrfp+c(hvmmg+y;72PM+F$HyP;p8oupcG$J{^|7PCJ zN;79#0!t!7x|`3sVr^y4P?;vO*C&ZH^;1ppAyzXq!?Uf+imj{aY6vkmZI&T$KKWY{F zVkvtC2i<}3Y!_qt1dmq0x{k_=v_8aMiSg}EoYyQiaJ|{z>0dMZ z7Xr&zA@DanFVf0F#O>C;+_RfF)z*4mlndKAmj04$(QxsTB(4o=Czr>t`@ zXW{6b^@hFS+;<%gE_Lp0H7(%g@07jFu` z{1bN}{{0)faGflzbB?lez2?&k(F$`lR$`bpe*hd-7278g^U<-DU2uP8uzv+cxim)> z51v6z-MWn&wA;9o1Q&P{@rYPU?!n$N+A~u9oyhK2wx6+zyCaU>$~At6g|pXXBsO!u zZri!;-Q53P?7YW|(AZ@IfFG3&WULV{;0)w zm{BN+EzCtf=At*Vg&%Y-mUh^D;YIHC1d_j#J6ndm|CI3=iM;kj&bx!~+kjA7gY(4+ z9k5>3X>?>?#~XQsKFG2&$KDIvVAaof{N`jv+Kj?CHI6bUY%LLLd z%=J|P3t9`<6ArsC_x(N=#Z1$ZKo1*;!@j5OCWEjKp7H>;?I&!O_WvN3>mYT5Ke6{9 z?;59V!;)cOX9z-n}%FFV4I zJ`sFe3$RxmqWvoPpb8OTS%rHKQC1mR>8PTxMy5V&o$*);dc8YbpLLz@<1^;qpVuLO z2e|Toucu>Viy`qf(A}2wrS(Um{ui*xK6VEcSq0J3b6keEh%u4U+CXEbc+Pa!ksk(!j@e{*6N3K4l*ePq3IgNWFkA@=DNIi*3^mtkyHvALr7INEz` zgZXbr@T5cezaOvP;_*$m&jIv+D>Mz|b8@L4q0t}k%Dx#3O7Zvs9N8c2@;qL;Jw0U= zVm+)?MP#x7(wsnUzhZ%%6}gnLo=h9TJ@(~(yM@PXOw?4H9Mt{vpOp&*$tOGK(H=}k z9x5ZRbAs&((2s@aXBiCZUHokdeYe@<7tv6w5%f;u=($g6#*Ax0!lL7SNd9klh%@w- zIQ}N=X9he|;@2rM@;bpuI_EPpdlR!;o&Q*nk_g9>ox`S`C8k9m0X*!;A@Y>7FQzVjOg-lpN>KreApGF`7~JMFn1*vE`ByL zF+)BZyEBvPmL;2p1xm~fvIbxt_dJ)8o{c?mUY=Zn)@fdh{+D>dRov-%^u}t*9mwG! z`tCHo(t62DSV)nqywok>Q8Uo%S!gl|&UnqqH99j^p2xKc?m@N_nAYk)b0L+n*1oc` z)9L}U+7IKG9^sC))Q?3R+lp5rvlbEYHRDm<)f|gi7LT?+_Cm&10PJ zQ8sfi)+#jQJFA0>%5Xi_k7j~zG4o>W=Py{!&Dh+_0sN!y)I5gSt<0eD9QwEz=9mddEK~1q)tw9YhVEbOf zgUUP_Ur&k=SW16?4gQdulZ%t{zny+8iZ+P%?x*+4bL|!AF}+tg?!>sjnZXI>+5Pu& z)O{RNisSv1I#&vvD$H5(@tlM4$ivv=M(1+!-|aC@{+EYiMIy4a75SzrJen)75Ei^L z-)08a{KCWZvh26NV_YwK{=Yr78H@V#ys=qx#_VyV*eET*o|_kQUa2#l%$U{T?A6d= zrP-WL1|&&5nyAGUiT;Lui65=~5T_X}C$h`h?n~^uhz$OL4j#i(A49i~GL8ps=(b$3 zESVLa39WX%=LFhBbYTW^zBIgo`Rl`Y1m}nT#rgh5vgIDlyO>Kin{M{Q+=y8AG@~Ow zeGE;ox=hS2TDF4bSFXWhtVce>Coc2J6!^Zh(bSLs@Vr@p!f1unPo?Q|=Z`!^{Q>&v7{{NZFa9OFoPm3> zg49U08sDc5%5b&?gFg%25`A@pvFVLndyUo?edw|?JvGwG&yt7<$Z~DNZ!yYilI`n5L%`A(xx32Iv4b3qspUC5s(4#4g z&!oT%a?OhvGr611jNdN2>&U<}|ZOdJX4UnY+|#+1vWk(i?4qNUmQDfeQ5oC&Z$eCE$!&J&KvJzFEB#2XJQ1=?9H*zedhtM1HO9pLKaN9E<#^JsIX!w&A&_q^jnygtY) z>lgOMzWwpMhy7M7d`};JLth#7tYK6(vB!9LKlkn&*+2MJk%iZ&H*nURxdT@b5ogGj zS)rIA-Zy`qhNH}j-xl`Gs-_%lcXIy)(KD+Mi{dNgL-hUD@5!I}n|>|P2J;lpA#Ghj z;oZY#J$r$-dSu62S%H$*vroS062vjftH2y!VlyUSB@cv*PhasmU120St z`J00L&E~UTA$^-@iMm?XDsW8}Gj;`#1DV8fTumiBf_ZAS&aBvzXjWV9yE}LOGI#MB z_v78Z84Pki?$v6#!TjG3R^@+K9W}Eh_UU2ll~r{9R$YE@gw-pTkQjZhy7nFS^d&lB zUdkCPGtsme=!>;u+L5_DF5-C^kJekP;12XR%Xsa!ChX3Zkcyv?yI+xuGgxMMa{Z}H zmAF$0wa(>ScrxWSWk~UD^tSAlb5Y#%dR9s(H_DI<{B0pYnUEA$O%<!{~fOApfHd%52qL$Y`AY<0Ocd9G?>b>13!!aH2TC@lwX zF9BE2!Q(jBLsrN&8MQrQh%)339Qz@`9}LD4jbOhV(scT8K7F;Ce)$gV+lrR$#YXJI zzGxRa}~-@apW_Q(%$O){hEmv-eh`qTWWE2;iPPoAg$T(u`f_$${S%YZdV zXqsB4&+=CY<)@9U3NYgKjggl&#&}u8XeCn_wsO2G!yawae~4goQKKse`n&Kt`WM?|LAiZ=iK=5mOB&&UPDucN>9^bH>tWUJqyQ zAfj%MQG1_<=hB>2vQ*;@&w^Duqnyk6^dtbh51_s?>i zm`8r}BAdPDYkAT?c)rSBD|u4Wdm;c)^&M<^qQ4T{ZBC@g{&Oy4=IBu^SsHAx)sl&7 zkfX@aF2-&{XtcA}=7ywL1viD)(~uomWp&CGnWEwcpH$X8^e*u3AiET&{O5&X%7|J#eOg%^6i^@uNWQO%Mo(RNj!_HD@hvI(s z^PflP{oR+i>wVD!d*f(hhu@Gd>mHS&gp}!RjWDdh@|W|JzXOcb7W&3j{Z=rFpEIgc z8T${g4}*vy`$y*0wG`eUqb4tFo!k4^l}|ZVRH8N5O<$|^e{d&CuoYZ4hkje1E3;A# zH1XgKjcbEvcqSOr{}872y5`ngtH2p`!_l+%(6m8l<*RrGb+k=*)E4+Zqm~3)QJHZu z9yPwP;=>gQ%JbT}vyP1sYB9#ND6JSxkDWU(O9n>6Y=Jp4BfiVDe;A2m{GXaD*Uwuc zQ-o{R6Y1a0f0*MkOXfU-MiKQ}2WKUNHC$e&HHaO#TI=ClSJ(9vn(~?2cu42&mqIp* zBKd^^-)o)pB4&=n@y3N0!+M?zDVH5K9!huz*KjxgyVgiC9*Ys*P7b0$ z)|n*Z8g7ZJF?(e;P@YtF)O>M4G)UhmCusGUt8U4m7UtR2C7p|7#;rJetXj4%(0-DA zs}^yDzEl^DLXIPc#c>ZIt-S+=rlTS^Aitp&Dp$oBM_B_ApS)EW z+CA8HD+9IVNntw^EWg%V#Ap=csC3g6ms}+wXs-wL!@5NQO zeU_DTOB^dhmz--(flkWPc^26g@q$(Q>5(Qm8u7hXF6JzWj#yjaZ1lvhyUV2}{6=*& zp&I&NTx~Ux5l&*JyVXiH;yttLRs>e!ok~1gOJ9L!=Pnvy`CqkocAdtG>=UE-EMHrN zGrGxN$fX*qTc2xI$vL$YRk%&1o)fEh>Tk1fWG0T(2Duq$ zdmhnYE=E{?tYuQ`&F5%!wMk}b%-Iy>RS~YxRWK7#gnJ#Cd~uE1ivL!Y5QXN7t95k{ z$I$G(`Fp=l8|c`2?Ou@)idJ15t7KVYl|b0C1A1iVL77j}mWnA7n~}2XTqNXQyyq)t ZPB?eM|CBLbS-bQ9_xo-N_NC&}{|BP;?-T$4 diff --git a/Mage.Client/sounds/OnGameStart.wav b/Mage.Client/sounds/OnGameStart.wav index 791a85b591a6d9f0e898d2bd306d3f09cb68ae96..08d76fefdb054a93d806ae56f8a5b8fcfb2a97c2 100644 GIT binary patch literal 59746 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 literal 119448 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,m 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сv{aDcmW%BDf-8&0q}gFMbV;Oe32kpCczH2GT)AxxCzv@5OmD?=QV% zy$o~i&+^am0mwSL4MYH|0Okp^7NOSa0>C@oQh*waJiu@VLl$K(V7p|yVIE08w)Mzy zWfm2Cx}14u8)X|&lT9xq>PSCA+sw-@eH1wd=up$4hPs@IWfRNZ7r!sYXt-!!!M=hm zd0X-vbAT+ztg{(sGuY#un>si3c=GY&hQx-%D+yN;==&Lqmpn!uQyWlQ@)P1h|JPjBI1cwEOb&u*EMXu(ev_)w?`9AqSK{wmh+}2Fa{BhIcro01o5q2^3 zv@RoO@rm?_l+TgaT5LVhZlayJqq(CUfY>|xm%5j_>FVj~t;inV4KpG(Jj+_^7WJ2CU4hMV1WH)5=APfaEfxm&n0M`uvEpiyD71fG| z@`v(tX}UCDoG;Ent`7MTkzi%#vG+NqnA!uvmdd~Em{aO37Kxxl-obov3e!~5Pyx6?h^FU5qPTckQ z>+u`nHpEp$S4Cfpycn4io)c~pW)qeck`}@<$Q^*hI`mN3p)l(DIBz1Si8b>-<^Pob z*!W{3@1V>s#TID9TGi9k)0BCAe19YgiGu#G6ilvlUTfeV^tS75$3LSlbD6YE%Kr7& zqOU~{fw_{o5^t$D6m0{gM?^;qcNXTfF{guBY5&2Oe+YoKbhEHc*tV^GTYD)$p9y+< z+y$b5dGOa@9`bNxlTgFF-+aG0`OV~}v9D2w+*+<-Es|K(~3FhG#DK2Uqlf*aPMo<=lsJ z1ori~rgDLs0Q+hm;2EkBYJ^_UiLn0J4p9HA5G%w#BVUvI8Na_%Km~wylq5r(VbFN3 z6|SXCsE{*n@|2kq8EzVGn0^0g^rwNht!h`b(~E$nKDZp$kKk!;-@`L~e+rKlRa=qcQj6@5g^i{gi5%XPGypY)aX_nte6o zGBW?OBaHa3z=J!hJ*)j3aznnc_{L(JY@3Wd*AX@&Y*1F~PuiTc*=)7h%3tlTzNxsW zV85WNqN{@Q-JaT>TJoK~(tf4o`H&`0Gic~;32zC9nGZ9chl~N$+$Kb<}g z)M?ymztv6+Ht#OfB(uLTfWB#{Pw8XA8ucT>#+l-}#y zFX&;w4C-H`zeq<(MoIn<{UO?l441vg*pQe>%s9KJww3$gIJ0qP&;JkHYst$dKZa+_ zGGs918|Ncgq|oqvGuw$AV!k)@e0dCCRC==v0@x#>*ByOSu=OK-YfzhQt8FXi)Iwz0 zkq1LfHucvps$W!dE+1JDS#hZRQ2Fk%-3Hw#@21m>rx$w`dKR)DUY&!Hd{8c_tgQf8AdaVK<6;w&;1f07j=dC3iBw7D2v6y#fImJ zpA*k%KI5#Fxu(b?V_$}Uo&`{!=L?YQu?3(`n`in(X#Lnjp%21YU=Z*EzSYZt9RPpj zeU$yZe@y=|<$RB|5_=QupYZ-20~~`lHuIl(4)XpCIWE5I|Dnma$(a4;v%oTNY{>%~ zU_Jn9qa<^&h1h~MG1qpaStQc!?i)UJddKoE{xc8*Gyvqf(C>l$>9e@^E(VSOJcp?T z&Hy-Pn*^{1t2L`NTMTgTpbq8^z~_bYw@v^rIqdrn0@%-`pR+A+5nOTlEAaVck9rC) z9A1#*tR=w%mHwc-ThK3-zP7WF?Q*&Ka&u!-V-r2^V;f={LhD28y93N`aRBHC+pDHm z&7$f>)mN&nRNbz;UAZ6G1nbM!mtQHnQkGkqTT1<>q(oA}tjP;S7m8K`%Yh+)f1!V2 zf1s+Ms-SOSUygPP$)jj2ZY-vTsY_XxvN`2*$~RPOsGxp@`frS&s!3=ZQ8%J)6>`|q z8`2wsnu3}tS}I!N+v3~kXQhHZsvh9on%PnO9CJ)_OxKvNF=vj(9Qfdh@EQs%2M`4y zx{I7{)}hpnbMIybWf*{Vis5;m1Abenq!fuecO~BftV_7Y$W`d~e@H}rF50<5?l)t= zJ0i!Me6{^%`^{2JQ!qW+2AAyBhR^rB>3PHF$9r`TAQhevhXD3t`2CugnizV0{G9WE zB7mQ*IrvfBH`-0xk*b^s_vHsjsXdLU!VS|BV3OG+vm?M7pw+Y$s>Ury9dj}51n_Hd zzhNJd|7ICL;bkMhf1mj_e*^0Q_JTR1E`yix1Au!e&u4OJx%Qdw!o8OF1A0&`0~`SM zA+3QG@H6|+{-OOVfHUrj){54?z;<{s@%~C*k>yRxo9;B;X(R{D72wR9H8lk{b^s^} zHM6T{S6`~S1eT3O)tSmOlv!0WXD_Ebr@RYry6iL@(Yux9m*(T9cFeHe_LuB083P;y z#+HsP9bGoMjQMpb0Q1@C4Ni>!qL|@|9$Jagu9}=d`c|+vM;$^uuoBsk{65KnpjQU> zS$ZkaCxrcZTyc$h8}~LQFMa?##hF9PUIcr$3y_J-`w~5)nTJh|$wBc!R0A1ey+m(V zLmMRH^i?TR%thUCb94{$cX zGwBV$+Me~D55T^ECcxekX9v6^aQ5{7*NGW?cG4)A{)4Ag;q#~%4CpbdV= z{{r6uI)J|MM}RRv2jCGr@TmRU2JaWnO=bf0*&?s}QR|~t`s%NPW*E{@B;!tK=4ZzH zD>Z{xfCWH9eM9{e;7??OF%#op?ZH|BzB-Gvv7D$em@5YL+kylhfV8lfW%t z0YJW+4Z!}$6@Xki>aW)WJg3}%d5nG3HZUB1#k_pcQ*o{w>15n_-||n<^t5n2N?xXifCkEY+>kO zJTrb~d=%i{<=o>dfI8v50Oze80luH~>dryly+ z4J;Eb6H<3TkE~pH?r?s%5MZrRZdMNW^J}PdSDB3gSmW@V;#wIGaR0dkEfV==+&4L^ z=HKDDW@KgrTD8RjFA)k}>q|97rCk~nqEx@P)saUIcDihZ?$#)8JH^;heE z1L}ZbfP1ZbEpz^u70$e|F97!+_j330&83@5d7e>+#7uJXZU4*rFHe*!%AF4I_r-vJ zj(^U<%!8TiA8gOso<+}vyTx~lS?fy_yh?m1(oz+Vhz^_T&%xX zPw%C}Er(m2+MU|h!z+6(dWNrzUm1^uH{S)o6r3gQLoQ+$1CO75wE`djXau-!iU8K@ zca?XQ9{^{7{vGVslCOOOp#RMW$p?e~33-?9z<&wI3gC(o^ZD0mKehusXsiLVO>J8ol_2h##jGRFV)^s2C*D)pQ^^d;bwHjxPfqP2^-tt9xd5Pd$+9Kc z20qE};@`!*Z<5o){g(HT3PFWHZXvf2!1wC_W?QVw?*bkG^$he+O>RqWV~xaF=njB) zI%Wia53jVX^;_%du|>@oe@_l1Yw(rTE33&_8c;p}Nyzugaa17Hcv@v^S!-EzQFM_y zU!Bi>HE002MSxSDQ{J|mZ8?uK9%uZX{ChI>c=Uq`j1P<-pEMq+Qj?R+fYKdW9_zBc$K{SF;2XF;x7S8ak#f(1^=vn3pvU;ODqex>3p=DLKu5!0V*D zV|T|p_IK>N0KYo?>Ok(vXV=fJs?Ms;tzBBX6m%}=%sF3Y$IgzecCB{z?C;t4bm-|o ze~>z>I;$#GmC6Y|V;|u+#-2527c0ao#N3;=pjM~9z$=*aY=z&_3zHWn=ygjEKvVSecpj4bGaKIYigrc21{q|mmAbWeLkjWB_FCj& zyn`1ez4H3k_pfJe+EUDdajma956`c{C!M-)MZat%W zMq5W%N9+sV7ak3a2O>U4e0B+S3B~ahd;!pgXhSB2P6}nt-n@u;5kE%#7%9W<8WCqJXRG(fI(%XK!q(5u&+erCNqawl z?>&8gmI1MVnZ23)0owz%?o~S%g`2l&3-7C9SE~#2lwYqvW{`3JlCoih$r@5(iQ|*ZQ5%u&WyxDxS znL2NJ4VxO98uMHukA}4spZ|Dd7qO?zIj5D@N;|}6h)sZ9fZa)llVGWbIBWpui{aqt zV9>=_IaxVLou$r`T_(G{2Iv#Obw=G_7x*x-r^Xqox7u6%oANj14fzfEHuT>1NcTu@ zi*JiryS+AhZMGb_^sdlFU~FQj(^=PZ?XX6RM8*^Avir!$eGIU+qL#G=2m`nuJwg7u z2syAdCN(CkwdlLcxgs@XF7VRkeTRGvt|RVA%z>u=+>@FoHKEm^)z>SpS5i0dtl(L} z%AA!se`fxfDanvzkO#Ijd1>;xxOH)!5uOpSEeNGX{1d?6KMr{uawX_W(5S#sffE8I z1S||(7zi7hpst}^L&t}W4_g_rGC~?7jlpy+`DNbAyfIZ{s^&D#Y21WN`SynPhLcSv zoA|vAK$bRjYsNOlHqY#y*^wKS_Jh($WiC%tTT+2BROI*NC{+we``UUZ@D zLR%m*zSytfy17|(vub+z^z!b=UEf%^v9L0)GVf&0NyGf(UdFu)^4mWre@>o~FePDi z%<34#97TAAd4={DRs`|i;*E2^jN5IT3?s3!uk-PCo^+?6uJM)maZ#p25lG-hSUZBTl+lGE4S-=M1SKY6= z_15dH8>||v$Xnqod8^e{tKThuw>+diq#mdmsM@96Wthirl5dhz%gg@6e(`=WduF_Y zl550S$V&h%XE<%XHS}6tpuze<{DXnpy;-^$?su;+$@?T_eY6>14agqtRDkn(&UksB zs1Q~N-w56aK3ROS*hQ}!^vykxE9COUZDZ=j)Spv+PAN(%N=i*gP53kJ z&$xLp^J1n%O^MnQu_wYg+&P?@i8>%SJUD!H#OjC?;K#@xBi*9hqCBEKq7fM!L;c^? zw5w_N^Y7=YE7g^d7}T@*%K6re))}og;8!;v-on(!Yt>qHowiOpM>j_oViRIRU+pOX zbAML>Cv_)v7S*D=_+`&4`{m4&g066ETc9?rnUx0mC8F@^;(K3dIsg!-bulE9LZqLQNQg6x7#d7JXC zW?#)_rtr>;of*_kOiY`Y#>L^E7`HZNZOrYc+fn-?_d^w7g{pZ& z)E>5aF5xitFW$s3&j=dWPp6c-?hJMMV2B<@`L&Q{v-OSm3 ze`o>7Mde-gz0rF^R+s~NwZ>nJzdUJu(#rM0>_Gb1a802-2R6ukbj$v%ORG(*Ed|KS z3~dN)_@U{CCh}!^w)AY7(mJJ;KEj;4vA_7O#kUsR6NZb1i&*!QPj*FiMaG%=dG&cU z`HIJZuE1{1|G*g{GnEeldVtS>0|cp!@b=(hW8Fhu;S$vn6@Ap`QSuc4i+6c5z*!0%Yn_3&5{Ih0=oHk#pS?H@P{b`c-H!Wi_O_=FyJb6h11F%!)&+{a^=Z+BG-gm zEY9;rLth*w4imG-u}!#5m?}sWunB!18o3hm*_rKz_IJlfrTdJC z6b_C(5?F94(G!E!`7X0+2Vf3OEPUMb|~w$JNJ8NS=_q zI%9PPd5-7D zJ>IJXRe~|#9Wf`BoVgyd9tJ;E>M*0Ak)Y=$b&k6LdNE&7Uoos7YFGaOn$^u}dU$rx zbkW!VH`F%_yt7ZrPhdGeRC4ai-q(5Ac|$*A0DLUh+2_W^hEf?;PDzE zju7vV?2!Bha3*AU&cGSqny0Tb`9+}S%R^)#SY4fDmwyjYUz#xthMv3^Q^aPw`<8Kq_!_v zovfyh1mCxn&{?wo%{jpI4%0hO?|u{5)V`^mTm*7sc_-^%-M>1wDz~afO%HTM3u@Sd zrFY0AfSMdlqo#3H^Qz`6EmvANe_~Drb6&`MVNaBE;ANs^B689=i-`g<;7`bUoOKY_ z(@pJ7E%)9KO^9JHx~jUWvQgWpYXS0RH>x&bXIesPhpI){q9g~7wKubzd5>*E$ix+3 zG;)Cp|K^HAC(SHD1&oljF#KEcd(Rz}G+|uoxN- z178YUDxQU0gXBdW5F8NPHNR_^J@T%x4BP_t2{>oq`$rG_A&o;CIX~@F*T>-7R9ID5 z#SB=_a?kSFWwXn^E&aAMt|YExS@E*s;KJa-Z-9*j8w=|5>hnec^wij#y*c}@%)c@h zq%TMxlrkuV{UZ)JsC)k{;kN|0c(-_-i{$0o0na0zN8AFqcioD)74vo6*Kzc#KA3ti zmFx9b$*~e&_^FYD$hi$OQR(&1c_n8Yh>TVY)eO~G;dROS5?r~Ot@$w1Lx+5Ldigc# z8g<*Pwp;yR`Ge&?=<(L7*Q%c>pDEd&WS=n)ePiY|=sW5=a?LV3=?=14SRV~;7~C+e zZd%>?n)Qa6_RQ*;)jt93QLsPzCvdRtVBN^Zk&Wzi#kIt>@cg6~zBOi^oJWK}&&L{; zeLqWyB_l>8+ojv3>P1Njaw`f0tZJo^2BW){R`p)I#$a@&@>O_U&0`kCl#<)&Y^= zzHvWN0O5d6p;I&fE0ik?y-#xJ=vjOXVBeOt8hN{Q7IhZ=;5SJxU4AC)Aq;_k?z6UM z1`cg&V=G*rO&VDj^96DTwB_E4E7I95&E!bM{ zH2-NnIV9{)4#^o};7fkU_>l1|{aJdiv|edmVH~6Sd&=8naP2M0}TRX z9#9L+{pun7A;>Kmq#2|^3tzj>dY?51k<$U*rE>t@_qbmrXcM%fpv~pF+Na*9rl$+* z1nL^tLjg_Op!3T>j*}5^xb3i^|4$wj*HvTOuigXIx^G1SEwZw4GBj1wqfYV4*Lq2KNw^>U)9%of%>|E!JQ&UlPa?B37}-y!n@%?|4}$(-^lIU{ za<6f(Ia+nJ3i6MN#pR33HD#KzyCru^s*9?NI3Eei56i!ucRTM#fVI}j+?BbHvL9vN z&AglWYx=M05KN3MUDm@eFsV=Q7VV!On3iR%;J zC*D87KfyA^GG%Ml)~q7Dx*}7YJsy(=lLqEI(=Ug;T6#Q_H#h=)frFL@EvHybvEtpS z7eK#oxwRZCZJ)I*0Q+|B3dVbpn0TJx4wg^P#tIDfNp3i~sF`(xLYjWQ0 zs8t^VkMl6-uU{ZHDhqyryyLMxSN`9tkD`wPV^i4$XfLNprb)<`^^ka=3ipvvXOs=F z4yRVB5AJ|m2dw~g1)OKU0{)f$Dpii4qTwtg4}`t&gUGm` zkJikxnPr1Z2bWrvSe3AU)LzhD@GkFN9_Mb<0{#Hh=hWw{%wCzznF{@aE~Z>eu>wky zOOt~D7a%$@I_O)yP}PmE9Oo8C7)I6pYw zuEMTjK<$89UA?ZJ7vTD)`X*|)sR7qXbQ1oY0*yek2w4`%R>@Y&t(T*7^^NsvAQj+$ zzt_IkCTWs1ht-E^BcNtJ$6Uo+g)?}Nhb#_RaI@yTpeJw*8NRHw$PX@VDK_|*kPow` zW)GCNlWNGBpq7*TFXsK|fhF}z>R&g$ZnT3}`Bh{DO>djtwzGX_`z82bc87+ToU85N z$etFS7JeoEO1wa_z_4#6f@?|rGW)H!G`BQ{yM?8~l6fiA2!V?w>u_QDx}ULfQ^JV&-xIAAU|7qix5ohOtEr45n> ziHFof%5#u=7V9$hCmd*^1#nJ7;tgjtTyy-|oCi%nzQb7ISRv<>oOhGc$+JFm}Z`8o;oynX!6Fyjfsv4jtSv$;c*vYFT@7K z1jN_?Wzl8P$6}7f%#NKM%YMVRiQgukNIQ|{o9mnVtn^u_eT{w1-TJ%rl` zBqg&CO5eg*S*(nH`kY_TM~r77{pV7E3jqD_*$;ZGeXQMJxqm5rem~U!Jz3d*5Y`Lp?HlbI`!x4y zrti`D*7L24+ZMNRhBdk4g$NF zb@H+~qF;EwaJWS~rBxOeCMb_LBTPlm=@IxlW+#Yq#5^~DtG|OyF>YR^<5)N68lzhJ zn!s5(-;*!B#%mGRBKUb-Lc6&8!{Gc53>+B9c^|VZIojz&k0`!2zLwdh<1nvD*1*;0q-8^@5bMEHc zsW+zHV8%C6=p{TakblADUy`vTWA2r?SCodQCtOaDDtEuj9nw3bqi?t(V@1Z9tTS0{ z^V{anx-;tzGb>dURTWFL?@8_FnvZ=S``B@nADkbYE^RJ+_r8Yv8vZfvk8v|}#zl`2 zkh{}c#P&wSj)<*@sfeL3-72nCoXWYF!P1;l`=T!O4Rd##pL1q|Z9UH3KR9_^Xqypx_5dbLGWMOBAu4%gK8*7yD*FrzVFyA;`D zzFhm%uZvTNUVmYo!aBRccZC;36hy>Hhv9>IAGrIXUXuO-@lR4-4dINZ2nhnc2SdOH zr)ge*+?x1AACw*deFo;nM@Np1RC?iZU(s5{mgzU4#Y9Y0%RGXCrFd!eVPlhoUj=$M zW3^`{H6k_QQSF#XsFzR=-2?d7N-LsHYLCY=QO`v2`=S~M(NR(gdCRRO;QrHpr~klQ z0(|FOX&W62J{G(_XnhbfL+8!&Cc7umJ4a)N{Q{g}jjtSE$@8gpmlS3Om0vHrUKS~| zE^S@9_TJiiP3|_i8-F|gcC+GU#mjFkzx7?wcSZ18Rurs&GFUJse@uR>o2_n!=Z5Ew z&mNyWB6CD0{i=#<71ugl@1$vjh1Wxba~bC{MqeF$m2rU8+E*2DCE!YtfQ>zy^=#I@ zynT6SB_bX%_u<@!$>quAX_aY}oy9egWVw~DeUtbGW|Z*ROQM&!-2P6nowU{G%h)Ob zE`nN2vAu-#n)UY!)MfCkH%4!aw#B7o<^Uc&8tT*v%$!{`FPdYuKlZkEtXBFf{k^=s zyc4S@RwrxE9s7yMA6f`Xk;*p-Wff%=%xbikCejRn*)gh!xKt8rAV^v1G%yyZ5bNc2~6jT&2w}5Zu8Td=pU#jQ>eCGSi z$E*}H*?q(NhQm!596dPN8{>@`6*nqwpRin@$J#|e!wNq15n*oZT(|eVA$CJ-T69{p zendTd0KKWWpg7mwm@^w-4lvo3Sg73;DiOUuR{vP7QIbk#Tc!vjh1Ui69&kA4Rn4pV zwffg;bdBl@ZwlYkep5^AWxq^}8Dlb=3oqej=*`fc61TO5gW(6mne(Fu)j^z!!014i z8_rom|Cs)?T3mZ;E1ng+EA}Q(%aO3b%}5cj1@bdEsI#SyhISRc>$Y$z>{J*vBr{*= zEYqJr=Lp_^T4K4>RBu6EF9cIAbAnw(kvF-vjIvRbYMybmw`fu%%Wv?c?Ss#&b zcYJlcYjeznuz!nZ_=$&4JVdi_+r4e~hLsE}xqs*W9rVkXk%52tg|I}>sAeI#+L^pF zdF1b^!bL1_d&1bYRFZWo5O4I3Frv$OIn1taH-nN>cjP0CTtSm_x&Wi zDxJDC;YR^q${82WJUm6tQklQ+AKX89deHPBcGa{GXdl47Q0gJ#g)Xc0l?gd2%)6O)V}+tSMRzs{*|)QAe_8xxap|U%Myt%IuX1f4E_8 z!`w~zoAMKi6N;HjX8xUBzeyEI6|JgTRi)IX)WR=&*YmEYx43KY`7z=H(tfAbCx@kX z25~w5ykx&OHAtf&SvM+GVvngg61aJ0~7C&u*a*;tg?o{q%Ex(M}fT zB~Exwc<57h5+7<=@UmcRkH%|P?cB=?&kLt_+BB+Z)TsKS)DhdN|Bk9ppPl%%LEwE! z%1Nxzsjkg^8vSYX^8z{q_a(|s?Z6o)H3Mgh>Bt)|Q<0O+O~xjJ>i|!XUFgsGpYtE{9`kOg-BMde*jBTx<_|*K>bBLXm8q3W z%a@kF_VBfbPd<3^0ehFml#D4!yPJ0R?47fBzQ6swo7cTn^j6XNg7XCz^DpMVCLF(c z{ANL3LEhQiv#t#;%~_h$BezHHguDrPfj0wh9?LtH*IVc!qzf(bTjaC9VWM=&BgEE$ zhl3`^Ivx7ZCdvKZYzN|SW?iuw%d+kBtdRGecwc&7b zALs?O(K5UcfnusUD7n=A+dIU_OX)-+e3Hij&sLZW-K#CN#mR6 zXT070x&_1!^36qrV7iq?6CNG`SXY%6Fyh zPYuHP^%r%&aOY>>qT#oKB7$7L@q5xRfGQ4g*5FM=M05;2ek7V3oUC~*6ys{SxsMp-ckdB*>vi+br07){I2vn zDWSG2z4YLcRIQ(J`@ZZhdQ5n=%i4Pf1a{rAL-+I2&r1iE4J?z1R3u6loW2b?0lR&eZ(ibE;-&8zXUEy}_oqv* zc%f&ZhuKPU*^5CJgV2Ud4@r0VUufZy_go3P5|$dC8cr%d$~>!iib<%7fDOV)p%Q;ZcD+j&mo@w6e`?cTYClgKQ&P%9aO>e+kS7 z_ZGev==qKiz83HoB|@%1UbIqxBLVNPP)HGv@R|SzX@jsus2fsOn?lyRd=h-uo5FVj zd8CfX+_~&N;)iF3WU2y7bNL|cLfVB?iNjGQcm;ae=!ap4@Ee&O;hE?tXdQgu&%%2` zcOhPAAi%X4B3$rX(8lstH0d1V^2Kyi<5_90G&7A%ZFE~Kw%AU2y-fz^CYDx2Yve&y;6TTb0KMSjc@j@qISM9Fa`P$3MjzIL@ zZU~$g!rv&XEURRn%O zP?{{v7T5_vjq#MgpUk`R@4J_EFY7G5aehy;s%BNpyK_cLJt;ZI+QHtzUTTqz{*C@$ z#XBjrOYLWjXN*KM(MK0ccm;a|$q#nFj=c3en-qMzoo^^7ys~mnB=Tq!3guDE>0Dt|Q@Vc;1{2F+Y z=p8l}Qq5FztU!E5Gw^^w&w)CyiKmISK=1H8rCDZr$mF680vfn{vLf;0;Tc{Qh6WAQ z#PaT-`oZ;srwP*qaujT~RY)s&^yH9%0vax}+R# z(-7cH!Vl7TMiAPo{LY60wmDVcb-;1_D&Q++dF=z(4L?{Q_7byr-dYIn3+;sFMstHb zuW?44@v=bOPfoa3z()O+-$KiYxsT3PXY05Y`aWtsYDEk9%>BOozNdvmZ=!3DCE8^G zFSWI|wQHN$XIV{|n}biOo+2;0QzvF`R%cXYXtM06HcU*Y;w)%y#a^k49jwR^ei9}M zXqd8Nn;mV$VOwZk(cIn917~7O`Iho=!aD-BCVx_UGN+2JIX#Z8m0K&ZOZt86jhIq1 zrG}5`n$v#6`-YdjD7=qZ)+{Tg#hGtTftuuC)43_Tih)b&H~f>w(Q0MCOMhpnPP zK%AQ)z#k&lNDD}l($;)eyOsMpL5LM@N(YFU|Cfcy0{-%lKsxcEKZA3REQd*GuT7qDq~*b@bMLUFdoFr%`Ln<^6Nej1~(s?#%Kr-+x5&S6>Q? z1$@bS0%wPB``-5bCQR^8@V_O{gSLE@n1^rp(lrCy#n(kvx?k#ijeR=y^QP9OstR0D z`-#A8Ri>j>UGt*LW02j0KM671$t*c3VhFa;RS(NMf#C& zFFBKf=hIl=YrO?(7v>e=-BO=IPU|l$7C3u2Dlk{o$k)jC4`Ho;tsmWk8iDhxMouFq zTR3bSHi#`9Jsn++a-{YI!+(Y+xJeod6Sa?(el~k9h>6%5dHWXvx!unKdH)XKMS*@q zv(RRm#{5&L6=J#i5C0)exV<5Jr79hO#9PQhf%)gwLMMUGqbo#=q@nK@J`$!18Ygx4 z+Co$<7nt1-6PTGR6v#EP6V73%>#@uK5=IK-asb{4z6=}wlRz#37ksGT5#Y^`>s|6( zQdc$IQ!W$;O9WzXo|(tx*L3Y!m-7hEwno6e-!^U=j|nQx#U@#(DtL|2RUkGi6*gu& zvz>AFID4WsQ4{iySbc=`!abov7$A)FkMutx)C%06ivoQGW_X_vn32O*J|)n<-zQ+J z*yZQKcLG`#L%c(DlGM&S&o|HI$zrF>hT%6C3wZ)D6o1OR0rvWifaut#HJ`dRJFaG2 z%@Kjm9}w6-MBRxFBR0i(U!br`JB*o)qwhv0ocDKh%9) z>vZl;9mP2W+}*qWyY9c|c~C0iJ0Yz)e*QDsbg4~9`&wVs-Z@@BTsPuDW920b2xklQqWPeG~OB z75P#>X$7dw9So0!T%UM2S^V%!0h`1A_&c>Jf09?yFBv6}x4~VakH`!f+Bnn`)U5AF zg9qN$iQp5#eFeCa>jZox@s%O*M}$u518tX{3HjP`;c;;*GX(q`z8>xlIp|i+;ZkpO z5ND8_jT{b5^!g$*A94;M+vp511{l+YUxlSYzILb5yR!8GACq0oz3txi%ht*&j#CQS`&hg=lS zX%FFo>Lg}nu$S}Jd25lqNUEbT_C4|1ut$6t{}!FFZPH0Z<6?(^KjXD@ushhdtXtM+ z+NOlXL7A$kjF9UT+kHS#(7=lCGvpe4N%K)icQ_`9@CURTY6%@Av; zW6*@c9`LEyXj-Jvbf&LQy znVuvullRbBGnC|+_(pQHrcP5_i#wl1tX(Y)@{W!mA4cDS`u(&i*r)ACE7HOz8PZB& z&H`WevHxQ?mKgeAR$_y*!J%*Uo_4cfTl8tV3)IE%%+Xfk%o|_GwVz|pQHGvkllMgk zJ?)%cS`Bt7lJSJZAeLDsG<}9JDK%ISFdMyWqIo2F0AN;}1`}sM1 z?T~tA)ZG20m(ap!VQ}8e>tNqHy}u+U$;lDWq*99Ks}-n^nrf$WYp1ot*$uXZZIjFL zT=7g{Q{!k?*Do%!4zt^u55dNxy(=nkr-pAx?;!6Z7*s z3G}o|q+dv1lHN)ivyE8eb858v@m#KFu5qU zK1jg7QqPLo8B9F|rmxM_V7XBcDS8vBpW;z z#3KA-7w!H@v=i-%(l^Ezx3pW@_`ntR3iopf+Aq3IK54)BCHNuo1bjF)iro?KcwW+_ zKXk#l;Lt~*Uyg<+zaRZ^!#3=f{VzjB_1AOiIR`ZBg>D0W8XrjR#mZMQ($ zy_2OeKTv!2*wOWY=0o{ja)h4#o_>4)K92ZBUPSK;pE47DA!+h(UO-=n@8dQ0GyAz3 z-}_a=Ht;m?EN~XcN>ZE`0$vCpE~C3L-~HM3(*5CQuaUMMv#5b8V(1fBdMZ7W)C(M= zxd3W}Q(6duFQm3zEzKa}Fa33{GqK8Rc#Tn>QJzKu_Z?qXEWlaE-r$d-9fi-EB+w^> zU-O9O^(WbrY-Y3<+lyVj6Q17|P78-ziTaoM<7cHo*~`<*Q)AcI_$BJ&U^R$774T2k zr6sHu&=bP`=x1P;#8=`sKBLemG!B{vP3(nSz`dXL9(%fa$mFvxIxjj;_@D4c2wUte zcCwi)kFnJ}Y#+9VOOJ1=HPzy0qK7%w8SCK79+xIrXYH}(8gT!)Z`de4ZnLx5;o9d5 zXsi+^$Uo_i7JG_4md+)yCteTF!B+x)?V@Ij>2K4+=UQS1oFUCLX3CRxG|+U*urjQ% z_E@{Q)7-gl-*@vAxFy&y_l)a9Ux$9|Dd&{4$=YPmH_)-YKgbDk7I+qTur2Bsd(46@Y?W0#0la@v@`zsdaY@zHYv5?h&Y&_X_kjrx;U=f9Fj2IBXgJ z$@}IyQSXswV$akruS@HUcuKq_Hqk3h^dx$)C2~gY*>=^0`1zJrOSeAYKG6TC@3_cV zWXyBsDGHhn?~yvaSm=7| zYfs*VEfP1#54p}f54!~Fg^8-`u_=DuaGfiBBn@fqDSjRMB5x)J;18xd(;fN=`-MlP zr$pb0Ia;2pSA;3{6!&}nCVfHdva8)ymU_{K6O9dbla?iaQfyQAW1~;1Cc)M@^B`ZO zF8oNl!?4TQ>OGKqzb|0J*hzQ0yHxsz+w?H7Bi<)@NniD6$xMe@LoNKuFmsqm|CZ~5 zy&n~)_P&6>;QkU1@U6rF?kDk|=b68At?(V>2lQ01-)>en3r!MoVZZdHxM8Np^pMjL zXO9V7_lv?p_34hNMkHQhPt+{ryZpON0{Jn!J@~%PMrVV0*&lU&Il>v?+!a6bO@UZQ ztwucWXY_Ng#VBW#>%aIKIrK;Yf64Q}{1Nt?Bv5lRXUXrvuNDaOdC0w6o2}j2Z@4ks z_}%&4;k9j+{sTLt$p48SziS66KZ|FXoCz*EbtFEK{1%P2?*;A+@8gcnQLz)^Bz_1V z#B+{sPZ#)q>V(b$^*z12=GqNQUiE^&&*$0U^;V1UO%1?vLGPJ3!FBjrXJPbHh&A}l zY34MycZEOYIit41*062-6W4?O0zIl*s_UEDP3^tX=EYY~+mTbOGFG|QkXXfY1}_#{ z=eY?t!%eO)e&|c}9lEL~M(#gF`ib~8YBhQT;wNmuY`Pz=L#Dl1{163^YL}^ zV|)O%Sg1KC;wimE`~f*nyg+QE{^L1H6=IASVGLj7X z;ZdF_w{OH541ST=+)uOb*v~h@bDBe>#-KjhB5;j~Q#@;&ZQH6bcx_xmcG?m*c&6T$ z9y9+QJIYf}6dU9oP)~91$C=}FCH`oVj|~#=$MmcC9n25%ymD`eFXUK!j_)JZ5VLs} Jxz@y>{{c#aU=aWS diff --git a/Mage.Client/sounds/OnHover.wav b/Mage.Client/sounds/OnHover.wav index fae205369b0f6394f6dffc7071b42a43a6f38356..459fd0705530c7ef3cd10d8fadeb7ee3bd40bf26 100644 GIT binary patch literal 7548 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 diff --git a/Mage.Client/sounds/OnNextPage.wav b/Mage.Client/sounds/OnNextPage.wav index e109a11679cf0a9e5801ba94b9806b321baa986c..c8aae197d5d8fe002ddf8de692a9ec4a2e66674f 100644 GIT binary patch literal 22816 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

    }1 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 KFU|hN*Z&1jeY_X| diff --git a/Mage.Client/sounds/OnNextPhase.wav b/Mage.Client/sounds/OnNextPhase.wav index 7d321fc19fbdfee5c3719cf68fd39c5381afab81..09cfb019cac421f84697680a57140661db289f83 100644 GIT binary patch literal 52340 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 Rh?WHO#eMNi-;(v}{{av!`;Gtr literal 63990 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 UcP8Hy+ZVFju-+`Jy6)uv0cwV;eECm=+ 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�qCQ7=(!sBR7=729>5a!7gqL5@R45ljTyi?ijX~0MZS-3 z5``UB7H*`B%z`eTB=fScdJ@}ZF#BRIW8TR8y}^{fvCV`FwW$GaYnFlf*rmY8*~q> zorjF4ff81KnBYf}u~3A3gA_y{3!)`TD;;>!cUThrS(T4y$5Qy`L-E&rq2NF<_{xirN3Ds*eda1@*`?`W_vwI*1+Np4m+au8 z;oz9HK)ZXey1QBBt?cbm$~QV5Erzr7Ejz9ydL)cFCf^q=I)RMuzDWPpNbZ%yN6W*T zb`rE;9Z_J}Ud`@4X0D(wafJB}-f3^(pfMi}odML~h<;K3uBWE!Zg8L=XzqMFIb8ud zkzKjKrGkUJicLgQLde$Z%{q5ykM}`}9)Zs&1G~CA`~3@+^8@L
    <&$rE5@Swl2s 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 BlPmxL literal 218572 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ʧZXdsW{ORGRhcgal9JC*@A6kEE{i$I$ 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
    gj^xLMx<$dk1$o80i0t{E+3A$1RUg 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 Gh5rY4rG#w& diff --git a/Mage.Client/sounds/OnPlayerLeft.wav b/Mage.Client/sounds/OnPlayerLeft.wav index c0590e8489fef4dbbba180d6317067f9ac2cff11..13c6a54aa3bcc2e6f5b536274a722e09b49b5a8e 100644 GIT binary patch literal 50056 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

    7qa*vzkdV9@f6>NHh6)V3ETCU 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%0A4t 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 F@qgre)?NSr literal 60664 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 diff --git a/Mage.Client/sounds/OnPlayerQuitTournament.wav b/Mage.Client/sounds/OnPlayerQuitTournament.wav index c92220b59c0cb4c4d65f9a9f878bb4523c79bd74..8857e7980f752c071266a1731cf0c1d3071a2ee5 100644 GIT binary patch literal 91364 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 literal 91364 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­*{wd(ExZ)XO?~#TZX#Z|RT=5o}y!?k;f|;p<%Ug<9MPa*C~k3JG31Ntzg6 z{L`{eWH0ewR1WLy?b%Euw_TVm_wao1mh$FxZWfdngJ8f~=o{Zet1(1n*F8z=1 zS3k^rzx+q6SvX`*bXvp}_enwFW5kj21#e>b?TAvLh2@pJUpVIa=vnOwVN=xC={=HP zrvB{jZn4Pp_=&WoJ-6(?Nm6Z~`3R#p$DCOaJ#=vDKJTHoJ2t6)Zj^x5gVGje9d zXZB9+^X2*n=6fCOiKk{vo5%w0ioyV~w`;ijwr6Qrsi%uX`&`%KMnxS6ZR?3a2FVk; zo5|wSMTy@*&luaZ9!gQa*PloIY7TV>slauVwtEVNb`0f1)_MxK+sOZu?#p-F_dSMt zDKckIvj^!<@FG4}@@cR2)5Z@&GDjK1v?GD9zKi~)T5J0t69971C1;COQXAycGUlgu zOh1@@I^%Wb@QkHN`#w7#+9WPE_k?6emx%c4+A6M)YRa+lEcb`7;?Zp)z3!cen=F@z z_oVw1E9+acnDkreMSTyosq`!B=68@9b{b+bQ`oMqY2FFm{vov@zvt+b(-%`VqCR|{ zbEIyh39ZBw=XG9VN?KmySDnF0+#yg?`_*npo^U%w!M!(Rci7R;C*FmgYKVoZ7(n#5`aq)!|btsQNLzg zN%y5SOxu~dJN0QwLSo%-@n0q;wKR5n=12F59N~^f#A26tK`!K-jdQF?^tsS6$ZT&b z&X7mR8@VlJPv6tDIcejwt|=+z4`(!qW|mo7^vgyq=8jn2ljNNknkRBy?18wyV<$$I z4D)$s!ZT zdLYl12ci1GkZ%a?|jW>4?hVdCnUv zr&i0?Kl4IH`HU^;butEJ3`uSBz1HV{zy0ECDLe{45y5-T^9r)?{^FCRbKc|#IeK6C zXZLH-7Bp#>i%0>dtGYY$LHhWtScPU(1i=jiq z+k}2_trK5~{awh@5}MIoN)gm=H1(ZOOIt}!JgWa@**_pZ6O3Nuj;OiHgsh0T5#1|# zdc>R1{vnLFf~%xZ3b;rcfrNC3D@j_@I_4_)6IT1O0_XJ8_C|7zUn+9IlZ!_d#2&el zv=I18d!$lwyqq8%lm3N&a;vk-=&1Hp6SZ~vb-kZ)!`P^wQJVXo`_HMHjI&k=x)Qjd z`|ZEXiP}B?>a4iTl#C-8Z04KH?HNY0obdOT>xm1LaN)0zw2&3@0o1-M;J)&?rQ`0^ zp}WFndmGAQP*2s)b#l@Ona$`@`ESoVxjpirZ09PooWJ1e z9OB1W6z^Iq{UZ%_t@M0#&k&~A%aw_~>HgPhgw=%klbuaU+2s(W9j#Y&dhuVSSMJbI zf0!A%-dh6uuHtU#`XIIz9`XhApXJ)bWT|73`2XUO)_ljn!UoTpsD`HS$8wqWv=v<)%uu= z%$NFLwX1&%@{4H3;4CY9g0HA=QdZuyNUS@XQg~{aj`bL5p^=v;cM@qCtE|<`@)~dsBg|C0flM|Ta_)! z=aX7tm*HLUu1r}KZ*l)JPpEBIv-ew}sI}{4)xsIU=+6Ruvy#)3GMfYrX+?}rsI*P< zm&|&U-ajKL>k<5FmDGa%jv3#R>m-IJ=1W#B6?Mcy5Ehie7FNeQ16%_t`C(4%}MQ8CI6A%fGruxGTGs zBFp0+DO?!C?c-}pf5@+-II$+5NUA$!?MhZzYct|b<+;(oT3g2*1pb-=B)KX$OX9^# zQjBY?>jf&o^^V2b%plAA6yqE)=n^EX=ipV^yS;om>C2kht=w5lB6cFZf35-G)(mWQUiY9C)`>oqA(`qFW9mJ>#ATdSR`yezkuC&|^_O+C%r zhO4<}vHPm9jM?n0XNw49g%d(H_P;oOp>xbSZ1*CCh1|e9{UG|p8RByu`6&Dup`v&b z^V(DH{=7IvuItWrw|3POOY#ZaYW{bjia0QKr zm0E##-?Pk;8C}y~rBzK+Qd?!r3Usw}dd~VspQ8V4hFf9QTKYe}ynCeQGvYcA#EVix zIaB@@6&=T=`@%M$;9e0%AmjU}I81EE?P7+IA$$RR)(JfyE!^d1vM#P8Ul}!*6QtF0 zD(cn_OCzO5s4^TX`h^8TF)>-1g`AP2F2)rluM!1eI-iX(=_w8ozX|a|ZN3%PoV|lt z8w}Kg%4~bG3HVcyWDrvcp2G~|ccZj%SMR2Ghu{CX(c6gEMeUh-S-Y>FMKq`issL&R zk^_GQenTbfmaO7gO*6NpUrOtk@zhsEpJqlGh4np#13Wj|D2oi6O2Sj&iTF~UC0nQx zk8ydt+3q+wNpia?Nr_x3{=C$|wME>>h44LqGdquM4y3(l{C##gaPk@gx%3@(Ty#rA z1x652F8DpvbSc}pR!9P$GQJGq150f*hYo#?y|7zB=7&B5I zuaxlZ$x84wR9~xCfgijzD=~dt>Vfpl0hjq%&#m-RlJsq;cTCl8IEzr__d8G?{$fXR z|6?!lt=*@*qg>U+yYNWwM^;feag3Z#E-(DUZ9z?c1%4L46SeRSxOCEsy~(y<9d?&c zTN*9QVt<3D*A&-?gT({TUH+8*6cfbUsQkSvzeRQF9QlcOMo0yUVI%RoFiUvGPvQn4 z&ohqsi!24o-~%QcnRC?IX|1#tS{Kb@#w25$F$d9r0oovAh}G13ZLBk9!uE(q{A<1T z6YxThnLQ0tor^f|`s~QSETvIkldrU|byktI?$OdRDu~1m)N5;(%rb0q zp)OYsy-g&=xz~IZ#BHa!v!$uxUa_%QOQ?4aGu!=s)j3bbA+?-Qa_hsrBrc)v|IXB>Ly3HE4Z&oKlsLw<3EH+{28u3 zs@RwF61S0LGOfsIR^f8;dHET9L!etW<`Ko0hDnlG0@#|9U5n*ok|WRMy1;rs! zM_8CIQDroXhJj=5KFs%}zpX{(GcW*0MEtu!UA;yqm(h)e!a8SD{wx0U{R+FgCL zaoi|jY}b0JL)Gu<0PRoRG2R=q^a)yTZ88uh->Lnzw_0B9g>ps7Qu}Db)OfXtW@~Q! zo_^IhWLyX8rfiI|hSJ5(K*Dlq$afveJm-o^cco}igms-?UMQ6k9&(&;MA`?BOo-fB z93pJspK^uyIANLKzIVbHN8um6Jq9x-OIwN=n6Dy7UBS>g)O8lHgh< z_mako3xzhoSNI8^)fDfDMZ`2z6>kJO{$2j4U<><%)xuq2xA2>=2PaY^RJh6lVvO8c zpisA#=E|+57~wqE8?~BY><-{gJ|}yCoL&(2@f{k0c;gYfiQUHb&{s4bI7FP|po+AY zG2K{;D*eOYt|)0IS@q24+8p(ZnxS3P!;Gu?M=eo(tLD=i8in*bfm*&ZzBPdl0nHy1 zXrL5QPeA+lXu4^By9zQKo53f&p7{k8hwa2A!UXOYV92L3*AVAjDa{aza>IZkG?TeR zG zWS;BnP}0WPYKK}sjK?NCvrb)PrKjl=wciTVURUj@f2goKXv`QF>o5~3I zo!(@B@YhhEsCl(3`Ydy*c?gN3sO)_X;uZQ7O`gZGalhKVf=DR^c{{|lXYM|<@0&2lyb_Z7! zy5%R1aNT&HNab*MU-v@Sdf>gZM*k-RwLy}eLb?|LB{rMXASX!*SV0<-S-=YW7ucK) zv8qFy{`MK5)9BV>y3(n{oIs6}lB?KYj;!fI?)-o_3zj{Sqn;`)IH zB1$0Q9ig;P8F`sSasK3kUOFART2)so`5r1(dy7Xf!;8T#vY+%McbK2T zHDUi^L%2W4&rXbUi4@}V@sGHmot=x{47~DQ{A$d6aqx<~02*;4peLN-PjVx;IovkX zM<3#-AW9vig}_Je3FM+Td?!%_j`b*a8*ie!q10J;2jrZ?KpW|gIj+WT1zLSa{x*9H zShB0g5hoWoM)m<2H9xIEchQeFvDeslXb5nV7Sn&Jm+r6@n1#&mh-c^1<1|xoDKsz` zC=ot?WB&u+^z0cxZ|)V# z<&Lsn*<4&B)&aKR0y2`F$QENuvAa+)BQtr}j?kcU3A!*woGy6K-W2W=_Z}=TG29$} zoG?e+F6EZ)@)@X6Sc&Y&Bm6<3sFW9));MvM@SF!?yKqg)f=^|nm|xfi-DM$Pl7G$Z z;v%`Sz|>C$f6p6?e05UEDP@;5kLk5qrcD>8P!p(dROCA z6VbA@%3J^E?5COKGg46<|2%Vg=EJNcWgqhPu39gFEYJbtHh@lJ_JLEP9XurWg|3{B z(a9H1W$!ayG7fk|Z#kCh!s%>1QWKs=A8E`^VSnWs@cH>dTm<+Eu(J8e{0;UP+7||t zn?^j#Z{iQ}Q9Q>l1;Wl4-sVdpj#M1FV-2yZcnerNeMP_2K|U!pmkx@(g}Oj3_yR=X zQfxF(x$|@1$P*ysU7}^}U#(`=4zrE12y)xl2$);xOCY@UWlq~u;Vbs&>x?1hW#qy% z(q<^tePuFNW}L_zo|OZ27V9$FW?uFk*0RiVR(<;stqNSnXyEFuU}mDl9^sboCl|(M zbN$2z{2*ov-He*?iR@Y6eGTJn@;~4ZJ_Qmhf ztBKn9BtF3B6Gi}K;R<&KXU#)?np6x79ujPjKcHQ$6RwLbq;k-nb4pd@64E)LlsHxt z`3Rgy-NA)ak^Py(u_s8Fa}&5MvDQmtroK@B4H(urjd-&sFwD*Zdrz_cguh}ee56V0 z5w)AzURmuQl3gRSX1blSKWS3ZvotHP*6zier@8IC^t00o7@KF=q5Mw%3$G$RcAS65 zk4Ej!TRtB%(AhyE*aZ0fD+%-Xrc5pR#`y%UsFUDQ$jwhiyj&%nxn^t>D*HqE2(BsV z!Is3l-4Zf{s;ER?$j&8RE)KTU4rn8b#4ciY;U2$3_#jGBEBMYt*oGB>KGO^6P#yVY zqz+g|B(@&V920`9CDgE@Y}=|~9?%QHPxx9Nq}MdB*gQ_ClXf#JhaqU2)K1zqRFMo* z@&=N8k=ds*8m28tUY{r>*UXI4|A#$yDVUKu0_!r431ctv?SxakxLiP|u24tRqa>QBt!bQaBJ^+bhRD`TqGM{TbS)$3}r z1FL%fnhx%xuTDeu9^Xnl2;6?wRT}yJd8NzX zjv0efKx6j-k$)KP!5&+mI5dnp$PJ8Qx&W)L9Qz8W&>w*1x6SDb=BJYEZFUoz#;)QA z0FO))Dg(7{89R#W%}cN$CW`IBLbE{3FN(ljv&2WzZRwpTz(>&ld5XJuf~yyS-Qc{F z%Gh8Fs|aMvS@g8|La(S_)S76sfkd?fKDoI%F^&RPzNR);o1`sJJ1Q5D^ExQ-t3NjT zX!^30QOR>t^!R;R5mH2)a#mT%mt3xQGFS7;1S9zFas0|#02UFh6WD#S7+zTh)AiP z^n2=7|1w)+pL56I;f!-8Ba^R~6UH0T1y?usICn+&Om|z)L-MA|BD6$%Ky05{?iX7)4q2Rez<`SZZQ>kdre9$1ZeVZ-;Kz3rpc zD|4q&3>o1+0_zZ0dZ#7m`}Ah|aJ@7z32Ot#?;QLuPyAQ>PXcD(n6G_?lYBdATw2+{ z47(6`EOr5*xC_%8mD}r_9Q;pmL3dquDEKxydWLu|xC%-I1;ST=mUa&7=M2_MIF}oh z#7TCdU5(zQ->_DX0n>Az(~7e6Z=h#p*oJ+|sRZ9lU1&>3pb;J7Y6Fk3rLazLiO;3k zu#ASgwz?|0T1XDOH>ywu<2GMni$#w$IS zwpKX_&9)#ip5B7dtFe};90>Fc3NVP z-cED6#;)j8M~;6xWT&67>R7AIfOU#FjaW`qb_83UD+C{wWpINldSJZrDbUZ)`X>Tvrf~M0j4r7WDI3#&Q`*v2sNKEi)S;2~ zGixdZ#vb=tXed=jN#U6(+FvxvsF`dI*UiirnD2f?Rbf z7m>FhkLHVOn)@eLU+FjTU*S3*%3tKlao0!`Q{Tzq+@kI2Y$}Tp5W>?JxfEzL?CU)aq&bvh$c;;$`zi7GJG3 zc2#C1{F(|-2hU2ITv^C%JnD)Q!?~ecCE#YhkRxc^>N)6?-vRA35j91c?h00U^i>zDeE7Iy^UQrJ@ZCH+c2Kzxe_N=~^7Qi>OmfXMS^D&<->JZ^RtC6cND&GMiil z>LG`Cfg)uKl*O=LunnMfG7AQ0P9eqcTWqC<`W*r2Q^Ej-j`u28nfwAAz?SoEhoC0~k^OVdD=dTO% z1syDbEx;03fVYHp$Pw)3Iw+Ng=j$P|cDspR;lsYmAK*vu{e{!;^Q8lU_X=|pxVax8 zudT5&b_HVTa$xUEWF2{qJi9-bSn{5<ihLb{gL)b z>!W`Mw%sBBWq*x;M?Gn@1m4jf^d`_23!5v93;Jqfqcz2@VK)SBz&@r7GUSFMj#3g< z`v>P&lFIExY$*ipstqSS`ZH0Z>Ds3d_MUDOX zL3OusLcd_uw7OV>=~(&)#_AjDD?`n{%vI(#GtDyWE%qh*I(R{6(7iMtPOqQACK`j2 zA%&YHa6%J4nJ*|T<-78W;MW{4b_3GqJ^ZVo#%uu4R_elg1?$1F|_n(J|8!kZ3CvKfnWnY!8He8R6*gW&>yuW75Ks2DfqvKaL>6ed~Z|`-r@$q zf1+~pxj|r5x(?r1HnjP#_`C>r6`4vt@bjG`>9D#ckVzyP*z}Wu=%CVJbTA@}@9jD? z8JOtzscwIwCQgYt=2GV;_N-ON+5$gPA+tEGs!R>K~&p=x>L;=Zv1ME zVIEnNjRmNSYim_Q(c#tb1x7TG?u}+8JrKw6~KOTHNY_Ox0%AHd+PTi!u!* zgjtTdh{YrkR-50s!$blV+OhM|HCCz_>U1K#?J{O0ooh!MzoK5^7UDhS%^dbESu~PHGmUAw*#&#Vc$_Z}ncuB) z^cTV*gWzXwm%Z7j%Wh?^=^N+~Zl+DO&-5M%F^}p?zzdSoJYY3|&tjCh&RS$`vUF4_ zl{J^zjp#3CGcyirs)QA7p9H7QW-0)QdW_Q;qj`chApzC`zeokP2xe><+l$KtLsWhE z$wrd7;ME+-)+ImTeAz^nGS6|&EyfA+9;h?J*q}c<9ZbhPNFwqQOd#WrBN_0(wSwQ* zB#&SP=4En%Yik7fQ$CTM@czC9&T%5p+GKDG6krr*HFoeIi^y{DasR>$0OQ0MFmwFn z@XkbFpAH5>{yusf>`_&asU(4eyM+BGDv^GNuRPhhMo&00ZDc3VGT?YU0W73!toqTw z@u&f&=3!v+*aRJwrwq{j8#$4XyfWbM`UDT_{R zC`0Kw`vnj>`vY%_(wz2SdjqO}o+DFh84#4)f(xJsT>&p@C!EcdF+zuFCcRIqqrX?d zS&5EqoB)G_4qi1k7-o86=W0PZ!6TUtjJhAp05EPn!aF|v z_m?2E`x5d4>{cAvLUtjNB{C%l1w&GKaLHT(%RxuPA#Q<}<0R9YFw8Bw9lSVG(BgEo z=NOnIeuiGq2(wiKj1fz5M)`mj){`!z2f^D>p4OxD!E^DAex^Ubd{`OnF9^%KKOKdu z#yjPma_G%MjN@ts^9ObXk@*a6oJ_2&`jFWOFro}1e=ud?g{Z_PGc%oon1f;9=4pvM z&7SaUoYoShiSn=#uhKU( z1vx!m;5Tax%ebyn03N@s!0G*rk*Wihn(7$IY2e5hhZR$i83pc`+29mO#;m;n8_jYs zw6q1kMgrJ`Q=G+MNim(aV48Bked7X`S~Rl&>{W+h{p@juU_@?X9u_kjnIYh2ISf9L z^=QvVoVLecJLCp8lY-}02mi|NSQVAQmUIu?BR9YX{*GzyRCU%t19yWtOdPs5H zQ=J(Gj+szKhlTVTIM)<9o;uD5CIhVE>%q+O6f7K#v6ha3|7HwkDHnKJlEB39ohG6O z7o8E{3VVZy=Q-5fr8w*9E$0~C`2&%-H}Kfqho;omDFxJ*b70`={~vc43p6wad`vUZ z<3uMv(DkFiz4Qg_5DGJzyg)DdksxEqHn1Q44VIwNSYi9&iTdCa1GkGw&!Wu=T6e(d zig6qVu9WMLohjhvI0@dJ3#bv=f${$a4xitU;VP36U`=;{RpAU~)51NMz_c(7EGpZf zBmIO39)l6ubNUqsWEYU{HVCs&+i6J;Fx}X34z;ro8J|rb(EE_ReK;QqVUJu4 zUnYm0pgSU}uSpvH*O|Z{BqywAOdKEX)U@-%?tTqR#HM{o0{4@1)#}G>=gZse?MzPM zj@qU@hONYHr6cT;>`K;$(R@H0vJ@wNVWv2n#B8J!oF!nQk(d|Qr*6`rs6z((5FG@o z;T=|46d1WCfQ#)ec$o4-qQ8I_X%3{$O-?i0P&Ij)J;^Mxvz`0wBWArVIvjU|RK}Tj zlO0C(LmC$_bx4A9p8gDr@}^UnJtw&%uz`SBI}MQK(;Cxc(g+%k`mP+=XNVr^nGIX88zKe(~ z=b60RW?J9OVok2DvDhgqm$%RAPlZn0dgE`pfJm@w)9p=GIp95}n+`pNtcS@Y85Pr(_UrDTvhR;SyZ0~+j5eY-^wS&kYw#NU5yA&0lLo2M5C*tL87b;iAne4!wr?Qx;KGcyRw1r4>!mzRB^6lRUPSkj zL9~iJl5NOLG$dxeaF|L)H*!mS;nXpTk&;4Fdf6i~S7?YDuZ}7luwmTy3dIu8u158mz zu|vF~8a;*ew-jFa0G$pGMMWpVnS^YRK~5^Tg(a}Uw*?~oN9_GkU}6-V3>pXI_{Yuw zrU96py1*km66Z-iFt)`zDbQJKBl0ucxdevucH{w*$t)#b2}2rzA7cn<3x>J%;7weI z-gN}i#CmXgonSsd>spR1#(vlXT7p}=KDgA*BEMrN&NCTa*r`k#>?I?Cj8clc#0i^% zQ@9n*mknUj`UM(93YhNZphsRZ8XDUiVDgWECU+Zrd)>elbq;)95#aeNh>^Yk2ElOX z74@(uuEx3Z8Tx4vrV(_rlXM_hY)0bzy$B8F2KJ@H;F08?=9XY_p zbqoxA55VpgWDfg`9l5bn1eu1Nm}VHKa{u`#c0tby2TNZ8CZ3raaSZf`Uf=w(6hE;HYVcjbD(8p zL(l6BSuM*v2kYfH=m`O6!MVX7HxV<}2<(*$A>-9BrVjdb7o3G(fdkP8JV_kaJ7f?(h~jPY*;shhz z9crAuBSYycTF?~Hav$U%9@^wn^zS{sgY1{r&^8sTbphH(Azvq<4SvRqhclm``6i;J z0jU+-V8))Ye3T;1O2%gbg`c3T|7qVFi;}G@q7jPG{KxOVA?AUt@tzgA^sbEBl zLO;oe_^=mmC=RQj3}!DkKCOTe2*DHbqRlR>fui_-9IS`(cv>V{UjTOnSzOCt?2F^O z5=JT)w4%JwaAWZa16EKs_ALwT%s?9@yxWJjGqC?O@K*-VcRxlX1rp<6mcF5P^gk{V zKdw#1*!tn`w$Q&+^p?fEWZ-8g+GOF%JeWs!k?RLIGGA zCGhMxj9EU6Kpxy%8Dr!|FPq_aKlad2d>Z7h4fdYHGy0$?(<0>D%bd1qAjCC%IyAPukfuAO%LWf2D1*0B@|D`}i+?WL!|7y6C;F@rJh2awk zGn*T~XF=8pWX8q`!QyiV^A>?Cf-)!I3J+v8$USUh-jeaz7f4hhSTYmwm5Mhcqv!9i zXTHV0^b|k8;)?h9n~LXsM6ZL~$cd0*1=8uq)d~O2GJq=Zm4WAEqU{EL|AOCxZGVe# z3Ni$n=wmkS;xYF>@Z2BxUBTazaYv8^*2Y~yX$!8H;Qth?Mg_K-i7S2he%n9$Yn{kj@zRa-y(0JouJy zPZHi8lolN`l8kYV#gl`(vxK`-F-F{fvl-kEIE*HXr?YsLfP3L>#@~@%hn+Pz0x7uL z!t;WoMe&3L^d`t$tl;?s(!rnyI{u>lH?lf@&%zs1@RZcHl?#RHu3HSeLyQ1n;C{^mmegLgCdDdQ7@r?LM% z)54pAyOxHZZd@IdFdMse7@qV0SAaelcX_ZvqVXN%Dv!Wy#9~J%jB_U%?})-)6y)y? z#~u>o`Yer|qaeQGF{?qI@0{3U;_x#PpF!jL@82T$EYE+R24^S81RZRHfffeaM$nQV z2XJt2hMI^rd+?j|UvGjl8eAbk-s}M8I}-0;ATc&%FdVJU!l*k~6~X8EFjv|C&4`8B z2#&M^xsq{JaCC#K5HRxidvH$;N^cfsltW8{G8X)V#aOYBnBZ;@ioV9+I|ue-*soYA z4dEr}1uxAMcxN6nl&Jte?`Qau=OWXxm{3Ky#Jf-fQi8pJe7|vaRck5u+lrYL5q%m3 z4#5V%LR~}$z%!EO^pGVBNLh9!TM`+qPocf#2af+ZdfQ%aKd~#&x$ueigEXCH8j|Vo&=e$J znOV?|Wz;FGMdb7VuwHJ{BG7*BV$C#wUN{3jr(Ezs@57FH8`{ue?4UVuibg|L^Wqd9 zjAw;_mGw3$j>y9Q;7e%AhM+2dLgSkbmezQ>+inRz{wzBJ{Kh?Sio`>*R>R-X6f%7g zHp5%+i>v`NZ!V`6Jow`vum3RlNo8b66h%HrP_xvrC!dA1Q;cYBXuO*s*ST^36lM*s zeZl+-X5enPawg=uqB9va2(K}6kv4}slqYs?M4~>>dU)s zJr6B;D5UWL?)@FrZJlX2cph`2jc?&GzX^|)0jsS65QdlIJ^|RQ6)|2Wt>JXXiFcn_ zPyQi;5pm8-PGM~ibDBZNH?h9{f>t^L+|nbkE02elu@FWq0a!O;c@#s) z8gdJ@ka;03$6=o?fvg0UD3@8sX`BzQ3D3Fc=+S&D(xYzwNsOhhV+!EPRj z>J<;0hn+`OAR^GxNk&Y@hG%maEZUKgXq=IltvIJ3J%g23 z6;Zx=cw;&2E-GRS&B#TPhs{Ja&MKS)d(qk;!*x$^jbEav^c`}^1^5ZxV6<3v1$&Qe z&Qe&Cz3`>c-{=sqiI0N>O~QC3!_V(yDudBu8}bDpxpX_d0jnUtlVn$?qp^;ImWG3? z_A(FQCGLXg&Q5T1yV)8n&vr&W^=3S?A#HCjv9?%??OBwArJBjiVTS>4wHWu7osanL z4CXZaC5x=hR&LvGXQ5_y27KIk@x<;VA6tk!gu3rZh>7JQMHrRdvJgGlgjzWNc5fZ_-!JG@M2ZPK-<@7e-2|D2|q?X*ro&V)d4%jEXe;XocjyGg`SrrkZ5iX_m1sK%D}f?hHBPwOG0i% zF62X6WDc3&VruC(Vn zQ(&_a?8zyJ*qz3iT#dbt%+MQ<{(oTe_CxPZAQR-Bu?tx*Gi`#sryuEnijN)QIb>Eh zWV4;0=q%u|O|ZIJ0pPi=rA?VbY)gI~-+jL*CtC9*~&7jn5)fOmSTs%SH!c`xLD{G9r&^Ad2n&h zvBJSh+sZ6w&NLTVOK3GRnrq5O@|2svuR~R1CZsTtRse#n-bJAcg?d^A|eRN`PKe)_9}eK$UJh6`98DSYXyt)cCI9J=}X{JAG?SF*^byuclGi zY-H`T4?3x+k)9|#1NPY!@d~dI##v=GhlXPshB4jzV!fdW%tLk@bf#~@K%ol!$y=FC zbec89_>N5Y9(snc-l{?4Ai){jQ)K(B-R3ZR0kOCSR^|uf zfGiN!gX#J+s{FQ*(a!JoH}j0q(>P)bH*X@7raI~}zHn)LiVzU?@t0YFAjWAohV(Ac zeR{mV1M^fVqcN(XmO&zy(VB?8Z{^nU^@X-Vf7G*- zCa^Q;JNt~KnIagppW9EVjvBg=tcl%V7`T&x3qnRYA+(cS-foWbys16V{sMlK7nFsk z>HETm8DR`w9=?^|eH?8zgsrd9wY^&INm?y;p&jc^Y2TdLi~ z{tnD>YL|C9fsv&f`<_i^ud%z?g=|qaKN;cNvh&y@?YqDnS!s`_EK>z_j;+}Ic+O$2 zAlDJO%IBQEw5#3S8Ve5NI@Tup5`6|tyWZ?Tt`{FE9N-h!gG>sto!TQ0d99gX7PJmn zY4&o&czUs$Q4i3If6iI#da?mE2pz3SsQ%4i9D|QvvkSx97R$Z@#!h>F3EUF9*|($_ za=-mnH>(8XasU|rLa@$!WC8bpuLi!$<-E+lU=x_zG~D)^!_0Q(60@Tv(8f#^FdA>* z9}At3jlYZ2$y(+m-C+G;%m#8nA0yPtgAB~$qysAS#|veJzWjKu5F5d4w3mZhs3F=j z+gxJZw(B?#nR;wH;D5OI+gv=C1^@PCm~2OE%VP1h*52;iWtx$2HZQlGn+KhE26vk+ zL}ojep;xx2p|lCjM*QAHX2NpPg*^jS>6hG2)L<>*Dzh_@Df#*Tc=`(XD3bQ+@pX$Q zKyWzhaChf$cXv2k4?X;F_rvvYKiu7&An}B_?q+TDtIqx3kNuI|Y-VSBx_escsj3IN zkfXphJ0YvIi?EUSW&A8K@n-NX_mlxF3>lqhCs$fVD4>%@uWLeNTXG~xZr$+(4=u#o(zwjug(_Bnlfz|h z3;%>q<#foYewCdIzD+b$j_JbgWXo^?!oT3d_BFLMXIe(s7TYFSJ6leeDRZ7N(NGtD z9hY?l!Z+lZOo6600&V+*2ERhNBgXo2Jy!Qs7v;L)OmOya&BwO6n^Vj`oWD2En0q?= zcGi>36&b&!cTano+CJ@8MnTSeS9R|iah)2)eCHDcUbjWpO#cdw!2`I{Y#OrMJwQIA zPo}x%Ip&&{mzD@~bG?H%gM$nelUxH%WlfYB7>j!YG3Ti&h(2awPCgB_zzE7oFJhXo zr};{T=O)=)6hPB5MPBL$Rk7O59H)CVtYGVnbqW=O1nNr*tYKC$a zKI#Xt6MQI|{WZOLZX?tT3Hc}T?&XcjZ62$UBiUB-@wyIz21p zRI)4iOxoj|f`a@0qsk*XgZ~4LieGfMbUpO7^)BHel-c8ihj0OIWL|7-YzwkJH5E5h z6kal0wI#|+d6-;Xx{hoxccgi$g4Lx3yp~#&pbdu>U=a4Cb2XOffjp~&^qou{twrn` z?Kkbi96rZF=S|3EawBrLVB}*%jgV5|`3DIV~|O`Ef>S z{v@wmx~%qNH|d5N^7TFSPxKuOv-SIhX?zSn41O8MO%c}9w(+*fmL5C2dj4(3Sbm`l{xiwpW4kL%xOliEMpy z1BTjrS@yzvsJzi-9B4{1C73s1>pvTw+2Mwfx;ornl!$xg7jVmFOCRN%Dq);3T3h9T zNc%3jU$`FSKgs=+vnzL9{zjM0UE9;h`^DSG+sb`2zeD!)v~@|{;+n*GW3!V#W)Jor z(mwMc#=XctAP27&Xj3xW?5}nVOtScD{NSi@FK@UO4-f`&(ura+xg>is^=C* z7LZ8aAKqf#Wl$4raCdZF%MZ)nm~Sg+?vJEm1+O_bpm^S#BRDpox5I4jU^%F7%C-ZD{Kj+Ao#GjWe*Hi>i-^xaEmqp%I|5E{d$G6lKrW^o zq35$I7cH#O-_Tdl>3BCYhJw?$SWIe(S)wK4h%e+${`;=da7J8~+9GLOOr@`}pGtjf z`)PLc^z3@{am!+BJHuP#e6PTzV?}q5Z)Lk3vLn2C#M>fsA{UjYQX;hI(7=hhnsP~Z zIcK^2J^8l^lKkzIJ<@IW@41ngchcUZo=U5b>C9e~H>Y5fbe8>MIAR`ZZR%(glozxx z@NhtO;Q8R)!6|_^0~~=T0>cCMJ387s+CE!mnhxmQ{A6}76gye|GTvkE2ksW$zx(%eZ}m$gtZ7C^#2+n_5Jy040f^VF63kPsa+5&0fStDE(3W@htl# zy~5hi?ljdfR5mU*r5fGFUAC~WxX50`H%7z;cM1*(yBw|r?>5(^$N6+{^xT|3GJmeC zg13*avg=~nso3e?uSQQxl+&c#7v8nnS^hBcy8mMx;^-Bm3;jFnXjsdz2jNX4KbHPp zu4~!0B{IUZ0uqdWGY{dn^IaYc)=yKZn(t&m^Sm9IgVO#^y@D*36S9itCOKDmm&taz z99IAzyhC&w?4}2^eGOk6@51L7TUVrONNGoRONjATT`u22_r>tun60nR_oWXiqx?Mz zKIF_yPXuXjTEex&-;&Gyobi+T`AcHi=nY>Ed_9-aUY=!DgBmz`nwAYY}CZc`OUrXFBHKb&25o6F%(^3vROrTbyft9>e zru$muSITJfGd(Hi=dScmS^gY8Uvy1G2A7TCKHI4%rYzK*acmJjOn=;5Ea0z@IiXvF zirep*tC_|b?;D;VbGFO$+BDw~iM&SNrH%fvzGt591<#$YTzx#tyrbOddB?Nfr_W5i zmOMJ~O9GX2F?m^PR?bzqh}jUd&9;iI3Kh&nRpSmC;Vd0Kt@!N7kdP*(&0xCkHViXW z(qZi-ZITy(RXSgO;2YxM3wGt^BLDf`^iO#?zWHh$Dof>Lw{Nm{gRi6fl}^&h<_P;a zdnH>7%M|l_^HEEXHQBPw(%)jh3Lpx(&EJ@hnB4kot{!EUiy-e&d*wZ_tL9Rkx48QP zwEuT=D&_3RJ>Z`U?#ac_5-3d(vGKxtRenU!5WV{^*&q}_?7 zk}4CCM_Ga8be~!1lx{yC)9AU2#UZ&*SlKa92n%7~a{I9;Jae%N{ zYcEOCSzt{jd8Y5RyP8YPd7Az<HKI?rZmpwH9i+7ZKTP*K-ka;I# zMBXWHF}c5bjcy@K(C-#zLk;8Sy6BG@r3KO zXRpv;2mEoB_7;5GbzmeOp*koBJdt@(Su?W^!jZIWhBNi+ z&xq89c~`UnrkMttTt3f~7v(!i891vx$v!<|U{N}#n*MiYhH%-|E4Y3@f?+w=TKH}} zVJyQGul-P3Y_!aWzK?}hS^WDZ{^4MWa^Brwuv>h)USXS;sE_R z^KhHdUfOoXa?SkO{JW)w<+ZVoFo>?E^cEZYiy|w;BXzviTakU4u6lWMb4TXaF4*X) z@+vuMN4|FCz2SPk7)h6MTYBA8r_B=xtbN+-k|ShX$;(r&v~*IvdUl zbGf2$8rlQ}bpR)T$GBPS>MtYCktRvuVz9rTzmd3B^!me*Eps9?nMJW?8CY=8{Rfop zUGqC-E=yxGa&tW14g8IOAHfTZk9_*vEv{|abNxy4H`|k-dT^XSuG;{-^ostp?S(~R zEpYYtmARl3`0h%ccd}=dt5(*JpB>VgyG|-gwJrWl&epjHa({Kw-gas+p`%Gee(!Yb zZkOnzEVck^;2Os{+XCwpOH1>8(=X;nrU808lO(14=K8y%|7{a*c-s~Ho3}dqd*=D9 zB>1hZ@(hBb(R0ss1W4ceD#@Rf#yXWtv*tHCKslU0ut`ZF2#x)G34VOLg392PO zMgKR(ozjMG!tZo}GFp4fRWbafXSpldLZy~`OdJM<)i}{6R`O;#cjlhXIh}hXuT5TD zPR(pxR%}*M{wwLeFy3SkHc36)HGN6cMZLumYG(q^2YPIc48Oz4G0gPT=CeN6muC=n zf+xUc`lb>mcJ#0Ev~dp3JLEcnb;KFT<=N{x;bJ{g{DYLm^aOqj_7bhxkH|Q_QTSr= zTawIv;~hgeLr=X;Hwcb?Klnsepj)dkvPl_%{4IOo)z--qf{dt(y|;Xd|E#zS3b9wd zPRM~+N?E4W2O@hIOs~I~cAUr`5k?9h;hVz>9^o0X*xuF8(EEi(TpfBm@M9TR(4UC( z%?Cd$0ZvuL#Yg^mqEl*ujOwj{RwgS>bqC@j!+?9urxTfbtQ(j>GQ4)C3x{>Pb>I2X ztdlOzlw)tQv*BM6$wt$Sw0L=}{8L$_4b`42edV3V!s(J)0o!y+XGNpGoo~7Ci~k%} z_&_YRWzc-pS7|zlF>$5%&u~m7StK%Q)XfrJu#c!o zhz03r@I~a3;&$(GcNur6yF)>=vsK=$%pE_Q#Q&4n(b-V9#J*U7$7Y&7dy4m}bVsEJ7`C^({Y%Oqz~!l*>rY~sfsb#w9Z&o+m_QKt%~ann`7uhe<_%m z7w6pWe3|_^Gd;hbT$_F=-E#GCm6t@eK&Z+-R0ko)^JTug?l!SOu=dinnb699rrsLeRxbj}EGs2SjIsf7)2{MWX)9ETgW+zsNGc~^1S(6b^|VdYX_{sR zffMLP{4AQvrg^yetmd|HU!m1r0iDJLI13C!L}4|(9vY5+shfzp^##_mS*ZmK@L%{d z>``q{y5y*}q5A8EZ>xr=4H#e0EKQ^pF!(kgUb++!fCfO94>GAxD&K-%*=BkgJqkLu zdEn09f)@88lm+k9zY(k3h5f@3B?{PdcU4l(DtDnmo2f1UdNmQ5iBh2HhydDMovH@y z-xEY9%K$I>gXsoTY7U)C4`NJE5AC3?AYQbRu8%0&1+X=HLK{*B{Kb-plM%k+Stx$e z5R2@n)rVWiN39`+{V&+)uMx%E1dY;sN(m^n|Q<^ zOs*k*@D4irGpM7nU{yte1@Hh7pY1qzO~k~VV7{%>W+LKP9OL05MA3|h&YcG#=^)jiRzPhp9&q!G~oS)LVXPj29zJ;r2_tf4&P86 z%A)I7zXSoztALoL7kr_!h_Nn*L*TE7ahSnrC)~cDi1`vmQ6N|eR`8C}5Gh>*hUp~4 zfvTfEra{RBO$Tb{9cpg`n1QFLbBOsh!+ColBHR>gt=3?4b-{PsLG8Rn1lbC#iv~L6 zz;)i$&VZHR0IQ=Em>V4s^<0NDcEl$a;?+_xAJ2e?9D|=T@m?RW1)3nD*@WthNNOpR zIu7ikkJ=5WOb#G={1$AX>!`aksGGy!Kki2)*bVLzVTFc2m(Mq9Js^VA& zuCOGY1MsRCIC#YhSvod6M;0=jLUCjfw26iYW+@;J0qD_Yd_#HMVT8XT;NeGE(hA#) zhVJGyYUeG=ehrc1XDIPYl=cW7XVEW@fvdV#J5iaI!f_x9uJ|HbjQzz4a3 zdOU{u+=tJcD{P-FsK+(nk#0o2E=9a`F|=Gu5TRa#=k>U+wxeeEZb`!7M6XSa-!xuYrXuo#OaO_&Q;Q z?8Z?1wH#`%9L`w<$5+MA%7ve=jn6m3x70?zt%)doO}rwWLRIni@_1Chxg-CNgGM+> zq{WOVJ81y~aPau=A9u-3F_y6}DX*e_KGg)AwWfgMR{Ad;V|M+KqFy65A#XoXI624Q#JA?^EI9Y_P zNf>_rl?G`@(7G_-L5s%}UPlzhi7$A3MBn>>$1CszAEGBd#mM;(_sK7-WRXb-|Mv!YE1 zqNJ&)-~VbQ9q;6!hO_az6Gu2vcZB8V zDJ(s?lK*O%E9^)5!fPPkWkvrA0>6%22YEymmbx^`P0CpT+}_IIM^!@)C4KZ){H#;h zU#sI)O}zgrem2BC(gZ!aE?(Ef9rRy+uY~)la^dGm&#s7bl_{)?viJtVCnmKNiSI3j z-^p_b>LC>MLAaGB)bf99LUOm73d>9wc`WM1PM31MUxUzr4V642~o9N7&IEKFQ*& zGG19xzA!wBpfxL@l}n;r|M49OlRFk?l)&dDJ*x!zMcu-giS&Rfn75i?jBQ8tz&t(( zGkG%{VZ+0Yl1nJ78@0}XAsUZ+`W8m}JB4@mCzQ{O@A?(}sW?7S4&O)^nJmgsqj1b_ ziJ!k=<OykEldi(ER3N1)KxU&m*O7HrAd)DHB}|S;6jWrPVIrAGAZ68bFb? z1-(~AZ(g8{###J82U>%@R}ZVQgBbnEdTJj2@(|_khxa~W4NRjal>rm+0lu#QtCgpi zUsm8dL(tnVU~VggoklmTcCLfz14mGdBcE_T^ug$N7srkVCwB|hyVuZm4y={yV@-So z>R>PUY(ZdRK4VX@r!h0PKRo0fm^~J<=qRT)ZSsJX+3t)3KK_q4wT~2GNifX8) zD9scWt_`iwx_@BB6sX;RC)-2yzWR^$2YSLV?1Mt7N8qxB!*gIH^q!|tiX~7I+rY^2 zqwg)DW%@LDZae57=vhm^FnUc7W4197%r|&<7Dbl3B-)LBHi&Ku*T8DbWiSlS!HXmb z^Tto;oR(tkp9p>>k9BPV6m!sY;(o}7iuo0K(o*c>iXuxuJ0(}{DKC+Fiq-wcd^LPK zy*h6woD+TC6loh2#9Ne^a%*G~NDyC&i{Ykn4vf%FX!C|_eRxq_XFD+Y^jfAQT)_8p zwS_w11X$o^xPZOE4rI+t0(J_WaPOR4hQFASl(Y3J4M7!SJuqZPm+41|ts2lgx1 zz}4#rgXy zLK@k;)B{SK@?D*SR%@*F1#h%Ky`aR%0m>KoiujAKw|A1y2tG+i-$u`1M5>oNH#v_M zEcR`eo=aY_2{Kk3hhxe|d5$s!E~E@r*V_hr-g=0*R8{_xm&=c(gZ@|E_ue9Y31~0vz3Co;%)eWlqSJ`%4d11H z(i3rmbYHHc#LAq~6)eFtxLJtIbUqm_=qvTJbiacYcZDy893zarjs6JSK6CkPe0hF9 z`;^`Z#`AB`MRI7bc#P1&S{FDb9s?IBU%9OI$F8FZRhdqME68b#Hp79PJ-s_eKp~6=_g}*A))%y+Ckb~Z#zb~xgHP*^3 z!YDKba}bR=atcPGN$M7PwX_V3`y44sZln&u2(=b_S+dTdG3uO!GjTC+T>juW-5A|L zct&**j=~2&kAIE~2mN$wg-re=9L%<|W0HE6YrD6y^iB>39@9a6qimM{ zm5P8{N@14VK(FL})yEoN8IR~^3&HT~Zwr6$@50}PFUA048~t5@6+}*k%WgZ|bM5G{ z&A4n6{Ssi6+Tbrz6};%xR5FFpj$0sX*0K7*`gK6kKI=R} zf^bWBR^Qby+mNLXfQNotuw68|DtM5m!DIe{`FWmJ3NGL)kh!5Qys#H~+xhMk2L8*b?y@MpN+xTYKru1~JMj4|8LTfZ01^u2)&@5JbG7re6mOlzhk znE#1d2t3pSjvsu8!jVX?kN55x?#d=ZYW&T!!h4y(4E2PECtTvV_7FO$U&0e1N7yIGIMa3hsPI*{ zP`_Wl70jY3aO2&G950R8aZEkrFcHC~9R)v_X6jPeC6*I4e?_qxoY!)Isq5glx5>N3 zGXz<3>v-pSDgPmHpV-I08(T-Y;G(O$bGz%7_muQTX#*DG4WN<_C7<|CawuC=tgz|3 zjGgZ&42Ngzzid-x9kYO)$At@#`n85`hQD-Y!M=ROHG{1k z|F~;;yZfSj+x(%pXX_$E#UyX0=bO8C!OemM&qZW!?Et=IvT{~lC9M=q$Zz42U#c&G z>b1qp{tb0`3$wv7C=MJSp{4vMGVvTk z-l(Nw6vni^!0#){^${oe368i|Zl+X$1`5tHz#xZVwN@3Vae26DbpT_&FPpz#^@IFwR+``OsNC`spXC0WQtz?t@RJtoAOCITq zbVRx!Ii(1>vwRZjD4VhitoRCQC#<=$fbx&SZpDGU&M0a>6^INW@3G3$=ujvgdND)6 zm%q(iW8#t9Ad;l!Y_ky!=%Y@-|K92$^^)2PdaG{g z796=0tDY=46J%hQ5`tRof;oK&u9%>_$(TtxL6x)===}xkJeC8)&qj`tXYig$#(pFn zu^SnYl^WQu#ADym2C9)_$dnmK*TiaKGMpnO;A$Hqj!={qQFoQ$&-sCR4ux70lp|*l zCs+Z-{U+=^2SVX;1fB}xu>u~3{pK&&of2Fo9xLIa*iozolKcm*z9#m63RdM&Y7*AP zKjEnML5;!d1ia40bwpu5mZdhvKC2@XLj*zo6LZ>i%>PgE^A7e#K8&ufu_w164)Fl1 zf%@3vvRFTq$8%}yU8v7Tb`XV5(4#NA-( z97Ej@@2ypZ`}GWb;x3N=h_eLXtUi=|7ZB^)_?@781honPf)$9G>V|R%g*az8P-LQ& zuLNYrhQF5p?$8q0a`8eeL&F_PaCw50QP}qe01G0TUmoS$jTRw31OyfHVHcT$JuK0; z{RHm%1$DrnRqEi}CGkn3{f|HiG`M*TL~Q0)d{Zc9s;@xgU*K8jCUzw}oI_6~T{*4xL1A;!(5r z@f?H4TeQ+Opf9obpNsZ$pcL^a7md5?Hu`iF`ho@LWl`F6^qI%_Tsr0`1J3P2?d0Nn zKBEP1qi6rX(ZmBS0C*YEXPXM^(^;s{7f=p@5Ea9F|KaUK6C8vVDS4gh@zUj zB6?>5-$SrNqLC+>ZKA*?x_lB*^5854?|0)jEUxgrg8I)zZ%V>_MRd;udnP!i8>JyJ z0TMeS?|5)j4oXIp<^(e*`erBo;=+ha#$1Bele3bj0@<$+bu_sa5?dgjbK%-j3co7_ zqYF6;iCUzgS0rJ)CQb$flT5-p1WP2E_C$<$M8zJDS0oydfWIc)i#oy03hZy}!& zQH!Mi`p{c)PUL)={ zqW>qV|01}X%Hz2x?x>oDV@)LP&GNV#iN2rAbtGG>qGMD7tU%9@IvN_wUneVCM)_$WBh=VI_G4-ewlkcTo8l$=DhqJSdC z;rR!8A5s33e(1+_5jO}Db0qUU@l~MlZ6bQ%4}2q;gWR~Cnc+wneDi*5NG&pxI#*yJv6x=VLYfY&uSn0F? zPBskfas?>sH7GOv7!PLvzik5yr!Cy1ra}K43Gb#~fOr3c7T=CJ;!j-163nkXfeyz2 zr~C?hyo)v!`<4folXs$~ozT0N0q$A@Yq+7%j)h~TRS_%3`d}LnkCg~u3Pd5PgGP8f zQ-lekswk3tk8-eEv}|dd+6tM+y3ykpvbMzp2l;~sn z@)pG*wPlA0ALMa9JL?tdsr!|ibPr{b>}T4s^RVJrgap;jGtSq4pAs|#FZWPe>x%KMvA=8259Jn$>y?YbpUg#B$1LP~Xl3LE%u^N!xmBpR#u7o^}naIb}kCDI$%Y+V{qI$!H^pkv>s>fgr0H)Jqxdh!_Sg2j_52vp34JlO| zrB3HQaeb(z>PF0PaY}D`5v&%IovTTYCYt2T5C9Vk3>Q-32~ z_8ks`VPK}+{3Hh`MbM_KSOr;mnr_7>_Rw3|J!2W_G5R*TZ$qpA-21M-AF zkX3aw^O`;gOl2V(#f?#yD$UvT>~Gj}S7QcHhm2=d5ckNdc`sj5jS<~SNgy?2l#kMBsuX)4 z9^CMKl?TBacNnu+^+~B(72yuoRIVkCWasLyQlG@FaJ8KRC&^;!L}eA?21eQI>mq-o z7jlZGlSZo#kUe8Ey;8BLd$5~_2OeD!eCkj14gCPNgI^V|azlktn(DtS3eHQeJBhXWdF;U3OS^_w6PxS+4PIx^67jRPP;Qr>y7P&FCmwiD^ zRZ3_SeF|9eR@Ft-)b1&9nx38rHr;B4QCx5zxeA}`f%HWKpq5G&ah0+O4)sy;2Q3cH6Ju4Ev{AwJf;IY4Yd|}cI#RYei4mz* za28#JSz7|jajaSbdU!vROpQRaF%i7cr*MQeFk4ldG*yx5Fc!=gWva$;`{{$Yb6Is4 z6USA9r>#-lg**l?;fe4Lch+ESle|%N(;-YvI8ly(d&h6e7>pQW)O%7NDuGeu?Y`#7 z;=Z0b?>{J}YQex06RMvgvt1J1m z!c0|1%eClePRFDuALP|4$6REG&@PM=*o7cgou!Nb@BS7yl<5WU_fx=a_W%=S8Tfgt zt*L(yV_l;(QhI=OTmbLnP&Elrxhix;S(17|`Imzjc@?G`zY5;ReW`x*JGr59guTrE zBdh)esvg-XYEhHbkJu+41hf1uZD;GMmDLnv5!;pW`3QV~@ zM$tfOur^Qm49xlo&N&wQ_*6Jr%%L``)u`#LMjyonWfXmu{RHoe+Ux22kxi%g$GBsX3ucaWLeG6rt5=9ZL za5%hG&Z=(TCVw6399<7lDhQYV?3-y{gM@6b}X@!HA9=B5#rHWe(hXRb?P>+Aw@uNva|8 zCPpj2Q0M78;4JS4_t*?xavALJ?P!6jbcixv?59iwHn~TQh1=08i1VFtXq@2O->+6wF1u3!Mfg85t$`MtVnC+J%2 zpO{rnBImPuxQ^FqDwR*0=n%w6i_!<_nY2P1kn@;> z_imJW9e3$HtmjW4H{lp+xHR0CEZ)#s(nr-<@_zLq@`0YyOz@@HPdB1YDf8u_N=M9W z^MO8Yge%JeI)&OoN5h$ZB-MebKsNzL8odZkzdm40lhilp3sc~_F&e3j>F?)i59BH zQj6KU)I24W>dgJlZUQ1a8yOm7fPHpD1bQCk((;Hl?}MkxT`CLfvm#nqD63}3+oVa# zJ792~)Vqiq-B5ed8<82}jkbw?$mBpjoS+V4TCy+cR#^8(YD0nDmZ3Um+mU^8EL0Gi z;q(*)fBzj=#RtZdk_?{5V5AP>P7iUPmMhPCq^xU$=s z@$irtq~%ienS5a9diX!&gKtf8=`?|N$~$09+Y#xjhr4=>dP?ytPAFyDXgnRr@XTz= z0QT$^?5OG^s;gsKQC1*c%fTwCikNLb%+{yXA6gQ!b7oMzfO}WPF1k24F&_{i#fYKx zr7JPhkO@J;Jz=MMtC@&#l?L+u2ORao;R#G*R_Rawp_Ku@q#0NZl?v;C)gs~k5QLil zsm`Uwf#XmX$axmk6*))_V1L{Kd?TK@M?V8g>Q}fAeL;L94-QYa=sC<+WZv10d{S0+ z02uv0nJ&yKpyb;T5xR{3b>K661?BR?P2>r<4Q-V2@&u8Bzso4Oiul;)^L6w0_Jw$Z zypKF(+_ei16c~_Cva0)U_W@50-&SOjDkhpFQSPBRz)%^EEFgX0eDs-XC-fG+0Vko26q)oAbZ3z5@rZsPvLQAXP75a8FVFx^5^4&Ugyy;r!ZrRk#BM6_=lMT` zUP4J|+U5&)c^4wo+u)7;n!ZncRh!5s#cQHosww{ION5^Lgm1EEP{AhGVQ1C6f~@M9 zwK5xJuFbrYeJZb(lXm45g!{rIo6=XUgBV5+@Qb0S4Y<4P(8+`k{tB~_=q&ujfw(EF)UQSZx;q2DYtnN}O08h@BB zm>L>o{cwF4BF_VLKZG5^L}4iQ0x`%owoG?UcT9Iz7o+Q|YbAW~nt-0xkV^P_SfXD`Vdlin%Koz^?E zK~D9&{`ujqyY7a*#^O-81kO_TDl3$~komy|6;gS&hwxEXO<&32Fx@k6gu3pDWtQc% zxrgba;hX+q zKa=(X3m!);z9LkoIdI4+pnj_7Zc%W{xa(eiTO=M3&TjXOOvLd?&8SOtXk;vO! zQfQ0bu^)N&$|HW93ibFn%yv0YNqz9HaxZbU$+zc@$d1a~ogSNVH z!7O+7(!6`Fjh=J9afrm{f^z#tmEaDZLUrM;>2?^pBSUPMrMT_6J|FZ7jqbBAt4RK(oEcelGR~#GP9BhWD`9!kp_G2TH#@tIE(NE^DfDunarub29ak?ZCzN4obLeX((J4$8 za(Yp48l#1$$mTbevjBN$s*RO;dDC1!^PXmJ&X}IsD|uYPt+=`IgOhfqTuf`05uNoa z??^#+?uacBiZb7_dhC4y2L&$)IUJG^yfWxvK(@WW zI^TTNFcr$k5?mfVo;pA!(3_aX%pEu?)n<;Ph5uxZL622a%LC2#U+B={6$6~(-@IzrxZz=6xSlATx?82*_8aWc^NyhhUc|+ z2Z|}mC~5&}U;?rVx`CgyXS0x*_#5{0fu795b3m*u+Wfm= zfiQ^M%wzzuEQ#y`wV6K5SNaIulBtM0Xe5Iif7(U0G+2T@%rE}C41*SK-WiK;iOGk!C_w3z~%gggs-6)uNW44og`Ea+9heEUGlS3?KE z!EU08Y0uSp8sflUG=*YTG_#|*_uN7*jm<)yPMfw)X$&8?Y$XTL|Ig|(EuT8cyvAHs zSK#<7Y#%0sIxFAvohnds$7QTZUKZCh`nMlfqF=_fOB#~WBi)|e#(BY~*Y2>@z>bR* zY6vDim@C2=ke|G?ppcA#`Y2O7`+}eep`XHPhL;S#8+I!+D)`qx!9Ky~KeI4LUIvQ(}M_MrM^ppH6p$q1N zHOMpGmSLzKa&K>hvrTr-wEc;$=#Jm`Z-;)2h&!8D=I7(o;H>>lqZmwWV}Iih2`2pq z{cQbaT@hUu-36T=nb_AFhMU5zPaUs=KZJS0W5bie2S?P3s1-IYDBd>9)JfNzou~DK z@>KB^_>TLBiz%WK8?@JHjgtb~x{JE>o@b?zckbFCv&mv`%) z89Er_3~ddS4fhSljP*=yO@Eo}mO6G_kSTOiSV;JyaC^kB5kHx0gSL6tP%AYfPM2B1m?!UD{(cwkEbE1JKcd> ztovYCWwaYd8hRRv8k?DNP01z=b564TXi&}2+F|>`>V^Ls-ahVWFYp|go?SF8IdMqr@E@nX7mNNgc2E43#1<)rtSIL{zBlp! zst?yf|K51SblDVWPB!ng#9FRcMq9>O23VKdTLu0eJRoFc$mI}k$j1<8@W`Ml0i|q1 zOmlT!_9=Bip`~8_%gCPk+`H9#(nm}4lycB^_M$H^57F7jM&lf;R$mR_oZ~s z{;lAQe}~eXZqAGPjixW=A(nJYlr`Db%09v7u}rpnwN7w!4crjO1%?LNg3^Lc1a%1P z;jr75m@mNVU;$f=YN8aEZo=6p+4I3&)|2KfDSnq|rL?+FYfIl^?jvXA9_}A*0X!w! zvKN^vOe1y&@*;0x#=^O?Dt8*(p)htgeFxr7k>YsIIOnf9%hN|DuaEmHx?6PRSVR1Y z_{fAyN!`KGRbJlhR>fWz`NakQ_JM=2QQe&wl;T=i?j->}xYj~K>U+&3S& zn_NdOf)lt)Y&UiayySXfCFf<{G8>>3U&UPjW;lQYu>rk83anbSK ze%p56w#6>l7uXNlURc*zMw?dax4|_im^!9hmK49sd)xhIf!+PV)5(|Vo9ureK9`@V z6XAX~6#jgVxDVVr?g~cL#qg`?%ja@0*mOpR{eA}9lr72d^e3$*0(dq358RjYyJSB} zE0X+A+@a`((P6O-;sXPhyQF3worGSW8O@jhT#;JU!rfCY{) z`vu!9dk2Tvkz`Y?ersD>HQRM-C2Iq$KA!8F3lZEWx|p^~z9F{pcl27^TtT3_p7(;! z;veUKBu2?^)F~9hOhX3urO@)<eku1U#wwOt%Z=6lX|h{e+l>Lu1LFcO z1#S!Q*b{85{fE7URTV@XRUfC{rfm2uTj47yE zu+iPeJIiPCC;P`sqm;$kdb$fco_mR&kj+(t|H~Qv1ODsza@=t+6Wegr!8fhM!~+$% zsvMT8_^Ws}J9p+R%4m}ECBYusC^{iJF?K?{7_U!U{PRHOapyiCue_vEx$cI>7R`3Z zaVcO=V8b9&(8quh4#8gD?y*;M6t@qy*0&6?G`5~XS(}^77(?`pgh|NtX{Qdtf%U6@ zuzv&5_CI~`YD~qLR=gIEEj`wPzc_SLTTptGtlL`Ac{{<@d=RkiP!su5`qd8DPhwTktOrH91{ zf0Gl2ak|C)5>}zcAd6VA^r!#6H{P?{tM|7OjgmvYrYr%vRFavG^-fDZ1Wut}&|_=x zW%x9pl3#ImwdEu(mixe-hL8Aq#C1lhX_D;g?zZH|W$DxX$;;#QF+HM3#zrLUOoAL{6D-O$@LPS=yv2RLic!*LM2iyCFl0=v#AR~B`Cj}J zt{G;9zVOI6$&O(EWY@7xSOu<_6jy;814eHrdJuI+O_gT&-WK@tu4Hj(J(7CFB}AW( z-WA(6p;l7=TK}A%%htpS&!AM6&iYe*;r{xf4ENwy+OI%lDzfXj zUxW&}Xkj9Mk6poB0e&(Gc+ycS1!%gHS_2Q1LF^kgk3G(AWHwP{)PJO#zWW6+xrrIo zQ)VUPMA!T7{eCL;dE&UAjZ$Z31m;=2pOic7b^R>!N$W$~V!L8LZJ%Wew+34hOlgKp z?1;bVZyNWTu9#|=*I78*ds~`qh%MgI#WY1{bxpAfevdiv7j_MIN_WFp!`#W-#r((|X?bq`Y#M2-qz^>C`5*Al zZL1CdKldPf%gVs}ag=J5*NwB$kr&aQP^zbXWIK zP1v&hPv})b_yks^yK6rsoo`UVw0t4AV%DIvLCMn-nE1wVyJDF*UE-ZoYtANTZb7)W zoK&6;)?GHvHXSnlG<-JPGo(R16AY)$YxsHLlUuknk%p6&}6 z_Gg(>$jNI`bCj)W1?me^NoZ}@Y3gP1S$EjKI=Tg1ay+mtHE+|?{B-6Y%B@yWlB8?W zb$O1ugqp_uVE@8u<}^1MGekXll^P^}@|(TOTqW}|vL9q^$~=?4J~ig&h~$NdyW(fZ zZ%S&N9-RBdxuU@6spqe!u3{(a+8Aya;tgeurHoSyWAw?oZt$3Dh*v#y7Ni_GV(=Qv znPh`k#|wUB`)2v2z)4!cNxeJP*~tQJ_!C5?*S5dxYwUCE^X(D#tJXmCD1ALdTTjC2 z`L_!LjbZDv*>n}CV|q!Od}}qTluGaFWp^3wn?xoGdD6m6}Gb>!27EsYLo_KJ(=sOi!&TFC)tVz zHVi%=oDeiBu&?8g^@1tPuwCfR*3`yHll`mwhs8_M-`IISP`|*B_yc{NabV4R6Ui}t zRgU_Pc?QAvcc!~}!33wAS0b-!?%nL#S=TZqrv05AvB z+O}=mHdEVn`_{H?+jisR`i^J*r{DTlR+To*;GDhp+53V0Y|z=@;2>RSz+@)}5_!<) zd5+$2Ri-FE!S*3&Mp$^%e=(C|m&KHfx*2voNEM@bXc}XRRZ|@*AC}vz2lWb2Vc&>} z$V}w3dgKG^myw{)QESPI{WH8JyhD6cprmwL>L7LZ7xg#*#V(XSFZt5X3SU}(I`TE! z-;%$aI^7@Mf2|?dj>5KzS2jCizWl7cSe1ys>VC&sZb1RY!hS8X3L1p9rHBuTiDp(@3v*U#B_m* zk4S%^&og~dIZkF3CV{z2jU=iWPUWQZHQ4={k`!g$M5yO`=u;)U6lvH?{+k~8!iF6%nsHT@HLyjHSeZX4i4xS zm}IV@Sj)c5(KKjqP+^Bhc*HCrDdHXwa`2+07SQ_{lRYe)bvzF36_GD8SEN6pU_`C3 z?ZL_RNvJS5R-wBvmDxe;0;VgSNtFTPa}LG8pK^w71DJ@BDob_cFUnl)B>E*Aj1LBH z4uZaFPi2)f{Q=LcNBVxW5oUZ116mMV-+(0faft1bJlTs131#B>u!CN zzE?BV@#;5aoKjkODmRjEN$sRC>0Y2s;EI2*@0w?keatj^N>b3T`#@um6s>?wE}tcOR!NpO)$ z!3(wuwGb|ujo?D`!5m{O)3<=J(gO}Vqm4O6Q)4BxsvfEhm7LNK-vIA-PbW`B_iWcP zcWd83sk!o8*{W=oD+hE>9#`+IYMCF>zogL_i=5xQtEBO&s-HF!%{%%Ya50w~<&cqE zTUq22CJ7p%uWZ8|w;ZjJxi<#aMj!k{Xz#GHI7bf-i3qan%j~A@myL07!BazyhinY_ z9kMMXHE6Q^m>4F0!jvJMFCsJ&c7lal6W!#K)NAVdrSG2mh1(V-g%hRRGTfgK`j#QCIcSbBKpi2V`EB2Pt?irxzi=BTJ$QBR{*M)i)G z88s?ubfhahS9t62wD6#aw&4ZCydnF8`vpyL+_q=fZitUXp&9Y%CDOL1zD+%trl)yQgHviIJ^6F|xA43A z?~Z>4{Jr?MVA8eZ;c2}xb>~>rAiD!qq+ofv8fzwyY19~|I)4+{ZfnT*u!)fkqen&u zqNYb*iD?;2#lDGY6T2h!cueQ$Hqp~!^2WA{c^q{)GCJ~Z`18UF$5;Hl5i@6;=H992vPgLIM;n7W^ zr$-HmOpKTu9vQYJq+@WGpfQe)_Exsn;y$suSY0^68n%2QzDZy|33cn z^3V9BohgS?SEZIr+mi9YInC43#{{5#2?pc`?X|g@y2oZ9o9A|X3ho%TD57mtLbMds zEUI=?(ddwv_?U0e{^+9knU7uxJi8=$!$_ROY^gSR1%J@(FO88!RPPhVD1+yw= zCZ^MA4blo^Y{@K|c{4p3&%RJ_kmR?Ud$e$k_%$3&Njrlb2t|BRj-{Uh>W zc#*Kmp;bdp2jz8?u&3Evn6P%Rxx~7nhcCrV!-;w-wE({I4}eri2TyvfInvmvCu?3r z#Lu!Kg-eb=VgD50W^W%)HTPuKJLkTv`xzzEKc^i|znD=q^GU{l^pdGJl7{~E|J|3I zkV>cRO?#6*E;G!jyPkRDq;<-8b**|rYiIT)|IjAeUnpzeAJiqp6Pg}=Bl1Yp)~Kpc z5m7%Phe!5_tQj>Z`ayJ#=s{82qHNK%qR5EBq3eU!1>JIlIaGUXhh_g{n=D=zjtDJ; zAih4k5S^B;P|7GsYQTnPnT5>^6c5iExk2p=4IIBHVVrN}Fh^P)ncf8$P`Mdgcrf!eQLWP`|uW$*tf&Kh( z?kMYHKGR`PFkeQjAbmi)l(yQLJ)we9)R>GePn@z!PL(nP-~BE9Bk_^jH_aXE?3^_= zD<*SY>WHKlN%zx|vYtAJW_C%tpYkMSd}_h8$7yZTAE)2W_?Bh&EcBn3M`?*T=Up>i zV>(L^ag2|jYI|gdl5_COu+vdnV|UY)nu;aU|D>jpu$s9pVcg#(iMUGdgnxGlzAgX|C1#YEQMldTZkua26T*8~91Q z)B9_+)q>EfEFQS%pB0!OHIp{_KYKnq>t}9Ce~|Vo^%3Tujenbe+h(>3tkV}70VS8e zqGyWds_$svX<(aQ^>qzgSIV1zsZhSNSXbbfA=WLR2#e4q*!}DPZY_F~B;>K4g?Tv$kWw(?g1f6bZc- zHYx0C@JIVb%*-?Ry-ZD@(N0h-eV6J$RU~(qjkPw)W#B$PsfCnu>Asv-s}7%azqt{d zyI7#QZWyb~%T`w~A!kFEBLSGMNN8!^gJR1kI1b%Z>MNHdukV|CfwO6rKaqi1%87=tT#j-YBOzTTk`9~9pVi(&0HXR{O_eK zEhkV)d59*^cQ4M51x6;0AHY`^I^(Q;R)}+mVXnwR(L&Ux@L{3OplS9J;yq5M^N~fZ z&6vnf1h-`kP+!-Gs^(d>n><-AuCCKEvZtM3HzrT=gu+Qrq<1Xl&IJ-K(=P8@UdboVIO^1Zzg30?yLKuU?YG5`j)bD`+1Y^EC}Lc zalAN8yf5Cey>yfay&EwxDmL;@Xho2mD91iAldS`eMhp;JZIREWf0efHFQRsu4d}bP1)KG zZJSu~D0n!Bp)@)feuS;8C&WBx`D8)w_n$v^Q|o}fUfB;E)LsAG<3mFIW{ZwnG{#xl)d8yU8~oGLplux;OxY7C6KE80`S1FUdHZ`CdW(2&Is+Lk(#K^CaQ~6> zTSo}XXruiGGpK}>iuv-vC6q=`Rse^0} zbgZ_D(db+5u=lYu_8VdplsnwEalwm1o(5&v;~fiwo(1KGBK-zFFXv@k&kz9Lah&aSI&#^WXGh+hq>zVz-FHS zzY7`u3J)bpz98L~>MJ4oXfVz{8nul^W-+1%bb3dT+o(s(0j?3B130kFLIGQV`?knOA^YHEw&Z3!R)6b>dPamB5H0z$TxofQJ z1u%%$eeZG=mA>=bm80C+u91k^PvbI4~*YR<|Ew2 z?m`!0G}VuUJ{okHL#)+iccY!IYoeZ^ZO{fm+lkh?sppjJ%49j0JWS3HB^pEW`_KB$ z`u_Sx`0jX*c|UoxdGolJI+B3zt`9ekeq@dZs&4S+rB?LDOX^yjd`_Snj3xc`eVZkdy z=7%PRz7H85k}o7KxT<4^t(z@}eUN>sEnciGT;r?qI@f|f!CQhH9 zaO!<4<&s7RN(7<;^ZcEC)4e~v`TdT-5C0?I5N~Bq1$Tc}LDwx;oaeiDj=y$5@=x-= z^-q_+C||W;|XmmU?7JD zzY9JP92#6QD7z!V-q}{sw$66Qc3y*WN%Mr3=<%fAz1*0|9FXHaEBI1Io03 zR8ATzRhOm&#`y>ME_j_@(O)evE>Il(jpJ_8y~#D%RnGm_^U(Lge;NH=-JeaGEEiB| zeF5@icI>>$K*d(43j-5-R``Ir>wrzPpR*5kNRGil6NBD3eD>}3Scif;+!3@j=u%Lh zplXf}P*d73?iAaLH-+{>K6Jl6^Vxy>Y$i-WEd9Ym!WZumkbh0V=b@>V9W&o1hs0yGhacWKz4J9@*R?WH5xzSUk2cbpKMFZf_kLeN-8dAlsO z6sw30L(d!@WmKh!sU{Lz6#X(PNyoPnZ#*4NT|+_TlQ&pXSXSK1;)K@}`oDkL9KR%*SB z^}r(c0`FTQBB`o$Dns&Xgq&g#aT9Q2OYNKNP3$9)`xn@+*&5q!*{<8GIa2Kt?e*-h zZ9ky$)Jdo$L<$G_R(uy^(iCnm(B5Z&?(E9lV5gz;{FQl6tMD7{NtFPO{xRklUCFDc zpbJ9Pq7M8WqTprR)_AEe0Rr=h-U=S9t+i3m?(c_Ko23@k@@NOt-0D4aLANP4p}AL5 zjZlxkL-MflM46{ZayR+5#7PAM5B)0woGd75@;hm8ptQe^Z@c%fcb_jP5HC%{?!F(0 zlbXm;YNUP?+Er)42J8XcRa^2XH3EuNiNaj*6iyXcsIC{=Z`=Q~kGGewU$Awyjj|O* z&g|g02WO`Sw*8_a)DbR2QR*bWoX^QmN6oi~Ex`#q`oqAGWqkNx7(0A3siqgE*ebFK@?z&%;e*t1?f`(#GnawE9qZx`2s1qwm6+&!Os2Tl^r^l?3#S4b@P0DtDwYf$M$+ zr>^ndhQ2uL?K_e~dK-8yEmRt7XY_l@;m*q3#8r))sz;k7iHc-2xUBWtErjAhet0^k2 z@u+BB>Ot)1Dr!eep7v^eQHS4zl2t?FBC6SzMm8v$)-|r{EM@~~@N8)dm)2Xrk)PDt z=v&n>^2317f7ee1Mh7wilcZRA8=_vMavZpvcX}yv8Psh@nF&^JVjKAZdV4C{giqpw zg^ofFQM8S)h1iCPp`s~#7d8or!c(D?m|whu-(M5{6MpkF|Bh?IH{+{uZZ3ARA-v6=dV-nTYG(e{kL%x!U*JLHGMee@^!Dg=^@KBYJ8c?Pd`oy;vhrJhHQylb z1kXNK->mq|{#lPb?UX6jBJfwnS`+?<(1?U@V+Ughkw%L^(L4f+Vy3Nb&~(Rg;URq! zYfpju?s9O6z7Tup5H2s5%rI;&K1tvNKhqeF;VtN?>?*#T=&;41vTtgeVmmCR@KrJE zXv3VPoX|@S5c#R!R53aSF!(FMP1tGfhmHgMW}p-`1PV~)tRO;X?2W zyBR}`8Bk~=^@-YM?XosR>#hyZY4bVw#21Z1nD04=8x~_FnkCKW#(2DAuU=DcrL9#> z#VHfgf4)7QF76ht$632F?xa;qfA6Ga_?px0s661#F12P8;qX*)7+0lS82tSdFz-jCgW{9u(KC}y6l5F%DZnZeU-rCXL z(Zcb@Q7TBaXBW$GtAIFOPTq!6rf5zDM|TH2TTbhe@<2Kmm>C!txbN@k?+a!~Rc(r1 z4a$|1z^V3|Bj8ls)=0JPl8>lYba{CFF6S~?9-iMfpn~ucHA_A)Ed1zhG!vHcZq{OQ zvprC?y{5;~f9ZluYx*g9n^+Is<2qIiqms5p`6?aqH}E!bKXDGqO34_SZl+#Kxs>uL z{f6hJTGt9OeTpbIS6>-t%{Tgbt+g?gkfGjNn`D@N!Y5lPu`kol+OD70x0)-6zKBDk z!2;UOuNOWe4`ZTeuVTN>uV)6cxozhgIUQ|n)#qGiYBs|2);!3di52))On$1XH3*&67y1yKIuB{_`Z3@jHV3)@nK4&7jlL=Y zztgvRRjAQLKw~Qnnuj}}MH*%uMU}sr=uB+_X1Oc;(-$)r=^a#A>LS&Zjse!E7I+IQ zm`l9fHq};6oXGD0r)eEOlTYH_au@lz!g)TPElc%)HpCn_bDr~y-dCO%-jCj|?hRS< z(&wahPid1J_?z{|o>VTqg)iLvMxUjd0P*+N3PAJqs{UKqqs=2648y#j;+XjzU2O(H*se+i8XdFp5< zwq_ZMCw`inj3e4+Wu;t0c>+K2Ez0abBx;KbzWRX|(st#g#)5HJ2^y$n!7UyJH9?Vj z0G|3ot2Q}`&dY9M)0oY4VagzSK>sYBcnIB?ov5`&AZCpdZV3(eVXO{he=WfhrV4)% zrAG*vd<`y(UPCsvBru|`OD}v&;K%&Vlii!*x|xwL^?dS$Lzdm6pnI zc}O75o8W2SsevgqqpdgRlV#{>v_%aCCuu&ozze}4noX~RlHzZABP+5TRndBHvd{sK zN0sZg+EMH1{_rW&=uq|@dx}%|Pr?l04&P7cXPwha0izNOjfwn#V~Y1Kdfj0 zhkuFpnY*N`h4Wn2pv;Zw>(ef!9ZKt+swP)ViA&p`@xj$ZnZtGqF+;rkBPdEXL==RN zvQa~?O14I2nio#w&zL1V%aX=H-%)oTe-r&Q`Gx+<9OA1v%7wfO`VNQJ7q&&gwSzrk zCqBx)G`wl_nD7U-Bj^#dq0gGUl1s`^3K~Q8rg9Gd5&uZ}AyjvheY!{TZj^fID=~43 z1p56ueFI1f=;M)(=;^2kn~+J?2eJ$}kN3e+sf!waxRDRu@|~>ubU|(>yBA35jpP7e zsQPk~ITx60f^EGpl7Gq%725C@nd|6G^q|fWUyKV{1}dVH(n(~CckasW`mUo+zq6;y z3GUFW+yUL zDAU-gE><_`(~UpcHDwg0ony4mU>ZjGi~E-ba>!4VcKQoTgxc&kI+5~_%c!PwEFDS# zIYj29YcO?~vGh+$pecGhoURK4<#dXRmX2W)939Zc|C>>2(${}h$jYkodv zaAkzi!Uq06bC2{A56C8DEi~ZAL_c{ zX{fr1l1v-+2X`5WWUu3?t*ww>NE1ife)FO118!5$$B2>H`eL219frZ9SDjRcxt_%(2qFf6)&Psr$bY<`mdQv3##97!4 zLunJ-@3DG*=TFW_NH-Fnej#->i@>e1ax)DF26T&#Z)2L0)ny z)b=Y|?a}96B^mxvKA-1?`=u*~i*Y$%mvYC~)IZku&f{>ea%N=>avpZ=^L!38w^D3> zBZSE5_OD>|*C+Q-`^_WDW3>V`O4!IB1ai9u+g3PAXUZ2`W8GzyDDow9lO4govLyzc zcbpMk;Y?ebzlsjVbM^zW9PM`C zxwlv#pe+Mps16m&{NWDqUzury0yOD1q8B*ZkwyQvzD`tE05>4ceFpJN-?)XdPfxsJ;$W$lc4$Y zj(lR=)Cl4;*FrqQc0m@qPWz~l`YhiGcg{dz^DJ|mUnGnZ@7g5WTVWKtl`hDx7v|cQ zhz*54wp}4H5hX$megJXRn1))pq!y;cX*;bUBx8P)D?+n+spgbZyxl#5)ZRP^USctz zA{p)~Tb^2GCK;*~Nll?XlNW*U-Aa4t_f!QU!l(oN;6!5?Iu+-wfz(gtBr^k?p<2vx zo)_M*PnouSnBC?$C064#ZWBve$o7sr5vxO|anXiHoofKcB=Y5L*Kyw3YF`-AE&N2t zU7jVH8Q09U)=VHjck1v~BdZu6rJ8}~@@2KL{K6aS9V|b#PGId%gi^o^dOPI>Bdw24 z5LJN0`$3JO^3$hKXKo}y&2su0t(N{A8VIdP8Gf5xnEOyV@IgzYK9>(_&nh=d{9tcu zA15^BdSdsyW9E{PP+V7-UhEC(m{rF-2S)b;IY;2UUkdD!W(6+!hWK&^Z1Pulxfb;- zboFzMbd_-(b8Ya%`1?yw)iGoPTSmyTpsUPleWf!}QXvWF=33kUmIZcS=l-*q_M^5}VlKzikZhp=+Z*}>R4CG|O{N1Z z${}zvh&5Kq@zN8Z^a4^t|91a8<*VVc+C!z_3KdQ}$ZBRDOkQhX&)gy_QBE*Ue^aSY zOn-%Wa$7x@;Wm%L&-54&`dbiT;D<#lpf|IbK*zr3UA94vleY7GPwo!X2F}qmBFJ56 zDqUx?QMm{T;^MuOYJoNWdx1_;&cIHe)lm|-we=)?9?C$Pf@7nB2bHDR$^T*1= zjPLB`p!kqi!Yb>!D(g?kY4m)Y!A4OQSn9RtzL=eAWE?R~-RK`1C~Wwc%3?{e3e@Qy zvD4Z0OmpT7`&!6vuV^n|J87F3v@~RE&^`V)nFy^yFfvV_{@eJcS$R<3CRdQg14*1s zKJV}4M~_R7AcBC%SPPewg;2tHZsaz55Lc+B=sc~%8SX7zku+ZAaH~$E$##7Fd1z2?A&;^KJyI|{AY9Eb=l3XLG)r}@>RBz(GS|~6_s%X+Ijh>+c%J7@n*3cCf+2TAYvbK%r zR)jhl289Q|a$FEP(kn2Zn2#CK8nYI3wQE~Bj15XH^shew&-u)s>fb9L)jwKg$(~Sm z_936PG0UI_GuKK*=Qfg_2XBw^=(lzR^STNu_z~!IZXkZcZDb%FK@EpaYj(`~U(oBB z`|NMNy=}F9lP#YhaHD}4Si{a_f^dqf&UIjiQk$(&W{Q!n?UUyPZU=rzUdaed2_yxc z1X%xd&rkPckIlQ!^US@`J<1dCzVJVlwkW5yRaSj=i?~}@Ox@J4=o?8E^U!6O_f4Q{ za5b2cL`y3i`EVF90};Erd7l2qN7xR|&Pb>=yoVpiI&P$JT6`+D5i5z&wvqOA_EzF( zHiTLMO~radVRZhhKrNj&2B}5lkCGzyQ}W1{0u7~X>Qdt*7}gZ3Z~|3m92CQ^S?9?a z6hnO>X?h|v0Nkv2q8rx79B4d-0DDjiRaZ}P8nomWQXT1hbQyXfbCBzR%zII&B~0i0 zfUm1C7nt@;Ze}R+6qsO(tY}R(e#1%CP>xI60>!0(G(t-Cd%*XrgULxR&jr^!S35WB zneG|wE#+?@jZ*sPKcL7qgrCjKLdAd3{7Sx}8bb@I0kx9p%#gt9tRuft{mHq;Z#JLI$uCIE*uc=+m6_K*^7#iIL}U@CX&^m$8#QClbu#! z^D7WOHszDNT{fl5QZsp?QcBBfEJtVJpNnTLFi?WbNO+diB*#E`U@v-lJLu==?!5r| za{@Fp=MvYUh2MzUK~eCTc|jZ?KT<8}&hTZO!&c*~3XIT{e+EsDEzsH@#`I?1G9)@G z8B~C_y_n~`LFm2dbhi~xZk<`abn;6bm4=ko%tAe)cb#ALCZxKQ>VlXD!f-p$R5dPS`ndSuzu zlky&^J|+}p0{2M+3z3a~W zO`#fke-*`Ww9#HdMIaKhG?~Z?MpPm?n0bvJxT@~z0d<;k8X6}r<+55?%tL4CB(&Sd zne`1_uVN;`ukyV0m)JyIK=S$edk7tV8ytDs5lgLM$Y8znNWF|UQ&}Ws51jUI_P_Hz z^LFtz_0rxRo(FEH`>kiYH^V#47axdMvO!5~EY%4*OLz2{#&576ILymVk*PGge@qyV z+#K7C$qU}WVzU6b0Bq|L%mY-i2ceyEm!8ka>{V_UM{(=86kZeBiW@xE-nUp|-by|hFvwOg@%Dq3I4ejp@Nopld-*_6GGBZpgzK zjqS@<!|h75;a*nrfd3k^!*KOH27ZwF~{p`IDp5P2G#RC#D8#Hstz|Bg{TRq z1%`^EzQV;RfikIcsPU%Kz0fDD&7NetvLSFJ@4@ZizCq6@joApy{S0WzY@%z^XQ{#D zZ_IqX`2J6fUs_}Js8SE7@_AS@3Z}Sq{7b!`J-fZ#e2*{(TkCn?t?nO;N~VK$2`svu zYN*mw-J|z2=IY1vIBPw$pl%Vd@zADgD~qmq}Rmt{Lr84Z4DCsbcM}A=;SYji~4jZy8bXXK&|)*p3^R} zFq}%-(>Lhq%po8P=Yb(S0WLZskZ+@)U-Xq94K0gyTpUJr!YpCR!!`Rm^tXnP zcYtQQ3p7l2`eO0Cc6k?i`*=rtOZq1H z*Mc$hpVVKTuk2N)X)SR!x^F&&Z+#`QIXq?hF%lGWnxfL~hHh&C;ieEIrUC;d2@}K< z;#_f*cwBra)({&Ady%a|1wX%#?}(XUB=*<}wl}+-U4k_g&g`RyK$&L{cFS!j%3UKq zS>@o}H^K}6W!ur9(RsO}jfJasqLy3RsCH0?sB6^Sn4ekdDDA9v8r(e|o-3t+w6UAR zfIG+wx7`X*^IA@7WJyfYr&HIUgBp&ow<#@Q=6jJZO0r$-|WeWzc53;PTEz772m4ql7ta3(L4N78x z^}qTfeG?EJ3-vSlZLF!2x(*!fKxE(T@GD9&yTh~C!VKded_AJb17vkLolJzvX$D-; zGO0Jvn<#_RZ6oM7cSJYgAXK*hKpXg)dBixU=h4q%k~LOMQAT6#JW6gR50ZPx8R!Um z0#cxWG(pNG^U4DypW0fzqwd!Bft51cYz39@W>DQIK!#FYY9zgleoE6!4lvngKsTTv zo50>@CSkI)6AXPC^V7WSWyI#s=nb}I*21Ue7_88X z+TYKh`}Pg%WFGh$pVhjU(RNqrU>1K`t|B|+SUE}-cqAMwUY#Hl(^Q+sCShgVHDD3=THKwLt8 zgDYbXFq>k~y&X+AqzmE{m5+8)$FYA%Y6|JWdv1o=ei5sKxx#p;Gnn_X+8NAv*C~aR z2!&UU$;IWrQkE1Vmz9^wPzqKTsdv?U+B0pV-VTv_;`*a1k6&1vDn8S=>MCK3O7%S=>D$(p% zPi4XKA4PYiN1}RLj!E?v^riZd+sp=c_=`9% zOeRds;g*s|Q32&60}4uT^ii!Y&>I+o zl~ai71WxiBDg_#q!EhdH0#)4-bS1hc)Qu<7lkk>iBF{9&=cm)h5M!?(>at8uxR^yD zzSPFAQB3}NlGRf1BtqU%p%(YA@eU^dhy!2q`O^l~!(a@2huVO{-M=$ybew~82IGS#Te{~TKqFpH!yQwId zh4@<^teENWWYyuuRmqf$yT)WA99V`8SSQ1rv(z;|s3<(`|!uhS_3N}P3IUNaGWw!+pu zv%mQPGxb;cSpAPyO536~QnRV)$|Ys9GE=Fo{KoFO3?-|!ctW|=MD@E`3p4tzKw51u z^1{EE#8q?fZHmV^&xH!K548%JJA|%}`&^AX-i3R=ME{_9CL7{$0PE!${SNyr1geLL z%toAcDfDbOWVP~4J}Ao6VidUO#UVb{gcrat%mx3DD}V%^0r#jiaIk2BDr_(O(xS|b zh$=IT(r}q9qSwWWnW-1kBap3T>FwdLxfuIuH5@><8&PmnHh`j-ig>&c+Pbfa5{Lr1 z(JwBEy>tpE(A(5Gs2cgGPt+W^)$!CfM7e5ktK9?C;9K~WJqOb##Ta1_#tC?;X}}3K z){1GmdJb5eVd^Ack6Nqk)cNW|HC*ee9mZsN49+_FP_rt*!zgBm&}!a> zz4lE{1!m^G?$L{&GMs5VH%jAFy4(C<#=(8#InWl3fG+reSXmQ_e21~m1gx1bXe#{fyrA6 z$GyYQ7V&E}_1$oKZG)?$;L>&!`+F6z>-C7WK<8H@r$Iy3j{PW_w0D10%` zlRa=|+7ACIuXP#qS!u+FQKkme^<!*U=6@2MYs0i1g9`x&_(9MwH z6geHL!x4B+FYrba;SN^{ntrGZe34Qwt&U*HNddSvViR)hYv4`Ry^MBW0(Yc7_)Lv5n^V(K^!IE;-z?p%hZdrm}& zmgZU1_8Okgbhrw}=wG$vS}U!t)?OQ~&4XUdVO%EL+C))at&W3pZPyFVB+~$@>tQ9s<2MMF}XgQ43ws8leiSWjuvaYy)`kbb%Mj zP|{7dM~%^#K8;t0)?3f zhvDUHJ@z}E+BN18vkx=79LxheYZ-5OGIAwBjUs;$Bf$i^2RFyMI8!XZYFc5mL(W%G z`<(gTJ_te05&{g`Y<<2ySKopB@&gJqGoYi`6sut?To4<=!}|Ag5qQheD%y4cwkzQ#u7r zI{FrU5@(L{=wv=XW%e31_Fe3!`Z(v5g8$hE5+k5bKcIe&o8rV@|u=g*aM*NIebQF8;3{*O=;Dm8Oml3&} z8)J>*hGdjNN3-F}b`I1nS z90#4Fnm{6I+#7tpF!zX^$VRbC83}pN18l_&vIu;Da|16kAJ^8-xS&f~8Eq?2r2W7f zSEMD9T^bco{2%?9{vZD3Ko(u_ZT0Q*9rLC5=J?A7_6E`et$?ZY%MYNLH(i5=h;bED z#ckGg;ytr`^N%*k1uF#-<$p7YJh5AB8;VVB0$lr<3DDKV2^3TyH zis25TGcz4Clh??B@90Iy2fL}(=^E|6HKQu3mCW!KnwN-9`=K)!BKMj$gkRPw5?fRn9?u17dfr8%Rmd=wzIra^Z&y zSvVVF!DV^}DrFy~;?%Vl=ea4=R-E;2B6}7`os}I85$=I`n@IlcBk&#-XVn{-MEsj;? zg4bzXctRE+{vsNTw1!&k!5nyJUc-BtYmUS_tdCgI8Iz%+aDizE{AFSMIsm7dG3Icb zh_54#JTkwS7OJZRIJdUNKHXq#fotdwxGiRbXIDO)_lMwJCc^jg4e^Ue#dIhPJ%>W@ zO6`n3)l_lQuMC*0_*x5J}$u-cn_}socR!+duRRuTlJsEtbi<51>VFXpn1O# z*LVmg!k?HK|MPYHcb)(INrxbk4mXY(wN90FDf1fpoCu)9E@l+mcaUtf-AIwJdkC4Mx~a7>Gcn+hWChk5$Ix8f`>>?JnPwrfe+BF$^^TrGCYI3 zp>jEo{APn2Kog=1_QO%A$o#^*tpHZtAaV}kG2C~^H)Il-0Wa`O(o2$1#?6Cj+9YYz zi@)%ZOn$->--lW^5k0HMsCa|HYrlYd?|{4z233k3sF~q$ftuyAxe^tC2=(9f#xSES zs+apfB#*>-Eg9~@D^LmWP-EGsPQk}?wGU3`(a==bt;|wpgGDPVEinyARl^XI&ZF=5 zQeOqtm1pJ@_}y(mHU5m8N##b>`-kq$T!JcMBlbKiB5uc_XIuu|;vkOa9Gsgy#|~x- zvo!k&l}s<3(;w0Opy+pqnuJ+N3eL-o;l8^Rh)@e0;1%G79KrJoMNje&s=GE&`wD|% z-EP#tI}tlKArmb_1YLp7)(!oqZZ}F86@e`K=Uj5m_zlKyg4qkFt0!1L<$*4^f=VVg z9O@RpS1t`0)-ibd7s;ojgnl(V+^PR?k~oO-)j8Dkw}D1^McqM$oPc;RfU5n!y4i_% zISo&`7-`}RauzXcG$yb4kuN{uZLY#8t_Ie#0UzYY<^?=)IDVLe;V(A|eW&`^g@eIr z?}fa+1gzREV8MRG*~U^LpAAtdn-HQOHue07RA13 z1b6B2;5e*=_scGH$2Q|kw;De-gMWOFc!wDA1U;-v#6_&b{n$@?iOX2o`|(z%<7ssO z<1ZTihy>!*4eJD^ueadsdJcEL0{glJs`;E)t_ znHji}ap+{s!`}>rWAPxwjat};m9g#$;w;n{?lH~rUd!N02|UHWs9Zd7y%eyc{`qA3 zuy60$Ij+y7$a9{g!CB5q^My6XZt(Hy!0 z;}L)B8DFVkJ^lHgyW@An|7EBz``{}2 zW7n+0wY0)J%?AeY7dTG25Gj9}CDHjI&}aI$UZbI{&ZWwW+bn!l zFWlWQtdU0Ws{HqEf5R;r?sQg?Sq8thM&@xMf^dlbU!m>32f4H)a{o1SmwKb~G6wbk zI$+Xc@vmNh$Nk-`ftXthJm)cp@lD|?eFD$96Wljf<0}7sm&Q=!UxQpY6>Np$c!J+> zr7aQj3*(w25yOX~TFQ%z)CP0*#pvvpL4SW7c9#dwdo+H%fo$3YuADwRgI8F8Iq-kQ zz-zP+YPZSw-e2KddH_z+*AV@W;`hI>R{uH9d$F(AVSU`eIVA~Bp~1+-pWw93VAaQC zhf~BIyrC%cu)O80UliyAO0;({K6AUL;olT zJT&Ja!p=bi+lYAc7@6TQ?tdWuhhSnLc5i$5)8|3Vxq$C78}IWru5<&k>u#*JgH{pT zfoiqIn$C-r?1mQTZQ>Ex3;N&ptkG%><1E#IoM4OGC$FmiF?|7Vh~kdZ(|gtBduI&0x_75h4$xMssMN(mw~a2 zQ6i{gY-w$~@tu2MQfdL_4|!A(sVht_s98*B=c~K)qGDBJrgUE1%~bUbCf|$8HA@}B z9%EzaPS#0dJ+qh2)L)YI=`Lm;>N#0NUrV{*2|37`&*mcB=0bQzjxsk=4q^!0%sNmH z%uYmO2KaEe2DOC0*IIKI+~$s&Y3RweG~Ab5Pe?5A88dlG4ol^ zn2OdoeKpk?NXnb^d^$|8Z(gAun&Em&>k}NO;R|drW;gUprx*pz$52n~WQ3!K&;~AM zc}UGlMW5vpK~k-7dZ|ejBRd&?tPW%gRFo3&0?G+1!IJq!r4ZY-oJ1J)O&?0w=+oM3 zeJ{D%{6OYn{!^bDtAx4co4^g~Io$#7b0Opl<2+*APrV1wecAQe=4Yy{Syr7+tYCu8 z!paw8IsJ~%)dofZ>a2NDyN4;jO!F%t8BJSnQRX=%4g3M;i@^7iI&q4=I}o`U>!u zRv9<6q1IW{^iIsEhd>+uw>i}MK-@Jeo8jP&h8w%}VnjMR&ZM={>`nH-wFMa!tamuQ z<%BElFd(}clG&-JW{fqPJcO(^g&YY*oCsiYwwM*nx!9xSP{(gGpIU3EI>a=y7BF9n ztSjUgGs>7vb|4lR#}I>G8kNXPgn*M(CL&ar)erOJoH(mpM;{`adD6N_^tQ5_tntL` zL#GfWwT@OY-P!C9Lv7jGuhQfSZi3NM=IP^nHRHXa0%KTTKdy<)CaRQ9S#Ej}Th~^_*FS zS!FiWFQZp`Ucanwq8qTh@kzNtzvg!7AJm~>5;X=|>k3wMWwI)sLn$hm+;5~2MVKx| zgif$!=o5;^SjAFSrgEM9zmCoXPN(Ys6pRy%uVI)R_WEm8)jCE$7dG5XEod0`z&FkgyEcf1XzUQ3p`JT_` zyEJn0ya@GLyE{FiX9~MHYl11>ln5RZ;W^$r1v9L(&c)CbFENi;&oOegOe(gm6oZBjR)0tAZ$x8|~va$=F z^?nX6vUf)NsA0|t6ILfhU6ZJ9%j;slI-@7xd-#)?;nfy9o!+{=yHxCRhRRK9l_~Gk zm0Qqt88XMOWaircQnNImFI#<_-ToQxI4xW6m$2(OYrXxdZ*Y=*Et=?-CF5<9x4f`i zplP_dHqmynb#ScN9<3>+ISX_bwcG-=S3RiWuuM$S-Br5W=tOl5|E3jd5A$xS4CilM zB^tKx#FS92@+&*t;>LO@1)~Gg!{2!O+*%I2op(vU8n`cB_NIx|&evv`e@Nsxi$$8Z zO~wVvdXIXS1J&#}WY@|X!@1NF_tjWY#W^b0dlk%jXPl|#4i`yIHFEY>R0&r7U<3b| zXwOhauwUeMbYS?WK<~&N_e|{1f$#I)^hd=F5v}uQTUTP!)V=%;&ZXEM_#|J6SrKp^ zv{1jqWe6v-Qr?a^t94#w8H!y>F6mFgn*&24CC%_qrf%l>;%$4D%v7axQ+tY>>$kE} z0*9kN7Tybe6KM0Gmg^+$2z0s=RR0wB{T;X83zR5+Epqq%$nb)=^Mx()UUOE*M|E1> zPEjuoJErgrXIzMTdM!dD?B#_U{o$cn!7AjWy=~75jn%Ea>M+&SSbxW5jx$KiaM#L) zF{w)DjdwnaAEqi5*ml*}!}@eV8*5z50RLE|Vjv-SJ6g*-9(*S-wJ^?oE9O|BM85O~ z$9^R~jPwwb>^zYAxn>MCpPu)Qnn~g3%*Oly;)j?a@><~})hn>fI_N#3E6O=~he)%Q zgGgrkLQReT?{E{4B%uSEL9b_~_ai}y~& zr-nYuzm~r(lpFWDTPe@jYvOL{g#7w?QA~d^H1CK^j$a-nFTL>dz@R{~pR8Nj$Hfsf%N(ZyST)tu-DEEbZ}-pUXWLccKlJZD*yDT` zf79EQKRb{bTj(|}a0A`q&%47P)D6WJn;1EB_obL(CC9isZ+EwQ72obwx_dU%F!6ML z?%j4|%3SbZdt`Y`I5d|$(pNstz6cky0 zfi+gXt$x+%!nRV)sKRloYs@E3r-HVHV}gUiuX~A+iFQipCD@AhLT#K`1r5|+aZBt{ zc~`w!ad!d@qZ>RgpaUEH9`0T%FVI>)z^a8^?1xy^>IYYp`kVYjrzMRP(OP+Q~$YK_nL%IXHrIr%qrXA?r-IsM(G-nY&!Yn}J6 zzGPPt#Z-!zLS^jPdNY|&hwBw?vYF%T<+`xh&3?RFZ4hVl8vnlaMc_*{!}U#f%aHLg zO(p6CyM(-~91-QTP|9g0TYFbbuJxOGh&tZsBG+qgZei0MCO7Ob+p%`3)w&M|+7(?@ zMNLn;qIg1elW$n{)M!)if66jb)2?H^rYf2()=It1pNMz%JpHYHNj5YalotQ9d^145AZ&R@ zZS_6j+AoP}?$ zGqDf~WGpCNck8~r%(VB$@J%c6qy~EtrTwcq$v$QdtGc|aqFRezWqI`hb)&ah8}W7M zAg5V1MV7u}o|XN?1l`1ZfW@+xQ|5lMLS>1XvLEM`nO3|xO9j=w)D#=QY5!v|ge_n$ z>&S%IlZd8+Vlh>`PuLkI-|ZweI!#O}*5PFP4i!Joip}D*Zpk^O4u2=jEb*2k!-e_~ zU$!XyO|Vx|YkZPv!2V;@9x#Y7Hg%fpN=!?Cvw%}$8*rUPTq*JMU!rT7ZCF+%^k_4I zOxzQwH=03~yazB-^ZBl#>?;z;YFk6(h}J~?R}wX3ZxFeLU@HH|X@3A2*kvh$s(u|z?^QhpAAsrp(`uXbr`=HWRJT;B z{76nzBh@~t>O}Ae7)P#-k>E8yaAti`%;gkK-BPkPO_TerSM(k4TY9(I6sQ7ITZXWb zo)>>}3SMhg=*nWcHB6jR#qs&5AQo5!qMqMGr`Qj~LUn{JirvV;_om47f7U@~fb2=d znF1=iPQ})*hMcaERd$Z5K=kq{xz5TKM7rzKV8M#|q(xYANBO+@i#1V4UPgxJ!Irz3 zPmoQj)m;R%YX-`y=50Mo?3Foql3&$XSl2^L18jkX)_IWP@l*!ftT`80qo_<-o%-J| z>dvf{RbmZif+=7d1Hgj5;jbn>hn`qQMcc||pXeZ4<1x|49kj{v1T%o^FEw<)hSdx@59MYa$w+v8p>Qu{1|e$NG|d3=D7vZ95KM`7m+~ z5s`UbbXAF_vnWY+tY<8je7ckHGC4;b*D`o~G&1jjc6Zf3iY2mzNijA|Q*lmBTf8me zSI3yP>Q`#F?(#n-hDGU_elIKDxvO%#G%7FGz<1|@m`tUf7*kJi*NNer&9XSJ#q<6P zvsya#Yo?vISG{a~AouC|;$Q1YS(4b(GvX_ry;b)Ihs@Cx%wW8hj9w*HSmVta? z7K;N#+aweoSJ!nJxfygKOAfW0=q{Wk?pe>vw&0aFI5BM{cT5MWOU#p<$^Kng^w+Pc zbkW;BE<3{!@1T{L?D(Z^jYapdNt9*bOG|^!4-$1)d-2p+AFZc}owAfzOlG>V=z;w@ z8Jy=`&=Ff~f$7+3{x!KmSmnhTm1G*r1+4EyrmVF|*3%g(hZF0I;3$t+s2bO%$Nyq)zJ<9RST@0c{P0j8z`5mN_f(O~@% z_EasIt3ENVJZ38Dnqm)oLXvpYyhKIhHgc@B0@=+Yqt|}gH%@gi$#~P;HDAFJ6$gJj z%iIs)(S3q^o|Qxc?zhXTYJJ9Bdl97i3V73Mc8&UsTq9bNjkXvpS6gdLuG&WHznut=z#m zv8BDs8bM8y&EhDPpemZ?pkV#L(uROLEx-p(fm}9YcCFBB%@L5ZZe+t;VqGPlE9h{--7eTiBO z5|L;1nNR1*GI38#u}6xVsyvYZ#dTSIh;#Z+sbw`&lXW`Qp;pe;= zzwl&`(3fQuG;A@k&FahPus~g1#vLYEMFOspNrdZ4T z+s90+!e#awXC{j5H|u!5TXS zx*Ln6GDK-psM?B$LBTv-9e*g7T-K$SglPUTr_`+7uNa`n{%f90K z@65mCYniU9n$dXYeuTH=+u-Wo!}XnFrJNK^h=5rL+M3E!7vOU<0F5}_B(ain;T<1m z?$u$$1L7gj;}m>YeW$-*VVo(!0Px zmzaKFyuC#XebkI+53;Dvlwr}H%(VN^_%}cy_nVcvHYak*HNqXug3pNRFx8cFhzHw? z-L#&SP#K)O7(2)-rap{I7;Z949Kv3ChaIaQ_1|lNzfA}AY|5t*5aHWqATfT+^a-@+>#{bb=jiHk-kxFJN%*qwcUFj}in*JJIE zg41XT_d9|f7vuZ=@C03uRx|e1sm$d+^>*_Jb7!yKXpV|+spUF@eflGE(Aba3SDznVuS?kdNsq}p%GOmi(F@F5`8$8FZP+Z(%v|Dg}GCX09 z8BoNWgQR}L^Si*P&4lSoXU0!PhDCXg;>-kC*!7H<1>bpsQ{pRJeGV&!$|vvy134dD zG|ljo`%qx3(1+bvot;?i*gvkWF<_DP;P9S)=%ADEPD1;BB@~K%{^?IKCGBg><}}Ve<6B03GUZsEZ1@(8^hi+1%0%O9dsb9c6WGc zDYuFOIMt!d+8wZrZ{lMz9q+s9X#eZfS~(1pn#ufc1mD>lTd|!e+J$Gs3e`oYHbc9< z#cL6JwTH9QQW)$mtlbQ3=a;D#ddD{>Z*0EZAP;+L!w;V}+Kced9PaHD(sPi8jh)Osc|Doi;w&+rXDDLaSS} zB#v0OOZefhHD~ecIfRz#!0cPhGb?e=Fbvz{SVxQD;cQ+2D9ns4MwmW zV|RyFkbGLz63!(XMym?FFV84{0DoP`3`j;7MiZ8-U?| z?X`JM(f{L^6@u?;^Nc8?S(jfwKrVmbLvRl*Wsqt8|7JjGH@ z-#tnGm~%IlpXU6T|9hV3+-o%cSqYE(Z~5cyT{=(aJcaYr&YA!2#<9h}pW$2|P5iad z`R(EUtaYCE-*YSO%sIjNS?MA=lsln z|JL!8hu_YfYyPa4fA9QuuKUBEa{gZMlbma#i&*Zj82oAHzy9Ty6wyR{kx0Z7F~m>% z%-*&a?JfJ#CJ<#sU$H>!5NkxRC@tRDskWH?ZNklU^UkERP3&}g+(z0D{0twFRs1KG zh+m?OJS~%}3aX-tqt?hIvWwVhquUPVy`HI?=$g8|9<5L6bY{9qZFksKBBtCWYpT;K zou`_oiYK)vOw~{axvsU?V85F3W~EN4cX+#b8+m(r_j?QK3wow$YRih`@`(&p**!Bo z7d^KD{ma{`>3d>0PkUMOP$4N^UPipYh^D^Tjz=8 zR&udQx zpWHseXSFB2r<+)6BD7J(Wtv6IpCY(@&rF`g`9-opDc`Z|66-7Xf&&MK2v@ci+V@TuvO z(dV3}f@g*blTXAq8_lLQb@dW&MsHZu&ZrAf>Ag$5)pbJi+1#^d#3ngZ<@X%(`1;iF zDem*jGs+XG(kg%1MD(>Y%yAu8_xC3B-inHditX*|jj2!T1!kCSCo0GU>bPp)+2{Go zuLw_n&wEuy^}see>^+m*bkHxbWuUi`w}CGUH0VZBhNF?&r*8(*9dU8Rx1Dncdmr1Qk`TvFZD z580l0^A+9f8I!}T)+O{W?>+BpZyG&7ztQGyaH1 zVwDxPrHRn3bz&Xqec=7;t*ZCvisqS_ZvDj@F-ay<6VxM>m`ID^IjdT$N3xupE1uaR zb`B9YLl@S@`-bcC>M7dl#ioq?W><@v@}+E{PN*oAgowGVCaUCWqI@fga)P*H^Vo6bs~)J+==a`- zUa2eSO=Q$@)7ZuaAsWb!M9y^;$CKTY$P=Lks^7A$JSI|zF7~`BXtwDZTIy%scV1uJ zPruP4z>jmbzepyx$oy)adaB}k;&?uBb|JM@#**zpjRdw2F+N)7*B<@Nn^;%TJ9RE| z-t@E?#AVS_{w0r3s^2Px=LeC{QGJ#z$i=v#ncZbFm{q!}PJlmR>tfjEuMReuIB|%` zERV^GYLj}eVtJG&9NVN&3#1WE#WouQoO+b4rL5~`8%p(rM%*mtIZxubjOTv}-D&8R!*8@hq{ZI;;o#7{9>rc%M`8W`Z?d8;;n zZx^MX3=#KiZX05>o}f!&RpU*dYw5K*t=VB}gYp|hBl${p!vBBp$8Y}H1#fhd;b8Po zd(9LvJ9IT29Y6l?=GH^>Cq2j{ut#i5kw9*eh15p%MWy$o#Q)1wezgH_bQb$;YTMU* z*8O#6{n7h^XLP(#)Lb!xZCY_rw3R=}sUto2>SMog|9Mi?Wv5sy?fvxk47rZ={^BDxW&-KcQCi18?O zPW8YWt>sawZBx6&q^06i*0G6Hp^NA-`kNkQGT2KtSmXeyYN{P%V;ql%oEopvsZc3p zQ?bcf)5=`d?Q|k+^9kFuA#Q4zmu4)HdS46zjmN8J;6_>^Zl|h?ZA!@n;)|_e*O+8x z7I*rUEdJ*8({qT_4W^d;VV8)q@}>+_hsde)#Q0-=MjSOr-W1uzD0|n`FkxgwO8wdU z)tij7BXmm>-EJXne6UR>HA&qeP7`=Os@<+Pa>-ySV`e+b{NlL^fvVrZ?~3Gxui0oC z!jJZgR`Q!0H(r&%^A{WSP=91sc}1iVz3efQ*Q_8?ee@Tqa3ME~$ABBBY;TcD9-uaE z#WuG|w*GddNdt;kqvrhJ#L{|^PEJlWAg4BqO7e~jAU9qpg-x%jQ7R^t_!>FY z*IofrPv}-UEB=q8^AX`sbz2h+e$yU=+a^nba8J|^?0P{>R+-fnnOgQ2=gFx7<~6k< zn~p*L=LH9@;Kgv$!zOZV^I7&*=ao^h$&7WXGTC2FZWJ*^N2%?J+7`jigS^ zmLAzroUrNb2+)5Bc=H3CN~JsL>mcJRB0RGQ6V2pj*$&%iaN`Fj)*!zuIc6`%51SMM0~kg=2Ri-3fTBX-Bfc`33XWJkRxCXY3(4`?MNatA^ymtJL@yL zusID&jU#ruciK&zQr|f5ky=S++>v$U5s_95vf-u-m9Y+Z^UE8Din>(CH=!nv4YS=u z47rLE7r<2F5aBn~I2Busm#;-_vOg(!WAr%qhR}b&sW$quZUUcLXiJMo(Vd)Xj!oVx z4;a3e?7t=p%ZcKNElh-`G+T8uol(cvNjNc7$22QVB|3o(qK3RDt8<4p)km=7u__(h^`-?s&g;tNn(0Jmvtzjjo(z`=W3xUsFp|{`5!%lqE3Cq=M_LIADvb=(7W-* zH8a!}0vU%A;axzuXPo&MY;C08$$D}Zy-;<#$|Qh`S0!#@6XA9A5*^3PG`Z~^8$u1g zA%n2#XAtfaciLSUISSiU7t8EVQ_q~EP9+AX1ld1Ef7QJ}#>Lp?nHUdGouVFqZ}B{D zz=6DKHQh}=aTD7tGfB*1a>A(^amcMbRMe}m)MUg>b?Q`AxZ-P0)KraL@SA4bX&lko zUcejYh|lbJF}g0G2f;Q6nT%A85h9b^BlChXm+}8s;&qzJ2ir^_o6|E`(+++!oH~~`ChzGx%1nNEzp0FU=@r%BX&nOOEF zi?dRvezupRFA8h(>nZk3tUR9Isa*mzkDQ6AM>-V!eM1>eNkaGlNK7gKhF-nZjiMPMv`oUKNB}1^2%% z>#Mb7<16xGjjE@<$e!{ZSv=7`GXZ3A8?H*I(-Gmz$^J25@kU!)d>6CGsTp9R@_faz zeN;R(6;Yw9xNHm9d7%Fc;>Jh+_NLbz^-Zw&tr=s}ivyyTjF7dd79U}M-_(Ba=DI8j z6Z>Kt+tYaC3W%5o_7@i>K3&H$OHF|NXy=PO@}SH@bvj1fctwN2k#EJ?hkFGv8L{PG`!bYA{(CiT96kT`qM%=8-eS3tQ68H_=Tf>@*$z zC`sg9)#YGf4P1UxiW**vczHqgN2CPcHs|TYQsTu}E=x&Z78^f% z)pm#9ERd<;7!ml;OY{r}8Ar+IqAC%dkUFKz9B?BcIGzE{7*5srZdTX|;w3%9ciD(; z;{iGK5U*6Hh8F^hBW*#u7%bibYsd>qW!FK(O>%Oo8d$s$n?`b{tH|Hi{NAjZsGqW* zyf2F2#e1d-UhGUxrNTB1;ZrfqFq6=(vvtKcyqE?AzQ%cP)e%r5E}BSm*-2cZgIkDg zmgurPV;rj009Z;B^U;i?pV|-JM8I#>VV9roomNz5WidG8U)$22<-{wXg&!E_i*1+d zq-M3LY~P?!WC4rQ!S@fS`#j|lszy9DmR_@*ScF#811w&s>vCFlEHso8>zZ#c_{!pi z7z-2Yf^BZl6CI(x`Jww1!He(l;tCVntffoMiyzBzr{{GEv!Cwf6LC{qhJ%c2@%<~F zb1q8LP1#6>iGpG}ict%53;vaZ>gKEK>DAonJd>I3ranDGuoQG~CqVJ9aED>s=|uUR z&hIe&)LfH}6C2@+1l(&UDr$ZB^c47X82siM9sEr4@F}ORg%{m|i7iFjs0Z69iERdB zm2A2o)n=7W#EE6>V>^QgKOl3f(bSC_Fu!%+l$GPLO$}`G6DIbUI$DW};m5h5`X|}{ z%gnGPsNut@Q$4uu4tczjTuiQ3$#gKW_qG;2Lk6=BM9hr;OVE+u*43#RZBgMCh(dI? z6{v@g@c$!v&H!~;R+8JOsDsI=AWj?xGN$4wYw0zv7mM4wwx5VDXUgcRGr4h>XFP@% z6A=7bez#>K}%6j#76@p!zty#%K8S zIwE{0IaQomQx-0FOy@IOO$GbTPNSlR(T6W4x}VTD&WGJb(iPnhMa2TV*v8!B$^5v} zj70bfY&ylHg-`z{UWpNSu_rbB6?b|P+r$MmqC`7!ft*@No!UxHWybsYbWb>AUGvlg z+ce^^s6szg4D>%s<-b91TNQR&UM@$6Z4QQ4r815u;_?%#O)4$pquC6GXW>_IJ%T%}YR=IWeYTTDE^2r&;_VjC7(rbuPlQ*4GiDN#h?`EF zI38?E3&PcgGbS+$O#yqsb`-zGI2k3|fW>#o;p3_=O2a7mMO33JN@Ay)gjCdaoR$-I zG*sUQQ9sfZ6&Der6ZNeMy!a57IRs}YLA5FE-f3046>aM%Y@-6TrW}=ZpUzJ9``f2> zrpPBx$fEF@<6L))DpggzlHFw_wSOtu-@!bhqLu^w{a}6@VYd^g#H&EY2lQcDcBNW8 zAWnDT&*=1T9@$siw&jSM%w_|&Ne@yLB;M|Fr!UM1o049mf&`bSQy1WHSBRgI#9Lu< zQQNlm1{nTChfss_fgH{C1}gCy?({i0K3rpFE?=NB5K6IK}WCl4~yn-{Xb#t*97R`-)#$nT%aLtw| z?oKYAp!1uDG)*`JjsY@v6dP^>YB!K zqfhN7-lm&Wc9RWsb1@n=-A9B+pux03O9_@*bQa;ZIJQY=w!;;35#j#C!Fw{}Gr5>r zY{QFA+)M>E9#i>4;qND8eo({Mb|{qf%uBpj(?!M>dMnD-CQ#!Uy=`*2P{vVh@!uJq zaRZ1NjV}B>UR+7vKY&WSib$&f(+GlDy+xt;N-mb9@9!1B+WOjmS?Im3I|7`Aa4n{HKI zsf){Ga=7LPTi+f%mT;&f=)j-+GK*#vg z^fbT8sd^xzAJuAwj%}u*`W?4z#1AoA{(u)P#24q$U>uebD*uZ1RN|~~%~a+v*jf2US->&wusbs=I(yDY+0o1uuXmIOH zK^ty+!2FlO83%FAc|18oRa4Jk#ZN?ibmp{Z8!_l^8i8-c!T#0S$BZ-{JJ049Cq-j= z)M`ZNdHlGaxJgB)nG|K~1-1V)eb_bXS~;-4B&_2y-BdWetrAPA{aayTeR#U_#OfSQ zyiMHf7b(RMbjCJ#V=;N}kM}#m{1TZ-Cc8amJE6f(h8Hyf_4k3Qi&c9fd={!-XK~DC zL-kDzGIrGEIkTajr(fx2D568?7!T1E-G{-=h2Naz)B$wiyW!!hL~PL=WUS)eX+^4= zll|9qF>{c<|2`UgY}joQ?sOkWb)HIGLp_vj!gA9h;@ya^$0%5tZ@^jU(F%?|1iHIV?E!xIn*NaQRsTgV|^{o?kn$^xWN#R9Z!QzU#m%+~bBzx2ArbDxO}NWaQmDl;E|oX} z9=@B|O*poxfj0s;`Kqo0*X+W~XT2yv|CSlAujfv8QZ-7dyL3}Wsc(brW4PvPy1nMa zcTIBnpiY6ZmD!$Qa_1vw%h;gIYU2A4b+Li^AjiTr+mij6>22ehO<;I=Y}1C!5Y*-$ zX1q;Dk5W@!p}tM#ywljG8m3GH882SNHm6N}`__&_gIy{U zW1F4W<{YR~4Xzm^&xl;qH)94H4}7`}zAuRvm!tZOH@U>HFZ+HMHBf)VJ#L0=0iE%;p4mJPZvcOjeb<-3Wio zokn8I+El3;u$wTHjrB0N%h<+>DKaJ%bu-9#8ZXvXZ{brfMWEPgGq`cH9ov-UP8;Jz zgX*K~0=VWGCU93cF$52uQ(MUXG-@3kLkRPb`t)!9u-jnnvbcNVWnGH;)`aQQT>7{5 zG6kG=mFvZ6aLq_2Hy1=6x~U&v_#Yy?1HP}NyX);bfe9gQc2VCxp%?v;4T{93A- z!%}8on_g)Cg+pG^lu8b zT0Pjru`6vkcu^aWu{=1l3+!J{wMmW!msF0T3lD&Y7c*C}O+%ul5hvf%0p_AOl8VPdWDMKd@<1Q>pd>}O{MUWEQh9bLqgn@~7QQ*BzvOH9M(Ss!N1lG@)9%hV>9 z4=|gW3Wje)pL{6#$v0s5ENr?T&d`8rGe%m`jUJ_p-NBUM0ytBbxM@o+{?Z-TiW$JB zz%r3v?x16Ikns?|2dNBdKhufzY}pJWZaSF1*s?XKQ3KnY(s{5=Sr}Xo)_}${E38Ls z@8!xls*Y=$$D)#}`A?#o-pz@%v1xm{_b5Gtjh4l>n7Arhqu!K33ERk(i^=B1)VK85 z<{d2MFdE!-w6q3j6iunD52(bau+1lIlbQK@dhT=+-q?|$nxH-k0Rt2dV(M^5P zozM%$)4%NzWtfI%2NAd6{cY$B+0+iQe=)mD-KhOd$SLQ#zR1<3eFRKYfhVQ>kU`Sjx%gNXAT)VIM#*jdEQInl(esN>x07Q%{S z!BSFzjGt{I7#ysG?5~Fxn-Z}vbUiS<4Yhv?dmGEC{avV2hq>EeRe=7j8XE@LsT$S{ zL800RCf3mZk;_Mjn?*4HgD&&$$Zk?;`l(G+ocVA$1@n&vgS%l%(@i^gGl9M+kO-d- zGB!02iJREW?F-TOr{ToKpv^M$pKR(7I@5NMjGTH6-uz^e-I*tBj2F*go3+e}&fDg0 zPW?vpor7gIQ;937_p(2Ie{*q)$=zb`W8NMuM<`oirV(@d$s!|JoRrDpQm$J=7U%t6AC`|u)ux{@@b(ToV_iCc<7}qPGg+up zflL{C%6IUaS@?esw)szeWODOEbP-oUxb3jii(FBUXKbsN=^totZ%`WI;SE1Jzw~G* z8?ntMus93zen<0*h&rcQudXP zso^`VFWpTVSi>;tOh)9j?#?1jdIRdtEMb?yOMSiiw#@&bhWg*Up9`^~`QOU&QaF)IqQUD#;}W;$7$db5!T7{_jz zlf`dE1GXq~qE9=FY6KD9h&k*obnT(oX1dJ;gRjJBBm;K?f#o9Q1F8ZA!YivB^b$FX$}U_i(a!rzwig?9`heIL9*m9nJp*bF{ed;)29Y zYS`&~PF&1hQbwj)rKpTaUG#5jqWJSY$c@%06yfOFo3PCVxZf`^lDMgfAJ!4!BULdN zd^`D!{`~;9Sz@wMi${P`jj2=n=@`c{N1IFB97WkYgKhd@n~h*VQ)Wz|GNBw#chig+ zb6wPwg`8FoyqTk4{tw}Pp>6oex!9&5PqzlGxHmab?TFxfFjz3Sy2(Yfy#ImglmLNd+7DB)Gp=&JA29K z{K~QmmxG*IMP@7@!V|&7a>zyOrS_#~Xp5S%jOeaU%*|l;rZOzGCOZwi!JDyePEB=B z9E5Gy;$csutXR($#avY1GgP=1{2HncvC%TsB(`hNr!S)2pJ#8g56`!bUZXKAb(V}L zhcFGVZjYPtu!dRKr3rYm6osmxxljKt#e9(yH6;lXxLI(Gc|>}8w6wBvA2Y@Y_PgoL z_SGhyt})k!;Kf2Ars#d(#TD%lQv%yeLHTJ!U0nqea~OPg8%r!i_1!E}64?vLsD-F;zSQtyOo~&W zY<@!%)AVgUxUN0uabFjwhL>U!vX%G>Yxsa-FbV&!1?Nhu`?3=%OkJ`+4|-u<7}Yo; zya8yn6{TS)3e_x|1>5+`BQhKP*K*?KA2Kecf1iqa*U{cGEzB2A>_yacfipfK`_Gsl zkZ~B=MhI-Px*EeX&L;}|K*q)>n<%Ka*+rXmaWxG1`WFoD4Ghp`;hIhiqdM@ospdIE-ik-WWkeeIo}looYp$Dhb|{ z0dMAVVoRQL1388ANS#V1wumC&O$sXGERc8_-bes1&MjB4=RMdy#T!v5?}N$VUi4v4 zQK$~WsBWV)St9kTtPG=G%ANM7YTS^mm=xDw+b@${4i;Y^Zk!WG>7(@T6VdMH!Ke<2 zT1=Vpz)zME;Zvv@h6wzJH?7eq8Z)0*PM^_?-wVm9I_8#XMz1+WB;?O&Si@wzzYK5W zXS=ixTcUnwsd4Q@`0Y^;t_?MAJSS!$QZq6QuOjY<=IDO;sKKFbq*f(T$D*e67WZvc z6w1oxiC#d&wFVhC;Ei^8qo$RN7X~(iteOqp_^Lg!4Bkjjcl*l>XHResxZj35 zoq8KV`rz$e@aU!*yxDIPLh&P_W;d^77VQ#P43H0yJ zF4R&mb)}3)EuKn@PgAWx{~c)X>)^Me!PG%a8IOWdy|{KM+^>S!#T@kl+gI=5aFJ*R zeevTADytun+7U(-#GaU+-3W(^fHiglZ-S}e3C$>QV=Am+nVv7F z%xM5O`NKL`~y(IOf4z)NNC(h-{ad5w1a-xjMPRny!*M_0qzeWk~4UYFG zQh%WP-A7H+%!<>=Mbd*e#$eTHswLg+Zn*y*ky%UwH->{72jH0oZ>uPEV;)u=2&O)UZGNB=yMj0NnzAlZ_2f=RFu99k`ZHr5L8Pt}xnb1t$qmOF zlVAa{*}Tn0Cl()t`YRPK1{&p1yx5aSe+F)xVB&ut-1sX7GcBw{HZCIKdZ|2MY9k`m zpUwMBOkneaRI_--Zm20?FsiBG#!~AijtjacnStDx%!$L9qW_Uo*}fS?q&6i|8-n6% z$c@fK>P8qk*!=1HWdW!51P@ z^TJbVvhURr+$aFH%_EP8FrRoK2N0?4iPQjl2;J9VM*X;M1Uoc7Ohi7hCl*gE64_zY z(TUVx?lc56Pr^o9F}S}k9PTguQ#^L4M`D{EcS4o7cF{Ph&*d`4%bsEn&3P$yd>`cVO|CjAx zBZ<_XE^c(dJ}a?JeQeW^EFLPN5nrFFaKpLNsq_G8)k)rF2m@2sP~qm9EJW%Q?z1}? z63#?q2^?-KZx>t>bzw%CiPR}X_&_&{hoez-7Y|@Yr_m_iplJ8!%8?+P51SnC(C=bW z{WFrq25$`G34`g#it6cqRGse zPQg<<601|mseE)P+3jJt{{!kxIE=anSIs7~N)R^#Q8&7fQvr4#)&D76YyfOy4D*Q? zbf2G?-6cTz$%}2`gEJF(!twky77DdfixZ0xFr)s=QucsR9Z@zHF}bZ`j-YK`XCn5M z`Q&qKGlVCc!?}6UsG7O8c)!bx{K%>4*ro$Hb&RRDQ;QeaeAME~Xq0KmiK%#TgsO>c zrl8)BM)z$+U(}Mg*+g`A!i(#%O*3=Hv?HgSo^d8Q<=AE}c5RK8z7N~%!#49!3@1~I z&w+4#$c_cfLyN<29rO=mSD+p$BZ&~eQ` z_I*a$gklAFvr5JRXC`9P5ZGoMbeQaN0UM2jPz-y!wi)ea{|Y7|wNdZ?18;hRH$&xX zS&kT;%bDHjryMN4kzpiwO_DeVTf8qTxPdJ^<+$7wU+#pUVz zN5UHVyR*A1^o(D@;2}inC?ed#sGhQW>E(@$G;%&zTnlD2i@R-%>d#v$@Y|G3eg0CX z;=7ExD^KZYq7I`f&y=wxUhK{Uz8H0C7KqxFs&Pp+m$%9OL+CJ@*%Z2uH3xI2GeO4m z?6ky&QDtGju$bH_6M@AcMBFH}t-p9DG1>pqc4POpBXw#k(cOidTF1Lujm>qoi$B3{ z_hByuN#MA5DVV&7Vd9Q#gcPpf6!9~a;L-5{bIS_x4C<5< zHOx7KGcmj)Z)=R;cPei zgPCkhwyEf+^AI=DiI)*rXBhlOGp|g`dpFU=0QM;Q!5WT`6@9>*wM2MrI{!d=#-2=> z2Q%3!Mx;)_rp=k$9;ds#NZf3vPOUZt&{G!hj6>)dZtJ|nO*(c{iZS!80v4x2V;Doc z^`@e}mh58@H}6mk;j-qB-bNPp13UJDj9uNn=m$9!4_x{LhwH-=j>0yHc$cZT+{?D- z0yN5*Y#D@e)&O#GG5n?!cvFBmQ#Emu=}nkh8OQRB-QhP6WiKZ89nl(Upo-OnQE!47 z4FVaD>crs4A2Wzq%6#RH@rFxmf(zUU~^ z!f-mVcXS)K;c%U~)3Ibo7ILbQi#NyF_T0)``w={47$?r7OUX*4CZJAbgHaWN-^PHa z48f26+?;aoW)g3yc7xw`XVP$x&SntxZ3hZ3m#iRJOg19Npy9GJyZZ?H3GfO)zlaU)kVPhSs8V}$%-$XC!R0H<5nzCiE zo33#LwmF5;*pEo<&HJvC>BK_li_3uDr!&@l<;Kpj6ZxESvmO2$o2S3p!7pq_m zOYuf^_{LalQwe@Eml<3rjB2RsjT9(2Gs*v8c=0D9^%PseH&A}wpr_oRqiWB2!-%`o zY&FzldQ**=zaKN$O60~SVtfp?xlIk9%eH4In!y&drqv)-b*wrPyeY~y`&cUDMDfS= zLZj@1@^^@c8_219(0yA`85^;E*M~{^02G`;_tVfr!6K@=6CbFK~SZ0djjWtBv z7}&;rG^*vOsawd6b9CYdL8=CLVCnEI_Gm-On;M;(yL)=JxE{kBBF;tCu@S7dzcZb;cS!R>N{c~}r zq1a|PUG8Hdb*srm2Oq!&eO)5emq;DXopw+;nTL0hU#X1uZB6vsAoGhz4I#qky1aM@ z+U8(b!#ueE95B@%9Com{G9BDpnD_#=Hbae*Hz$`5veNkES6iglC-svr!AB0N*!sTHXvLxFn@u+ZviMKA` z&2u>zZF4ZQw06v3doU3{4d0mPVsSip@f%dJzswoqGUa&(raC7M0Fz_DiwiQL$O3DK zYiGeWZ-S|#@#7}=O;xj(-K3NBjCaxf&rpk-bK)oz%B)nzR%}o=qM!B$;R2~QTd~b( zt`4U%P6GX>vJbJEoLWqm8bE}P2Fc6w7Q_^GlcqAE7+}A^E|THJ`DFi8G*L}Ih5o>% zSWj3(A9}|8AjWVv`;&q<71`V6{|(+e1^us+Lxzetnd|2Ao=-Bc_>1X>)-V-D6@t1|lDHX8yj7x3EkWB{ zLuH(9V>1)UM%*mHrXf^~&v@||^MXr6_+xByUZy2(2J)*R8pTPl_zn?%)|LQos)IK> zIdKy4c9&`4EV6$#Z+UNGPjm$wt{NU3Nmo^ZK72g;Hz8ngZ{~~x$o{kB;W(~5roGJI zZkQIlmC%>$?~l6S$2Fs|YY@Aa`>0bV(ZtuYfw3B%@)Bk=oxWi+8%E`+Q#sl9D~@f- zGTDqt+;k^1n!;~x%O3IS8F!m;&2;Gyk$bzMMwflqLIv$$qDX zFNYVe73suO*EX5mxEYUiwxdx5Vw(!Qt=o|KbW=7dQWH0Q@J4;tHVt4@b(n0GLZhq( zzum@(As}NUQ|5W-zVkrFP0V1IOG(GqlRIq>OMM11#z0N|1v0(@8RMDbcyJgU$6okN zdlaMAWd9)gse!yboe!H1vEKjmcqUGjG_{@=~aHxR|3 zG!b4`JYtK^$^QDB*pL64nm#N@-o=Yy%;1i)@%4lHG>a=&;l&(yF)k6FR;(q$7oZrH zCEf;usD;7sF({3b*%R&OW`A;!aRKMeg%`yl{vz3Gc}>sojqJa{WV0!?xGP;zbQrup z7+y+jWdCX-ldV_8_7w1cBMN0nW_OvH`V?i?zZ^_FHrDLHl}(tyUgyoCFQO~+f`)Lv z_H39saT9_`#wX`r-XRHntBiWe!L8JItQw9#hkNLbsXDbsJq?#CuUpQgbs& zFDy4mMT9zc+7_I8h_(?WhQLzWGfU}CmvV}@384!=M=tioi(Op|k0ytZ{kf^Ay}+sp zRGXDDFT5x_U2zJ#h(7!=OnMr&*@G8rp>345NBKIyO|~zO$z)X2KAcz&z3>b(7)OP> z0)~gdQoZAV86oVLWgs1T0 zc06HEu2=M^1;MFoVh*#Ed1zbrVbUSg#a-ykwc*pHnQI23P}h-1u}y7k+6xP%Vv^RF zJ$Q#RR$)7(AuRQv8{rOv%VuVnXm$$S%`!C6nM8OAo^JsCTT%6rNm>Fqowx3WqNW5h zp|}PIo6OxFM`v!2?$a2(xGQQ3?@9CiR1k5~4dx#cmQoQ6cd|d9Yn%7@Z#w*aqy7Mc z+rZ3s0~@Ueu+19RHl29FAl^p4$$aXU=!0$A*eBQ~5qPtlcw6IE;vp#8z37TZv9~u! z-X*6Ra9&IHpnnkIdC30kOqo+tQJtLH2WBiI!lU$mXd6XQQ!3MkSAlKBA<{Y%0snzh zXW`Q?MN9T*YBHZ}#+NLP;EAc!oI7Oy4EXdU6v~CXJvWV>p$H!AfzFg4+l-MZuuTFn z2F^GYP5c3#p93EAoe+M`4c?xLu#Kpw4c(rh7AJNgL*lFbY$jeqX*zDpvJX>_s&R<8 znSpNPFgS-7E#kf6?XK?k1H5TV+%yKm?-4f+FZu;%d~b%B6x69z*mM=PNk!beVWahv z9gKS4lSs{o=eyv=lGL|lyp^zr3H$~s>IPWqd(b-+?B9!eSBZ&O4kqx$#W6N8*5eI- zaJajhQ{gDv-`O#GiFzN2H{#-rrFdg4CuU$`@dGVgqu$4qLy6R!u)c2GZ87x1*|3fE zbT>|~xs1I{r)OBeiO29p10uC7`^7cgerl(T1wZM)nYEY}otE{PGB>5ytV8GD4jtwU zKAcb7Jf@;fN1+_coM|rJnBsb)8FAB$ZJ1Y7)TCr_EHT^~b|$l$dvsC@Tx5*Ho!>&e zy~oV|CHr?_G6iRKAg{{Oqi$jb6Gj$0n&?6LsXtg{G5**~k6MBEAhNQz=Z7l7wuSVf z{ItV1K`{Ra*oK!n^@%Kg38E#XgIh)}u7vsfqRV__`|=kve}Qf8$Xs}^8`qY^HVc`- zY=osQq=ql0yLm}1UO-NrprSTlT3E)OC5x}JL%mbR!!~WXE`Z&X{ca!Dh<(o*AY5C} zKg_kwHWcyv%)?{TYa~UZ@TE?Df)}^t#AZ~~N4y6Sldf2bfgs!{-V(V*KFuMoF3=Tq zr`Kq0Ur?vMlEvXJ`gg%PWr>@$#LXe%W;0WttxWyCf^duQ#(waosyX1QaAjd)<>_uD zciM`Gt3gFQ&91-;*hVB9&G*qH5@MUxT(?!@MK_8sO-*qb{3CjXAab#>tNY9* zr&dy@X4^RQ;RVeL*ycj`)LHPRC13ccih3IagRcv}iR0R)1@Rh<`9w8T{~FlFpB?IE zu!eJ-xEwEjK-*Yml4F~6=zi(tbhc;m52APvQWb-o9|@tYJQz%hq4h7UIx{_vN%mn zZKU%r#q&9L8c!X8Z9HX5`~eZpd>@3niZ@n*9WR+{&BBWl*=m^&znMT+oRwPKj7-ji z(lC;4dIqz*@oWmtMlpIpglu(n(>tR;6vbN>7ygT#rfu-)^|lD_!T4dD@7TuiVs-SQ3)to}UnF}A7Qcc& zr^Pl~u<3R;!iSl^)bJ>5BhaI-kyF*cw|d~z2P$k9ri_`${xsC7a^^F(S;dLxwTB2l z&HKnFP$(~;7dzTkNo>=UxQRhmR0~b4F7Gqc;O&wQMEF&%T80;2Q#BT%iOod!Sxoj% z1Q~PEyS1UdWv1^R!dG)9xHVibNzIFzwv)JV>RVE(NF*Bkb0%r;MGI!PiOH$v*tIYf zmG3XnYZQjx6oC8H!8WHjaTWFLH@4Zy%x?>C?CfLazZ7IF%5`mdPG6Wt1GS@0V)hLK2`b`$*s+MReiLp&v z=Ak`!3$7h;GlZ$neeQG(r#=N4ClWVsMWI+YtbIrZ)#74->m^O~=U zoRkU3sV1E1$FyJx{re%_oZo|9=-5Vp#p^)SQ}h~vXz;ms*P}4}rXaoLcbVTsxQeKL zrG#fiUChwJ-#M5fX&2~ z#7%qNNo+)y5}UYbgcl2vQ%k{{gS-c`i?})L#?2`Zd=;qkhn(7lwy_1au@~Dcq)REt zc`eEQq^K~h`NBsR-t%mYmO2RA+y@ocai`Cy8dKQ49!lJdBB#1hr;;&2b?!6^^Y=+I zrK|favuT<7RD<7~!-u=@Vm#vJEHl3o*ygM#MYaFqMrs2x%ZL8G7W2>`6ocB-scvo- zZ|BNmXd-3IQt)OPs{brDHwMGRQ&4aI<2h5YDKdz?ttoDuip$ie41LiVd~pc9C=+q> zoN3X0aw?Mdp!UdUC`AoG06(_&R?yv?0E-WzG@U?8kHwbBHc-{6sDUm^UC;Yd+jvW4 zHrpxL;c)ed^Mv&84i@+0P39hKZj40}ea2~0UlY{p)v$1{qpD|4Ax5F83vA5BdH!mtsrz-Nbz2Y$F&+wF*u$#iXSGtXj)_c_O zyC_YM-OBiw)3y`g-(VXHso@jo!>71ednhYn4ShV;+dO7%}%gb(X;F%QrF^*P4v@Kz|^c%#d@%fcrN$* zhBtmNgZYg&a>H*A;QzxQTwea!VGZBW{g~3q(=s8|KZt8{p!&`ti?`y9jd)`(JVlvH z#Q1JEQd_ZmU78(}QgkT=QDHyGoZM$1y@sGN)_k^<30ou089U(UG?Htr#_EWCJ&NyGPceCekX(<4Tp7*^t5%V3+c=rwz16P8@NpTC7AjF>*u5|KFJfFW3Ew>O(74q z(RM5fb$4Ys{w;|ou5w9PP1+<|(RoO#6^=9)Lq(%A_kHh*KA z02hmYlEvler|O6^_CLPw*Nb^UB);EGW*PQG*JGP`)SHFy+Yv-+3Qns57RUczq>kg= zi?LS1{R_Lc+0EU)q`MhqzVfcm8+4fGeE()QJ0Ar&u{_&1kK_#4<}Oiyjh`aerX>~b zCLCoSITeq%JwxZeAD*(GZ`jR&HD)0%s^Y~cwy|mxH*LVwR@i2w$pNE2j{n2xic7ow z)EK@DHGwSd&AxXcY*UjHle+qiqlzR$FLqSe0Myj;WaCjHJOfjJ2W-P!=gq6@#LWgK z;(0i+5^UomT%aUOys9_{zrDqlL2CHMQLGbA4X=srmxj(i4PUuU4li*qwIX*~nq8CjRN!!ONV%*@=8JZxZT#FZ$_tC@=whgD?Se^nR%RGuSVmW>fKYSv40^_mfwT=^6UbYc?cq z8WJ~^iJNaSzw3=m*k&P&>ICo3pJa1`_m)vN9$*{iPJP(o+zs1Y!*0?VI=FGnQc`nW z0Qup=_Ejs`W`Fj!dZSQ>&@;a0w7tX)-=syq`HM#J(+;4!X=33s?U&Fhl zW7#oFNz7Cv!Y$L$7T9JWwi#%7a}B)t4t^izw^OI48w;cQPGx+@WMhvMY|r^qk5iy+ zjAPq-1G@sKba1#9(8ew&X7dkRl2jcsy~Q(I*qanl;^-->;R z;nd<+Alv~?{7c*{gEfq2Z)*Z?mUjjHV_=u^{Eo+a5dE2m%%w8U2aC7SZNxOU=~K_r z-DHJPJ>Yvgm)V9oOD$f6H!^{z73hjT)1{PS7qTvjQGFD{fkf(at~x~L7tJ_W%#;-U zZVnn%KPKt%@rFMq#(;@;MZXybhZ~EUx`YniOCBBu8Q;4(^_I^6F?%$T%u+VP#d5f| zaqwm~`pp6O?Qtq2UyoxZ@|-&jbNi_#bpHA1r{NSZ>QSJ7LQX6LgEv^X88evv;=3J; zMiojH|K!AjC=K7}Zs)pc+GnPPAKAb-Oh;9axG70LbsL_N27a3zZ{&tGHb#fL$DM|O z#i^-2SJGmfd7kA zQJ<5=g+Tvm@D$#aKtIVrZk**#Z|S(O-JR&Z3+PhkunXT$p2HgjI58jII7ZLtcq1kg ziuf)wQsx@DagOO^Ztna&jQWXfhPGXu>iZpUlp>2$a^iG!-~F)0qimQuwb&QFafV-y zbz*A4NxZSy=0y4N1yiqqR0Z*V4)qldSC`7zlP~5nF-1+U08-uLyj!SnmGDM%6rmsB z##`n^yQu!z$c%i<-!Gu&#pg>s8NrQwU}_t<*h{*waC(Mp#NTZ?vD3`p4x``B0L7E@ zj79O{Ya+EY8dU>uqd9uY7^ZjM@cmiXMlAU4Hj|VtH7>ZJu*Dha!)c|^nFYAfj!m&~ zd=q^ttZ_3l*x2O8S-P7qaQ`u|21na$%ob&NaN{+&Q3P)!cOx|idlaR>jmp%UK78fp zEq8jBK0GP5If1&t1d2#a&NGE$oBTvh2C{eqGvDW^@L#ZjvfLwow$r#$0D;wBS1%uOQo7?HXU4nLLZ zpA_2^ViWQ;eNhE=1sqIe?*SAq3KzS{6F!8A*P}9~Lfwex;znEEzR>u;5MI=%Iql)M z6L}AA7Pi@j9b;2B&XE0IbV1iPt@vhQGgmWM1Zzyio%&J3A8>w7y3}%f1EC6E+w9A{ z@B=7y3EQM_ZIhoY&L)!KkXxrIw=i%Z&1O zla4wEXC^_}4n@Daj4E~yO#Nsk@XqFMPP@-et zd)VeUcGD*D{c64djb?NU?_Z&Y7ea;o0;75Y!bQO0RxuGzk4^ok;dePd3yi7+Q@=`V z8T2M@-gDk%dWO{a^ek_Q>;&O9&=-&7PUG@~MZlYHJnw&O(RJm$lwQ;ur`zzt-Y<|- z(U>|c=PiMeC_e*0xF8tDH<_6$bD&Y22L0nQWzK+_n$I4i!lb5d+~C&_osXP)N?&xr zmM5ojp@ZDPHuomX4YkmHdy-Q_*iGcS zgJ9}??)4sfVinB_a*FvQO7k0XYO8CT0-PvOVf&(OF2FXcnNXa7(fXqOTy^6nFRbAK z6ZkM}bAX-JiM%BkpITD@h4KY)QwG~K;r+?>*k&^5@8wRz+4f5S7H?xSbp~%jINZM- zeS(#li14hihGWEyMEOa`oY9w!uli`zk9oofY*Wl-;tly;_J2%o__89?+Y~%uUbL;d zKA16AtS;!XERZ$NWz6IQW0vkBLIPD?~J|1zi&7=j3?7E~Nvkp*i#E3RK3|a4|n3H7-5F zINpKZ!&b|2whV657v&)PZ@X0^1B~tx`+nO{;d%drzUUlylZ87?f$q0bRzZj9$Rxe5 z^!B%GIr2)|F&%16~epXYu3C-~c`Q}>9t*Gw5(;Kdxg>yui9 zisW}eYO#wF|tM$o0a zw5aXOPRgUh-s8kau#G^rHWM(rmGs-+;J16JQ<;gH>@fIacu}|!9*SbPk9kcBdcRwo zD9Dl-?$jrOZKw+__m2c`a&l%oden*ZntOP=Szg>HlwVd~cnEdIiM-iJ@;!#8}Ph>GgZgd!{4|2q9mR_-++wSNxph+N{EQvWLI z4A`azgp0t7$x#gUxDg(Qiu#kjXg9V=L)}Qji94~)4-hjB+%Fxve>3>aTkbRx^|mAk z`w6yjn?0JdWdAI7niFwdPWI<-p#x<{6E9EP1kx7`M-}}=zi^X2%omn?g16aLVw+ID z4%C&niGnrehNXM}83W1wzPwu+%--GxJeLU8aF6;H7nEE^_77ldw-ayBRE9%6hc#q_ zr5Mn)H#6TA>_YBR|`3KO3T{zf+svCVUku|C@g$>>s)7{MDfO^NDnde4ZGLuo%2>&4*H@t z%*5XFjFI3}F>LdeoVw{w{c?eY5%hjph__g1>64ijo}lx;#^%mj-n1zO7C*!`AL%vQ zn!{|uFJ(e86aBUewaLqgdC^jT5H~IO&UP^0Tw(GB6K}{jx88soFW60~LJy%)(_XNB zd7WLMdCUvra9&zBr-txdiOncRN2ycyutq^x!xQfGx6Xs5ZqUK)X8Uplv$VcMs$kxi z6XyStoT@|z*MX_uKy0%dERKygZll5^rfO_tmNK5*`@wFVS`VX2M#TA&{d-}pn#nx7 z$8;%YsD)WT|48&{!8XQtSZYJG&C239SUia?H9Ee?$cfjPh~Eq=$JECt(q z3~GF&*K7^mIJQA+0gKzC+5DvU&j$1VK-CChFMTuZ zkzHHL%5TbSM)rk}n~KjVig{s@13qx0*DZA$P>v7FTK_;m2c zQMY`FocOQ}howGXuKkr-9g9e_6Q4|vlZ zezORzVIzCO7r=YRHV^ovVerAsQtI%&b|w1hY$%4|^u?KooLFG-WK@xpWO0Ps!A%F@ zd_bxPbVcd0%@N*7UC7pM2-FH!sov=Lbn|OLxRFe6nC`%f*HIah^MvWJ%^}c$ z@2Oy$6=+mpYzt(i-aI63G%DO^u(&SVuOc-(3kY|adXwJu;w?9)&M@=8gYNqQ^e=^G z@YJxq9jM!XLAc!H)F&8xedYy&QDG;z{ZvDCH{S7t&%m3i?B94m zh4;K876JELfYy|N^U|UEpMlXOrMqE1!N4WD*2iVEx)6%rfi{0D(I zf~zv4-Z_dvX*PbEvYFb2ueHoIHMrB)MBICju{m9FI0{v5QWn8933uFM=Ru{HfhA=N!OASvB-u#R3 zhNvk?*}t(UMz5JOuEL86$l(+)xV<2wVH%W-t~dt~-jN#q4a|5ByDiNg{5y6buM**W zHu@yk(--ILTXZyglT4u@wr+C(z%? z#TV$zwW+8B(Tm5!#I|9Z)SUQ~YLkd~Tft6SKfKr)#egpW^HyqHs#_{>>Ns(mh$(X( z=9A^<{075PEl>EGzP|_)k$b5AhnT^wrz`HmMEnntnvNdjE;v;J&e$Bb(aS}~>gfJ& zdBV@s{^rc?Qri%!#y}!G5Z3kz4ws%v?0B&ywwVSpu4Ys40yR7rv-Ib%;uv&~)6h1W zz{Dz{P-lVrT>|}6fyPQ*fo0$`Us(dBz_o4PDt4;2RFiCmojBoKrqf zi_;Nr&#_G{s>VR{Vn;F9$K9o+GCl>Tl2Bb&Qc?TyMS@nSu*J##J794JSn+SyHi>z& zG#|EcB76w8G2H13>YE=pb)P=$FnaNN_OJS58!tR14Yr9O`U=A~8i_~b&L6m5HF)s{ zviK)mQCl{J($R-Shc|yA!Z*YH5)n6v=!&+YG<*lA;xcE*Vh_OJ)1mu61vTPO-{vv% z?Le>5fL+)^Otx;psC>x`FJ}*DcC(vzL{7uRo>EcEFlT<}qDDTpgs<|Z*B0JpTZ9VR zjqLx17t_E}9>e?tsBc}FPmQ1}-U!=IMNTIe++8;J0=?|;5X5D!e~_D6?}*CgKL{m6zZc?jcjzcubIEb z$BPbzw_}o8o9xd;7F}T`k{mwu6XY3)UbvnAFL~$4{&!@*Km6tcHkGh|!Kg5$$o_w} z>4>)Vi8}TFSh^GNtLF7>;CrvtsF5O6G%AV=(M+>KX_TlWnkS{Cs1!v~h$c-ULqbZ@ zAZd^aolr_D8dahJO~1AFem}qcf3L1{IOnpgwV&@Z+|T_C-%By++vq|qozUIns3Yy8 z`2^Egnuq&~*C@ljmazWOI(~XVVs*&oCvPl-**N4BJIWZR;KV+$A7U51sYN!YFdO;3 zdpum!QjS_1f-g>QzLKR}!ZK3woUxhM-&~!cE6+Gn9$pNhK8Z=c0iNE#`lsW>MkY=s z?iFG7@NgG<1T_u+TrNsYu}dh-ONa5^KK$fUuuvgvi0?cM2~GQZh;@#Rp%U-af$y0BJ!dqe*I zEHG%3v$1L zG<+45a+&_(YA|E7^Z`13JH0tYZ}LI`qu}WVszsI5HQmAmZ5-#}vQP1c|on{2MY7q4*|7yHr+H2hh)#u~iOud2)!c(mpw=>B6FN&9~KscTg|GjW+^xU-E57&{_~snjC`fNs zv#Bd^Vzs_3f4PF_PdLvKqEt@I~`JH5!ef4dmZ_B+0K z8Y@n-;+&$!`?|!V#LG@28>Rm2SJf1Y&xkg~_~L0!qm$0m1{o_JC>J^@6VKM0^)O@U zOm?$JS5r)iEokZm(I%JE7$_^Ql%55pKBorPGGoQLSVn+@ooPnoh)(!C`aR3xw)*N$ z%gHy!BI<*~=JtdP;ti5H*(2zaliXI%eDMKuG8=r*RGr%g6JK*6n+{ zT`gD1HRHrXSdl}%v;ZsqK@6{rF~~-#qws!9FpcG%#%Z!CBldiP6B~hr>k2j0VDVew z+k!mf;p76E8e~xFLb>KIvfEl2zj2nPHda|XMpHM5jEnGogVfzlIE?}_#*JiiEjFbU zP3?uFn9IXmnbFjQ_|c#DuS`=5CG4Hx;oi=~o5FDT9)iwr&=fAb5iZOW#GlFe%w57(RCgc&O?L2uq+ zQv>ugw#QLa;VCwWH~CrrQF_x|4{bJrU(3T~bD~YjCW{X*q!(ulPOP!{sY)vFIrZr+ z!22fI;u+F?{{P$5aanOez0e)lQW`&%%bWYj!^%VOIaLJ?u&Jr)1s7;s40XNQG|}UvLdZZaxj~t82FfUtEEPXIp<>{rbmv#@;mChDzB@OB()a#`F1!FIAbw%TfCz zcFP$iWg=rPw)iWb)z(J2iMnCtV<>+T3v0=4W52N!G&e^jCHoW`WKMAqqRE?YtgPU7AE@?Z4OL-L{}=Zsf3K}Pc0^!{3^Fq$)*j4@^w+|N;Z}K#)dTfHwb-@&FQ>@7|ey4}lW)wDc&}qEJ-~8)K&yvw}p79t?tgtz#s_F0Kvo%a#M0|Kz z-gO>)(@oA`p3i9v@}47DiXhnUGbV ze`)+<1!(gwJ*^YOsmnc=ps$T->Omc5D>0OF#HmNb@V%Z(I{$SfT$#V=poe-GU%XHZ zzlN4xfQxQQ4RRV4WxYA|SpSZ{dD$19b{gl%W=014jj5D!)U@=qHuVkV5wlMt2fx#i73b#R4nUjh5~ak#)tH|=;@c59Lmzc5 z+w^p8-v{4J=iy3tE~0VuS=evz%_39RuR)vl!L+;RO+Zt>kx$(UiTAdvWdinotxUKY zmLfNARZSkSLO0CQ=2_ay8Ly#ZE1bi5I4)aL+hcEMVntTVr%$qt`^4hBp1ca0dsUXw zT%Dmx2KzrOG9D1&vLoth-(3#&YpuuR@pLZUzf%!hg==81Fv<_S=9lIwqgK7`xG3{$0SA77^(Ns}+}JGiiCzul&Y~y!c6a z`k!p|jf|$gKvNf(5!{OtZ;GYJ&92IcuG!gb=d^n*^w1YlANmM}J1=r%TXBDVTc4TN z-I>wUxw6z!WD~LC+iB`H?Cm^^(O77+1z)ipFOm?aHp`Lg$o#W?>T5Lh8z)!8SBAd! z`cyYooFA)et46}UdB|iX*yMVv8k5RNWgK| z!GRxU_~Jb_=d4JS;8U0J-@>%hSd1|$3a8X_8`wkXbC{pDPJ@BVRqAGt`0cp#t7z(Z zdC{AY(K*kZ=HXt{MfDRaK5H&F+oukusYRW}#Ufol%yuz6%wHJljcO@Rd*fkRb6RAa z1E*w}9lJK8sVDi3c79_ar+AIOnFx5FeV1*h`1(o~u80w*X z>SCIj9pRF6ARBFNPF*icvBQ&W8eo35X5!7i@~O!g*<^DKv*goT{IfNEWzuO>BAW$} zcpq8HJ$T=%aNa4jXy$H zZOG;|)6<`dH~Z<$T~0A4sg`EX)73TaSA(f8A{D^cd`wfbHT($a4uizAGq~Sj|2#TH zALcLed9J884ux+k>J`Yw{`)fV=DUpEoXX^y*&c2rd^;Pv@v|t}z#Eg~S{6=u8w=aR z)cxIRwjWlwGMhxXt1j*|efJ*|JH{ z)D2{FtL(Oy3jBB;Zar*L)7j_rpKP02fxjEY`*(o-vk~N0||7;KUI#%Qej;erITvb0rHbF&9uY5kIC|Xg3;k0;bl24&v7t(*4@?h zf`Qn$58%dAe&Ous=IB(`!K^&dBhmh7l06YM#MPWme{RqqTovZbQ6@)_V?|gioS^~` zsr_7^ZkZYz{~ooE@C*T>N= zInW)e@1%ZogW#B`jOPwz6^Qz~XL)`+lrOJGSF@6Mc87`y}hQdvs`cAk3fRGO`&N9@jV6 zPj|xt5$CMindU{;M`xXXVH$KSni_Xj-@FFmIGp?-XcDgV#;csh$6?j*rC^gxK6j#Y zx^Ze`yfb&!9<0q%_qY7D*WM9*l z@9Lo}6~7);iq1R5ve8I)P%n$ez&TBDe^K(YpaqQ!{lb&s8)1oXP_R%G_(vSSEj1wi zDY`Gp%Q|vK_eN`@N8?hk{4eQsiRsC1LH=+O9WRt4nPX$vHvHOY)K0ds|9Dbrv)jX8 zims(O=d-Fr6QZm2am{r5MF$(HE^-@KoAApp4s+z#A3h)E4j&9=Bv+{6{KtEDW&JIq zLad`$^icF`G%BuzRsAphYhq#Y@!+!X6;e&p^N+$Bp&R9G(5aDlF#Swwr8}7?L^t}@ zi=rmcdr@t5htE@!b^WzgyZIq#7p@8a3D48?$HKpy#!$U&t4x>`VEqdi^IC%r@=YgQHw-BGcDh`UHA22~eu}t%s=d=V z69zf9hEKT@x^XZ{6j&pRFPwTH{wiug$J1F?M+2i%(Q9#gSw|7IMvPBTDV!7j73Ruu z!WUNwU&F}9CXB1GjhXRjvMd=Tc&p~o=QK4B=J<268DvKE&tRZ)NaV;Op-1_RazUHq zQ<$oyYByEmcX{JnQIvIk^lX$r{ycs<)j=L#QVsUKpe}1X#X9zduZNe0{ew?w>RJ15 zYo?xI8;_FdxvWA_+vtB$ca@y1)bHZP%;ZBso^V{ahgbb4To&F%Hfa&3xtnNSO>J`b z?5ojDWEw`bGqU+Tem^xtN6`{EnWU4ZjXMhd=9bXrCPM|MjMJJU?nkHaR{0LdJ?m(wkaj^JnsX zviXo~;&7keS~%<$EWoS$gKxS$H8kEAb&0Ny;;bu0#_jZ`3S@mKy*4pB*;(8eC#EKy z;-_Kb@MFwV#bmQYPqJArZoDE=<)%4xqghcERp2;csMmD4Y>q%foGzbzGgOo$i&I z%ch==DtKSPsF_&Y9G|lzwa9JIkI|byf`0Vof=C>x2RN-taeHb^ykA5t$uh2tx<@;r zC*qsTC+ttJr#JVL&6DBw@FXwyPFOp95A$#hz3FSd@CWxm&lahQ(z!eNo2vR8K4epm z$Z+zy^XM*Cc+7ch4Eu)1=*jucZT zhr6Br0e`I^7XQGe$|UNh`=#c`x#O|XEl~k+^*;Wl4W{$w)Tizu=xNq#SJ0Ui9}SPQ zko)-J;z8@=lcu&;%TVtWQ``8B#eDBfk#R%(EIy{1O?LZ|lOUX_-uRbO92w>c9}V8a za-1=na%bwL_^)V)NL7fw^@$EdL*uISW?y<`;?-n};J;u{xWW5=6T@rs#TVo`t=uOx zU4L=K7&;-DOZmC?qnq`dyl*c_XWXxC3&Gtq_0RC{a8uYnJV9^9LgYV~qN$MT9q)*G zL}jB(c=C~a@ifTj8VvW|#FAv6pg=e(+)Aq3#ht79;vdwFu1nmNeloR`_n#Ei^b3ne zoubvzeR!a4srT)p?3BFDoy8A^E6L_a_<7hS{7z)NKlu!9WFs_v4-a=Ae|jkmpG-Di z#Uo(V8^z+C$yb7M;gs-4&ut8chB?B{!TWN6EZl#q)a3X)?|+*&-VpVR_CXCd@;5uv zpC-m7o4A#`U%1|H+!xLZ?+8B(A``#&xu@Yx{lz!L??;VkTe0ZwXg%&1|+P;8ya1L1} z%vxq-^DInNg70`DIxL1)#mDV}8ed4>6C4k^`*pvv#mV6f;hSoX*)}yWJ(p~%ij1wi zu{@l+G^!_tf5I1cCL5FCLACJBaGPKF86^I@nV}J~+@Hwi`qUFVTt7N?MzOjH?KR5 zY`u9pOz_2TW5>><%ck#w8vk{Aw>pg*qe0OjvbjYjzn5%YN!}g&8}td+g$K!IW_Uf> zm^ex{O!QArHeGTZy=h8Q%ZP8wqxw2PmZo0K#Hl=PA8aTF|H{WL4!eZg%ziwUoQZEd zq9)QaV^ft`MxAJ4bdjA1y=5C$h~aCJLxW4hu`K@}`8*e15)KT$vaC82s9OiGz~WgFQhP)^rd`c{jX0{0y6WyIW7k>xeq#4(TtPUwP-) zJo+%YUia_xR4+_L2^sOU;3nt(GmTpv_7*jo1urMRl;h?}*GY}yZ=T@cO3?7p(LW;U zU3#hiP5&THJrJA;9%IFOd5!TI>)$O~t(|ySoch6?wF_j7mHDdf(fX*B?ugZ?8LCZp zVtp3{cfhqj(wz64;`ciEd)d{y8ryhvYH++K8tOEzg&C(r7u$)@TercbCexO)sl2@Z z+VGd~t8fI*I5=3T8dEaSFg+x-!oBlzA>ztBz#vhhxBid4sm1AW{7p%S>Ml`#8@bL6 z>xV0K4z*-c?_**Mq#lX4LJK$X8qK43qEcpQN18IJC^I(w#`}*J{rAAC!`M_$zIdM= z-0RaFQ*ZJ96X@DC-Z-314L5^zF10QFL1IMaG}_bA?N0HP@Ro3P2K#k@{XfxR*f?GR zNmuf%_eaa3YWlI>hQwQA8&4%?1XcLbALK^MMAV~v@puz|2hSf(E0IK;>%>e z;G%Gd)7VZnPl(}<1Br;ZTyLL<2!q1+Z z4Hqv_le^Q+XVajDEH|F5hm5ZGt!<)@qZ{>NPob&xXsXWApfqH(iPu;Hi5)fd|FUk% zKh^J>r6$GcXuQ}~$$wsmvdE?}jys#Bn2>Dl#`+$aH?AX_tHN<)QzTgrqMDidC9a8W z=;#cqvZ+mC_=R|F>J@iF*3r51QBVUi+Co>~=ZnABQ{986uEZLZa%zt9xvO9SIUcWL+-1fxD{lR2zv#KFhGS9HPgLQpTkZ4$j0CF7}ab9!?s{dMB?WV7HXzwxmszDm3* zLN?noR@_aNvPWLLO!U6h8~aCFqx)gM4XHQiO+!|^FsKQqd>ei*2Hcs6Q(bJpU2YQg z%2eNsY;Je{?V@>6SvK`FHntQd_RHiDdGSyYV+;G}9{y{q(L2ds<e@eyhm|G;*MBRL84gb9% zx`!`bB2GPMm(?j~vqJcir#AW0W}?PTGXMARjafL&=i@V&qPxAZ9sZ`6oe$kpH^Dc% z67!(V(`2&{?q32I1+tqjOpBC;Z$?7m*RZMf-d9)j*bl*%R>fN>hCi(LdM)ffLmd9f zDc%q+P|K^A9Hg(l`gMmCK-***F!s%f5PvMn*y5;-u1!-K*++$vwXD0~P<(IS|N zhxr%x+eQYLOI~yrPu0|ECgaJm-b&WLGVyYulC|8m^9BvS zJzg$5t?f&nh<=Vb$GLIbGxbE(Q%8G0xG|i-^RJ=jb;4D8aXZ*8woEm>G!6fQhBjmy z?V^vOGSJ2dp0PXze?1M)7Y?Lv-}uspMUA$>TnIi$R1&8?g8km){j1Zrm!kio@o_a3 zt{>A2oZ^ka_Mj-ySheE4Krp7W|wf1DUf!?)s^X8Vnwi#El=mxH}zbB~==AL*iM7XOcI8vFAETg>)T zOHwbG+N?k}uLM_lVwpcPc+_u9DfLgzvmq>zuAX`&J}Z(oC({mOQ=FgbjZMjGui!i! z<%yspxvYl&dxlx!+j2g#`DEQ-C+nXf!hIxv%Nq`Xr!Pv@q2aT2 z&^N+S4V3lWD@WOf6Dx$@o}<=S4@!MIxGo$+GAp6uYNAci;6D2yKTjW&-3$>?U!bWC z>D#jC77XPWJtJ4?-P2owG4AX%mWhsSWQ@(_sJ}vDb<)FAYk0<`(PJ{=&Q39iUy5t! z-rks=n&_gRePwV9*?j6tpT^!z(Q$GkPJ99%o_539_Gp+dZ6q#kj#^|i{7HR3+3{^G z>mMu%e@^S_@l!VhPwK+_4V%(3^`?mWHs98qzI{Z)Kf+L6ZT5N%ruhzRT2uITvB=R2 zN*NM-tuLlpqC46A<}ToM(O~-BA{rYVq~S&6sB`VxZm5p(L2wP5TI@GIAKr**C=fI^ zd%uuu>~@L&&d8>5)JwFvnTC(WP?s@%vs~tP4uAU&o0=Q850BV}G@ER4CaS0Vq?X5J zdB#WBRBL*7A)3hg)2Z*%bFpycf_2!mNq*rX`g$c6<`~|m1KF%nx#`3+j`W=^X!v$0 z<==RL+cui&hqa>v+897KOZ?7;BJoYZa2*``(?!Jo*>V1OjyTl_-}H`1{IUGK0+hM| z3)>+08QPd4-n<8g2VuY98#(H2iAU12%p^9&iVX9Z`ay{8`jfyy+B8k8-M|+>wcIb4=crcAs~3k!>Mc9Dqw3uV=VYvb|2) zRVsy@up*=687+C8pIQHz_+vMF-bHVAvZ;&0e$IZ8r|X1kOtub?qwc{MH&4xq3*zq{ z_FV61F(1A%?#44-fZ$(FHVw8x8xuwU>Av(I8!cDr7rs8xPQ7Rkl=>YjZU<{j7Kxt{ z-}a?Gw2`h6T=W(ec3Aj5vv#~jsf=?`T$73s}wH1$39 z*wrZx3%2Rtxf`Bdtd90zd>F&j32uB*mFZEe?-!|;bkbIUi(Y^>dWrk*@>4g3E6j}a z#EJbNyQ!a=5$EG?9&w8Oq9r)k74hRdV=j{-Z;;JivYDKb&4aA}k>C?EX5|yDap}9{ zQ=4VA?S1J?x$S6Eh6hqhRMYO_Z)OL@<==Ds%7HX|c5vP_>`*rlAJilCTztV3U1-kJ z(YG?jU*lKw(q5yNW@++46^d3o+&kXdINW8c)l|JkxnRb@_ATCs6&XaTJ+LJk5LjRA2n`3&BBrVJE$GU#q2blfk_p+h`|a*cr9U=*=*9W)xA^ z9vZ~zK2yDMw7SM>dDvicR0mBMwS&Y;(9{7u@gQt5t&O{~sZ*HkQMmL?!Rj2N@C$Yg2WC7t@(}jVU?!gFE&0+)xnVm3pW&B ze4Cu%DLUSlXS^hy88;=Ht?4(&=29N6f-GewTkI0%44(;p(`(i-@sh5Of~m*i6TEj% z@0=X{5p~r!wiGAUBvDl7&f`2>dzGmfBzt|h9J4tf`5}K(G~HGVznrG_p>dBzUqH93 z*i7pFKYO1N3z+SKoKOU~+Gs4- zxI~=l&-#a{PTgvY&T!py1@)Ng))T`U`O3MXW3zA%&p6L^k&=lPwvq1QZ@yP0?C2EV zjB>~0WYfphC!W&}8Spn(%cI^5-y)$aVaBt`+VJ$dZcHhc8ZNt;k&(?JhvA7+Y59%2EGrcG=JXwjq zsZBQXY4}5MQD3v7xs&yAV(;q`zAxU*({vDtCq-wX0dm_d@N~~a6-aEHQ|wM_W~)w= z4d=VqR9M?4XpE~U?80hD?mxQBMn<)<2|72X+4!ffUh zHJ-Ln^j0za32*F$*S=T7u{k*af72e)m_@^Hq~Yb&!xz%<%UJ&c*8eHlbf!CBMHOws z>Z4kamHq~oS~K{bY{oc?iEz;$L1!9%PB+EFBI=(I{BHiH8|!#Wjxw5t|AyHdj4%8L zO1+qDruou-;pO2QLCUs=XKDBeeBp#Rl==1X#^<6RqoykNQ=yIPWYbHM9o45=u*Esy zi|X$`+P^YE_imiNA>B9iC8lYOJp56%xB@Qv1P6PC-OvlwZpsEr$z~Y8_$pgG7Yqot zxc%U6+aXs%Vm;$S@JUy3aY}SL>JKw+koVs&*Vw6AlqAh5o*e8H=bPYoK;FMm-+luT zwMhJlxZi_E-O7jWh@Z20Q0o!_zxO)Mt3cxv+mP9`#_)?g=hRh?fw~W9LrDbwX^em-Mgg{ zZ8228i5lDFirvX|ev}6;s>1pgi>QtCdQHI>cO#ogYLl19iq5hAk+v@VmC>8r@%uEj z7p>b3GaicHz=&5=*ZN3ya{w-Wo;8jLYr@mj>CLx1W3^1ws0sUxp{Y;H!mqYlxP?CR z?dh5F_rh)-FGWYQPor%Z2ZMv1I@=$B#5U`L8Z6hGO)~vS=tR^FC$iLiGL6(HzQIt+ zgq_AT-s(CWY?+`hl={2uraj)LJl=0OyfKPrtP-z@d$Fm1A^2xhi`F}hk#u|<&v+ns zSO-p84`#3QJX0_asxrSurjN7!Fn&S*#qYWr`s<@SrXMCJ4>i$gbXQ}1L$`4gEX<1Z zS>3u*<>8BA|NfY<9X#Xi_*L1>75b>(q^Y}{#`Df`jI3yz{bFX-uy^$`S+SF2hrOM~ zXOWyNuA_fzt$Ju1eXwr^#lk*hGePW+-DC8dndTlk;(pUB@*)qnP!(n{uX8+ln5Mq3 z2m9v4zll$iEmh#_I{yg}z;)0@WtEgQx>|0=7jEL=Hpx$Vc=n6v8dltaFFu4Zc+AZG zvfx@)JjJiPPegqzuz{H`9%`Z~z~27ND*F4iHsv4zw!J{T{}NU>NLw^8|_Ox+) zFP(S*Eror1AO5hOwAUf= z&z=8JnB!>lAcktLnqMXO=ELN@B4Yzyd@|&JTPP0@r?$YwwbM`F(rY-4F}`$!Jglr; zuXYsKN-__=x!hgX)2C2S<$yq4O_GxGr4sxy@IBe555R0 zift2|WCJ{72h3({0;5lQfv)t2q0Om&;gfn{^3v4naPaf6{x|DrewI&tfVY`|yDg+Q zA<|9x0>1E!4%2CT>Jnf2SoCVNC%RV*pTzr@OdP^d+^JWry0=Zl8{C51s3~Xo(Z-gB z>1Smr4Kk-O1mes_V((%$bHK%u68Gz%pRGIPQO}JDTZb2dCxTy-C6f=i6KpGHd#Jkh zJHB(MI@)>c-9@SOYJSZ`#tq4?5LIJu9LwtzS4X`hcvRQ#Uf8dLETwY%HSab^?BB-w zZ;hYQ5uec2J~nx6@Rhu1px-!5ocaZ0@R7OQ>l2-I{G4{5_Yrx~AlAPSN}Y(=JevB% zZjl-o%5k!k4xSr>yG=mw$IX}y=HZU$ft|#Pm#~YWZ0cCl#f0L!cA4D(`+cl-w*w3N zxF@@-O)rJuvu!FV46}{r6@HazLnOpkK=e@Cr>?Vhb|EpNIAbl_X zrcAsldR8=kg)eTx-#lmjF1LJ2H#)t!j^B6=y1hk}p|J|wA9{BmCY#88&gY%R^Ym?v z7(Pn{?nLT6n-{8JMTU9fT_pM>4NtkJ?{u;T)bJTZRZlFwN@Z&tA3j^=*O5)l!KGef zE5TdIyRd21$!09fSW#rWk!-#to4V-{>Y9zzCnslQvr#?l)3_a*`hjfjQxAUwNA-}H z@l@Cd2ips3xIEboNAaV1?dQef#ZF@+JRL_*VpG;+Y^t!X?QX#zqW@4b?JQ2sH8IxN z1kSGzRcH07Tk&_3=;?F})tyko)9PC1dH*4B%7?gyhiF`%@K#+EEkwo(^yYCLpE*)J z)FI>5>%+fwgKw7e#bd}OH=BAPwU388?3q#g>NhGd3*)vT<7T(> zHq#?Mk!)IfZm=Bn7%p|IKGRO>6FYRIkLUfDi5p|dCZ%tqfbQ+#x~RhB7h>`68BKkL zf4r1U6%D%MC=S6Xy|HPxLq=2ix2bAH^{{Y{*`IVWy(ICt?DnIK6%Y5untbtn(B=gj zTl(<+DfjaJOH)U9=Vx&7t7LPKZ2IbkK0t5I1@}0^VPUI`-uw+U499F|>&=^SX|j3A zb8kg|i&H1#H*plD6Z`PR^@4B2;@*5?H+r*7<@R}X^n8g%cHi%T{r8g1aGJVNR=f~u z$m6E9S474LLwyl8Y_!np)8ra->!!rV7Rey9{Kbbr?D_fLsZ$mcoZa_EBR%z zz1nRp6^5r^zk=daLH_1_d3gDB51nGQ;$P{^SiHd=ncr3wxGMUZm&xEt1n;uqPR_rN z82%#`?qjp5)e?`va5+-_<8#phr}!dfvuOMpj^Yn_cz=6S_o{22f~cRM+8Q*X}Y{&YF=C}Uds?yGlg2`B~MejV45PtWuV--3(p#TblK zN57E%icOW$%X|f&I+UNPtXj~Bzxi7p-ow;RD(*)%i};%WoRPcj8KL${RFi5wy`uRePRk$g<+pG##d^dH;v_|NFx$ zMAVAG5UhUy`%kcqrbB!j>VH8z-hvTdCf6)VHdE=%IeK#eYV1enYJ|ICzqPhDv|&@* zG1RZd#bEfUY;iTTF-Co2L+Uv_)VWNhw#DDwNJ|HV_u_pflT8PD^BcYCuHUmRy_xGY z-ce(0j%oTof3qSn*oLR~bs4nxrCo9N8~Nh5@P0Q#n@db343dd`<}9W~U+bWrqf_KB zXtST{^bYv;nA-gS9<^C`CK#gv*MKixmrm=U|46-H3!gfHw>lF&WOjcBj-t5C|8?7a zS3}f~@WvhG44-EF%~pF*nx$XSVc1b`;z!;%2eWxwyj+~hZ-#mzM0EygNI8uGPO(;a zP;dHA$t#jwb(rllK{Hjhv7TgJW&OF_?psLL{~+CW|0WhE8_PDX%gClRv@sJ$(F2!$ z!tE}$kH&Y4#qWCVo#;Sx7k@L@-0t!8yLN6}BooU`*B&FAoB854@J)_nT})HK~a|9mwd{EU%6Lcy2w}oWAu^8H~?d~NIabseJ4wq2Z^78 z8XkxJ_tDhT!JTCDI3)H@Fw|t@Ejn61p{aFQaYY>EbW;5UL)i}!U!Xo!LEqL?nV4*! zmJVW(#W34tdH+qO6Yf^?JsEe&*v1sGe|<(;7{@9lnB>@T&ux;-GlE; zi*%Ny9)we7LDb)|#u;Q&*lnA|Oo~65uBn#tk?#9VB3wsa7mrvVJXBuu0PP`E2CvUu*4Nrwq zufqG?k~+l0b!1cR!LFaY z<^)IC3%ejFBEt1^A|;&0&GMpsHWEGprz9|jiFm2!W@F(hyOH9~)S1-M^bl3%eaV3` z@mhRiHyr$tV33^grsM#;??0(VPNNFhyvZ{zQ!N@GXZ%23R8c18jufb|w6{H`s##Pe z?P@IS+C(~CS0;8KegK2>po!71i@k`v@Njl8iVhB8}Im)W6lk6oQx z#o`y^E8^8W)f84-RAelp`|cH6tc%!4(>eGRo8HrJyhjE%0h`u5`5H~l#n`lU+`su*<+;g*8@%3sjciY*s zJpB|+J&+tsHg)LDqw=W(c$n>~KK<;7IYm?7i?7vzGn?o5!gR?HOykF?zL=js6LZ9y zwfsgWHq|oBPc}t^L1t4gq-&Tj*c-Qz`z;{T`K-7Jz3Gdg-p7g`kfpvHBy=To69Fp9 z{F~`ZP9__{x8J6&f>SQ$H>S|kucIsC*W-$&j9xSESJX7xL*mWNzOx5>bC!oYgQI%Q zT*4*k2eGL&;@|kxDQxN-Bz_V{b&uZbEm*M%s>Rt>+&km_7xQp0Kn+C`_v*g<{LM~m+SkzL1Nw`9!->!2;r_>pXT!ypnBTcv z<$e_JpGEq#bBo@V|3I>py9)R#gHYgPUB@i())F^%;< zt;6VUvyht;!yxgwK_TevQ4#fGp0QH!qB_GBiH;c!@2}%)1uK3}r++o4*n($V?bgFu zIPsyu5v*uux_VRit2p&-vTX7Z9cD+(qP~ZR+u;|^)d_cT{G4fFlYCf_6EwW0&g5c# z--Glm4kqJ^yV|&XhK7%`Z|jjbi&ebMYn+VQ;wT=sKkGLfRcrOh7lO0&<`JAodHCk; zV2QoyO%gBYg)EnPExwZ8WPj=Rvf^nrJ^q3fX(78^s#9#Us&5;bQwy8&tXaBd;?&PL zD)&IBQ2b3(=RsnLxEtBLX2vY1N!TaVQs!d*?qpH-K&cC1zlrVzDwF7BDm`cFski{n z;2qEI*VD3+Y?5ZvhRFPXHJ7v>PHE3Fs)Rd&9`dPcGS+{FXZ!@$@SB>}JY745RYVG7 z)B4k!qv{3K*i(}O8)+J(1dIfI-$p@7gT0b6=WM9iT~T9Quvz+YQ8UEMUrL_o5KF3$mSt_>P#?J z4W<>F+O2b=pZhYJ!6}O}vbkWI;c)!2%0>i<_tGo!x>{Nt{KlPp_{SN~c+`CPKuq(c zsyD@)#s|E{@AT$lQRAde=w9N~X597<5OoXRT2ZaIt6exZ;x^Z&FM=92#CNGsE%)4} z=+byFn|e!jThv73XcJU#;Zy3$`|iLO&kjnehi}oHaDV!3tk@8p6dU};Y@2FqmwiW> z|JQC>tIikq(GPQ-vuH+dzL!s}OBPK&tS|i!zWCkvCf4Ln z!3wCc8JTA5%~(uh8))+oMCCRQ_%?!2Kg4XNRA7(jqo`(T_hWO=ft$xq230-Rh)pfk z@iEUf^4ry!zLytGff|1D+$S=>Thx5-P%oInii_CS&{CFqHN?Pe)R%El%lV6)j85l> zV|5Eu7v1i}-Y(TaJr};I32kmR8!9sK8%vuDQEHb3av-f1$SjdQ%7Y`U`I@~rqH^URIO<~FkV)RR9% zCB&(0?APCxfCJ_dDnSi-Xz9JUjsJp|$i{|J)tiQH==v}2uXp2HPp;#O@7H<%xIF>8 z)32FlIi?1?-)Y>#`irXEHx54J{qM17Ie^>MG$BM5|p(CW6Uv=$N zs+|heUGYhFu>zjXwyDc)CF_lc*`sr(Y(`V7dF~c0oE({lTdn5bOeH-F^H$htEb;7l zmHVIIn=5cs;}do4Kd+HcNH}zi^6$;>Y#hOoAHDsHJr@9sVr8 zQN>x*!ce{g-@L4LdqZMadYyQ~i^ltTs~qnX{N>0JLt1tvvibJ(TY3vsd&5Z0c{~%`aH-Cf<3eZkW4+&sF`}^KeIbxKGID4`;DN z48KO^UtVQvwCxiALE^WmrRISc8j;O`;3=CM+VcL#RVc>7DZNGitu$_{Ij_E%oS}yP zs|Dr~qU31t<_4!&hc8~BZ)*zK+={>31Z_^y54GF-zGPE(=uB)PXL#3?z~vajwqo&B z^ro4P?Hw}z9VP^anS#uvzkIED^Ow5aVr)vu_!&&&M|NPANNi6$2Z_((;i}Q_8_DKn zh^oJeXzoNCdXqDSu~jixfuV|IH$R)YE`g((kf^45*F!&48NaYD_Vz20ajBf)ev^KG zn4bU0w8vr3Eu}Y=^a|XdQ*69_U8%&|GPor{0cY6Q?A$&Tv6HgfH=xZ5>0zpO55-A{ zdbu}VlFhB?_-SP8-m*k@eZnu|Z!7aRRl}S((b5prE;iNE7K|dPiSgAKoNT>0E%RF! zKcKGtx$L$=CNh4*``_V>#US{0`nJmQ#mmejw>Kqnm%M1T^WPyWeo=k$GdaUm_`A_q z_}OquExxg;toUVJn|;l)hKYO9Q!zh-VgDbU;y3cJPC65ZKvcWT z8VgONzAb0C(~gimWHVm|f5dlwg=fA^_uZ{n*q7}yNG0CK{Cr9_wdq?0tpDKP51kv+ z?9aIl*RT(U3*~+*onn#r3BGuWEg=zZ^HDZ6HaHBY*2`%4Y?=7?A!-WPBZJ z-0wGTl!rCbLEX;O^=EkBGW4dMe7cxZyq&-KS_k!dvgv0td{UqAdJ|M#!eNnvGVZCA*yZkCWbV=G*x^R-Y+i=Z)4VDot*^vc*7HL${pg{-~PU!{+lg0 zicYqX7SJnH0-v%1^1ndCx8jSl*|f2c_-L7Ux%it#7YD9@CREY?Z8UCjAch z_8Y(PM0Bf&T2;<4UOsgmzPXk42lS>kT=XmU_ITzL_tEeXPO)p81E2B*>%Z73p3!;V z&|QK{onnaVIW96b;=@zyvaF8Q-88(9$>J*@@d~nyH4xkd-JYBAemU*WdCbjj8)a}C z=uIs$y;$dUOOrlVC40H`Fw}vu84Dkqnq8~rQ(1OX##XY&>}lWQ6idOv=h##o9`#@_ z!YOugidnX9O>>G*vHrdEbSGTY57RWp?UjcxjZH<3$4uT`<&8Ip{qx-NF+GFCCfa0H zQ?*AjAy)!$0;G#=*mykaEd?483wx%q_Y_Qqvw7X z-?Dx9`{u6l+k(<7nNtRR2-j4TM?E1&Edr%(g*LjIEG{mCyAEntC)%XVz-`r?P*6Vg zWa1k8i&|ouFJg&RFq_Ntd#%L#^~h-WgZg3aBb%*s{D^72H?VN)A+d_Mt><~hX?hGR ziEvl*;ZH)T590l@Y|nWk6E#Zl#hZAI0(|%py-C+*tiP_P(E}2{!gDu~&4((m@2bGx zV=Co9s!?jOeEL6VYK!<*AM0NSN_`c3e?cYvX59j5HdRC4{m(%+6Y%v}|L-E|bGXd` zDx14J`MbK-XlP@WD)V{s4DDCJ8WD4$4*za@In?-D@GQBAvzVQXvl%YB>F4pn2Q!OnooRTe@3V5HwB5HeczH2k5 zF;t^CxV7=t+?>NlpDDytWaqp8znsg-D4DN$n>PV_;Vdd^Oo zDSFI?^Zt9tW(UvM*9P5@rnUE|Gc~e}t|vrwxi76G^P8szGn2n*0Q>F1H7s-*|B%eL zdQMD%8-{YPirC9CxQgP`(YU)B{C1hbNxL7{*elnN7y_u@T zjZ>fNGCIpI{-35UusLHV-mgyLj0#0%IpYP0`W6v&tFFy`SdnS!OgE>;s80`ssP?dp z-^pgU3HT{CApZy7+$WzNtj>HTeJdv`ew~MV0YhEI%*J;*aNdfm(bP?{qDY-#EnIw_ zrgoOWWwY>$AgW5*_r4by*98Tg{|$WcBC=U% zO5lDx%;{8{)H-=l;54@Ka5cs7o8X%f80v$GNqFBG*z{{y|7G;1FYn*X1jPv*7_aGT z7$M#q_Qu1kcmyu}RU6ljr{^T@=2Lr_O1)Ser3{;zYPbA&y&}~yjeG2b`&^wlCA$5} zrrKv>_$mDmtyOQ{#%{bFoM->nhIw$Q?d`Fss)zbV-M88Kbbo!6znSqo4#B@lHXqCU z3)l|YUDy6_e&aH~@KWCYY51m(o3Dx`xX+` zbQ(o?jUqVsq4?rQY_iRhXs>!xO!U7wKIt?Lkgku%i=I-wJ>reWp@y-#TIN8T7jO-2lPBbi+u)5#s*{K0;TN0M-UV$A$yhOVL0-H= zA9R6?Y#z2d_fuI)vE(Q6>Gxz}C3Om1P>pY(0$&_XSz(h!chhCva7_pC+GljMzAX>m z6Sy_{?cgN5B{FL_6iP^`@lV zUI)dEt62Y+WV4grOts^y1}n~?CUUd5aRf@emA}cBO+DTIv(#XJ!EP+4sh2v%-FUyE z`e+W>M?Bu$2aQrIRbdLmhn!+jna(!&HkRGCcL(9y;?2z9FIAD^c%M&H;J-|kvjJl> z4>wF7-4mk!ak7arHdR6GwkK|LgDKcpf5J8~^=c9Ir{HlD6rIT?9~S=8R0$rgMtt7s z|1B#XmO%~WW&Y2R%_jWqG8KbTeE2c%uE?g+_O;E`*KnUcy3TUH>^EK{Du2PI_NHFM zZ64v_u22Qr?@LRO&00Nezrt|S?W3)2+9S=5D!?0ie?W@7cD0SkKRf zASeG;NY3yqUp$<@xgIO>6GXiPyOGNq|H6s&QGxHKSL9>$$-K$;pvGCUhN3k5G=8kE z+FeNqk%=GjrPpTS)EJf2pUI|*-Ehs+na_(Gm%zo7b*9dQ{af-k|Jj@QomgB1+i+BN z)7FimP57HvRnm_o#^e283iby1_1&MN2W?g0Z&yn>V*l|JIAuK4c#gNp5>Y4HO8bty z=#06PrZ!S^5O1=aV_s3?8NA!6Zc|M*RbMCSmSA@*aLgtncjSW_YG}otV~mn zdgCQL<9qx~woMIJgDa1t`Y(P~){yq4`Q!RzQw9s$QMU0p9_CN6cukPQS>%$XJT5Ql zsoVcb{M|a;0t?7858UvNj*lngMMK=wuwGw72{@$=D?SwzV*P(Oms>E@7wZ&UZtA|j z{N`~H?mwqkNSE?5{hnLl+p;=E2jFjqz^OTXY3$99+78hM@0$}xwIo#%GP*<7_$Su) zdcNnJ8r(H*FnR_~S)V~hr{wSj`Qk}D+*B2cW^l@XsfTQb>nh&-#rpG;(kk_Wy=E_} z!YR+-wnt&N@;U$5X*@tv8@LtjgnM1*rV8T>YVsR@v8mg5xZE~9*1$BsYFFcTGOAD5 zMgbA^XBle|z0gM!jUeh1Y-6i8mc$yI5vRJrw{7KqQ=rCUGOCN^a65xse&fIT>06n+ zs>5&m$u?%Ba$#_8)}e6N`QM@+BHK3V>uH{A&%@s2gL?iV9w#qE^(=04w0Ki3G1@-L zJFpaO;LX3C|5eWaSLdI!0sB6FV+IB%+f(Ip8h>FcZx6o0Zj8ijUn8SB3u9E~ss7fP z*ib)2DQxP4s&}7@{(s9FzQK!KhK2i%e?9N~zfryGXA#w50o{S(5K_4oklC2g16d8-QTv(4H)CI&fm^E zZ%jctkFv)5SYu8Tbf1}me;eKi;u8?nP4eQjX^+bCn`blD*ia-r?v1(iw7q2NdXk;% zci||{u*U83l&jdr8Eje?*4PZ6lI_Kh$o-4*z`w}FibCR_;|#WCBHR%*u{Ufmew8%_ zG%mzey`jhKT|C^saB6*7Lu;pZ3Q|o6KSGTcvBuvMx2dHbwr_W{xOOFvbKYt6)tmT` z$%MD<2RWZX#uIQq7tz$ed~>~E0}MY#z3_TiETx)x6HIknw{HXUx~1KmaKC$67OQO> z)e*A>ZYYc|-mFtFN_L0gi`$*@t!|Oe#O}h*KTDQ6%xOGnTf>*I*d_4B&G66>_FoXb zo#`|_a2nm6Mj;cFf3V&1PU9c!eLE~gt<;aHA*}HS{cs62=}jV4KCyTO7Jk2N?F)2Z zwG}t6RxxOhIsdfN7_VM5Q6Jq78C4}6zfJhYQ&8MRx>_cf5uC&~Hg*~(Qk}$&9wOC$ zd}{IdVO#TB*n#}I)A%#-EZ;baZRC)L|4UO_=xVDj+x)}c%o&jJB&U&Z{yF%8nK1kZ zvdt*{mWig_>VC_~CZBKp7J|$X3^naj1>V?$zh5K&F6uPS;!_65{d&m6Kh)EnQZFvU zTV$VqE;-{YJlqnT(Gy~7DZcRx-*}Tc+*uf|m44qFWa8b^m%A(dQMS>?Xi{g-3K)LlFke^1lWH133`+yZBGhg$(p$r|SB-I+o|vuz{k zuak9dy~%H!P}#nnrndCYXKQLg^nY4jJY4neR(@ljxUs=BL~+qLrZ)pjdvw#Ax&RhS zo2?LTUj4-%s8DRgr@dxdM_sbH#5{9- zJjFS&xRGq*GJM*du-F^e%^#t^PsGNHAn`4#H+keYyIJw`wzV`-6YWekXUV2K1hJpq z*ikN~rV>;2ioWEDK-AcWA-mOlNl94jf7s3OdUqx|g^NVhVwg4E|M;|r$>vkJ|9=f*WrK+i``N8-y{y$X3AFca(xO?Hg!fsxiT$H??e*O;OhT$GM zTV9W0DBJubT~O}N-g)tax@bu({03NTk1EWyc#;0BcmPJ_yl?%RO|=Ssbl2jWwkO=H z&!ChXt{J3~rr`~-qJ`X|Ro$-c7gQ+M%2VDUn~*R5AG?%&z^P5#n{ZYYZU-*3JZu#3 z_s?+OUWj$(|i$wGX~!H*6iICeCiD{qhEY!7QGuM-b}T__CD3y zTqgDpJB=GMZ!8PL|Dbd05A)MiF?dh1;%vNm!I%Dt=WJq5z%6=eV)f;4m%^Kk$R=V_ zjd=fJsrfYZgdU7q>NicC#$h^shHM7eV>3)fRm0@%@l_El z&HtzuUyl3vk#CHH1HlwL>=HeOBXG@C?3K!GlUY4)3`DDTthkCga|hA?106BDlK0z5 zbDYOH0e3v2LiLDx;njLDe&SPCi=-u-Mji<1d01?O9j0ID!6=Y?*L3*=vN`KpxB9!% zb{XW=)ws%z=MkwBBzcQBCgs%+>%Xh7SL_KpP&UBgr<}$Lwh_z6Khk}@J9)SKHmM)( zbMro*_`)l^v5>ekS?|W{roDEghnt{Xma&a(PU95L*@i*P?*)0v0#g+IRMSR~N>0Bq zI~ISdKjDzd_AQCu%)#em8(*v7q)7H1+2*&&nsWcsZgyROPk&#YTFjRg_1CxJD^l~E z#!>y(Rn;0AV4Ds?W7(SexSM7E?=)UkFK#Eo4P+I$M1bpg|9x>kr?EivKMVb1?A0j$ zp{qNfvYYW~SK*qsi~f_~jcKf~h^TrM&+|ECw9aJ8Mf}FS(4TH}-2Vk%`l$-lAL7j_ zlaK?k4RuAhF65bqUu|F#CUl!{8JgM`XZV2#_d07l>z$jR#>@2>rrovpsm{$Oa6eZ!^{J5XSGUJd(ZU;5qAiwQoPUr*3_~+z3JlkH+9fje# zsloSzj4C9C^BdV%tPk1b^=x&&_7vu~u-l6tgp6O8!#~Tno$;;P@%NQ6zr~XMWkzMp zm!{>WcaTj^Xr-g9p}Jndp1Kp4ig5eP7%U=}EV$|ur*VMaSS7*@P@%pf^`+A&>o;Da zXZ#gY@Xza{+F%RD#mV>0d%dJ)blRUya=2n<%d_0=x|kOq<}_Zy{a!+ED$>;dVek&% zQ!6L7I*tF}jb)xXOE&Mx{eKeS=9#>14H=i?sqT|+WVWbJ)yw4tl+kHJ)J0lXW#N zw-@|H6KxID#7n4Aw(`b;GP(95Tt!~Il^YD-kQuF4qnxgr;sp6D72(dfi*7qC_M(1) zHu$Z9d}ASh>WFYB?D)zHZ``NH{8gFJQ>5}2oBEO8$UY6X{_s?G)?{C$}E4CZjL2zS(Jtd*w>F-3EyT)ek879^VnGOBd^teCpSj{iK# z>6qAOWjKF(XSQuz8O*}`cT0SQQF#IPH-&F3;f*(mJX>XrznJwdsmHvN`t5@})B#f6 zo$(vn)HdI9CvXQl*Q)9ld6)&~_qBIBjf?TAHRUPK+eN+9X}s$EPm;|_ta#FC9CjMB z(s8O+>LC5Rja3z8lOxrOA7vZUoW_B~)1r8Pc;UD=?r@&f*v55ww+_ow-ZevOPEVCG zudi*ZnpPq8X{xpP!ntlu*^0w?7jDSb)Gu^I{D&9Y;!dGwbp70|p3;kty2v|g)6_HZ zGrB%jxZf*qH^UWbC>y--FaBzb?apsw{`+F$%HaNTiQ;#8+a>z2d#J+JwNtVW+xX0$ zr`_tX@3F>{kkN;{_(AOUDxGxwbW+waWAZ5NF5om8#WVD6zY6_rfpChtDW$ADdb9Wa z0X;rpKg^3*$~Ly=6y~YU$T8~rjYZYQpWrvznxYuTi*JW;&R`pth#AM}z%=>o8qEJ| za`-0h6exvlYzsFOV3BS4jnZV(R1WvL?u|9cTB7(iUwXjvkCIJ)S;MVj>M1=Dzq5#H zyzv#H|2Tf5pDq1!Y3iSe7kR3IWOImj+#>o{#u*lejJMglGR@5%v&rU4zPO^?e{Ecw z-{?bAm(kR{cIVBfGpBs%eDjR{cLs0t)4Nv}7VpU`7GYO+tNZ0mO~N*P&u?6sd{aO4 zXmydJ{;c_bES+< zpXZ)4RU2!sz4k8H&DgLFzl^3R>Ed%X;haqc&L$DoGngsCMz9T&nP|KLFZz|rXb0Z- zi5#%hDun8z06LT3egitjIoa9JhF_T&FK$lvJ}r2o9PhhLV`l#dRpVUp_ZM#Q0B7Uy z%Eu${#%%wW*V=o7eU{>HOhdk!j;?8-7YG)s2KpPzOj|Gf{snpJG^i{MXA_?(ikrOC zvk;bg4d_1u-|AB4TdP zSVqof181{@4I#Ju{*iW*jS5az!+%Iz`a zn;v-K3x4T2&L#t~I0?Bpf)`m%4Y!%Bp9MRO$WxcGo9mHwvkjlRO8rKQ+&e=4=r{a0@;Eb;0Q?bnzR1L$Z-JkJG_tJ%nI2+!JL1h>h zUJU&!l~G1MSBl^K%58$(jK`-g8*S)ruxSNLeS%L-#q4d}=b^m65-(CV9%CM-h|E zSQBIv%zG(au(XFnj-&kMl-5c##sfKaGjvDBtmTxveu8`MzRyG-BL=Dn3t^e9Vk z8#nmeJu3J*sG(cJ{6|FpS6*W;6z(sGQ_TQBvXtJ|WVXW{ruKK3*^dgtw42{~A75rS zA(gmibYL# zytoXv(GNdN!!5QT7N>ySEQBIzAYHK)C{2dr8xQ%;5crgEUi=B;eZP&qL=*FeC{qpJ z$Os0ULM-l%u5Ag`<_j>qqN3i;=bljIj>c}bf*QuNt*a~;KD~F4TPOg!EkeKW9Nqg9 z)Hi>?DLKu<)G6cn#yjMkh0H=cHQRt1^D>wG8)Wo_@2SoVMlSx+WgzOYc=2v({~xFY z1K8`gmv4N;Z46)%ZXpwG-FZ(k12`obEOmoOyD7%m+=bnG0%}NM97abU3fr)p+jvIS zm`ji1GFx@I$ei$7I#r;9E(x@s-y- zx3ZCJIDNSJFfdu^#Z_fPz!y-%Ula-jVDLJaVRS{;@{Nzk8k14P900@3hBM+FM=Gil zAfv+EViEGxaa67Qu+*#fFg8aol;a&tD{!0-`XT#nCWC6-5= z%>)qDek$?5*i9gIvx_@?$O-jjE^Qt>d}q!kBWl4|cyV*^W;Q-O2D_ln9+4)(!fS9gf2oUXe6!QI%-@#-Tr>>+wj4RU9b4X3!Zn`eY^HNIkI4Ybt+Mos zYcrXY61~6+uO(VM=m;=pf~b1p#kcT`&3L~=MgP}mZXDrk zW?(lP`9uM}u__4pt=klQGZMx3Ayi+tIGdSx@U2J-&rhBzO8-V0?Lky!ygTrA<++XG z+~#3=TU)*2ynHZ(vsq2;Hw0vJH}Y(n&@b-GyPy#qb#xGwh6}61@617mY7QEVzRcb& zVW;eUSc)(z@s(h)J8%^v==*J^n>LZYZ&i9!xv9jvN5<4r+{$^k7|MnwsD60=54*`1 z=~MUl8y8bgKQf!5P0zsG#(S@s_X-xJDxOh@zcj*bX49cQPAvWl+Vts)Zs1dw|93Y3 zQ8Tuox0#VmKk@OY*3=8R|93V`VADsVh&s;M+yOPr1=~Ep!v8}>eK;~tDcePP9$l4q{*Z$FVS2^?iS>?Rbu3Gp(c-s!>Lmj`PdL1()%eZNll)Ec7% zTq9cn;EJyk!)H?YUk4ZO!fpo9+iDCFp9F@>L#*n6k|sIKPi|gY>&!;+nUS%03nz08 z?AV?TiE)Elv}n>KW}^U@oe>i&dl_ysP`4%gI#Dy1Ucdz#N3#!SZ>82b8`T_Z!EkrTi)XOqv$lRBHk3`lTEO7%@%|J-dQgRF7C?KwYngw z)7-{pZZRP!H3cgAH)PZu@b^bKlM>il1t!GrFwb}m6}>Rl@(S4*bVgIS`5WZL>D(f< zCy_B3y0+I|3oLvJHkywd*B+)ZIS4*4Dzl!34G$BG$haL(JRg~D9CHYoui9`_iK)Y* zQ!}*TWD4Suv$(~s=>6xxiriv~;w2e%A=Tnl^5P(LbQ`FOCo}C=4+}2|E*{FS%nfGf z17<8p?ypPbHldrx`E?XPMes#B9P|B4cT6yf*gshPnIK0r?albfuaR3!#PSk1T*1xvM=46<-8^R7+*vkMDO(+f8!SZ5Ao6bB)}J+p=#bm zoH|WpEQ3c?amS(-sP5f`+lpqahG{-b?jOc^o&t@JwQ^H2mIF^G;TGS}h55i8L|AxP ze3=cS^b7L(7w|=ccP9hk7uNHQCpn?URE#6oecXf?o)KJ>6ppGR-&lxSoJ|aG&#U)i z{S1+q@eYj9Omf?0FvAcK+)i$B5%a8V$^BKlC-i!2a~G9B{^wxtcfrCwhxbinE=Kd& zkt*d7_Vyo{IFvfCMN&e13oXsw_XDmm%(+h61vBxwyXt6Y(9Y8gm zmHbu=MMOWmf3C?+0J6pj&UGf<|2ES5tAZI5!)?Z9=Vk{!SCZem68+@>80rP&w<}=A zNBGoqx+15jQF@|IT2JnuLRDPfKZ8%*1>aQX{;QD7uc6yM!3%`nQAA{9HX#jXvx~TK z7{wPmlwsjcM@B~1>rZEU1zud5zp)E3JRUxkjH!1|x%UeR*m@qj5n>L19Jjaa$TiNI{1@U5PT;_yc(e)3* zQtJ~J%M;5Fp=n>?6$EW`gWHYVMt?dR>v<7qDpfJB#)49B!Z1|jmsTdTUUdsGm0Xj} zGENsj_2`iP9WgRcK+ZlOFDR}EZrANKwxdN>&wi%(G91V`S+ZZKeOrr=AV z+fPE}_mMYwzhkM*x&2CX@ecFq$!eIU%P6Td+AVFi;TunJAB)NTzp2B1Q5Bz{x>-n1 zWFMcX$S0fefA~p9^c($x4D`}!p};K0z3=CfTREH5Xg;!&QGK7+hKX>`h=>jOTwT2Q z8eY5?CB;*`ICf;7>P|F0#o5fJBlZd}jzAmhQ45Wxo?4Hkmf@3a;Zo7KgWy*&d-n(= z_JLY+0akN{8mBW_v4v&~BHR;@*nYIa*U3*+iK*3zaO~~^ZFFFR{VMX*F(TY(>e{o! z;$XD!r|F39AWw}1iA7X?3#o@oVgWr+Cnck^k(~(Fk+Ye`>}|(LFFwTyHKf)Uh~}p@ zyR%Y*QWFqwI&+7`@yPjbVqHNSv+1Q=!)~6^y_?BjcozKM51x4=J-Asgl+FF~^xz-R z2d_!Ksg4)lAWt0!ZG6XWGK0j@k%7087x%)5m%yi*qG`{^&NTxim5(N+1>aYk6Iut) zJQ+>H4if)qDh|pga~{4^`7U@boL{utemk z3h0^&Q7ImZwD4dm#^cl)>rm16giWar5}Ohk{j1`W$H`OcQ8nH}M;Vhm6`L%xG1B{I z5sP2KGe^`KA+WdO>E3MQ{z?!x8i5%jxDA^+tQ45B8MDDyDixB(U>J~K2)c=PNH zd1^lvehFWy!slw^{f{FpyeqMIm5~FcDJ6MoBi_FQyUR~3t_+u&6bt{rE4yE*{F)GN zDx>^9PQ|#&%j2J?)^Jc@x#aL=`2I00ygm%oKsHg=Wm{8(_oqOg&>MS;h{f~iPqg!X zGV7Tg);|I>R)Etu!ENm17E{7(W;AEQ`?O%XxDvNGifSQ0b~6Z#Q3PhJiuaFW-eawq zlv+51+uw`#mxP6B!7htpk+nuJ7QT`DE05)LMSm3srXju`LJogubTpswjZ^s4;Yf5F z0}GEy@Aipb9rm^uDzo9-U@?AaL=LZvj;bv)REyBV?E|F_$NSG=;p6G~o~M(#ml|~( z_@+CI!E%sIIlR9IEKEXg4teSj9kDOQXt?x7poWN8ycBJsHb>Fd<~?NWW<6Z`aUx?` zzOe>X(HkP;2O?v7>acp`sS==teOO!wXOoJ}Svi=4HF!zx5q9$qwyzPNtO3t>)h+7n z$NNLsoh8h1Oo}v##BfKbsv2+`edvf(4-N65t z6smzzXtPKti^<>2Lsqw>xy&!&rE*K^>uR_9q#B|y?@DFc8?4arA)F)BBb-IUY>C6p}7yj;F!tf>G!<=Qxa;JH@jhki@aX{X)*94>r z%pLeWpk6>XyQcg_-7k&tUR?LITIw7RPahuk&;K_xytq?O&DT_ZekOCh6-Ab?a|YZG zNFSIWFeKoW{XotVX{}{OB7c!vM#oW!ovz_B-1}EO{BQVYCmZkcq~Y%?V9gVkhU}&UR41 zv4BqjX9KDQjJHR~lHwr>lTfdx8%KY1ET>s`;_yV_!Qr``T&jzvlkPt?+F0j>Cx6&0 z`CM4QM9${5JSf^(e|SeG&|9lJsaDRs@O1prvf($wk2=p(kh|Y2Zk#f+ih**B-6-I8 zfEjo>pi)3ryN>k1)3J>yURF0$U3NZ)HxEx5o+W%hMIr0`_nF~X~dhlO8tJk{8J;`KFLbBH)BuhGLl;rooQ6(aXNHqfJy*}QWCO++W3Tzpx-FK=eD)Z7 zmfh5TCUeWOBEJ=AUg3qMe!K#_K>cxMJAIt_j^+->=>Is=uYPu_@6Mu@{4G0R-QDfj zb`QBitR(g~G}8D#nPU8?a;r^FZ)dP`8T-znQ^SaML9u_={AYa?M`R^?wmrkHZXc6A z)1D45(5$3SP|t0qhp89N5T^sbG=@5%w&>IDCoePH)F^9==pX~_q4s=x7$?(4vOUkL zX2vnzf@%-wyDFX9>hyEQIuD#asu~kbL%ePNCnF(qQ?cZES=tV^2ibY;)$);eOPrdI z+9Q{j+|8)ls0YpjXSB1|$;%tdcXXJW0?poB^N4j=%;Z!@*i-CA_Dh*h))5u0v}Txp z5cTu~y;^ykO)qDT6Yi{1gY+nOg?HDF2|B4EipkHiJ!d-DPG%30A%ge0%`Uvl8PAj4 zMs0P{8Q~0bPC0c|LLGy?Ms;|!E#@Wb7~hzdzi%98bAz{;vx%hEcV4@k?@e}t^sFX-iTOY30u!`a|0a_%~fR6HHvrlN~F z#^8-{Yr7aE4ZE)0(#~e@O!%ALsBq*h0qwVY{AbxCc|8{I3O!G5oX z?2#`Z?-J!&+GXq)vWgro##vq2LmbEd%-o!#%B$&PgFj2Eb?qTXQAq&`!iX7$yY{7EY+4rWKO%Q-2|T+ zCijUWu*Ln^?wO1zo=$gH?>U()elY~!sBO2hGuS&go0KB8 z^%Kr#zBkq#rgy5CYOk|^v&p7zayFaX^WI-S3#?rukxxF873?15s4!U@pBm4+b|vh_ zVgAL|71dSjX1Vj-8K4vJU7NFM&3wo}Q9-`J|2x~|?I*k<-%QlC@|(hVK(FtJeyK{SE7;;m@7SsPmPty>^639JD0srdLoU8XSr0w8+avglHQ?Ws~yfP=dhDSUB|+=xtBcN zmo&>-RYVqfN0zsH+V$;kvc4RJ-E`-T^whrX8E#_TUWIZO%ba(_o1!`=Dw;m*FuO=h zy~sDlC7!mmv)CKuXOxtm*(kXXF1#gqV=cF_kI$WV@)3)fOm}~JdC&-sBf>S1AMxTg z_~LC@K(-*il`|6=ujrt#F+t@~r?|!4PBgVnb=O^(yWQ@;FrqV47Deutg}95xwt-J= z6KCKVr!!et#DfLbU5Kgk@cw&F8+nysIh%eT2(DWp>CRK9l>p9rX zAwKsUjAAnJ^}&@WwmX>+>Z_8y0VR2NS>Nb)nDGvgx%!Vebr}tYK`;3>7{b(3{=xC zsff0l$B8$6h&MIu7Iu1jv;4u-o~Dbsi7KP7J5nE1skn`e++tz%P#xAM-7qg1>VnQ> z#=_W5QF2Bx`@SqLyNWJW9W#aT*SpHD{2!_omb$|^>%>!QR0rJ{)VRpMX8bWFuOqLL zDeZc8Wn0Vs@_@Js2fG4YLQOBPTUC!zzO&2O<9x>6QW6;h>1xz9hMDuN8KSlPC94xr zGuqpwE7FOSF0i_*95Y%wJg0ej^*oIbtDw`+7zWKZ<9$S#^IEU7dAqIx*E0Rfdf; z1({}=#>*wwiN%BD4_VMIWQWUfSU5$k6$Y=dfIKx;?^kJwaEGzChRWe=&bhb9Q)#K& zE0V)65iwL+ zSZY-}o;^lh6!*b5o6y~N_gc9_^>)1Yth3#D=v3w#pX#q}d^R9-H%D9jMG1LZ=C^C` zjpt-`S(Vx*gQ?IK?&56Ts47_MLFcNILG4i^^iVcRp7DPh$=M5G$;~n;R#VV^E1Q5e zwlV85oE)ChOX(KWgOzrUIwu{eCSW&cV$f`MH)fbyt)*bNud=XRf;crs-WLvUiF`$~ zv)fzeZo`Yq^Nr`RwV^Bsu+&UKi?uQq9+k>ICDY3KqPbPuENGUk=Odg$DCQmAFBwXQ=4W(t;i5k$34G?VwqR2l3Ka)3M~Uc$j2VR~vP_;#wksVb|V zftZ2)6TkSeXUg^^$n|e;S^C9 z)pR|W>4LSq=laF`i>1yXrj{b2KF4krik-}BFJ!W?g;&RIrT-gZjoPn)kq5My#0}E3R7%d~u@hg-R%OXkh2f`W7>CVs)>hF@ zhRSqyO8c|yCvS?s^tE2XPt1zUjAvDTqWCSx8VNvr}WIK0ic~Yk0HsaY^ zWNcYMG~qUi8%eQLpLdnJQZ*domu6B&@#4N!T`%y3eWpbb5eq0^lg}qGuYw*>n~;Kt{>!{Cs1G43K$6HY*-T{1Rt# zS^KI3vGFFEIKMiprs;7Y@k@R<*gpxcs?U%vF)oFDle3u%5?>XGHuHKpsBdShgz6ri z5noMLMRYP0twFGpv#9-6h!#}u`N_nlJy||w7A^*;;URAs;|2dXGl!x`r#Ui?{| z2Nz%SKKQX1w`mo)(vXRwKO1>!yY7F51&w}9Rsm8hn9Q-7I zjd965V{H>{HR4TCEOngjhxT%{f7|$BTD&+un<$Ks8zMb~R`-50*N>oNNsjRk51_*myL1mVCj4 zQ8eoCXISb%EcLsphuxfXo;YRHOLai+12ug2W1E?nDEuAi8^uBJ_ho50Pz+77&P+Us9xIbs}9rpGX`-{hT{W+T}MDd^8 zek?UW#bv_yzWdQjj6%3M@3N(nM18#9kqe||OGp)7yvt90ee&bL+9%>RM#^_G zp&dvaR#^5H)2x2Hc$UjgO-!u{{gY9p~+P1P71v@uEkVop4_mCV%sa~Q@~yyHGbrQo+l zBhtN7OZ7}PLmuN1vP39qW=fD^cS#nS)?Za)6^{2?s-ubqhj$md5p3MZ z#+3dSF;)I0;zS|dB#@Pf{#DGJMq)pjm)Na96wjhQ5vK}(HV5fWY(Jdm?RWxexsH&U#r;h8j?hfyq|H1G~-+CxUlT#Do{UI`yY>iKi zGJ7*uUL7y)PF{A!h| zs1x!EMKUItn=u>SLZp>cwRRjBsy^f?lgt>^{O3P|3xAE>3@3{J1sCpT~Y?UdG-BfgY>XWLRGWo4V)P8uzdTw2`5dTp#t{}qY zmOEv*6!=sNxmTdUqmQ{0zL`i`GI>N$%oze&U3JV2h7hCwYHvwm$?!HCI1UEy)|v`Mn#6j0vey z68m|1DXl4}A*NhHeXIF9yUJ@!(5A3bo3`-_#l{a%!#I_Ovq{P?4P+(i>LvZ)&@spFv3W=y2_<`x&3bE!5m$aPdk z|KwGwn=RrddY{v5+?dZa+CFZvKk-JWtZEVr){q;-6E@L4ph^h=-yGEedJtGFE+}V_%E8R`6ZZq` zed@@__*x8uPy0@k8z|p$Hsy(og^Y}T0xvC9Y6zc+sgmO%-(XWFxnqcoYm9^DPHUzp zMZEdV>1>g?VBwZgGb{z)jPoYCA)toNd@4Ftw^`NGS;57*iHxY~!o5I>bHBo5kOa-`LGAaLOL}l3zQEvuP#9Fd^2H zDy6(vo3puxrDo<_Tf&L)&azvIZfGaw3PxESL?StlyMM|rEhX2pA><2H$~{z&C-A9+ zeaYbq;o&-C-zimne5xZgLniw6W#~*c<3%SSXUfNT z{~=jd?gDL?^tFC)8&8RF*{HA!qYNK9^HqD9ebJ z;NrTRO-bsak@_L`keY97q;9Cux-}DG{h1D4Y|a4t$K^NP;B%WnVk==q9x_?94~{Ct zWpAmTtcnpi%9Aw;GC>{Y{_+wqS5gG#=QY*FS@~KXgE6>6MlHbEWHMq=!N;R!T(8Oy z8*`{pRDQ?x3U@JkOpa4Co(55sA>VwEPl$|(WM?s*ohviYPxkYM(}j7*FHMAvmw}^b zrHi|HsBY_^XKBTo9%Z#c?EoacLNZYmsnEzuRGv93{;4nC4EN&E?axgPe<4QU!Jmm8 zo#80ri+omIGmDYXj|1AQp*LY`vH8ZnDqQhW2WPXESL9Bc2l3*fME@{y-15i>H=W7C zNmRFeypir2{Y&)*86_ja9ae305vKJ^p=WDNhpLG9D+b7GoX#QHSRP^vhEK=$EfMYk z+XM>Z#Z}0SL24=)^^QK{p7oyl{|t+1(u1NdndS*MIaK~(|7|;~6V+{LzkpYYv$?|A zWXB%|s1Irpd~ruqJ5#WmCDtI2_)0z(Dp$d#j2FAeQzzJeu*O>k(`?ge%7ZV~A~H7A zX_!igheABBnTwrJPepf_m{<5!YibQCl7LcU8I~`+q;5UEhtH(u8-uBeFM;59d#C)n zM1NG;RPbxLja%GeblFr4qz>=S=F^7c@cH^P2s{s;Yoe~Go|-;9D76<#zp>=-m~tW( zenW1Oh2&ah%Rig%nesYEAN(2KKcASIRh3mC#2bfL{M`HH2QtOz6K`6`qx_90Wfxeu z^u*$7bT$h3xxFB_mp-SOa)&v&#hNoE&L+7iWtB9G8QJiu5^g_zL$&5i3xGDX;teCVtuF9a^5V@Rt0z^; zG$Qy7ITs7>Csv@pSjOzk1h5~k2kEI;YEIQw9mB%2plQkkLtPC{Jd=3F+3b}U;0-HK zhkav{K>%#pI}~C8)C`BQ)G|cW5S5D!VdveW-W~tB@ri!HYEc49J;!G|5yJ}+8M`sZ zUf-|cH3AnuR$W2VMbr>7>Jm87HcTW9L#;j5YE5LE8u?4-af`!YnvS6^-OWb$J#bX1 z^<4064sy-`ZZRn;;pkX+1{k9#;vB5lE_shzY$7jV;i;`uW_%EQY%iPJ1=P@ulc@kM zia}&t?XKjFt#if=dMT4ddO2I3fKeYtC#AU<#hZ>}U<|r?L*2C?stLs5GT7TwHIj^4 zoGHHs%)hm_%8P&G@ZXH}wze36zHm4i z!4B{@i}V*Pya@5XFBblvZh(rWIu_oIenBOnsNl}Y>)^3mFjVKzdWYium(YiP)VZiN ztASJMs;$KEsGQ9Y_~NK!jc?Xo@XcnT_(72W1NOreu}YcwVVbgerQIPQ@g8__Y4V%N zs|nNHNg%Nhy3DJsuAt3vu$!mle=?!$D;7su_zc*Tnc(6WkrrMQlyX&d(*@Cb=R`qO z2d#E?@lJHar_O=ni_z77$#w{Zmi;BuC`y;oTZwIjsi`-s68gKo=icz1`rnLS^b59# zik#;S&ZeV$CNhbd^oncnG9Q?Ws`v@fyD)w{Mj5>BFp|#wU~tiNEW8OE#aMplRqQ;% z7dNm~VmGr|tJu5_Xn*8oT>)z)7)r>=C&{>wHr5aice>c%*0{ni(a5gdctOplGIZT@u`ON z?aP2t-nuWrj6izxm9<_3ar0-u;jQFjIFX80RbqH?`r&oy`F|inl_P_X2c>KQ!3|@> z$6U5vPqkVJNk-gD{12ud)`z{&`+1phJ^Ju8Z5jLHgF>n!6l#$%Z#!(A7^u3 zR43jXz^_WufB(hK+{9*5BfyX0rGufqNL^D7jI#mc|4i?9w_@QZz(sqlV6w)4eBUw%n+T;twVAvzTV{hVV)hz6 z;|J>ZFU*oR)W`Xi74WNl*o~(jx%bKaZ;W^JwP%QwFhx7@{?^3sd~}OCvEQw+-x#gX z8t~05;%R*~QMu&)9_R~Oqw^nVcCt!~x5VOgd~&o*DMyRr?Av+(?{m((%nqVrcyR|J zPH!x{5ghza_p7IT6SeMJxUGWx%01L?)v%kmq9oi#1#Y7_HNyn3-!QDE4)G>7o4Ti> z+ZoLc`spC}+F-xlSlcdecr;j;<#4IHVGK4f;q@3VUawkU;r-NY)q_1&$*|N6bW+p9 zZ5uFKQ0jC4mGKsQGe_j)Y>x0(wuTYUj;f(K9kH4) zO>Ky9zp>GpoX&LO%|<<%y*Y!}?K_sPUwQG7zRx-^^+@paAduJ@^8$NX4lr#Urc3DE zR2$WZj2Bcho!F(Q^8%SEj!A?I0c}o)PoGalJqlxx+bRr4k(mfrj(Yk%w$?zkQtMS( zeOa$!GuUFbbZwv`+McfOVE)DsD#qWUK7Gw)a7~9E1(k2 zh9*4--$)?N5;vCPi_>LJxdh(FVeSG_3WZ>Lw+*Oa0NAz*{jhSHZM|p(?)wjnN9JJ^ zSV^$8ZFq7s`H=m$4K1RA(G0~`UwW{%UPSh9M7;6n!1iVWx-FL4m)YmSaGTAswheqb z4k&d$Z>-%%xp9G6jc{EVcB3~aZZI`!3)qx@uyBs=!-+m2GiH&KVc=#Eiw{#3=e2^& zAe3T-z53{3{@@j@vGQ%$%}u@BoyrcYS;kVjevQNrBGoc}X&bz_h8RtCvj#4G1A6oi z)YHd7VQtl1bdA$cd}L=nEF<+)a<*P<5e2ZBwd9T*oXtxn;G>x_h#T>|{M6I0)mZGb zBWNQ(d*x1nZ_fBv&?fG(hKhLf-a@eQCPe=NAo%`FTz4Zgj)F~#%h|N$lXI2e<*S}d zKsToj@5OGfA|R@WvssT%MWXFz?3~L}NA)Bt8=FZ-l}mDJXS0)y)#Nf^IZtTP=ktd-6-y zff;}EV$K+N<~dC3OrvJFsx!beci?jq)K@ww^<63uwr12~;wBk(Qw6-Zfp1Mu^uLRq zU7@@FhCVon+gM*GiZ@Wb)EQMtn`}+|f1i4XPfZ0;jlxpr$*S@y`$(%>jm>68ZC*O> z1bgqP8RXPfYKcn3OC*zdD{G)X9QAB3s~kSn9`qgpBN`|>iPhknlT?0((CUBI#qp^w zc;hhjfLenIdR|FR1nVE0tv4G%;xk}2W>RZx1*Ik=`lle?r1Xk{8s2e>P4LHE)EaN} zA$K2dSDZEup%m>#zUhtCEXKlLixQ$2Jo6~jmxH`n?lGN8Zy;{8!NRqgt6LFoD)Mew z9dL0na&aXP^(xs{CPia#o_O<(IggLt56-4FocI{B%_w4V6Kd4AuqmN1+fV7;P84b6 zaL#lV-Ko=TKQ0BEQiHRp>UDvm@c6D4s-4;h61zy}KA2cMfeDyC*v%VyBJ+u;ZRB5G z%$ki>U=J^l9AJi(UFR^(!C>kcSokn%)TF##5RYBb0nGN!gZUZ2ZyiFHVU_sGWMM`# zn~}lKPxPOo$ug=t-f=+XLz}YGT?6m8-Pl9T&_;OVn}tM;S~64=g@qf>MxpWkL~oIM z1^#X)pX*N6h^m*-EvQ0ftb$gg1UnW_f&C}*Tl zUwex@72AE`KJp&Pys^1D86JerN$=aXxTLCMhhu zX_~Qyq)K5o3&`j{J~x=GQHgDoH|eCEgM~dq@3tF=x+|G#hO7)~0B0zLGevDc+BmO25? zn8w-kBHjq^2kL}y7OpIFMu~Yb2gueHzk>ZOUi_QN;5v& zS=NY5WQ>Jm)QoZ&tbcSXDHtx1pMj3pWO$f)`2Qek)FNyKKj3br&#;Hrb(g?3xS}=D zW-7S&F|oKO7;dsLftUGK@=8)3;>J+yW`&Z(;uctHai-YIF&oC4Ea22()Nh?p(TotM z@Zw+0&i!MqAeTFUm^z(IHIZ1{oGRrF{qVc~Rg{9OtX?ob9r(U6aH(g&x7A^&+q0*k zJE-vlICUF%voBtpl=q9qvvHvtnXx;%&5YtQw=ovBusL4b2EO1ZX^v}{LM-Yx0T;0>X$%eunINoR!-(WlmbC) z2H#8%W(J6Q3b#=N=BGRsH=J1fSdmOGGNXaSCW7A$|1w%rnHH+DPbUMAbH38`N;a)Hv9?nkW;m!%!dek8m4v(d~W~ zwfP%|qZ7Lz(xRj2%>?W)e=M`8_oy09@i&f8dtp;{={~40Yq9&LhKWL3Y!%u0#xdB9 zC%S?fZc|UcVn?51d%-}e&1Lka7OO9+H(ng>zW3hKNqubYv-;v2O}NL-;NsPS7oM!L zW>sQpOX9|9DymbQ%uHf&F{<0;u=j)6n$e5fNJoY%iYJc1Zr;G(%s|z0gf8`%Xo1YYc!h1ndqqY@`^weYPcCh#vLk--k{rI zsX^=%CFXJ=yQlnW>VLR8+;e z!}0WPzVlw@QgZQG6sA`>o491Smz>Qo(8f>L+rsR=w0UDou)XvOXA_kiH5T?RHD3Ig zNxz(C5u*@sqXT?OLcN(Yod{o8l3ctMoHB>^8K#^4tm5JxIdwSRUlvO(Dn@`))=>Lx zB>R8UwZR)RVVSqmNn4>CqG`;+X8-hN0xWfbNXFd zBX%=SJs}qdxOdT)gVIq$&ai5U526}pGf);K7pJ8X>jS$nj2X{maFm6KRFlZzyV2h6 zLebp7tKru$Dwze@Ke~xNa}WN;Mp$YO)ZUNb@4k`Y0?>Pp0;jGZs?HH`&>Ex0d_wL2c9ocB2O!_)seG&)h~JdZ=J(xYbl~%ZRCcHQSo$ z`aPreyNq(LmG~-Za;lx_qlXC1CfaJS@J;ZI2~I9$X7y&? zHg)9L^uTV)%9p&DH-mZ2W2g)+5XE@~29@Dr?thE2c@MfO87`3@n<+nK-mu2Q{j`8f zYbm1;Q+ad2N^Yiwzb!!ASV`5e8_$>z(^wzQ;0jFhHrTC*`lbYILrFf@8+G|PI%2KB zspFYsoJ-tzudC{t`8m=wBv^HnciJ1BjEcTO~z_Gm| zhHFj1K})dr4g4RND@RTq^(D>B?-LL^-OBEoh-nv1j`=+qt^yZ)zjBG}Z7 z>}iT+m`u){0sR^HQ$LV+AZK%rnbeeKX0$?Oyv{H&X{q7nfp1=tixoY%&AjZe0xZ@a z#qV{I7prLpPC1GazPUA=dGwid#1FXNbsg~L3Qp&&%E-HSgYn`jWd9PJ&2QpHA}qBB zh$@U+yoJf)F!uW>&L+s6q677IKDVB3(LnOeFW9YnOnaO$*TCStqcZA3yoo1Qh;Z^v z4LVz`v76cMC92IUoXv7FV_E&03VsrM4EnMeq6)}(8L} z(MqW2mtZc(KsBj4om%X-~lH#6{! zONoph(O%o`Eq4!dDXWczR1Nuv;yL-9&1E{K?vhf$4~ev!B`CN4=?2ud8~EfkFx)Xc zgj`$(bxLkC88LMlUR;+mEl*}_FE$b3zJrYD(bDx@h@~DTbkr8dIe z3dmccte8Oe<}~@{k@tbh!-!WSNI+t#z&dF$y>=bf@x+qRE_7rn{7Fp^wiU-MQirv%;tTL zEpXIPh;Y9+(RIuScw_x68=j)UZl$0L(-<9P zLSpJXy#G5@Y9cmYU+|9jdr{zww2F#rA`gFIBbfq39aB_7DL9Ck+c``>f7kW(TRd?s z+-6Z~zlluG)&?1sV2b$@bxKqe4QQGu64%+)l9Fn(AQP1R=uqY&i?1PTe1gA?K#dzfMl-;vt%#|IMRLBcF1N9p2-kv6 z!+dUIH&e{9z+!(RZ{rHLu^+u>MfMToLSY__d^4KqtE$*r2`c!uVh1xj4m*qzfm2(6 zHzMwT3-~6g9!d270e^piuJ1ZC7)8uQI?WC7{#bGm^-Yk~ii&CkeA-_4)TW^S9enbs zDouo&PPN&9j(Egve57L(mFci%#G6o284Q1#-bNU^9pl2_&FB8laH=O^Q>Rhi*i=+6 zh#M!(1y*Ho2PVD&c4NX(z9$!#g==h04}Pip6fFKmZRZx>sK(sJHoA8M>7_Q|HXL}d z7;v`@WCo&tL6Ff#;>HCwwEkev&KPR3<5qvi>%{pKC8~;;w#+7N`JO74wfn{Q9Lc*R~H?{c3zZdL}zm< zvk;qM8=_Og|0UOKR`*dSoQ;edCF!MRHe;|UZvCqY-$s+k(l~}_m!jjnPKoY z!5UoQOpkIKqfwatbnl^RJ7Mf(7N!(6d~Uw47SVqZ7``Cg6x3i;4IywpwdtmAqt<+( zs-lHm#(OE9sBde*ZvKTAiw-JkD6_&f6&DlP@^KDb%L_Ki^R@z&(Mitc0-14@u1idf z0Z#pGJT$j4L-(9oya9TzpJFiGyQuIY1<)rn02!T!ZF;~j-LHOt;cWK;`DP(p<1qBM z3B-1hfM`<<)Ubn>Xd>dqBD!#U$o{dYQxrOZt$1+(-URK>?u7ijJ)M&ME;mr%{U%a1 zBs0DgEtoHOiju-MV)$7(n-J7uSJWo#CaRu@I^_?j@v48;*ai<@3`@<3+N&%PZU$4Z zxxn!4*kUpsRpTe!n6o)REdHcw@Ji1b=1Y2VHudTH|FdR+H!5tQ#cRN{enacf>Q>7sB5zqDvkBdnnYz( z2JesXsUTR211NA_@TymAym%!w{2k8bHfVE&uFgIh&-+N%|2+EJO5zf?Q68r8vls+U ziAN<~m8s<3=nP(xQ@_AaoaAgeYORkl2RVUPL_4uF#}G?k8_U4nCd8*wQ~S-K5J04)XDGCui9Rl}!d zxn0qUm8a7f$9jmC;s^I%nR@yP>Xf-exTi3`1~Z#=h^blhZEXA+Ec`-paWwd}$Dqdj z^zVvNQ77m2^V2OJf!aSgvwn5S{zK^BebEi|KfdogtXL=BlQ~FlV<@`aMr_UCy>X^t zit;zcMVXpT^rpA5lk9)T`^WCGnZ(rVeB)DC_#?U_8pGruYLEJ6E6o1`Dx>lsswd#v zgVtX*=4PbYtciB#Ds00CEcFUVd?a0%XH0r;Ci_o7xtUn3hfyhw_eW!%B?h^eDF9<0 z+iR~<-}Zz1i#Qu*sbK!5uu-s@Ux>Yz0c@`8gQe!|4o5Nw>!R%1eN8vzJYGBoEOwlnS{9%BEyloZrKRiNge|lqnP~f{n_)L6`5VK* zw~pQp*EoP(M2*mV{p4&EQM@!Y!ye*IAM}^|L5-p81u9DRPX(qrMb;?7*>q+SCLwR$ z{3ODyMV)#b4yOda^oeMRru7dmJLE7*&}saSPIGnriO*dn-i!jLJb@M8$k~kJY!Y%d z(dnZWMnOMMSaffDpof~z)|}g5_z}d^+pzvWR9$Mu+2E8a%)w>^8C|rx(A~()=aN#v zl@@b&OXMAA6U)!xwPo6~sD8!mKLv@eLn{=^`{F%--P~f1uyTq$B0e6KOMVnX&}}BC zN^NMgWnz0Bxws`P^`*#L>_G*89L``2IHeg3-dDW%C#+FHe(5^$RC{X{uO1vHGlsi` z$i=Bq44eZOm(XY6no6=uJ}%p~o|~Jkdg3M%KgD6w?&4EBtuVHOq(o&@i~h|W`Y_-5 zrT5_PCX=V$Gh4iiy(tsfeG*5k#*6b|Z-2#q#G7JP2R5$EVh`O7cEJy!M|p=&D%F5k zywvRl4_l5m4`PBEd&3!L=Jw-)HuHgR_cM9}D7^#o_yIfc^UEXvE^x^wLLAiIuU!t=ZU3 ze(-bvNIVX)csy?q>|zq`BYWMZM%v94s^Y5jU`L?8%T76WGG}vDJ!TGK4oZrj?p<^S+t@A84h$DzH${ozf5o`SJk^}nXUDPo z=q&7Je_E-Z~4%s zMl;`GH}%B@k(6FxLV1d_S;^UW>`Tr@ycq$zSsi3_9Scvb=aHv=Gp~Pu`RQr+R06S> zsv#Ty!o)-rriJKj3}@?g2#6|)I~rajl#0>NZRst;tn=bgqa~R6B zdIovwsk;+(+Gs4bAY1E4(KAR!N93cJMxLsMrgE>EC1AJn@QqJlVVl6iOk$5w zZZu!6@sj$c8om*W_!dnbBi<~B-SBvQHkV%q2In!z$fElHj5ci*npPL=e-u63WI9Gs z#B8uwD$eGa7|!mD999c<63k>z&wch?Po$sn3JZ^+JL|t#>JVOatH{Bfc2oOh2Q^yQTYT_MOE^l~ z%8iP;H8Yz#sl@vdQ=h?YB+}z_9QUTX!kY-6(ijZ)j%xEQ7MGr0$^xcDnqsM&sKi1& zldi}HbY|Z;8&5UVx9N#h;;pQB)Wr|Xg{Z|2;EfSya}r$(?--a-%~VD)-gBSfz98S& z=rBGqv9p+d;Scw!x04sIg4qicC}z^#NXIAN;l*KAVd|n0a7|m-UzZBKNJ?0P$8Z!8 zIXr}k-4V%`@ z@HI@rL}4dELBBTmHWa(@)gu+AveGXq#D33fRPd`o4UJ$a7NEgP2kZZWn&GvT9ke-s z*EvE^L#K2naW?Phq{ZepJJi#|(C$HRERNrYCXZ1)ck}#NxE> za~Q(~Y!+$Dtali7@k@Lv3F^!7)KlfaH?vURUto7}5I$9q+jxhCwXdr-HC3# zHaD^d;RJCbIkm=S>ZwWe3&Yr$nv%(s5$;{i#sF_d+~QVnaV+r7b=Zx?s6G;kMX*$< z;Kc5M#BS1qFK0Gq+Gn%^SR8#3w$wtSp*=fE|zVYg>$YQ|n*xOn`HpT&G; zQk$c{+|K(`&q3l<==&B1HNK>G*BI{)<`y$@i$9G!bef8aU7Sr4&U8P&bS2&&fs2cQ zZ)OqwTTvIk;%xHk)w%??c#{s*YAn1CZ{18M!X@QQ?@<+p!iqFzo9t|E@i~f^1u(zA z@r)FDkha`i?nt&LRHnMMt%GzL&tNwRLAOijPxqz{zeb+2*w@jXnz0IJ^B#MvMK7fr z??DB!iSCxMk1kwBBI#eScp$i_HfX~!Q`1Xr!nWkySol!py*?2&vcvmj;}-YQ6A6a* z&u_iP!XI%qapZF`l8jo4`N^5Q>Tw}5GHyimrNChc$o*f*8tr+vE-O09=S+JQ7Q4lF zG}s^b=CovuW87jCR7Q2#g7HOnC&M{>t|qvsnH%5x$j+s0XfSHRiVop69J&Tah~a11 zLSBwKd^}y4r);}k0fQIFxfaIW(t$SSvr()z3iEI}4Q08FPh{0QVjx_4EvlP+OnN(B zUXM4K;D_(In-PpLbnOgHN zo8&eSZ%j@#mF}a%(KU2Mx0{uhQeIK{2cg~jNoDjwETsoC9F+Q!O>`;Hr;Mcw(*Z>7 zfEgOXP_|{B>5F&6-+^wsI(9P{cGE$@bAX6?lCvpGXKNw~tknLrOdFIl4}*q@-x z+4P`yn->H>%~(edKAg>kJNczi!HwzpKWM#<-hD+liWue-=F1Axp=M_a2yQ7pHHv-d z?~MRDTh;KXm%1y6>K}2cDs@-`)Yor`jN8}_*O2b*B)F!iV9isaAwCtuDvjcEG*cUQ zctK)bq^0_J|8$*z$T$;SOMTt~3uI4jBP`YD8()BnqKG!u5~e+#^V(%5CT}lu3o(gQ zF?9=2>R`5Y#P)x{H0}WVB_}?8Cj0*r`$Z|SmACm)!230Vh2QN;H#pM!O`^wI5d3HN zFjLT@nP|yoJ*R@Z!Cgo&BPfvSraM_CX<(Jve`hbSq-}xLBz1I@DuQb z7swiw*(x>}P5VnX2Ruv(EkG)H^h}+E4aU=%6Q~v$Zw|nw?!#_e816AB1)G9WPcU6* zP;2&bZ&5QQBpN5hVxOVD4x%dl4o9(>m%!q4md`oWFT|T-;G!_zA1X;K9?NuTZ1+FD z%LJ*G!l#Px7VKem3Jyc_l?MK<1^4$08^4U*yayKzWCzA!-hztBzLpd4_X+u>*@)%} zl|fs$tz^b;y1o&Xx`2H1m;dGyZ^m&pzd@-*&?l_n4bYJ~6Kq35Vlk0`PI@TYp_Z{d zqZCYYUl5hcCr^MGFQfUW4ceHClI9~DPd9)zqjEaAsZry)2kG55W}Ynx{i3xnhFisZ z^ji<8QKO5_^qKB3&z6J;HxWziO-v2sY}zof)f2R#;BO8a^UVfywnxAU>rCv0T~0@|DYs#>@w$rG$%+0ZA`hbLQzj0+1}m$y0gz@|=u zPqF#NilB|skr8e=vk=YMo^qdtbj6rUz6Pa-f*v~}Qb^yjWPULL_Ymeizcz3k3{g{@A_;Gn^%gnHu( zw|G+ob2crQE<1%6OZr8FK~!DvjX-Xsi+;_%y;9Uu->4ZjG9w;COkoz%BRg&qg;7I( z;FXOav>T(D*^I@6QEnZDv#9`M5afPxkMTCsa2TW1^h8>aZ+?@*&r=mYflKeqtlv)h zjDqRn{hUo){>JQjJosj(+Y?k&rj+gyU5MI0I=t~3 zT>!=3c4oG^8RgM#oTNi_fKUAfSM?BYtkR&=^~OmuV{#DHO)NAG_m~@oO6i4eGc+GD zjF(K__Os%N$>;^X;r;We!=|Dz4j}s1Ko7T@4#gBEnqzRTD8K2XTHY;qzv6k+Gqz{s%+#$mY7Jx-zCde-np`hu9`- z>!8ek6Azcx8wwLuIRt*>^}A%$@3}iI8{U)p^}zRKSVXt%TBh0?+8BqS%uF_?#PHS-RUh8}23s5ni4C*= z>J{CP_1t)|Bm5TBP=#&eaEjYvtK)sPtKD_ixs?KFo37S7W-ue)sLmE`i%x7ET!+6I+4b z$SdzZEb~hN`>oW~)>@o8>@FU`p^Dr2a!g!h=e zY2x;&*Mg^mqoIaTtoSm$(cc(qr~-e$X}pP}7-uqVAm%S44eu#`?~8>CM$bi8;kGL1 zqiv&>ehJ?&NkpAvcSf8q{zh-|MODAwVr$a4tZaEj><4UWp$_xU^?U?u5HITdj$;j0 zJB=%$QlZ{X;|PX2kG$v_D=z5CVr26_xn@l>q7fX$0vqq6veYdxf055f-Tpt?@$|C2 zGIb!T%^0J}>^Hrs)+Vyz&)g+(NS4x1eKHj`tsEBZIN2=J)3#eZys0>~((MeXRQ-<2 zQuFxIvau8NiT^HxEA3u~Cr+aW+xWkyv6nASY9@K3?v%8F;y7{lBRGvxPUCI11qb5N z&tj-Y${BOw8fxH{fJti|Fx;^;BUDuVwn@zeCXR*e2=}sr!zooqBET-`X)td}< zy2n}LL74Gpk#TM4wa_Q=p6aOn>&CpeDGyIpm8Ha;#&>R@$*n@MKR5_yFqHkDBiXNT z4Gnmz6S@rE!EMe7Cxnd3JN*x#hCA5%!tm|M=pyy$qN0BtzwR)b8Xc3v6!Zg|)*I*) z|1I)FezPmK1*ztT0oKHpavBTl&iT}Y$!*gRIZ1Q3Czr;27IVQJYkll7JEI?}gj(9; zxc*==trR;t_67UlYe%w1pJINd;QjB(Hkb2pn_~vXyoM7!%!}tY)9`~XqqlWL)bw2b z*p9IWVjHTY?$_1U!$$bzZXWpvJ8?h+n8k1G2)$u0Z4eB1QiN*}K24hMvyQ4NY3ah7 z!@bOwXLsM#E?bvg<-K>3>1Nzk5PQE=uh7f5&1P)l6>+12Q~V&d2TlFPj<3g&eei8} zwX{=Yvshf*BU^b-UK9?#=XRb!w&mY@;?x zm@4+xH+LKkqmOb zOEk3vsn()5>BF1sYAUCaem}6mn@LAvCqW8r43z=I1tbRmO_#&|?_q#ixZsa{r3Xu?)R=F2Yri!C#k&eXr-|vfO{M z-?)*dOUDH=vAxU}w8a>nq^Z5#Ao`;F916yaU{M?B&HHl3S9R_T2`uHsGh!+JmQhu3 zij7P`=Mv!t>1xX!_z%0)RTTfq`ETR>8$(8QM7UFd7iD4{oJM-K(E#62P3Heh&R9gY zaX|GZ&WrC5H+~}3)x3X}nDHXq+qkA5%!$Q$@#7*@86Kbm4_8U;_7`{~PE)UmsToOg zqc_envvWkR$Tw;!Csl8XtBE|1n}BeR^<*h;gqL7b--S1h2Bw+zy`{D>pG@OqlPIQ( zx^|pw>XFUy@Ov;-6MR8gzw{#6q==lbaj#FjrY_-Ahm+|hsIv&{pW^??=4vEer^cQC z*F0Q*Q_0E2n|9G@7@U$2PFrs*hvhhBq9G2aPO!)B19|ZbnmSPSw^m+Nl=n}|!;MnC zxfyv!o%s%*T8V~#PH(bdetPM^NJlm+%?bX;r!FDYIK8>&hL$f|84;5#{-JM}MQRh!vrS8f$ zdg7Wg%Zo?hjN)Xo0TQnibHIHm-{NooQrY@gALR?-sk~x2+Bz41x5&hHcCmOD=C7QI z)|%{agL+tpn1pc3UbmeV)_*z41bqqYW_z~ru`J~h)R;7KG%{UZLm8dobNSSPB(oNx zDo$_G!SEvk>*U4RbneB;rYb+xjK9elK0r1#a7_((ht7+j(CDeLKL6~rfWGYw^d?R=m09w1{eDyQU%ePTCNg%kSMCpd+V|c#H>RV^|2vh`Oy&dz zxvxGLX)4|f@tyTmZZDfI3%Z|Wpia^BFnsTjEXqkthl}#4`eZOAHWzAm6)U<-&({{e z?n}OZe{4y$l&<{EV|nq{ayWliUOUiPe2Ag0XWAoRe?m8JjInv+Us+~X+Bz3Q-4nk3 zlTCddcpHD;A7|8Dq?#7fOAqa0)tkB^r0pL9aYJuvi_^nP(yK@TRU__Y!GQ`(YG07Gdf;xc9}10U|-K~s<(Ze{|vH8 zVG`m#z3Bu|pVGV0!%ZmVj?}2cEhG zzOBx^cbrBSd1E`gUrKkDSJw-F$@b%JScR?(kjckK4-qHZ`7N#nqt3H{gvg{@8PQJ78>HYwsM9DU;LIk))uSXmlTVC z;!`__ic?rf8Z$c)H;)fAv-@u(ze#}?c=4}%>5$k%vE}8(KSpZmGWpxA|0lABa$@RK zxT7*y_ayx-dbjas zQtU%k{90tU%I4=L?=Q%xLL%EZPj-#Tjx$K1A7+wlBPLo-M)kTrlP;v%Uw`ojI+J_Z z?*F2@)h9tl$3?ioyy`IhHR{C_E1eZxj22I91)O=R_0x*>FaS?1#H-s^Lc( zK3FZ~VCcip$lyMHqmbNxx7yYYa%t{sSHxxr&kfgs;m*1Ds4XjAj%)7b^he-fo`yPy z4!A|KvfOW-Slk+)I+lL7C7XY3KuQtW;pXXjvW;`9{sEC~jQqU|e6t9mYOIU)Q1k_{ zcs88+JKJw9YV0GM{bW--`a<9kP5sb~tRKLelW1#2SxQa)zPH?x`tu6=Y+BRu z`C|A;vbh)eU7fkC?E>TVC$)AOV_8TNTYB#Yi>Wj$j@}T9N07}D{-&d|yoeLOiKA?! zCicK)saj-H2HqUc-xQ4Z{yzryl1*Wi?OpDk+Rno@WBn^2@kKbwWYIIxIc8zf@^EjH z%_LEymJII8&>?-BRqS`)5J_yNlK|l)5ss_|#!4M!$Nh zn<==zb+tSQ&w>5(2A=8psjJdh)^j7tCRfbn(A#FV)(0NTQroH*=MC?H{=UGfZHJ53 z;wUpjZ@8o7OO>Xjp=|ud2q#$yE7p`vC9A9B><0b$3=~!{83W;g6=_BvcJ{_D zIEp`Ia6dy-8Q9eL$ZfZzU8kcx#kX~0_|LZOK2Z}Hpm*buZsAr|HQVyH7r!UdoK`c_OgEHEWPQ;syc|_YcW6Hn!J4)&5OU^ z6aG;BZiMHCLGbUz%O^~+4SZ$8nFIJCa7w;2YgR78Jx0=hubD@^isRIAWoe!2~)!C z)gGBx9?}0Tv27r9TQKG@{&uELifpPd)9t}%$iq$XTz|4j6`t%)&wp`Ez1h@#s4>R7 z2FOurkWEjOt=u}(=c^ay!-}T}ucW2@*y2;xpD^;f-H=7~G_TNQbXvUW=JZ>M8o$DR zUz)tU8O=#=cIs?6;!Atu;E%_C7>^oqMxW4|?zWluyL@Ut&wfC|>$nRxHc%+g$?mkE z4y=c<^Vr6Bu`At{G71ZSIWj-mPWA3QR{U|OHrWioZ6uIuJ_>#$POUWuUy3izAo>sW zdIGI5~1?)%H(8uVrwFEuK5uk2>I zJ*_Xhvv{l>5z*jCHHuHYv2#pW8vX^(m|m~YMDwgU)Y4P1;t{Hv%VLA!UUs}~F+ul{ zD$FW7sm|*8?Cdu-fi@QCX>2csUyr62r?!&KQFb_hwqCFS=LpZ3Kl(q@KHb^W60&LJ zx%P6@L!oN+v_1|Lu&-sAUa>Fq3(WHyzmMJM6er^EZpd!i>-Rpdcjs}aqO&vS~){XXmetqwz|(xx)bYoV^a8m zYPGw5BIYs;GV!fXICW%~*^8=yB=AkM(1lQGzpo$3CRb&CG1N#e^aa^%3)sI1 zoBGKcr@%!Y%NhFPHiLmp_}i>xlabzh3pwOgODPkYp`-mB*1rH_*h;oB-|3H%O=oit zZ7H5{l^Sf(;7u|78DHF)bSmiE>S-$NJ+pp`^|ch17o`htrQt(j7qR}fDim|fGi7t1 z?=+0@4*sSY8?J}JhVN4F81S_Qk2FMO7-nE*5V zr;_@N-qeY{7C6Bd=Y|?m^HEMitIFoXz&siJ zE~nAh8>{Q1n2MopqpR(1w1B+mwEE58@{_Sn&Ljic^X=Q+dY&aM4sq?7VGFbxfCTHDPdyZ8Y^{DSGoAe^W{3f55HW zpYw1fWSjHJW@YRXT>2eTB9%;g?AD)h`;RW}?#GOWCZ+u@w{X(_)UAy*|yX~|*#yBrTJv&}D3BujP zsfF%5%qB~jz{9O)8+G~q>gH$WhSFfuwyB7hkB)#ETJRfd^%no4tDy}3rkTEmBc{YE zn=lvvr+ny3>&N7aIfmQX%EQ$+dvh_88=sPi-J#40!W7iKtg0`12~8-`IliJW`cx z3gH^(d2$2RpT0+yM4IC^FOyAve2QsnZ>*-HbxtU?zJ|?kacLgzrhA88cJuhpc>h>^2G8X;tysUUMo{W1j8Rn;iW97OJXUnS)0iV;%q&jj#u$xd#ff?U zkI5!8Yix{5dl(vE*Ln^2o}9xpe?c~t!?#qJrmJf_hs5saF)JTU7}%<^ojNp2UR=>H ztR$i?3gwoEp9`ednZ6j;(9yb3?BE%{q2UY6 zrKAm<)bE{5P4q?nyDpTH0GFB;O5Gz5{{;4X8t#e}-7Z7<9r9N@k`IQj;$(#imyJ)_qu* zf%XyoE>2|)T$D4s3yCKsmxfSENH+bdYT)dXXK}FcK&9G^Ek^-&BiocjQ5O5g6pv&yRaLT zokkuk%-5nuncy&;qABAwyoS7J10COM3aVRt)Tjc%Z(;o@p@uNM`BaVZ1%4_UBz9bO z6Q|)XM!pRv*Gaj^ue`-iZM8WoaddOEuin)2I%zJ+QtR*>Ib=nR_^I^fZs)0pmX%Kx z;)|C##iJ^4qs@Bk(9vE9n>O9d-tY41Qhwum`gR6|{tGt1``wAYXB+KRcXqadCS3uDP53<{28W{(qw% zsEFQm-*{p?{3`mEn1Pa(O>8$%q1@?P564^o|H4xu z72I^c8h;ZL8b(v|VGD|gHgjy-{gG$Pp$4~6^=1rw8~4VYqD^IbQ`0=l3iu{VaEC1@ z2UKAz#gu^j_l6qV*6=o)S_|LQ#imx0rEaEgr)1N^@IEU=)Qo{MCKED+CWfNkSP|BI zAigD$`EAF-)>QS2F_oSQhF?v?|A)OhqBHsR=su@W#A&pI8q#~N1kd;fw6P|bOkI0+ z^o|(5ND4P1nP1*HnYTwX5VsSavAA`MnS5M=0n);18Q_jd(81B3`ZiW0SgjZv4 z@AJit18>Az@ivnp<=A3Y*>o%Zrl9R$JMlM7^_YGl6Wh*?Pse5o57rC&8>Z=vz&=c4 z%FsBdAum4kUGeS5P)h!0e;{d~p)R8&kwLQ5Q&{btvZ5ONO-sIbmoAfndN*2$j9F++ zDe-NK*|K$faTA*QFjCoum~!E}p4t?9P3)g)lf|F`S5UPA(T2fcqdRC_B$HM zi)k*TA9{zl_<(FyL1K4pUHD9vvP3?;()3kP_&tr--$cjP`)d9N#PCiuwHcgplyokM z8bkF8EW#Hjk)?d8m3?UFh8dG$FvGo&YE`J0JUqQh`WlgOv>g%GVt3Q<1hoCAZvR)J z+tpHX1P|~VyJb{G#Kkz9Dv#NIl@%|B{c79OU!C7L?8&>j#Ajm+4zS|GM7^4gP zXi|9Np!oI6Z*TH8$N8Iv zGQT$RsV#8vTTnxFm4?L5Ft^Ix%1}8r^_q^qU-e(slTX(Wiw`)(Tl~#Tdb1x#Q3&=M z70kk?K9x1R?-WmjIzjN&RGIHaOJk^`@{24osw1-S^w7qW@JRUPW^@WR?W%ZlK-|bD zV|WspiZK|=`+umeeKt}o@>{s9K9i%KjMyl-!5q|WUHdi6v&}U@xj?q@wz!y7Uvfh> z^}bp5W6`X-sBeV7lxLGuKUR>S|@j+d8aB8aZQGJs37ZLN^K3wW^vD$%gmaYzn@e3Cd>r6EEr! zex%=ThTUMB@qX!4(!1$v8AMal(6>}DV=wroIc_VFePr`Zdky2o|MA=vajL71=7I95 z({hGFIw?L2?F=Pw7U?nR(=bg_aa+{_Q^ev=B3pFsCNl4NAzp7*iHv7eeToHcxt}u= zKIN`FBcQWo;5b8yrdF!v!gRTF!g z$Nc1e`E)mVQTyPV)@WV8NH_{D2_6FP*iLR6`udvrBs4{ldWUFH0O`_WSRZxi5e-w~-U@Zq_j zhJ=wZxb(kSacT1&4Pf|?==QpdakOduk-BJ0xJCRgtk@=A`~|YP0*QSF7k`2=`Z-!H z5XBhg3H_`;Egijyu&!z}H4jZa8qE>ytIMccIHQdEyn0BX@EAG6;z%u7%1V{3M|yV- z@l@IP@C$J9i*U-}Kz2Lq_lW+B`Hg7oIkHIsd7fa!iKDA^3a64YmI^I~{xbTF&v7}W zS#c`&C9M>1TBO5R|oucDx2zVSAug*LP`b&=yODKjnAe-WLLtcOy2l1)h<2Cg>U!0E>CyUH8 z&lU_UBb)m&u{gYuh2ET(`Mn?yKgfzZ>1xbng0@t=re3EvZS-xm!@{n|`=-IB#`)C$ ziBy@`)Gv_uir^b28rHJnHrS0edc|+R;ZdC;3&MGzhR*S_>1FHE5VA?dHeMl{4*GBE z>J$y>P5vd40){W3(s;?2W()Tvn;&)UpL6#?L7jUwMYs@)N(1{%3}sP)e?m4>^fi1+ zHlK%IcK+ARqc;d|qc{J+aOL5YajbZpY%>KP{-28Dr=cUkqUzcg)eC;myU~ZH-h*!b z2DwHqaU=qaaw}ZR+)TOGh zud&6yLStkp6M48AFx-EUhPsSehg0*$w@v!gRh=#uxg=*S6u1=VtLocdUu$BP@jv~| zbwg+5Mbl0Dl(UoKRhn8%zH!gi`(p9le-bOc8T~0xOwUjC&}!^(k)bQ0Bz*WInNCHSe;(6?r=xkW8?pRo zE==4F-F_v)ljKEza1@W-Xj?-_5s{*$N3jjfqfw|&1u{f{YwSU@EaRhV=74O1l})+9mW^pkPxXYRW)8OtpE0i;k^9vMJm)tu@#5z~FZt4Ya;wrN8s5@>ca&`m72yV%+Kr_* z3Gf`#?RffCT{{q10jJ*5xxG!?cn#}&0EUYVcGQ89Rep0wWfOlYZrs&jk}cdr7hPw$ z-+GDvv=T1k0vPP=nX%c#c5sK@Kxc#(8orRxji#Vgd( zf`LVl@p%YmC6AK`_S-7nJPWp#-(-?e9f$t5`eko=E-3Ewm5KFm8XH8omx2pSZH`xk z4`K|?^QrHsY`yG;u61e~U)wCz2f_`|fY*7~wd#|HaNAh|JJnJjIE8!?fQZc0AIQ@z7B%Hf*tvc|YK{-BR$v`oCR2=_2j zKXOFHC>@zTv#X)4&W*Z}JLb|#%Nl-w{s!=kv7Y>!bSs2*>4hJG-70GT@k_9Hajek; zR{W7{BTc*)k5%=pf}?JTPkn;l4(Mq8+D6&V{6-E{-xHA!BOBS^Yu*?O`+tKo=xnFx zTG{3+!5L&TTBM2*Q7@5AKD$U$>Q34mO;1xF@xXcY;6BAO*M^LWh;W@~>h3^O$hZx* z={b#iisf$Rey-ZO+7ie%*O1L(Ieb!YOsH}+ifqQ&NOB%4nmf3O-C_R4--cJ==fhHZbbOU-$V5w>Kf+KUc#qsRrOz`ewP*+OTxE~4kwC?5aEuo;>^L{ z^_WjqqYTjSLu8Xm?)N0{shf{tRJL#MGI`;~5DB%@xlvQSXc(5_jOuNGciJMS`cIGY z9D1`qSO|u{6|IC9c~hQJg{KPgkCn+Ljd)YutnY+C@!%fQce8n_SeP?THZfTEbAiI~ zR{Uw?u*@hU{~r~Lzp;;|eI!;zygIxwCfmWtXCkI~wR%y1y<+d_7I`T$QJi_z zoWYy$?Q+q7EtVn}_(cwPE?5nta*b5)^8T$MqZSzBOzsmp6)B1PF*ENMzJvo9Y@=)s zTa(w@x|7&xWWjD9_r`GOnE#bimq9XY`sQfbXdhhj5LWoICo_hdK#iqXaSy#>yLJ5D z7gN{EH$wR0<)PY`zmMIR6pc2N-{#~~KP8uFyiHBO8B9>wykHLgT}(_VdDLIt_Z$b% zS0Bv~7`~j&z2_p_d06}%vPtMPy6|ufY3c-;dYz^whNE_SDonDo&86%R{YTN%;--X? z$x}-68xbDvV;(MJWSQR7|EYAd<@rcOom8!O@erNM zC)>D1Q`vfc+36$w0>aOxa}X!7gdRm{_S-(#A#|m?|h2}9o6x5*G8J+s{Vb|{kqe%hu(OB_b;UeTYzkC z$^92#V&?Jsac_JR?p#DRi%o6ZGbdIU+wc*;anAYQh5|a6z4$tKMr~u1tf5}y1U!^W zPW=)s=!G$Eqp~^MWXiwdO-erX|7+@atmqOrwHwYThdzTCy<4R{mzWP|5^u$O?G{KD z*Z_-N<2ROJMxHsvCG_Sm%-=f5=nGlH2a(P2Mpn2%ITJ(?esmFNZ zM`C$DRy-Pi|Ct>DFX2;fJB>oD@nxBOM_mTh_1_KE^K(4V$&TlCV(>pa$64%ANqr54 zb^JYyRF-?DKtxBRvUlyS;g#Mx9wvgsbY7$~Y!&L6RcNy}-hs%5!6{3FS+U}0am~|g&Yi<=WcC~1 ziT7~1u@nth@dEknQTHX!!2RE2$xC^-e}aunZDh0={#2xjns_G_oL8M>8P%Jpxuo=J zVl7Q3O;r;gNVo5J=Pt5Ii}_2)iZ|%N=w~)zq$l2B9q;mR`=G`%YGPU9HT9Mb+-0=% zUmkfnM125GnaheBL^tbBT+fT=pr@H&vUw(`rbmj3H{a=pTV?>ij#^rxuXa4-=+%AGb!>t+lV`j ztx!WU9_~rt6Aa!9n3(&jk|pEcSj0D95{vIez87x}+wlG`zp+e)bBo@LlNWEsr%l3( z)TF7o`HdzJZYuWCF#H>K>lZcnThUR0ym+xfp|Sc5Z_^!HJM~d@R%!ac?ySc&^)JY+ zq~|iRsbOT(i51VMsWYD-fGi8poZ%}oJs z{HK~-!8}|#EN4Hp`$jmU;U@2o$l>lm#*3ZA6=Uu0t z%YU!2`}lX7dRK3H9;cCCuCRwpPxAhs$^F{coL4aZG#bMj{hUTRr%^6E!hV=8P~#lY z|CX8k5D&b9WUjE~esaHAYFpiL&4u99)ci(0vPmaSb+oOewEl$lwqO4)`k%(c&Gfb# ze&Y;1^ryv})qHA4%zrt1{yK|P89ZAPPDv8^31_r7`jz~4nyjIRcU|(%H5lU;@o5hN zpPQk2UG$F)k0qOoJV!As&_&aQx8(kL0{dlDx7BYKdG02yi^C~#@g~lverjqjPrPj2 zCYzl6$Fguvi27r>|40~q4VLmp{`;y^ToU@+9ApO*l!bH)J&d$aqa4J3Gy2v_vec)x zEx#Q7#lD_@)ur~E74O&`;n;q+!rFdy0M@*9uKbL#2$Z40NoPj8+^nqnKigTXV?)hhf= zSdU@y=n{JKFDs6L_*Qu11&HihjPVRp>0QO*_h9%`Ha68~8yPVG-Plw`JZwj?czK`_ z*_45d4|wB#|6L06R{>5*#={+h;g9(H#Yr`{4DJ^;^)s6~Vgp|C;7oecOUJy{W>VW~V*FvFRO5`%LBG&ddEC>WNtB_g#`qX%Us}y7;sS`r62l@7_ws_sJPPhN$Z6`FR^FeiuviH@%6o;&)ky z*`LVJcz@HtwBInX*fx>)FI^)}C4>E=fmX7OY&fHr@nWBOF1wtezaF!?k*hfB%ov={ zY?r7)Zw`oy+u)7@G`xtZoN2$`XK$mZkpCI<4S>|y85j9_XN z$}`aq?Q6=$`?us%-{L#E+VNEy+H9?wGT*$%Za8Hut2iGon@Xy8wZy3mxW-E&<7w!m zgx{D;)R>FE9b-m#TeKNgd;~uA3-RWtKT9!&FPprJ1{&L9`W!OOe|G!t zGMU)E94!goW}!Dt*;H1Tqa*7trk2{+CbJoV4};stW`wUi%jZm$!JQ?W&EizQ=--jL zk!xgA(Hry9@Hp9w)DN`*_J6Ji=LKi?3xuH%`>FGz&JD*702=-GWGbgal4b)HKvyDcqc#n53=6PPSb14Se{4<(cCYGM2wiPi7 zIK{#0MYSVWO#8gf7ncw2a~eO2`v>J3L*e4>IwBURrFX!JS5+11!#3XKb6SU2Vhm@i zP@d$AlLjZka9?7n_IYv^#^@1$^S3J8Qq13XdTD0T?ZRYJTh#cMY#z9u^BsLApJTTw z%BXgb>Uw(fj;^-cc4s|>Z@1_c+b#bt!7@I?ifolnudtEmMsz67V4l3#j#V<_Kg9x*)V4aQij2cH26`bXOIsX&B?LRa1&a zmtcO^vx%a9V@dhc!Ejk|swqvKjuqd;!wn^yV=Q?bHua?H?H_?RY3fz%R$OGP$})=5 z)FqJkSQW}0_>^F9sL0sbIqaw53v_Kqg9EW*4eSTY939Du7x5b(IK@xd)Gd{UxV$J! zU^7iUhWU@Pjs0ZPpD$huiBGc4pnmjE?A8(aO&kLlcdoGFH-mFT#;;k$ zKF^L*6S*Qz9fLNf@Niu)zY}R{0bg2AL=8py!Z!-M;iUUO5i?CFkKz z$7BE8>i(VBQ+~g*H(y*H*U$oEJWc&3F59pXkj8CL0r((v9KP9%-54ZGZ9!AVirz*2 zX)8{pCY!8k=?%y{dO&#s2&Ad)KviTWf zI8deOV~DDNyGXu)i9TTc1F`TG$)*`3K3N~_8uhzxMYtWTe+VRYAXt(2Pp9kS4%s|_ z73z~}Sr~AY%zu)a*dILHeTeF@SUiO#ZuXyzLjMa6G6&lXyOBo~Hj56Gudq!e#K)gx z{;l*i4b%~{h86FYZ44lr?O2uGQ0jV&;Y_vk)|kIfB3H!xntWVE*1R)Z01xw#*{g0k zqQV&*lT2SIZ$55@9XiJy389Z`qP@fNf`M?)qesu{ZH}cxJeubCyzxkd$trS`7=}aGH+NZNvT+V!9QT;;S z(e5f(waM^JW4(f1bbZWn8q0&}#nf5!dmfLKRn@n!txG9PiQbH~jXcFKw~b#S6t1b`_bu@zt670wr1}Y5w18}S==mDQ!)*>! zcNzuN2^NYRlSQl~_`9?!l>bH>%Zon28IAIlAB&Ga$~CcFWOIv$dmU%+iqn`9|HeLI z_)*#Ie$%B>WvRW%W-*Pa!E5v|3Gt?!AuU#{G7Q&-Y)Yuw&7-FyoZ^#UKON?6)qP5+ zG!|7c93nQ>6p82B57CCd`9{y*>_DO5GSR=iH~!|I4mgSxCUzH?5$|ckcT2LFDTn)% zWeg1;$NR2O6FI7{Empj_4~q@)#@SA>s64!x$XJPNvfJ?fjvB=vPc=}DTdkHdNG)}; zeJ$Hz|J}hH7~CnI94-%w1}E@0gLP8XW5pjs)MLrB4&Oh8XRNKKxjC+3B%Cr8YOJTa zF$d$&QC7SqSk6v@w`@QR(3@9GrhemnO}uxvuC|}$Q>$&=I;SJ*6h5t|^PdR=mSg=r zb<(sH8H>43sIVLCM$qm?^zB#d{Z}fReenMC@o>w7Z$e-bM2=BT@nyA??3m_6fzCP` zT4Ti*^1@B{w~0=%ysB?SsG%ba*H4yOQDmC|b9BQ{9tqZwPkksdriT49Mt0KFX8!c! zr_#!9UW?AvpR%7#9Tfe$!_sq|WmVSyUA%^0jaD@&P?_FL@wTQs@_b0Fu^8S~cj5>W zZIdCRI&9--meJCT*y`Yi>daZq!o<*;P%lHN*@JV`8T*M-oq7LdWYdyeO;u&C6xpET^MsCwr|N|_ zuvEAB+5!$jgYBR|*>FxlSRbr{1nWYd%#j^~jp zJH_GH`|mJDO;zt2lFb5|+D`WV3#Oq7Hl=y=A^z^w;Ey&ZSLVGZz#PqGjB6mVb>@pE zV^c@yGTp^rbfj|=aqxxpeB_F*aqHnp+t2?bo3_qB?n{f?NYD-1XrrsOlFD}F$PIIv z-Srv`gl=Dqd@U>PBiEd!=WizOUrRzQL%Umo#_gZ?Zb(U#@S#bCEV zs^Op6fAqV)hV^FlX6V6~5P2KBHGwzoCDS}BN1Z34E>~yV#}{vM8uk6Y0b)Sj&;=~q zqd*5SygGkVSHH+IzOfe{u+?ngH}s~P7(QHg>M*gmB>Npm2kgPuVf>!Xz05NI7xjE* z#^6l!8wX>yZp-}E!o}NV{-^Zd?0{1n(9%A%Acq}K&EeukcBfTj#Wf?3FbsqILbn6L zjD5}C^uriU5E;kHHp{V!p?tu{CLyNl6rQC!aS$u+ueSB4XZrFTi|~b&`I`@Mn{{Eh zrZ9YVn5wroHVI{L8g+FGRF@YOa{gr_wwHKgf8Tr5gz#wiW*jSCfZdqx{42tZ{otby z@jkgb;;v2ftpI0HVil*R8@&0*i z&nkuaU&JoHhcz#WsMA!ort30WDc&pyCQ{Gr>Yc51LtWvEWAww_kG3{J-9hfZ88_LV z-fS{o&|W`OE2v=rzk$hChiU5LIowT(WI@d43z z7(Zo$ex#kghDPR~ztSz%&JdwIeCZP0MsE1#mFNhucpBRn=``{~#9xqUZXT{5pZcQ=zMmeP zA0jzuBMRX* zW>=NTW~(~WwLlA=s*ajydwqrn`I;%-dY0Y{jYRp41fqWur*TAl?nr8bAetMMBR184DR8-vNbtGPd=-Rib1SRUG}sLotmrRlRs zMD1m|FI`PGC1w8Uqd%KyTPUWE!x`rFwq`0Y>FG^JX!BcMyfaPxj&D4xPBhg&$N8I{ zWYd;xx{^&h6{A$n|8rma9;RuM`Jy=4EEH3hs{1~Jh~}`2?W&A5BOBGHSJ`5{QEg*3 z-&h3FXkZ^f5_;3XPJ&jdcMbGIcTvAPsZKZ#O1VXECXmhd(U`y}oee$l@M*=i+P*Y1 zy%`{bn`CNhJlV|DWq#K=%z^w4U{hLSVXH+C<5NzXOJBoNl@Y5Nh^PTJRaXD)$7&)a zag7btsQx6?d7{QsjKLx}~#58WXU$|ckuR}I@ zqD$?TSf*QWgf5JXp8Hr9o>=DB(4LPkRqxuzpGMBeb-(dfooP2^e#3B7-E3Xz0mHX; z8Yxt?YO;*1WHUsycm~usg{IC|+k66pEpm#7+#%fzD^f1HThAXquLtixym$?M^?mqe zF(iIS@5Vtf^%MmCraJ5f-?~o>uf(QON5|^G8;7Ir!Bf3X*DB++lj+*;V3)-ZbMS*9 zoGFpwV&itttykB`7U>$n2I@~}#HUt=H^aQ~$8_gy*l&sqZlid!Df$t=(F#&Ii}78H zXMBN8uN3{~>P}r4$PoNNW|WD}RFk75W>byTQfOkdOY{j@(#F16u?6o6P7{TtNkIO=?Q0 zt7`EW`v^yw_?U-@i;>}O_N6!JO?MripX#KkZkx$RY{Skw-&vO4-1GjT>eCg(n{p~m zZN!bUB)ZlqCi2}YdH=a~V9lbb{cy&q#Qn0e@DRQE-0t&kc(|@Is?qrLN8}kN)BE9q z^6*Dw^N*_kb$D~78s&S=u!M~9Jhm%KaG|R2FVTGbMt!Go()n-tf3n$0Hmh0j>Og_u z7@C?n{!4R-sEf(wglyxqy!e_3_l}yuF8=rs>n|%yNg5p`ga1AdgXh~Be9>2y_RlMF zhEC>SN3vp(Q}5m)5kILyb(G(jqwgcT@B9!4dtI*i9yawOvMCRX zf2EWDx-Ep;F%+-)?myI-7U1D#nxg9=-+0N}ib8Nt{oYzSw>pzeFS41e(j11Rw#lZR zsZNjLZ#v6Tzfdo%1#dhLzT=JWo1Z%@gG*(iExTBp+g&7|BYt3oWapFHMNLQl%KlmyGxTzUEaSDEH+Sw%6&Ss-Be0KS@L`nO+U(ShOpwc!9Rit z&0H0OZWD&K^EXkRFNrOGZ<=YW#Z#U28xQNf&hOuI6KXhR7Ve^Sc*)lHAnr%+`cqj=!WWXSsSogVADHB!@PZ2wsFaGf5AncMCPc$^^Ny% zf5YMnb^WGgRhc08&A~3ZAt7zqW*$DZrMPjMKRrP3IcXYVk2j9x8o1ej80}uXJ^|@unyL(SK2$_fPEqe}pr-Y7fpFTj^dCYckWD z9W*sLM4iL-q$1IStnqCg=K@=dwR7cLUDOqI(tMzkE~6;E*PfV+Wcspd(P$oSAKUmV z+Q#|+6saU{xGB@P2Z=T2;WF^4iN)Nz7?lOQaZ1mq5Y zSo0T~DyCQDjw;L%8TB^SI2;#~h|kCX7ae59Z|fAV>@*r+aEHlo63D7Ao7l<*CvUN< z?`PGN5o(*wM5+g3TqbPsbsnxdKBb3V(V?vIH}>xaAB7-ouI>V2!KU|F^Kw zbDHzIt$BNJ;yHs`b>N+jHdBTF32sadRsX{mzYQmEV;fWP8$ZCCarS?M9j6xiFJn8Z zLPk9>c%#)}HafW+`mpYKE-kb>3%C7c^s>zx+hM8!-uOraNTA+}}&+!}yWsG~poBTAjshHXqhqDs;&gC~g z=Na?*-)r3pGr+wtFg_-B6o%t}YH9&I^IWodCPT+V%2Q5~e^Gw?5j{;!_a@8W8``{3 zBJiuOuP@b8|MnYW;OTWb1=H)mse~76LpHP7LuPgyW{V}DkK?k9xmfWbfjfa}GLsX| zKY=ej;O!-48(pxQW3k)2MXI9s=8$b6xx|n-o9d!MS%coB5BBoL>-_N}(R^O8l~Y`x zTVxNv@yKb^7UN#<&NOs(C=B;e^fwji;i_UaM73j3bwF0MTl6WUSFDY!VTiug_55#M zZwy2J?~%<0v)H!Jy#D>S77G#*2)8EL{K*+w0G z2KmL*7qC(bedBX}^`GE+7M5MSsl$qU;J23JaNmI(A~d`(#&EajKhE@Bx4;GHe}vQc z*Oxx<#bbH@f9OpLOk6=7D!timGQTk)Z~i$97efzEt5K{8q=jf#u*T=U^&;zU%lj{~ z1!oT{ex!>r?lcmS&FlR6ApWL=c#|@TjNB_p_i08M0Y{7rm_Kq9Xj4NM4ma@+pq$ zUz15&b;L{~n}#&?B(M5dF1I@PwSI54S(ETx^rtP0v~>ze{l?U+zn?jQd}Q;2tl}&y z9^&+F`i-}6vUdK;;QPa3bLDU+;D*wsz7pZ%bBR5R)kHernyUnsVjJ7b6fTkKBh`w9 zYAMO+O-UJ5Q+RVOKbprIUv-MrFh-YgO~06-9ZFLxiiUgW_XzugMTF}D)n3G^+;N%{Of)Gs*-2TRYSc9Lie}9W|=YqdO;#p;4b!~X>ttVo=C|-zMl6Y%5vN;$pn}mT* zs;Ncr6r26V`((NmyIO*5`sn$ZE8bk<@2k_8l;UGyIm=RPdMh}!L}0P{Z4;jAD9yP| z3+9qdQa$Zu-3-!B*0_Yn&(EGxIK}ERxGVH#p;$c7{8c%2v|Gfv2g|MT_Pjc`I;f?O zgT)WfvGSftNe4cXPuUv77vEA9`9rO#gY!QD9pA7mY>J-7D7`5t_ixN^%x8fGoMT#A z(3svlh3iOtV&*M`s z>3*-tlgY>-1vZx%iv3! z#>=K^bVW2%V6e=nB-_})4zGB6F|?7zd|6X>n2e^WC&;6Q_@9BkRmLFwY1(Uuo39!; zjSM`+V$WP5*Nu3Ec1P(ed{}Xa!0ZWsj+Ssi%08+FYRxyBGr?gp31_K z%l&GaO&Bct+Xm+}3Xx7xh-G}d-b~T;(OUOTCR#m9{6B1dcL6!&m5F^zHoswT??L-+ z9pyRlLrC9}O^RqIviV3IE(BkU5oeBy85>whO>s(}91Pb@r@>C~w}x}fEwgUH-`r7W zUL?Q$S}#>D`Q`#Ac+5ZZ{O_E+eHmvA^e_~8Bg;%+#gwZ4Y! zH1&COqODYai5t!7cz*vhPHpoU7~+t2g^zZ#t)o+SrK(EBwjf>52F6cX=E3vW_aUXIlwg7FB3Ms zooedzXc^smGx_c^-dBuleo!yUDi;6azT9Q<)SBM2hHQ4J0rtXf+@yzjY$a+#HXEEq z4H2VI$JK6M+*8jopw zgWj~%pEQG}-X_Nmo+-|2G?lZQP`w?jwpop)CeT&(z0=sLRyhyaC@M0J)bqEOpHEIU zgCOva{He)GHbD)|;gsz1o69x~bQTdecygJ4Lv?8LS9fJcAQ1x^gBq9G{Y-7DIoy7ONV-jkBF0(DsCK&ub z$fmIvSA|S}6g5&tzrx_;6FaX#e;vJXg+Fs-ETzrQ&r#dB&Zgdh{wC4vPoU$^eCZOs z&=pKy=$69ZrsBm%=!#tv{LOzi((k(`(4K4-VYlOC)7!7B;A`8+HEgJ*;g>MKGw97n z&TbZ|uJqn6Q0h%cya3sBr8kEloYw5WvhN+h7GH>dZu%mvn0w5OSu4JAsW;B$m8&|% z-vjl`B~KEIZ?WR8PUB-=+RgvI3Ezx^8a_3(9fC{-V1HM5c2vAAo(-6-#ELiO;r@_) zHS)eH{MB$#BNf>k!WoRl;1=RXr~A^?ETf00@yPd=#WfDrgLi=)eaRZD#9PJ+^@1vT zFkVy_+{)k7X2tV7H{YpzCZcYYr6kr#SIvIlm3)2!Us}ua(?!&LIH-SAVdvAEGB})B z&VLzy)t;Za!nWU~;qC40u?OBa)*_u&P|7Y*qlGw?QC4vZGIAd;o%zj|_7VGIXm~A^ zrU^Q*@50bMy|D(1?4t(rFAbkaHnsK9$IzSJWb+%{85wLE%qZ9VMul<>eDH$V)FCvc zhCg4hk`ws5?s&KYveaw5e|rdbJ`XUS1{H$DritNKAm_Zi|17n?2E1cS|Ax)@o7#~0 zOR|woc(G6T)akx;x>Kx1Hk-)iCAF=Zc#-w;)E2a+fzzA|r53;lTo# zBQp3%M)eyU)r_t-XCuqSw=&TwdW>t~(;_srn>WrO(}A=-jr~w@viU<5{x!(hJ>GJ+ z#`JA^hk@yBSZHT&0ahUsWR@_$Xo+IWA zhdkYCA)*$t&8Rm`z34Q0_>GOkxp9%be0Wnx{0$g?7o1wdn zfrZN~Bix4-9mKUlD4F$-Er_Iu&`gT z;;g*?K7OM*>m3^}(+;|JAMnLh#qg;#^|}1wdph34mkx6>5olwkdG^{g^?xcj9oX*_ zr`X-U;}yR6OZa9z)R2m8OmqHiz41H0_J)YsFM6C64_0f)K(G5?L&x)wjpSk1*!Bm3 zYpkw_`u$RG>KOl}Q|L_!tp0LUxTfkbQOM{^zwswB?I1^u>XC1Z6c%{17e~8}1$>wVq?jrBhpHw?Ilev*|kt}R`mr7F) zowO;Pd3QQK4hC$-Gv4A8D(Ewqs9z{b9uwe<&fYpnk4ZxFO0(5AYO?glPNOyZ9m66! z(eT7N)4!BYZ`7fXRvmV>cXjsX2fFvS?54kbxghL*@t^g?{tI%3BIXN+ zVJRN@+oSxxF5=uQ2<|oha<$EJt>N1sO>GNj{K&txWc~jWpX=+vh?7kc5pIU_?by zC29CtnxBGf+OXpDyvz^Y_$_p^PR+M4tvCl4+mfb}zAE21m|yM6hrh}C?QvpLKSYa0 zA7b9d(zsrH`QpeKY)Wgr8?QoCtLaSZ*zz@`VFE_brXx z#xquo{)D3{MK+iDjaq!;KwsL{DZZo^x|W}=kUgX;0|8#X9a8^~<`|#;int+Iiq5?J)#X@X|y=z2c#SlxP#vWTtY%%s;Vvn(l zJt{WrU9h7lNDvi4k={GZ`+d&#{_*#6K6mEMowLqb>sik#d*5>hb3kV^;|<>RodKJD zW$`ECe+|i-_&Uyt@%R4DQ=PqSf0>8I-|_BmYQVwnznEhe`AB{072d4n?@~QyTDVg0 zc)*lW-&B8t*>4N==2QJ#qnS6XdH#%2iU)vk2kl=;x5iVmc}z= zMqg{&m+f72wVQgL>Oar@A@{KKdSBnMM%h~SkF;hu)9hbg<_=Ub{=(j!{gsbV7{0xg z{~h*ITIq04kh+Sc&)R3~Ci|bon*+^oKVj;AW}{fTzfL?|eI5v#7risk!`TwxKG_Lwxf66&V=b7>Tg}YsrzWo#T$PG%=^AeP3;emy4vpeD<-%N zG5j6a9B<9I&`!(&7}?HVCpM! z;|A6~rY|;k$MS8k@pmrm{H^32qQmJsQD$tZPWda`c45C(k#$CM{xI=AU+WxF(Y>(liabh>~&BJD(F1r6vc-|s2UJ%7qtTpcUKGV+DBVYNH zL4R>LiM0ni;3e{2R;vD~gS+>94B$pZnp?aSv9VntGr)<9Kp? z>o-=XF7+1>f8xu&=9I7TO-6f%9EHmAs9K>Z5wi?7SVS(;SU&8&(WI-EPX4Z0c`L`HYQss8WyU z;7hFg|8D)>K?i)?r{TK8=4j{~4x83?sIE1M&98XV8B>R{@)mXRB^7mb41dJ5v6~7p zN)~UUHXhB|Jw$PqYaQ=Cx{u}5wx-5Zs{84DUPWytufv<3vhD@zo1Wr6h}=Qm)oSWq zflK@a#Hr?(L#%JUR~sLI>m#B#Q}&;z-Zb+5GGvfH5`Zh)l-^~_I-a3`SH4c7&nlmTg(2hO{sf%M|6lRUf<6Da6Ueu+Pr3->LjP`H5YGf zY8Yms3^I0Q=dt z%pUx8`qW~d>iMJGn6`YFtQf4$y@xmJSouBSj^ADEihb;Tm`!LrRDImR9gWj;RDY?^ zC+{y7|0dq~dzRdTqB+_g>`waB2+=rBuKQoENF3_e+dVCHb}cWmf}1G^eqXnSY}DLU%!Rk*qS&fk^dUta~@6*BwR?+2Ty zn0kU;kuP+loxMjjPFDTb@v`i1X4<$!_3wns{+ct5+wk!K(&5c;vF-1ExJTtdPxlLc zEP_wcIs$Jt#ncx}n|reAGyAC<$>aU`xuq%PJM2yMe_LnS#u{!cT|-QA!{yX!u(@4l z+!#ZKs#I&SaR8k=%BeZfI>WBWxVn41)6_*Y-WJCvNPn$sY$MZNH#O{UwJ}OG`cxWs zQNtTsYy8WnOB?CMXQ<+JqW-cNz95RT)#4*{M*nMonfn!!@!B-*% z_WV}g_*wmb*71f_cyriXWOduojQ?Q0arN4%IJ@KAPF7RPaQ<@l7%n!${n@;+z%)FR zhc99HLcBT7>kI8|UuI5SV()Kz`gXInX;c4Oy!pL;^O1YBcGAVa7rz%oKiG6sEpHT! z?yBySb~ihT`#yB;pfWD>=@EaW+Gpq<;7@m5{8QSVS3SnSW=q}c75jI;Rn0z=jq9;; z4}9AYZ${R;MNMty-mSCcMnmy`lfI#%Im;S#pe&wf_CH%RW_pi$YctUvJndZnC)3%< zvUsd2KEPx=6`DiY`X1i2!K90=Zrk$ZPHX?B@_$E?+tu$0oA+4J-zV>%RX4V5s$g`L8NlZZe5? z$K@yNQgwvQZX|zWr8$G`=lGQ16ut~nH)hlHBDvSC7@FYC-+iK~v3D@8^Zrdexv@Qd z_cLqO*|WYDpBmXQ{JSc?5^RQ(ds8+q@pp`lbv=KJ-@e%p*sM%fe_n1Zir=eUe}c`Z z3Y)Gv)u-fMW9bwt#=TYl5qj|vVm-!R-s?@<&K2KgTVbE?(_VA&<3xY$p}yWYjN}K) z$J+JV5_?~;d%vp=@g8it(YQl}X(Lg*wW>ECn5cKbn~CE0n%eQXmF7BX@!fVsHmEw> zB%iae^;WyYjQJvZe!{0Zj9H7Jbp9*2QHGP}Q#ksQo zN_RCiwk|pkZ(7&=Naih;j`LZ@P1WZ|VAIFc_?#}@5!1HUtv2-T#JA?bKl@vq->Gni znT+R%|66o^VlL|Fy@$)>l>awCjTm7kt{aV8v2;}(^-Y}E+3f!!rfzE%|7rP0vg1R! z*cdh^+e@EkGP=-&GfOsZs#k3xiVal8dreeb@a9_8Wp$NmbYw z_qvy+F^2xektj}frE}DqIV#-AdTQgk@iY$O=M?jFf1G&9XXth|%e-kPu9G-!P3xNV z7wa0g$hEd6>dQpC6OAJwGaTO*S%)1VN58l8bE2*^&V;)z|F%;5TVnXbW`gzHEpV^B zx(&tuTey6n_RqA|*u&L^`Cobl*vInQ0ydyeR)g34|mSNf_yc`3YZgT2+b4o|m z`WAQnEycLruvuU4pJL^AzFm>|=GedJ+0E;w;MylFonkL-dn?ePnA*=dLv``CP~FU$ zsEa!VJ~l}nB8xv0jRX8WtA*YN`(*iNuvxA$9*(KsSi%2Eu78bjYty)eudVHD4uMS{ z?`%Dy?{2P(Po(i9v7CW7dsxA}D;j&MyKl+HRn)l6X>4yb{icavZxi+VYSP}`znw$l z$5@vdzKOlL!KTKIMB@?BXlTD@BRbcpuz3JB>)YGDUx({08WY+18R_}US6B0{ve(dF zoNra_7mLOQEbZyt(4WmW7s6(lU9-QM#amf7e5EUn#_)D{bB-)t1eS-Yc6XP_oBGY(CY(j?o*Bu* zNf^EboCmwFVFSCO4~Rxxy)`greKW%%)2IK>-d;oM#&L3^S>4Z=^98v@-qk!1Z$9G4k$c1udxqAiAm+cd1>`HD8yM;f)>T**} z<8_;M>dlF;nP7c$v{m;fx_CQs-Q2OgKo_|if7g}8gVl}S=v1?491ELz=A;Ah{sZfq zJ=KjjXlyMjdcw4+_cflkH@}0L`WkNSAsZLV-*Nis0@&=N`ak2ohD}8JLG$L4dL8)K z6*kjUgX>Kpt5uWH(KNQCaUz|wmbWl{9AnxXWriEztT(MUTk>yB6?M7p^SFs>b2W8{ zsXNhFY(D*#)+Mrk&$@q_8kSj6{SAiS%KuK}I@_W6$$J)8!KQ;xCf;JU+*ECx$I_qG zsrGntB368-rXFD*{yp(;2ANLyHWxPcss6pqDNn27J60NhT>b-0>)VyzUuS%;s;TG7 z_Hiba4s7jc2mS{+<$ntGp2!F0)I+Q{n%7N+=md8qcT{gqSEDDJ;s0b`>{I#QhJRgD z)LC-#4%qatfBUeNWj}kr3)H9|WJdFfH~-Ra+Pbsv3g}N%aaQ4B8&k?x76#Pu3{>ljYapFUi#?%LsheVOmPkB=HT}{{cS_oTxGspE*fXJ zlXj%~-&%EB*&O~I%m1muwKl`wD%zV{H!KkQsV2WpcylVxCwNb6pxk)F3a3tXtZXWt zDK>YSsMfREeA>R)9%kwWbyHQT**-t9v3}tHic~lDu;=oeJJgn{Phyt5>&PmBi7H!+$B(LV@92&``i!dE!~^`n*EIfaiwM5T$mPY_EX_rRX6&| zjR(Ykjy&#&r*#(!tBtQ!h~rIrtJE!r&0Lmt!M~I6W-M$n{k<$3mtxLJqBz-n zb0;?SQa7FzjlD&qsc6hLqqf2K!_&ut5v zyY=FB>c&64M>)p2v5DNTCyF1bK&RSiUV^EYSJ7yrj?ZUlTf8~QYp>a**b=wy6OE~` zX^wC6UE^7OYCpUgqqCf7H>*os9Xsb+_jQ&1r?KOEz4##547J<5z^vK?-zM78xec4v z({G+pKlc%hR&`5cVtqRneN8Sm%PIfUq$>WHDQ*^yw-Adt`rBhH-5zh=hu=VzqMfcf zM=VmO4v=RryTg2Ayt&!RXuN1NBexLSUlhdyy+iSxb?g}`Rd*6TtgpVUjc=!_v}4>Y zu$RgBNvppZ^#F>e;~{*jDE4;8=c{VV!F8L-jfNx}$&9`#*9~^X8mNG$i}pv>4a?M= z`lg!^rh&8ViZwSi-l4*aq@pDYbRs-llBqz7sYSfX>%%u^{}Vbgk(oma-X`tVfc8fjeYUv zDH^B4b4g|CtN8W@dkr(~wqHzRA5m{cUmJ74&Zdn!{pGxd=9rVrh;NJk9JVe{ZHD{# zbgPu+cDL@5Q@hlyC5{boU=^4iWN+60OmD|{ked3k+?YvjzPj_772`#^P-nIHNptD| zHD(pKH1Ty^cAr^ypH<3AqIjk`csQQTB{`MG7ewdx-e;O;HFATyH~O=*En8c`bX$D8 z&Ro3EZu-%p{Ss^@o5yC5A7-XM2iEQFH4WAy_7#oJn9~NfTdE=#iQ+_4!+zNHsJY<> zbNp=eYJ~2S8os_h^{V_Cq&BTdsyWuAzMY5@pX1GTR#bPGaK_^JJjjky-~O$?^|QMD z(%SDd=dM?2?8xGNrrT@GesjEgcc|IoNqT-{=S(~uE;B9=qi%M7Uc{~=*ta%RJIKjR z)&8^DKU!tn9yYg&#%Q=q#+uL7$s0tmkNb9q>%}LETrXC3@Yq1@Ki+HaR(hG|uE2;K8>}$n%k@eIBQ^TIR|NZjlTf6wvu;62MU#?EA zZ|CPNv&^6DX7=Rc%2?A2-%i2sPwY`{X+FG3XZnK1$sS*d;_Y@*w$;NwSN+eD8=GTJ zXR+8o2R{aHUN&uZ6O9Yy#xV71k{FJI?_k*M=kAor&bZ8(+mTq6WH*-n)}Gjduvy8K zPga*+RDs8f;dlD!Gb-1SvU|Bc_8-yM569PJ=W6P}&T9XSa&11Q9!}#E_8Z31_nk@i zCA>ME=N;@(KSks3#cl%?pevqkD>fIXd*4_W?Et~s%tD{jIFZ~3SagZ2t>^Ch_aJ|= zp4x|xtE*R=iQ=i|qG5Qm5v#6%<8VGspfypvnf2T0Q~z^U$UpR#?J=ht*^O0=KdN2N zTcvcWa^o&pHImf#zP@1=JYV*Am&I?YyT_Yo`_Q%)>8&yRJkj{t9_3avUMv0|()gWv zHC*k#T7=*0^gQwJM`j(>qmNuXK@ED{dud%&-Lv(L*JSTFvLj$~r*-7+-Y=Rc zH?B|{ceRS@fvp?M%OmW~Jf_~X)B*p@r)Oy#OW!CAdf58oF!g4sJCOgQiXUJCHei4E77?0>cr+e7!i z4dXr(iP7wR4a3i?u$k-1H`BOZrExu4chC#YRWCoo)J>~O^{9*(Nphsl^B8Q7Qj43x z=26i&0$Y01*h?MQ55sT5{ArlFr^F8-VC z`{B(jtC8E(mxE;07Hr*8JO|1ChfQJ)U~`0MJcw~0L-Zq-K7`?e?20roQ9W8kV=sB! z2M2a=jlbv!Z`!|G!wh!@Y@TJ~r;fL9??#N+T~1Ab&5g2g0LE=bavM2(EZd(oZM55}pP>8>HrLt(*`JSndAKu7&l1JAVbcXRC#n;J<%BRTc7OgKR{?nvLZ7&}mn{g3RQZQ9(u zipCRce3#A_@$GWh?BLUdQ)S(4;(Z8-ZRN!-GUHS|?^%7SiTZFD^zT*I-ow^6ME_QN zIKWzSnH|N!)@w)Was42=EliJM!C(wuZe28hN4KhRue0?HIdYd=JVHlpfj7@V;$#|k zCfQHLI*g^a!e&ZU;f`b5LnPjEyksi6T9)l%$7l{;?iG!raJ)a3?j)m*XX#_!XR2o} z;vjwFW|ltB!xvb3nHwR!^xbn+NnR{(b$KjyYlo{xp|+i zG2IHTzbwAgyA4m1d>Oy*H(@1;UDVl>Qe=?Wc4V$6Z_N0D#zPi4ZPx?FEMRB2C{je&2ypF%8*zaRT zIa97Yr=vD>C*l59UDrE*2)Q9Fy`JR*c+gZ7U*gf(rm+F!2GDqlRoGxTI@ct=vn>86 zjgOHU0^8fIiDKz0EDdk|DH{)};&G6=c!6H|21{G8^mop@fu&E2{nKJ`rR?0@UV5VV zq-dN%j&&2u4|SJ#E7_l%I$x(aq>?*S=f6~y zeczP2ih6S-jkogcN&4=u>f#?&=+(?O!?F2NHSKV=?kj_jag{q%ukWmGHn#J3I_vJ` z<9|KwsQT&t*0zmA@ddm*yNdq+oplhNUS~D+r6_i@E;>$4y`7JbW7~cDa_ZZrrql_r zxr@dVaC`urhx7Jg_3dqY8|~EGL!o~S8wb;PFOBEw;Qgy8ey-kJOXD%54(8`^xNxh? z7$b^3>gOjbZZ&jTgxO!*T9l{60etKdz$A#qjM_v-5w^I9MIN z+BAKLD7JS$%y9X0xwDU|>^vMw7qav&F8A)zcj>5M!S$dQ@aTA6cf3< z>Mt}7qVaf^Udx6L?cQ||#luv%tN3^~FK@-5GraN}e4ArUF+@&XDCdvj-?6T6h4(sN zH%~Pd#XZ%V3uWNHN&egS^X%R1>h(rees754WzPQ-jYnh6x%$?B(}|nuxVwtRnR549lGoFGhJL!enV|uVZ_0$Lp?aDao+2wR6~z}Y ze4)zNR~G-7XIJTnH;_KZPkZ7`%c^S(Q8zAJ^L*$4_ybET69w#aDHk zCzvzNg73e1{e^dn+RNg7#qC^qe6t#G9o;9uW(%EozGw`^xGVL>pmR1$Z*rw~e3rR^ z+}RQ1PRE>UNnN84oC=%%UT>(vy$8dao&Q&Mp26a)UFQ|oTWH$YOmF#<7+lJ~YkmEj zDDEvs+rs7xcHNC-f5(7RWz@y0#?xXuT^4UB8iU0AB68P2_5zq5q9&|~sbfXs9;lw< zIEmJC&7Kccyjd!Xx5lqi?8RJN9T&0s_cD7u^=67|KLeY~cy}f*FYxR>eep{ZTwA%Z zm-wH>#>?rv5K2em?&d6A$d^}WycS=A&bchTU7h-{n&7%uHT7f}afRbjz8+g;|JtV8 ziMsVuaJ&pEXYunwR^O-ge{D)xg*W>;_pi{rS}nhr)qmji2KIfXR(0bZwc-M{p6%;Z zka`|}r&|?oC^wE!o6e>05(p(T_Q$u*RTjT(?R+c7onOW9GJJbdUmWjVfv)Pt01-cv zmC^Tiwcrpt8*8a>6Y=J0wef1+MdxLz#$bFKBd0o5HT5Xn_X61b12(5&!(J?HYiE0; ziRvNPT*|-mczBJOc!(Kwl6tc?jvOR%eRW#rCP-wxq*7(U&#UlNU*$X&?GOJI60OGj4qW_?T@$ggO;z;U8k zU=OkFB#O!6C&WJ*FA&44VfvIPPQdW4dfJvUDeLJAur3usNH?!@aVhb^mNF?_U~dbEoF6|B96?nm^+(dtwyaqfpV$6(w!m50Ywm~Mh^OZBPuMe%N!T*20> zRG#~w{DI6^F8jBXvxC&pGce!`7!73U7NXl&6i2Z1VbQpb+|~Gfx9beU@Ws{|y7y|HysA^(aAa?IoIu-Iq>qQ`9wx~yqBudF zA0mrxB6$T5Z(-^4ES+F3>g1eVaQaxNo`L5ls#3qzNqWe|*|?l&{F`rA=up?=_Y+=8 z6kEV%D>*c%(s(L_{-E>kC>J|o_z(Pf4##d`AC?vx4Oo2@^d_m9cbL4ivJ1xJ54qZqJLYKwlUv~(;=SL8*ilR zaxuIUQm@-*n5Lty3HiNg45}xK#W67571Ck&PiDB6)QvkyUI(FM)Qeu5D2g5Qss5}x ziqxqdiT+-yMpygO(_K5!xSNeZ=1$L^XX#keZA&(7E&c;(Jh74+#P03c-@&^DKgjgw z`FICQZ=mlkm?nx-RK_k9Q-6n_e`enmLE^!#~|{m#tT zM)qv4ZXAs-C*%3iu-StRYguW|(yQNc=6&LLqgdRbW<3X+v3S$med~Q;F;MhQq4Rih z2e{HkqPP?`pJ4Q3^8aQUZzlJc`j(2iOl9mP8V9QXCzAU!jlZKYx!A}AKT7>frMi>U z&Ey}1>2P+;Rj0a{8g{4gXxbt-5T@IzLhbba@mTp1zwXx8{zWdBzN&gnmHk~rV`o~9 zgw6^4Jd(dVv9uH3{3IH$s^a&NyQ5;w<9_~_r3>`8p02;Id^m>G@hm==$D8R1P4VU% zS^T2hxQFDOV)2;$kPl_re0w76@MkyKIEcn$=^Mzyey-N8s*EFOcw98XwL3BBDJYL* z>2mu%sc`#Y%O9&_pl-J#OS`f(*t`S(hxm4fh}QrMB{wAV!fU0^FFOS68{nUeA_|`zZ8EuAtRt)Z~ zV*db~UT5h<8k1A08^05WKX@F@(w%THQJnAEAHn}ga`({r0NpRD>tkWl+!=k;jo*?u zO2s(Jv&<;#s*FqQe0@&i(^VYrhR|U3?j2T4Hcxk8)pl?^jO39d52n2zztf3l!)Ca1 zpP=g=j|W-(I*mVxVrvt3A9DMWIfAW+%Ke>aToc0=sPZFJ@gY#X&+(uuyrTAhi{VXR zlib(~CWnjU;n3Zk&poVBmdm+Oa`pvLe~8Axju$aEQCtL@?s9#1o(*&yfd~7rbYqq_ zhRy%v#w%j}NTu&#x?g3(IGwmDn-YzE`4)`_iObIVL3cHLDb&Bzv0tF?VHzKT?h9(= z*DPru=hl<6yR-1HO6P&*^6g;L#dJHvwTD+4A0(MN{Iu(QUiG&Ya%xlAxDOu>h0pKU zydx&9Wrt#kdQ&t$%DV^H`(IZX=4w+|+72uGLiGSv4kW!lzHcRp$*E}~T{J#YA@d|I zybGI2uxTTEHWB~5_;?6w2hhDO8&(sIIeh#?yoW&bQ5v6Q=^Is@nk^b#bcp2tfXdcb zx&xHgw(ehsA78WVr3%%-q@Tj~;UbirYAa%!!Eqm!9>mN2swi$iV-tPqd%6A=wmeR1 zFb`jV&6i$XD5tveu^+zu|Y5GS!d?gw;#jw3F;CJ-xuiEtEbvN}U(MW9! zbDkjeB)+{VufN6pM*fO(59semZU7D>qx$Jw-Q`q6Yld;^(i?LAsY>oyeEXo{%@Wb* zCK~cs%kd$>yG zsZMfgw%Yh99WRLA6QrM`{R8a%S%quGn^c^gpt`qM><*hPM5D8JVCJh-UqbaIQFw~Z z=RNy?#!2>lnv3&#u<1u?PjY*a+m5B{nEV^K|LWU{aYN~Piri3`j-YWSrnVD}J~+Jx zUHg;W9p5%(eS39dHg7%`jaSG#3!j%n;}gAWGN!hyD%BSB>HpCeA?GnT;)r>f1bM00dIPX|4t&m7mbPjrWn4mnmR)kdw(k3{56+P`4MOtat0BDM)^635*ux$R`E-+=!)TuRJiUmY)#`X^zF*hzJBgX z<8l@yH$H;pYwUd0*I|DC&deBWQmHlUX6~~+K9Vw@#$*C5yxF=M%#+O}a-4VWhc)coY7DMkFj2lKGl5awH z1dWqqe*+k-$)~Ivw-t^4FpZ^a%ffKKMc=A)q#&2%fEhX-GRp6RD8=kU601`zi51uzSnv95sks7 zPWR7DwJAHddYHFe3R9Q;uL+V1&uwS7*uzpuOE#Yd8H$b zOWE{&RsY|k?+qTlOKyzV&R6~0Kz?0}+lrn2NNxq;RE;()ox{@q(K3vWuhaK_W$E~8 z<=3)`#>SP#NN&s94Pm;n>c7Y&^8>k0$-PDHZ4vzfT2p9j%+ju~>CLyTpt==HdqcT1 zOqau8e3k!+<2!8qkjAlIo2SCHrExuy@o_sE`-;rEuxX8{bNM*7@^LuHcVU`pGv2Gq zsw~b-o$k0b*=@*e#OqEhU5+=2|7U!A$MLQxe!=ITXsm~kooVdN!pLn4rA_gztKOgL z|0C=_alFgF_hIxY%g1B>GV?}fXZ3b=Y~70VCTeq6(Fis($c?I)^B#@E`S_J8`xAzz zZgk;OZ<@BQj#%1*rLC)}@h3ixfNN|W?)co#>2FJAaVOYsgyUOP`nI64Cynh`y6~6y ze-4!oSob@t z%P_j$^+*)Ir*VN^oZMK;*_)E-OW)>Vla*#$a`S2YRvbsrmE%)Zk5fx#=~K;lvo>4% zIQp`7bNa&Y4m2hjKZy4Tnque2ut^jr{}PSPvKE9=+*2lOXo%e-fIN4!5 z{Je_dY+0Oa?8drHDvg_y+nD8DdC&wliT_x7KCL+O0e^$d3|ZWiFI{QenBy-{Pru$Fi(@2sZRk8RSHWT2r5N}#l(O8$<7PS3_&AnLANfy`n{m(2NUHO<8e&!nE zTx*tSG!c!?&{&_Y=u4KYLu1>j-(=qWj$C~FjLt;n#|oPUd|8c88?tqCUKUKdx>}2h zsngV#aqRr!mslhhQ;X}VM;&39KHj_1w=vyo%j`C)|03Bqp<-O*M$q}yFP1LSZ(6f! zZMJSw;o94?o>deZsZ`U|mj5|Eb9`FKjS<(Wc+-$Y$;R~|(wmRHd6>-T%#wzpIE|0# z9G{EgXY3ut)UC+XpB@U{}>)l zQm2-yR2^X0vtq#dZ0$*Mb+5G|w}@PPOwIYy@s(%E#W__?ZRNbws`dD{A$xn!-$^tY zL3K8c|3J%V`XV`o{z)udtZuZ#$}W}0jVfe&^0A9b+X8RqL3O-{e_d%C>3gb1`qVO6 z+{Srp%E0w2ed|}5u?kBYLN(FI40%@xm(p-;)Yk zGr`k-Bql>G$(GgeI zp)>iLDz%0fw!xcaJekU)?@9iTonw8UNOBIQHegZPig9a^?LlLDO)PE6(nZes*_q$6 zG}ewKmsxWTzBPhgd)TZ&TkKqudAqx0Je(`h6NHbvvwWHN)TNn<;* z4P@h74EdRl-;w*4zC<*b2Ad`-%gPlVYtz-O%EZi?tysFeipFGe$>gx$N48F9$0Bk~ z@umYku{Fo)>~2pkGu#4JP5OTtzo9WR>I{5KP9-?1m?rxhkXyOp_?l$asw`d2&n+EG zE2jR;*7Vij^Mh+l#@_k()))@$SQ@SdnKfu!#VgI&8YWMv;y*zwejpj`Ga05)f={+5)irPRn&T*u_j3<}JkDkx;+A==2AlH%H>U6C^I+@wl zYt8U&39G{KA4vT`Zo)5?rcX7IJu8bxDnRgA&C!7sso{03s%eauKarow_Qh3BHLG~J zT7}N)GT*oBAZ@R~plEl3B5Ix>sUp z12%=@tB~kIZ)!#dj7T(=VRCxoR8mDU5uL}@<&~w)t7xoBG7$++(`_1K>H?CP5t6%+ zjEBK=5xK@y{-;*0S{mKLTa_rmMc#2}MdBT;HZu4Uz8Y>j_e5x0SK zLphbYkv=}zBP^ZF(peS58(~K)wsvq7jj2*?Al($-mN+Lq#?qgwuivYAVSYzNW7)A=#wzu^l{Ct*q@pvQ*TD6*l2z z>Tizdo$IG1j?4xtIaa18UWR#X{G6(hni|HMs_!vxPBPdhKFsd@2y;?@h`lY2aU{7KYJt=sl*FdnrO7B zuxV38BFL0#6Ym#7FCBC`UC}p_^cqem4<|5{>v3seCP% zE+v`H8M#PBUt*EyH?E?%n7%MBk&M2~(&1b7s2Ww+v?7zvnl2g39VE;T1wTlt#K-xxEN^Kl-@Xv`FtyvV9QxtLy@`kxp?G80NGuViLi&ZcBz zA`p%SqfAo^Xe?Qr9@my+5N+jqvnu=1hPLdCCm$k}$u{+EF%Os9ZAcs=S&meZbnvXF zmXe%DB50-u7fTn2;qq!S4#T1`)+YMR9GMGp?Z_pQa^zW}SO?Wq`D9~jl0h_bnHU>7 zlI6iBdQ!dfJ(wnnjr_hPk1_!keVM}2PlH?LjcAOmkxO38tK{lLBfCb)+tjCY@7DA+ zWyf+B#jZK@1fPP;T-p{^*>I6TbCC~}d>kx65bSF@f9Q&Yzi z$vndEbg6WWrOsPWogX_>m$S0To=AOhZc0PRjzprwB9^94We+DuxSd!m@O`OQ8^Anl zE~plLVNEoqYh)ISkHIFA#lx)oi^f#dpc)pGj0&dpF)s7r95ShFiD5Eh5wz>Ma`GU| zX;DR@bkp#yiD@Hi_|&Sb$ikT*mFdNQ0t1_17+zkxr7QZ<_e%#4=HYnLN-naQPg6C5O|m%MCDBWz$+J|1V49u3 z?5Jlw9&5we$Yu8~dj`>v%nf(qZIMgY$eh}kzC(nQi>c6DICQ{k&$;u|! zM6R)Ob9OmO&4^sygH3HrJYwY>kDyu)pJGpXYG#~bXQt$WO;}vAG1z3ilKfggU#6Qx zqcAS0MPGY_kqazex@S%i?FrsPx5pRs2&YVr39o#MV^kdOU3C z>gi`;cA}W*r-G+WXCFRYHMv_5jispyxo#{=RyFkqg9>Z%j!4#iK{ZlgOd`6t(ilHd z#e-_lOb^aVD(_B2WAZL>Ozvi`3BK85jivRS6?DSYJmO)ZA54QydR%PHnk<l!!F(EZLHtnMphqG(D%patZ0MDagg2XbE>( zdtNfCVHJ%qJX%Wah=-{o;YBhh2&SV2(df%$o3(W2n_yF7kTqF!N3LXl&WcoIl3ih6 zPYV&JWMa*OL2%;bBQ?TCyqF#P(8Ai=~lF-1CUO%x_t1X0Av! zWIl@4Xb;xmMtGAfs@WP#v&stM@i6v9S03>(5lW;Y7l!8%Y)f^E2aD;9iyvwm^D~@FIk+d zDm+g_V`(~gYGbf3J{CmNzatk+Q#b0cChr`jX2sSZmMGUWhI2tR`y_cibt=p!_Wh{9d zJL{RQf>U1MoGTY3Qe&dCWN^VWoiWIVbJ3Wug}tTThpqQBC{-AtMENYSk$<)Z~*=I#mR*boNa7?u*h=ze-aI(0>vDDV&ePnA4FI?`aEGVw6S3LnGG7IXxk@F5i?sD}ZOEKvy;!c?cQC|*WSiC?ihQ7YM( ztSwPb4ao{TmIj+3@oULcu3~A4Mzoapl?;x)h`l*r1g97F0{;h_#W8&6x)x zS&K$tb*UH8SE7+~N*@ew694j3VR-Q|+-zQ96YZ&Psea*jByxVVMQb7y|6^6~$l1w> z?4sm-oAk!APDy1g)|S{555lZuP|zv%Mmn!WXBd*G7w-yhgG{a%s}jS4P5B@+YS9S(JaXMcp;%fZOP-b5 zP_iR<2H)5l&l5#Ye!-^Hfug;{zm`>{wiauPoskSvGmmGT+rab4m+R%4MMn+U>>`q4In)!Y5AbN_Iu_DuS_HT2QVr{h5 z{?)R$RGk{rVtdXnwuY^_7a{L~g>#WDazUp=JZFccja@t1^2pf*m4awZu2>rGBo5J3 zzUFF$SGjt@Cq9-c6}}~AiFmC>Mt7tm85Ck^;b-kxu2fhRos6-~O=Mk;7e8}_InOBNMMMrR~c~~$l=j3a#H=fnxyy(g~ zuV^a_>~2pcgA6k$4oe3NodZpc+hb z?f4eyA`#Du=IATG4I)LpV3MDTE%{z_crr$+-oY z$mU;RM?5K()$FZF7C#CuHGR>QoXHi+c?H)MaV@Ck`jJd5Bav$tD@xRgbgonKDObt$ zic~Br7}b8R{k~XQ(_JD|v$JMnwAQYa=Q*p$rJ5%%fmPJ&#P$TdrI?dj+?HaLuyl$iEd*wK&)GMSC74I$^}Gz07ZFh?Q#=X6AXWS!^%J zN7D+;MQ^3N(q7nCn3-(Loqnl8E6yl37F=o!$oG=HC1%CGnkBI;e9k#ds*EcYx?oal zDOLr6U(1&3=H7t9?^;g8hFDZMQz}6DxxAj|we0-AF|5TQX9R~8SE@ZPc;&aXtCzeg zmX*9H*;}hb1?6&f@hm?4I>XB~YZ`Lx+P`>TDnt#X71{QGF)fJK{H|SVMKu5Kvl=^! zJw-#Qn}#K!#=vyhvVJHXGk*NKX4GWMYXyN7o+S!7qeP>udTLpl*YmHOldm=W{_nG(8Ohv3 z`+u{#L_U=ub9IS#sSAs()3Zxn_*b<5x_=hmYaCD9Yv{92v!@oR*jXO`|43F2 zRbOh?`?U>)H^tMUv38{zinZ&OD6jbG*V^KB{3^(<(3odMYc1!Qy<>as*tTukwr$&ZW1DYm+j=v1c#}5bq`&(8*SE6ndux(T z`s7sAuDy4iv~EG_e2pJV!|E%cNgUUUU9>JO}JJz1Mtw` zc`IB`!}T7-0iTxm|Ld_McKG}Re5UdLS8JN+|9uM#uD2plxN8_5QTSX3;`+a<5%}c) zt;-4b&H`)B{eSDG;PnJt{lD)Vg74~rZ^9rP{1I?ZH>}YKSN!iYP1Xh?~ z{)Img?()BTxM6Rc@Jjsu--ARlA(;^`+{=oDVJH804FUT_!gmguzs$GhbMuY)6W;BH zE3?8YRzxz>&Cli+^Uwc1>xE}C!FP(Ae)E(0(tKh*G#{By%@^>#_we`tSF5nz0!V$N z2Qmcd1OLyA{4}qbXUqriO&TIgk>kilq%yL_{GP0rj3!DYQFAde+d9+EIA1xZIm7n8 z)@R*{+rit9Jwxtr z@3(bHGz}$`8^U$JEn~vp#NToLd;E9ln${{jH9^|0qgBW}T-MBQvKCEor%cOwFw;%e zMP5Q#TkXWmkXy|v@PDuTy7{Bf59iNLzcIfkUeWW#9$Px2!^tb0BMX&sK2=SyQFkL<&bw zbvk32SW}-E{fpFd)hG6_xiT-xb}n^Z_V1}rvUSgVl`T$0oFfr`*h0=7 zFn_1~T$esM{oaoeznl5fq+fc8*bPfVbR?O<^~Q z)tWn=G}_8N0$u*h{FzKw(|i4_@~3TJs9Z5PB!0?z3++f&;EH6nWZRVTKILe(yjgmB z*HaG6YX6h4hPSA?P|d&fPx0TD-zk5_W{7+bWofWjJYbpRT7sw3&AkUQea*~gew*p2 zcQLby;L&%sjmdG5v-%pjfe`oK&iE%|rGF~lNP4Ftp-r(NNG-=FcbMqG{Nnohp7`?l zrf~|ri#X@*;y8!IWBo(LwfWL9{*|Bf5AuHwG!d66k7-+30BL+)piTz}tv zUy83Ax1F{Smr#$rqB$+<4VF|x;!@ro80Y`%@4-J4bE|2=yU`uyBs=RaMy#O=a!{6Vp0*IZD6kdjQ@KeCj69V>Zil46S=KFot-^3sLt$k z?`q#_-y-i4_5ziLr=YuRQnGyXjB!wDEq)J7_gC_hfeikzlwT_nS`#aae6Tln_alDN z>$qk3Rj=?fHCs{tlM}`OKl3Z9!<5L5+fD!m3+>uA=|Au=f z@>s7pgVyTe)_422qpPZQkR)oxXA2Mr=)Lo~McHjx}F$W2CJyPw5~g0=xX3{Urj7@K;)( zoeNcse@8|;Zn*al0eS>S`VRTheA_uEvw|4peqkq(?lC23sGB5{uND~LKjhZ~b;Q}q zLL((=B%j-cqDycaeTJRm?d_}YEACBUb5b2Wk~5dJVq#)Ak3LS`A)F69@_+Py2|N^* z%e0;rz8~KLwebymNcx#9-panFzMkI2Y&x|7UyqiuFEC$58$)f}7aQ@f{geFV0~)_V z`k~$p(yx+4>aQ`ru$lRW!bFB4j!WP-C-n(g^;t zzo7rJe>k60+M*r}=7^m)8`=+}C-Gvm$UgTT^9}X6y&IX@WL508BdcXx91pwn#qwq0 zTHu6#zyEaLsqjrcuctj=SQX^VA-8y?3;)l=Ud~w!tzvWyd-+nR@%H0T^78j zu96sGXyA^&OyCmVKsu+s4)%x<$ZorUUceju28JekgQ6 zYbjq5oP5PV+dyZ&g;+#+rRR=(N!+x~aXt48p^C5?cg?%ryNClkCwF@eyDHeGC$C2u z8oiXpQ2j*$r9avUUqcd@Xyf3{qy!%<2UV(Q;PuqSZ z%S8pFidsv`B-{?P4m=E`33H^=>fT_HSkioL@8Rx3tcSd5?S&Y6dG!i^q|Uj%Ds)#7(*#Cwlw&j(b0{Zh8!?)U>TN ztHx48oitV+Dr^GWNDZvyvq~$~lfksuBeR};ELsL1LRs05+#By3?+tD(GngEWWjJzL z2F8;iPJbj<7Kid91MLH)c(?dbUZM-(^NB6iCa#$tJ9VB}%1!q!g0A6WCsV1o8y#oc zntUATV9Ze#h_m^rfuVtVydeybmuM|Rn`4y_**?L&koZd1;#PSdd7a)ate<*?mvt9* zJVxrp?}s*N38}m=A@JVcIq;Y7C{0!i2Fpe#C%;;&x_WvzDuu1&t>Me!d%{g-nv)B$ z0nW_UYl+#BS;i0LwYY#U6!_}D61XIsfv#~ZTqJSWl61u2j!Wnt>>zL4JKg)8El=;k z`=PgOw7D?aD|lahDJ>H`e4oHxsKvZe7qwSVi#|5j+fnyV+)B4#Z*#r9g}p47ooPZI z!FoD(S+2yL;d@$L`LICoLjz|6@A%u|NaeA9BU~!+$MTOevnNExnHXg1dGAVYHS?8R z>AB%rWy@)9q^X+%gOLz(TD^ziL-x05c>rTgT z*8R~w3u?*|PSN+t&xD6ii{JbO_=Vyp<&#l6`aIdlHrv(NbDo^ZtmYngZN5U@(rkIE z7xeJD*0qVek^IJGB`S*ikwCq`>%c%EAx+gThDO9&THMZ7Q2pQO5L?c>(VNwKh8;%N zC)&H8*$tD8O%6_0>q$xeXrM*leW0SyU+SouMwRH#>YeD_ z%DrN8Q7b)7T^p>Iple*!3n_!d)%@PTj=&VYn0QDIXzxRf;x5ZWM=dN5S&nJV4e(C! z?&d_z<+SJqPk3b~5x_>nk4+-UU(ua{_K*we(xPA4Fo^&11I5uFakZd6T&f z9PTQhe=Py$r`srLe_Aa81kIhD71fyk{yZ|imEANu| zQ@zVMhTTEc$IGGzY#GUVQBQEBx<*j}{CzQLWN)zF;8W{}$kdck&>;e|U5J6M{J?_cJ^*eVQHR z&EebXmDqBCH*?VJ_7i6RSYOE0?J_2ofiB)Vu$>Q!&D0*j-_cd3&t3~vJvcR+smoRN zHud)9#xnECf3X&zQl7@!h5PIIl>?%|bG)5@%1;pqWrDsA@Frg2I$WJSi!iSWqE zO=YrCaZhd)LT0ht;dLXG-^SM$yhskZsd5Gcz z?{=;SQ=J@#)p4d0?h*~uLv*YdHREJ+r$@331?1h1<{{g$r{{v zZ=9RL8q{pO12A}-IWpQHcv^if9Tz(BuLH&SVZt`)jJh`HiM=+r+I{W_?xkC^hq;{I z3*1b0B7K0!g(V#$ET`h$@Gotk{935ZpA2N?dkQ0@V(NUOU*uq-p!G0B@hGfx9XAd3 zGz;foDwCfv+$CCfCtF7I2fM0er3`*|U}9hp-%Tv6Y}Chw*T!E!O}X8dafuqrI=maa zgm(!0l)^a=NlSbRoB9o7(22&t7&oJaVpz^69L%eCyG!m$-*Hv2MkBW_S5*dJVN z;9)rXFZBR#;~wW|Y6-{phF9uwxsceHpBMNZXeev|cAGb7kLFCauugD}!YIY;BUG4~ z#TE9xhbVINRbXQE?I(e46b|jsPRJugo-fb$;KvKIpodovu8&qSKibNmHasUah6%EJ zxT)MUb{`!j7Go2gAxqQ5t?&`OwsJ(Y2o3qM{5YYSbW;gJM@16zER3@)<|0+-H($7C z+#A--EFy<{p1SVXCY!$4lb~NcF0~UJ{G-4&zPtEW=JX4pld*4RetSo>I=-E%!HV2G zZ-nd0zMS(t9zA3;spLez{7VFR!HO3fN?kS6FiE}&hF5|Rhs2W zc*}V6bE!-X@)q{ddEPodIWRgcD5`&@jY1**QlJ-~Dn6C#>NUdiK!ZN^y2F&@ z_H&iEC=;S;6TBOD-mx@G{1?8Z*HG5L`%3e(`AfnzX|#IU7#Nw5xN4!CrLpg@H!^E- z2KSx)O&23SV%c1oY=PwY=>DLrK9B|qR{m6AD&JDXlrehi@R;}krrkrit41NfD~Md_isI`|@5*E|3$WsqkA`H5c4 zj^IXf;B3)JVm#K``PR}XA%!u}s12mG!ddN-b=YCN_<|vFMmQ1B^_3}GI~Dw#roB`0sBd8fjb`K z9zgYfpmm}v*3^lB?%xbiT&jMOJ`4N#&O9bu6gw*S^=H8R*IM2>F1lIb9(9*7+5ViL zoyC--T%c{g+j^RE^j)yAHbibGdWD0$SLi5?mAh$1FiUK;nPMM^R>8Ybdl(DkH_bg^ z?ocSPA8K)=B^KWlUaJ>V){8pdo7v`pMGBcdY zhc^RS(0 zj>6hHe*@Pn6lrZ_QkO~hg{S-hzPk_-hbzbRP2o^{jwR&4u|-5Zx)@uQ>&hKu3o+lw z51yi^)xH`K^-VCFmRZ(>Tl@k(O*k$J@*Ay1s8(#Y`NfusCOvhjGfZ)AFPED;%}k-T z;N{!{9IY+c5@Og24&_@Bfj-rr-y=Mf4ye9hMkEIAT@~p4JBhjUcJ?0k9ikBd)Hs7Z zbRM)$OAd){36|2D%UQ(>d~@CpTr-n0SZ@-Z7QcfC_6KMsJP*~E`N7WPDsTa2A2?h8 zqEo?3I~zL^O4ai!U&S865&k9rUHAYP-Y_^4Fnp-(tZR$q)!*)mowv_Kmmd&C`lHU1|*Th!%D`lZnE*i%ylFLkr$KG}?ku*bO`poyS$8&FD0?J~xp&&4%HQIu>;P zW3382JXi3snnz9(G2trTQn)K-S8C|4aQ*ltB&Q?IeF1OjnyC||>B3xo6~9?nAeB|e8wDe|64fkS9F5(d@vl@ib`W=lli6a-3bK)B zfoqDblUX;`E%a2oCHE7*@D2IPd}Z;7{8u|0`Vh;4)U%gD&w9>~EOUw-%hd#yl1_cX z3%C)-A*5TpZTPBwUTF*5?<4<%eY*bXoN)v@45XFH)KdGvE$=DZpkT5J3=UsPB;x`p!(zqGi6E+(&gDmK& z=b~+QlRKjif_=2r@^Fz6Ht-%{w0KXJLHEaFeUbC_i)alzKh=gg&(`B~_9k;0Jdx_| zoQ^X{^*9o)s^?LjiyejA@V){fA)i;tpcbi^JY;pbT%O^ihq=Oz=PGk4Y#P0m=!ETZ zuCg{sTB3^4Rh=Y_7e?|U`Qbt<$xzA}8DW3iYpDi%^8|lQWddA0#YNb<%vo|WI24y` ztIe^oC9pTDyjnzs5&S#8rnp`{rws~C1~v85_R%%kvy`+!?_U6WQ<=?87boVqdpq2g zi}8QLy8c$_B^?6XxXvFJmV%nP3M?gOaslYKHP|zv9i54FfX+Q2TL|!ng(}i2WwTx-+%mo&czAyIJ^U>7gbA}Hx#?_-zC^z8bV0}28z7E& zdMHH~<>ip!`}q>WR`H#DLCX;eM8nCPw(>62(}j%FH(;eTxj6HQis1|0ryU0@OB1sq zXN`91QfY}Wi5~%b(+@KIh_OEMZ{n{-b)0wmh+kBKsll!0ez0lGTCyTcV6xlZCQnAc z24`p|6?>G~P2IvvxwAUXBQ4_v z!lU%AiW{7!3_iP1T=dG<)$Bn$+9`R*O1VNP;SNR- zV7GUKJNy}b2l$!|)tknZh&9>VI@nnh8$?*>bSA-8;uf$O^iZ;Zr?x9*T?cBaPY}@> z$sNS9!Y_W5@KMaFghKshDW{22_kf_Dv z%VI;}49^Jt#NF}{t$k=j?6MiN#azog%gB#(PnP69vR9d#l#Y*gPj-~I{EpuV6NX=z zD!ms7A-CWazk#;7XY7o;PgJl@baune5nTYMI4%=ciJe2c$#kr+%V9f_>=W%2d;l5# zOL)#7<0lBI(tKsBUM*ZBJ_)&Me~r$>mqLc;;>K}L*;>qB^1G)sI>6otNsTk%9(oz& zvRFV^%qzhBmddj=CuBHk7PS>}eZn%6N9hS{XRbO#F)Lk*xa0opxM*3Hm>YR)EK`3; zhVTuLc(u?)vZ}p}hLK5$OO}t0y>1;p2wmeXn-8KGr&p7`JR4j?ZQ0H5Q7t%6`&T|J z4iu80-kyn8C8})*9gIa_9?}`rJ$}%()7b>Oo$b$brPktw+|?Zp%h~vn@NIB!ib$IU zg)b{~5bMjLS~eJou*sIz>7Y^06W!?&tcTNBmB~&oAv$9xo#(78lcQkD;M1zfWke3D z{}S{?L7|N!;A@{p9@|dv^+AnI$1A^rgjUuJ2WXc*aKj8FqoA+dsxPlyPo zr0VKiqf2CI;)4Zsrn}1!uc_mJaR0G|*-dmcvWRE8tFO&xK8fBB*3|mTUB!y9H~WQx z(g>xG{wwq@Mj|cjy-*s@P4#E4vxQ)#r5KI$;G58!_M^zc_>Ay9eZ7(u)Xi<47FvqK z2DiR&;(g6UTtBm6sj>vx2hDRI8p4B5A?jYFY5$vj{(+78^+~ z6fdw8TcVC-kfV-!A3mI#!Q5bTLG}BX%j7PP-}S_{&}d?nq6;r7n_wKz`R3nu!JE%c^D^ zid;zqExDa2Hk`;ohne5(4>rh@qz@7cF~J$NeoS7Dz72NMrptrGs)Aj(36989<+DCG z+%(=6=>g8x1K>qoW+C+Om25%g2l?028=Ykzjr5F93jfugD_x|Mg2d+*8jC&TI@-P9 zx#;_3!Wwn%#BLI`X`GF*5!MEKGn}wuKIc!%{=}Nd2V;-wm21Hrvj|^+r8w1E1`#Qr zm~A=XSmgeOucD?io7him4fYN_nVjJH;CcYnUnN#KbV_?79~B1)s4!pnDms;4TDMU1 z*b?)N&2SxomF8sDvZ>s8b_COfT7#E%cXd>=*b+a&nT%ITV`&@2BDc^)Y$RK>mO(n2 zIa%4-#F>JPB?{97>);$5%~k*m?}+Vj?y)XRPLA#iR@QpUjYUeh$4?RRO9zyX`ik&| z_%-CC{Q_DX=ctCvVKxu9hb<4)|It$sEpNvWKIRP1)t4$Yq)P%NG!-U_i{*aWkKm`M z*KBHQ;`)UdL??*G4fYUwlKD#2fSGn?r(ijnSQdF;tW@1{6LEmhQz#?8mujh<3`+!0 zG_Xu@403|h_UG&_n85jQc1OR-){?u)(;&IHbQObaVq$$cgU~om^-H-+L zq3C~}3*-k-DSIJ`Nm?Lt;D^z>_Fc$`_@MAp{ed!BiVNL@t-={`hg?rv5^NP641D^m zb22#TwP+2h@gRGGNvApyrLe`$#nv9l+R^^Ogjz*zBvymkP=uWlrRFe>g*U~IAvf*& z(872YssY4bVY{*a(JRR{9xqziUJA(@uNFS0|D)8FP7AcqPdFyNlFw*`L-rVJ=C{$V zgV;Ty4jltby~$o=?olpcxBH3Xyk#9|RKs|nR+9UQy@VP9F5Z-ysEdtOk%6F5_c;c- z58*ATT1;Q|2oQee=8` zvoMQTj9bf=WCT+1bVoL!T&EB!=*29$3DVx@FxdrpMqDRio;gkITzbR(DVc5 z5W62bs!X+l69%Qhh543v8u10cs14<@;sl|cK#PZ^tZHS$4=zkaOCLu)K)4=MduBX) zie+JMI+FuDKU|9KrnwY6*rbLjpT$)|ns8R&q^e3beL<*0Y>>Iqw%S$6(~i7E*JppT ztJ$_p9cn6`3#z!2rB0%8WQQ?K{U+rQYY44`HeyBjhgvN7EAlH5w-}DyfE)9u;mk~^ zsXt70n7(hpWT$3*mwXYWLzgr|{w3}fY6^FR3gC$>`Tv7XD2hK zsG@`gYwv7lEuG96Z61uOZRCmKRAG=%Rs1crQhOPCI6a;~ybcxZg_ng)oy1;b33fhR z1|~PhUGHp9%`34Fp-%b$rI2)8Xdqk>GE0q=()!-exY$IPhWByFSR8t>#_VTDu}zr< z;K1i`w{|R^Qmo*D~ksu+d^$j2fRsTvV%hv zLyJ06EzU$rWU(IzmO^(lA_>i&kPTbFGEh)cc8g&gv!ozV^6S|*qwAAa*D@; zRc8JkLm}ZGkzCZ3#Wx7=zdvi70MdRWM;D^oXfFYP*azg1#BO-71N74h4*vs zcO10rOk9lQ2*%WL@DHRb2N0%#fwq7nY!!(_BYduc9B7> zt*ec#s7XU-{H$eFNa>|8MhFV+q=hh@h=hK|97rKMgDwTFxtWeY#$^FdhhplfV{uF=qQ(e>1J#k?3( zLM!x3$||WiAXQ8#Bh^(h>C-|@W9`jewyLfR*kK|FQ^u+gMITcIJpW#hH@hs05^E#6 z@mB34pAugRkA#23X7WY#i7_D3Eiu`$*wMzl8*fIXG1Z_JPcV7tSHx$mn`?$`xY;Q- zC4}n56-s&{OcXrgROy1UUB|-jWA9+*bIw)4Q-T~r2bdXbUiJt5f^^~s&;NAjO2 zA3UJNWmHNRHbUMUg_??kmpV1R0Xb-&3|RaRd73sLbJCd=^eA$Rrv%KVn;})=ox)#r zUAZE)6>kfSSVbzUq-%LY@1pOLf30tvgR!Z^Pihu?$IL9p)PiZ~D!1-%gVuCJ+kq!K zOFki9g<4!8){;-Dca64@(uoR|vJL}ngrgM3lwn7+_n>R|2@xCN+HBim?ufk!4bhh= zJtRb&D`-MfX`<3WzZ2RR+hT6E4RiUy*)B`pVkQ9IWM}eF18~OO*iqk7DbX%+*Eplr z0(aw-a8B4J_6EEu82lLdn2;<#91Gp&@CH;?CWWobu4IzbPGS@0f@y)pOhl`N1g(Nn zQ_3XX1eSVC`lMXci-v7+63K3lx`ucfk)!EHOat~8bA;XxJ$wiH)BX#26aO1-55Auw z^${-$l7L9x<;mLNV9RLLWNm9%=V!NzSV6UBDzIgsYpkTQ5pHa%a|g^(Pe;w*STZn zYors(Wc>x4*xn=>z&MN#eIr&XLEGFVP@!0n|oWd5L&M_#k`{ z|CQTmi-T#=?8)p_t8m$SU;!Thyb{ZY!sY!OFPckLhN6cb+5_!tg0bOBVfh+?|tz~pnQ-O;+#F}Dj zskHJ)O9ppGmnD~5M>^wflo(BAW_~g67>TY(-NP@qi#eNFn^s4|zYB9sjP1(aWm?iKS=@8eW!T^sAF)E=^U#YoN+rcZ0wuPU z1}SO!;!yoqB{R)tcg?}(5&yyLwj_&!KTT0XK^HA_Y_@Dm+>De7W&zgtNfaT9=f%PD zAJr2)7+IUxWSQqE;_ik=K{bFY$}VE8aMtq_R>W1`R>iCaC!tH}W0YZ1S@E^dLfj8* zbDvI!f5t>pgZWe`4?$L-H!!)_hs+jw7pZs-qLSS}gg6H0y{4%JCf0WwyEQ#;uS3R~bjZatm67WKgSi>yjvi55Qy^F>PTqBb@z zhUdg5B7^Mt(HWlRYTVfGl)fi6q-^w`h__KrwjIGa)w&ikp-DDfHiK9!{kilWsD zg`<2jV7&nyt`TvVYQkh<<4l4sK&=K$z3g~td6$SsMg%)*U*#0&ji~q(l>ZCp#e*ZQ z6YVWE9T{j|{3g`KUB<(XWMb4!;uF@-wG0&e;@F+gAbpRrUTP!yg`R+L*Ol4&htQVT zMsvGuGB}1Apf)!%#n{ixN%|s5;Ez$523SgfyK&aorIwS|z)EF76(7i5wPld0nUjn) zdgnPt0APwvm zw1X!nS%qH3(CjH@0-O^%;^~O4v#&>1L8ewQ8mdWYn)nX#rhvpK7qocrbo6NQf_0~} zBvyskP1R!vU}7j!4?NLbZq%6vI9&1Qf?#Lune2dQM1&ilQZA~Ojj9nY!CG97t0;zF zCC|~HnLO-VU{o&&8C&4GX1i~`h`GbN^(V>!sU<|QzPLi#r;OBZh9<@am|egX+kvek zeo%v8rSF*Qz*9=#I@;1P*fK7$Gm<6f);7t1MM7l7h5%k9%Ev-cDyo@W*1y_JRUMH zJ&uu>rBG81$R(bd=u-PeI7Ra;+!OrU(()xSv)DrHBh^#BXk_RtI6oWV{Dm9KO3bA4 zGaB3F;ID$%^t>jAj z3=?KLFkb-uF9V0$Xgg)zk5S=^x~M#dXgI}@;sxL-8+0MG8|LV9Y>izPvHgTZjb>8W zZ_G{lIhhlGhvsvXvJ_9W1jq2M+EczNhM_Y$rI&I~(9^{rZ!%d8$9(rraJT+KGz_K` zvx-V1iedjaZvyv!6)gb$ris#Bsw3LO?II~RP>UIx!vo_3klyy(=mbx7vK76KNis`7 zGn9mL8#&Q|_6f+e__1&$qmhb2rY3|2;t;8;Vru0=@1s|fXROPeS+N4dN~$8`WMw8o zm!$UNbKC(3ZuKS8qHBVKKyA2SVjv3V#Ln_f^|{e4QaMrHlGpJR_28$;Jy26_b{G?+ zPJ`Fb!Zpjb$lMb96TqPTq$KJ`?i-JQQKyUf#kx@aR%L;ZTu74ohRjEaGNSmAtASCa_pMX@+grU3ooWaQ-GSQD!UC8+7%LAHv;@A!eB_7{(CefTw(C?l8}30z8Vb?hJ>| zS}@rndL_73S z%&)QB;HK)zW58lnXf3Xm_9`Rv`=JG~Y34Xvb=LuGF>#x!#JpkFG1KYIWWw_ZE#YWo z>6_RRDI6@Ly^||SgTygndkIy>Xw!m7^l9R}Wr-t`yEuNFoJ5ajwlO>nC)A0$*jHy> zTUFqnk2G2`ijWC5IT&vl%! zJWeDcQ-UKjL}@M!7YB*ep`$j`8U}BICqB;7!tn>Z?cL-wdJ)`_W|mQnh`t!&s%`6R zPL90}tO$W9>sbgrJiDbz zVqydfW(Mc4u+&2wCk~JbDBHAC!D>+|8M54UG;w#u-;>+u)y!e$58Z}J;&yBa)YQjh zGTH|wTkDiV(h9M$_@CHVo~pJt&V@(CJ0g|rzg#6fJQ1O)!yW50PTC|Id7Nl>`!r;I z{8M<6u|@4GD`Gpq@cq&PCA(fP^f7t{l-MBWFLyd#o%%u_guK~L^W+44fcuvtEBu{D+j7ciX^Plg%q5+ct(t1|h-6R1kf-+k=oYBrB6M@e8=5&n%_YuaeOza4pG-SA zKdjMIO_M*v`!0xn$q%~dTWDUax7omEarMR;5=$sItaK7Hh+Yh?$W62$_%H(!dw@|@ z(=z1N(n4{gI9*Cpc4`NM`J(>BeakWj>CT03BskK5?mv9(KDDipc(Ac4t%G(xO13wDfs>+L#)0? zIVJrg4h1H*LVlzkHSoyQ_!eZ8oj~h&BtoVN0rqERo>JEdx95SYpuGh$A^s>l-q;P8 zYL{UCCSH+tC}s8TAtU-QdCWS>`PKahPo>V#6PcdODEb1~7_Z~L??A03l7pjC@V7Qr zxhOplkBdVk1A2J2;Dksah{jEObHG$LsZu_s5A&8D55Dh4td;8+L<5Tt2^Ta5s;z+; z&li7+nPo=3s0TuGV{OeMwolGVSZ1OP^$far9i|#RjQj<-Q6EkT?@RoNj15lKQk1dM zCUKKELCT}d(Pjn1k&B5nmQIeZFcTX`)}iY&qnO)teeit?V7HyLts=PTFGKrur^?A0 zP>Y;2P@V}BiiP1~aRhm78|ylUjUg6LALuTOgZW7LiDsU>=xX~t(8YD(Tmz-OkvmF< zp!dI#b}Bjaw9uL8lw^CW*SQ#?!9({S2sO2k{z^{8r@HOV>ejBwrBNjGQ|qp*l-5Fj zDYdmRWR=N^1kJ0IcR99jpR@1fKcEglotsqmosx3iLuM^|o ziB?p9>p8*~Vhha9HkYd#mPYiZ-a<5LFeT_#iX*|H z-mP5-)`BWlEax4i-IehpWIwtcGYs-3m3oQ)anE$#w~EQ!u~oot-zb{&UR){WmgdXH z)M>_}@Yr~Bq=5ad%jUU6+@hS2;W+b{dPwB({B+f`j{!#YC%oLa1els4%@S{do;t5I z(?^GFvDeAdkT>b>cX$!N)H%!$V5#TG8qgUJIlfz*z^E<RL$0M)ZQG4w*t1W%@C9=(bcoq6HRnwzN$%PeZ>^^~P#b*(;p}b~`{Grsgy{ zg;kh|EVY$!&BU4$6QKK#Vv2!dRFGT_p7=d`6v>t76Nws`w3l*YX^nVJJPFD_1n9po z+B{j@Dm!|+d*HXpQFKeDJu{d7O)kebxr;hSSvMzNN1KPr=tq?I(o=DZSX;U%OX__i zPvjMxhZt+e(VCv$#8--CMldS9gIY{H!4|vz+I&cz_>OQ}V+GVyDnu~@&KNkXq?9tue7%Sp7F^@D^UZb`$)`rW) z9mpHV@Uz$mVm9@fZq0=0N7QGc2AuYsZNGvj@p_QqUeHB-rGG`g$V-=$%6g;Fo#^~z zCoAQg;2wv7)TS*7RkK%vQVWos#KXf-b52_!B zy%~gG1J9rYQlUV}ohoF6iM-@TkTm?nL?rr)njXP0}mzJM7J9<*oJ{bhweYW0~Vf!fEd@ zWLdf}bmHZ-le&(7c29Lav<8#KW7|U$p-)AmFX9Hksa2r-78{@8Tykfmg#8gz|5@TH zWzvI~7=3{{P9(5ft^)S<$ej3>@M=&gy8v$viwbBBMVYT33YCk+lh3U)o&UM-;BIOa z-H0i|l&8m&2(F>y9p^0H5_zJ>f+w_Q%1-GT)Z$#g@TuCE;Md58#0c>3&ZAE~t;t+; zL8dcvf-X;4h$7f)XF*$gb4e@|x~~@m=f@!(gz6s;Zc0^SYB+m5U|z6waBatW5|gMG zfN&=Lfs%-}o&DZO^+T69LT6?D`gz;8~2F3Q7X zXX?<~A&M>Be;gI8!;=@IbwgG4dx}HGq;JrPF{Qf32Kz*uiATs{JBya{JOo$lJ6(l= zN~YQoumaa@Tg*(0ZwPlXcB(7n+R|Myhty22t$x!T;pMUBCj34W9HYm09PlO!14bKF zggomxhE{OQuv|!ZU_x#5w3B;er>!S}fZ7@j@)0Opg;95>MWo*JZ;4%4a3Fj^%q z;@{jWoPxCg^tT_O8+tLdft+7@BleIkfw!^Lcmm3=Bw_&DxQUI1y}3bGWM0u*sr`h@ z^U>AVz5uxv&k=cTpiuoIA#W%t2Sjn4z9i&{-A%5rR&uU)PlgO{N|O+Mj_ysG9;bVg zyolCB%;v{rYEyfL%YU9^Ze2O&+*6f>&Nr|T{R-93M0i}1P>sLK z-luv3^ZRAi@qf{B>esKru{%*jUB;Qf;Mye$qcERL=H}s6m(H=0Z*RTp?E#*ABh|HxzWA z{t%lq|2REGNs|&`qJGVv?adbp$hm4w-$!t5j&LYs0(%ba6<)bYMI3}a)fO^*G`P!u z1Fy()V2 z>-j%x+45Q`-y7pa-Vff<(s_A{hC!k1Y;_P*sX45QZVC5Xsw>%*%3tRc`i!%HeNgxm zwMx9^@J_KzY?yvUc2I48-c&CrW-l8+dhU$ z0D|A4xN$4!a1QTwuT?58=cyHacZ0JnRUBu?m&_oP44L}PH4-$D+Gqzehjci)SoQ`B z`LJ3~E+#$nR`rhYP7xd6v&vaLDR4hD9VTjDVE%vboa?RYxl0i`0V|H8F9Q$n1{1Y` z-c6cyD_fOS9x;ZI`d1X|bMll&0#kH_&?Fh%3+4%N69)xH7O0A80=w_6KGf zJ=B}{skqKt-20dJj(8roQHL6-fwker_GeBjbCG+=S9iU1ZE~#>o}u30+Qg3b*3D+f zcUpS~r(qFmcL)2^GYpfHiI2I_5sbCK;;sC3|# zenV-7r;B5~mAv=7#id5FU#;T11%8MUj)UYwrazphN=P3YhzmcmbqD4@gj>tg@OgV(X9N@NV$V>Wh*MUd*$WVS zta48(4Aoe}8-NY$BY6)flz)Na%j@V*4Pn2agThHyhN~@P>V1x6UO4O97ldB`g0HM@ z!u!RE5Sw}4Td)!7uPy|Q;(quKK=Ab#3>&Heu3XnX*9ze@Dg&8%#9>(Kn+JU<+B&(v zl;*AO?dEMR2BpEk!|wTqh1|AF1V?+>IuM&fuA{CmLMxsEJpGesW7`(;`8Vl1m8yWK z#=t3lguEFj7u5#(jNp08Fh?pGVpf6jv&EI~n&2ua6hxDlrr%{(lqC5^p-&SA#B17`R^?ipX(_0@I4byP@26WK`=N%Xevg&o{E?XA2^EjL^n)+cnJ9MCglNGq=b#j@=e9INVo7niT{M!7~_o* z7fMIuVcIs|Z{{P*aK~%%3v7LB3EfwB5CxJ=fqV^NcpY#^)JRjpa1~DBe>_O$(iqum_IqQ5=^Ig{R$&y-#qrCmR zg`xWM z_r^-3yiGj?NbG934``wWy^}l2TU;w$tzGqn2?&yj+UKCHgUm0!ecBKCj8sEh=-uX> zE0)4@l|lMBnBfwj)K}CQ=r;$2<*uEsA3|@w2p};h@UWYq#K1-UiqZlvfS9)TW_vqI zqank)`aT8!w3KvgAP)j7juz^>w!138L?zI8rYFRvwdG*2l+U7dm)l6Xcck~Y_nNo@ zJ5+};JV1xf+v+=K(v7&$e44PyH4Rw!do&Z=Fx83eRBzSY4_!=QVDUoce8g9ppA9PANp%> z(M8$z5ZTlNmgDydQ=z|I5K8m;>~G*N?qoY2iU^#8&e$Dq7k79^d0BCSv|MhYO$K+u zPD>-lDe@ZA2o({UyLP!sK%YwIS~HcP`lBpkf~xUettr<4mNL$J$NK~PrFGPL#=bz4 zaH?&9b1mJ98wUMmx~qe$mv9)hVFyr%m~H)HCi^+PrlLyyp^BG!lf}>AYRHDY)(vxr z)kdVie(DyQ1>bb9D3CzQWF7}rd{y2ol@$N*?gnM60p6_4*WdVugc#dK z(0#754t|?37EbYuP!eKO7&>D&+o@0jY?)su!|-wOw0A!Asd>_7xq~*>7lPQ-a_l8f zFclFmRE129cYTJ5+LozG-T{0wCrJA;)uwV|NrS$49X2oraZ$B|u{iKs_<^mJa|T_N z>%!j^#z61yE1ZFeItBE?9ac+d3NXKJiVIJMp1K+^<0mOn`2~96DYFMmjh0j`b{py{ zba2gdeGn$`y|@GP45w-96TTDZ13UjWSP}p8&haV`o3ipf^{bH_#BfW1Bg-?dxL15U zOz>u|GT_?#mw7@CaNM-SnrnT%wVm=DDMB3W-QryXJD(HE9^LO>6RKsqPf+wHP^kCA zHy!QTDKPv$tV&%Z%7Yiy@E_K1DTDAS@uGLRx1zXFIwcR(R{MDKl%=KPIOxSyP^3`J zwcHg6o4apZbEX1$-JW2X3Xd!PQX9+lK-(M-DCNC)6c<-Z87l*2!Y^$doeQAf4CJ2+ z6J70H10Xit*s)Y0Vx3hqhr@oVvl5Bti6^~>z2ik6uxTC8#uc-tHN#PhD$Xtg=3mb> z#`Q`V$M@up((|39eR%j~V3aXb{e`X4H}4{^4zVdEUj>D#HekQ;_8-8fwsPC}bif-$ zUC}~I^p5#KE`^EO*G%=D*8=hfX|Qqq#5w52|3Qaq?@Dp) z6AJSpTbj-zhT84`+IX&iP{!l);$`n*Z&7i%bWrZ6t?>yEo2HIE8a80`zI!{kv?ap>ZPmz6%?wrVqDXP|uep{+4+&B9z${;bf~RnOH? zIDk5_6R8r!MyqO$^Ox0=6$Vd)DqipHA^rdlWj5^mE}Q+WilYrxkKK*B3+*7o-wLDo z_S`0VxHHSvI(#9}9d3zy#gydr?(oKnJ){nDs;U}&g88sz%!Amh;uiBygcdHJkj5vV zW6TwDnB$wJwfWh1MI)iZ%@$vK^S%Fy6Y*7LrT*OCA(RSA(_U%@dj~pPJ?K+wgecy_ z7J}G}v%L;A3#dA+9>lq#*L&65K|CT|lKX(_n+izG;^;|sWnOSc_!mMs*G=e*hqw|< zNpQk9v0Mly`xc6R zwr>nmu-81LRsgM`n0VJ)TI?d#fV{Z{8vK!PUHg9LHM$4agFhfta$zBlFNgkNzL4u3 z$U4KM{2r|mRPhcm*Gq^VaW1~6tka+Po5BolLCm3Au?tb0APW@iL%yS%EDQV41vWi2 z6`8?!S>-$ym{AK0~MiQ)4Q>fWvf_bD7;@nH4PNE2?dg z4@)CO5pZ~WDO#Sc_BRd(N`_C{;+<9LFRYAG1mwySXkiR0&Gw`UgQqbmbihABKcbAr z??uy_>pdVA#J?*(t)PFcS=4#}Ht=tmnn>Yw_{4p{ZaQ#h=xxp__C4X~;AP{YS{<-| z3GueKl-NnCDqjT0M|5ycxEi3%^K>UTjbo5;R#%8`guXHwdE8MFT-!zby4FBR1k{)f zIQ*?R3b5Z){g}US=%lp-(Vwc!PKGWn2~mK=!YG?FH7&c88W zznL=93iuWVqb&REPSVBfw2W&1Nk1s>^MWgiZU(V_%+Iw-l6 zYuYh1gvxC@)sW z8&?AjfTdJ)wxLyU!;TgNSB_v6dcp3dG9^2v0G}T3Z=%mvI^suS7x}NjBEjj!yu*%q>R+NWG$zsquQ9LGXkQ20mz8UaT z?jrklXF5Fry7(R;(e+q32a|Cc^Cwxwanw@4Jm>rSf0;T@^mtvOL%Il@!K+sdoDVg& zogqF`o7ualp%4;$LOEdv8V+c4J`n-)CMxg+`o>M1C{+|m@qlQ>NI9Y11|P+7OKHbM zG6g2wF8+$Z14eAT}XD8{?#g@*#DV@jlQs{2n~?jp%Qn z!Z#E?3ulGn@JFx)6!f~5L3h{Qd9Yqy2bbr=o9_|_q^NFxlqOJg>2!L z@RBcuzA+5k^6zbZV-E8-(*IO?;*VmSm}1+d>sxwqEecQIJiauU4I5@_PB`DwxrVUaML z-^i6>>XVv%w#5wY^KH>=iWQ$03yPh^Hc|j4V-cfY;BBaf?H2K!TE!kih2a#R3OYXw zRf6u{lz3z95c=sqr)Mfhahz07EGGUZHp2rHRxjyaVe-}`u%Ft)__)*jY4{ua36XpZ zH=myBOag~t0oZH4R|m<e194@Yr#)E#74yfTuxVC-0a|d0KE5%QMJiRQO<$c^v z<~lhG6r+V^LBCz^r8LDK#4=(-F+ng$eYV>j!A%TwzCTL zjhJH#g_Z_d8{^bCxsTLCOb~aAS<+8=93b)M!48(^_BhC!sa!jLyzo*OE;QpOf?`mJ z{B9p_2?kI2PH077L-9pyBhC}2NrmO%Fd2sjUWZ!Q4iML=q3i;r^QVLZ!biRnD$0(g z+7Rj15g`lg{1NyXYDwM2I%1mG7WY+bdYpfwqCv^?G)>YJAuD%mI+NXY6cI7-S&~rk+jTaq6!e1g~AH{Be#ONNv?7f zvK}zo`RjpmXC`K)uHpc(qI3nPDO>fc;J(~wH610WOr{vR#qSgD3q^!~&~-L}CLnK0 zg--@X7>m_XfQ*KSMWFgKr7!YuZG`VCR)SXX>07QzLUQ`$uzGM8Bb_PS(I<}a=rKTdce^cBkU9l6gi8F$-DgNJ^o zZ(W)Rfw)LqD*Z0+QfC?G14Y8y!M8`yd)VVJZ_WvS!wfHsvYFD94X}U7&}08m z9V`FfhSFH5#TaQWFt{3eGyitT)X9#0PaZkcxTLpV2#%QUs@_1>vI7keM zopG{~s%3y{dzZ!OXh0TV{@@z&U4;`uV`{rq;%;V=`J8_M; z4mN4q!AEf%d^9U<9=Kof7ci z&F$+Nyb&&CAMNZ%e`fC^lblTB*}oAehc;YGOzbdK|?y|+aPp7!0)8Y!JIk`};eoRw;eZ%}zsU`?cwckCw;@|iXAyb}I~RIm zOMw>>_^DhiW+s{9h_qfZr~3cU^OOwyr}Q3r_-Uz<+)LVx zP+YL_6}fx#SLaT970dnL9N!Af1@lG{r;0bkd$4DCq3$#u1A|{@`vCZM2s;ej=KBc^ z0f~L$jxs9w-LcYICiKPsR4=5Oc$Rcp+z(vyE`Fno*Jt=2z}9aWXa*CQbI?;;3bTZ4 zekVG@76Bhcs%WXq-;7XWjN*X_q370U;y3C(^ONhtmk_E7^Z7&+ z$<70`S>N_8^jBb#aY3Cff0A;=D`GQg8J?=BaJMkYoB@uXkn<(%#IjHjCQc6j7=_uL z^j+tAdriyx;4a@qt+CP{7X=jeL;M12+G}+)An~a148SSZs5WdeIt$;lu`m+!;`0mv zNPMrgK?wUjdObB!-Xc90?}+22H~5P(P9Nt#XA0K7jwxg%W;Dn1VZNGhj2{OKE|#w7 z4BGZX-W2n7)q-+$?3Qkbze%;RDfiGS`T7U1!z}LNY)oHfx1$eyZy^ElW+YdX=}lIL z*vv5-_*;O2^8jM=0KVyE*oX{MBaH%qp`m}Q0+B%7WWI6z`Eo*CVHIB%6=T;^n~Cl= zU+7R^x$#I{BBx6E;#tU>@wh9X%?rN#U@OaB`zz;Bn&sXjmG2>h_-s@h?m=nJXZEoc z&V21l(}sh7Ukhp@ReU2&kuRuIjI{v|+!9&>vpAM5f|l{Mg^I#3KAU^WlmgE9**ZH^ z37k7q)pqh-$kgW$n@9M*(pGQmpJ#rDU0OR*V7hP?KEyW=Zt=^|akc^7+gaTHFgzky z+t){vBr8^_PUlY!M(mqT2s)| z%1Ot?JTX_=CjU~87|(%EFSb1-Zb9C(Mtk`tP>XH(JKP4wL%wn>uoek@^#7|@1b5O- z>67?cTp}shsqWCX`oEd=pr&>}zxk6Zz}taMZR5M3A#5fUBA(bLhv7E}jG9`eTmcuB zUWpB)6kJ|er493~4`ziM+Q&IN(%0C((F49d;Asst<9u{Ql6PFQ^f3$gOY3`-!?-)- z+b^j8Uh-PCh0!~33Y6wvL~lxkEzC^5s!%}~1GxAn(*WEFlJ)OU%Rnt-iP}?sBIN-` z83N4jq*7Hc;U8q)vP3$nktQg{A>q*;9>f>XnfZ9yWH>cKWd3;AdvgAbumFi}^N3mgrt`Q~~5HNBMjn|w*KNe=0@ zR9SASz6VV_A~ei;*l`won=82l-p>~nmhiPep?*dEBn|_+wSqe(N_!+nV@|p$R+9SS z>dHQC5wMgf%Xs^4=PddsY_{LSgv;XJp*Zd?Ow=d#DHb=pWMXQ6Dm(E2>77VQhO|Zg zPhDZ`4&;S?x6LNTQ$fap`th{j;1qqN?zmtb7%C1KK1WTFe@KGl6L(1(_9~O~ z!7x!JOMORoGLGra1(3*>6%GOOTfic^BxvGWVb4^|*F$qaY-&rt#OBf*SjV zeuxNrEoTHhlkI|*@DAZ2|1YY<8FW*!D(nk(nWO!4bVCW?JyJk)NnhakxwDbPD~ z#wt5h@^9ueAZj0vgdseI9PA8gDbW$C|4d+~k*S`6$3F^5S>hO&Z+|Kpa81I5-L?H5 z=>BQ!KA4Pg!gV;sY<4sK+p+D~c9yY!3NH^11J2k$nS#4Qr-GYXm{huINxquFd7v~0iLX=#wgv)k z5pdgV)D=48RC1i7g7v$34DzOmT3LP}B}zr4UsAH%U&ZjIR8nXpFfZNV&~r1n#;g3C)k#AInEZm(PbP5cVn*c)tL1H9-Ny9Hh2i-BHr z2l&(#T6cc6ud_5W6XDLzZRI^)FIlCs62e>LJL)K7Qs7+3VXI42hB@_`s}G;2@(sZ8 zai6I|)h8UVp%@hyY+P2C%RVVi$`NNnXS}FX1P0gI+-6CKoyb!)Hg z3u>yb9a(M$H~AiDLzMN<{R5CUEwLik&}73IY#rWcyGI`_ zQO7uI(NMnM(1)tML-guyHkr~iaEz(-)J-)3}*ApQ&n=PO1qVo)Gut(5IKFF`*C!2e|ME!<`+6P|86M69L+)`@yTZG7h${!eZQ^AGvJvB+8_ z6!6=P(Q0=&O)4%WNl&G6az*u$zTf}WEM)EF=tJ6>3fx_Ei2sjo%}1gd>&cyei7!?Q)wXG*+QW}#B_%;plCX5zxBbgWEYsY45n~)HQHvUkD z$T?DBDMGp?#mjN(PEgZsn#kG_VuP4Q+$Z#qH~Hy&L)4%3Qjy?I+Y{~zGkmgE5)|WJ zaEgPZKX3zOBgAH5@Hya{-<^r{Y_=1c&j4m=I=ri;`a zJCqhMr=o*BVMFndI7AhInra7GbA|tkx^U&;7TjV-JF7kP%Ku&Oq_%;)sUTI9vZd~F ziYn^q&~JuX_kj-6gc-!;LQSReEqFi2vg@c*#3E1{{ee8A7O>l1I0gR3jnWlY~9vUB!csK!58hHNx*ezd2)E z3234Ewh=@Z>I0~$B_T4mq55ZmSKuxA)p5j{5-Jy{3BHCkavW|iHIUK)7gbYF>l^&H zOq;b1@bGjxiaUlj@lW{Qd4#I7&ncDo&$ceyCD_EbP^+)3!1JNMt(8vV@yZ?TFW=E% zZn(U?r8AbE%r-(p__zFD{A%Q357LS=+kVV4)NJY>1w1@feg(BZSZavx$v@QD#?-*! zP?j~42$PGMWt;+t`XcY(4+7UHK{Wt3)awwud~1m6W4R7=|B}*qNyQ(5znAhSo15Si z)17PY&3AxTJ})*PVhKX|9a&WJ|q1ut(H~;o1UVT@l^|s3!kyQ zCJs~4tj^Ws@9~@Y%cv~pWQLPt95t+x`4|xV0JXntN^PVL5{)Ozv%o7L!728$u5~N} z#i${72V!%XFABAYnfcUFV!5qV*cGIFJ+)%W0$_0UrPF}?wL$&A`Sx1Q0jJQkz`oFTcv&D16r&m3 z543|n%!4zD+szaJcLD?2*2=(2__ee9a(&2~TGA6KLN-9zZs<=j_gX%{Msz*>gdKxM z!8dKqmq013i*E0%YqwdRL1$F7-O3ky9s1%LX%*n2u`p4KK!$I&T_M&`Atn{_<|@B| zzl6$j9Ne9s>}X*1o3H$75StV^EVYBmh`_VtMXJlN1S*9lS@%1(lhv4Z+%x#5m-!@^ z{a=|8un`$#D-_NSqytJNl#x(VwWM=WD!#15>uElV+0?SYzQNfQ)U-ZmJan7!{6KV) zg_kp&8|^(Tac00*T7RJA!#AxfO^^m)zg$xL*Z40$g)*2V!#%t$|Y{05jfTT2W(& zR-kQs38WfLw1UbSsN!joPbwkHN;^Hu|C`y?GTlDYS&kmX7C>eA#eg-7q3LWrdIfBY z`dG@EZht3TQHsbIBC}We6UQiZV7@&K7@;b*4n%2c53>Q-?J9mAe-pLinlP8h=Z-_x zQK2S*uEt~arrZW5;{+)VkC1z*Z@?$|%p|N89mUAIfc++*ZqRKA{$DP{?5E)UW!sMM z#NZ@A8!JJhNR|GA{^o;CN{+V0w<&l#oDDZ9j!{157Uw~|p)%^jBwj`Poi2xDd0?J{ zyqN|4rXk)c9g#-hxAIqYkkLFaJhaPt7m!#*rW&^w4do~EFVGxr9a9*T?HV>R{43x! zx@t9)WB4DaVF5RgS+&1j$Y0j%Zkc2M17b6jjYI|cnb7+q(LlBY_$a1><0sMNVe6wS zW#o`FSGpwa$90qenrWzkLgCJ~kwgRPIJ2Jnf@bh3{6|=1g1tcdK{aG3h`6MiYW1KZ-7vI}pL{)1`L zS(yn66&)-e?q{1sG@=eL%emKREOgZ6C>r(?bI47OiPpNIf`K})yFCwivr1Yb)xfKu z`osDce*iFJ7nm9^=wIw0)PNt#e?dpNPt08EI&t2%JUlQs0`g|Pl7lk<6)6%SUjoO+ zLEnMkt8mcfaNedO*-yayr}1_8w&*hZH*Gi_jxUyD5SypaZ)V7q@kZ%{G!;;a0#hR; zFgJAC`qXihEDN#O1o$?EzXptP9urA5CMrX0(gT{2qBT>lD&W*Kz~LR0VVY)qhx-gg zY!%@VoN-Jq?iA_;r?>%C|$^RVJtgAv3pchkGSYCWxg|i4=v@+GTo{5FsBBFn+CgpwzX8r#xm5R3m20=KrepcdjvBa7R1g6 z6vsa1G9bs}`I5lH#?b#cGwhEnJI(d}XZk30t=th`lHN#raFmjuZ8v5G)`qTFUx52I ziHYTAquTIIx1zRO3h0F;iFoidz7Av=-L;0G`@V+^FO7T4CDoaFJ%3AcqGgkPtrK2J zV+9n!59BSpm#fc)sP@iI_6io#box8!q}m#~_*G!x>3F)bRjcTW3sw$yv2`b6smV+S zZVf8MM?l{EV1Lo0$&HRbtwTaR1K_mP5Y)z3>5()9pOF7jbK#c%T{GK4Iuz$$^l`Qh zD#G{TzoGM7HnWBLM7*<|4zC96r)hVT1UQY$5StkJ8q9Fm=LU}g*L(|{;R_(~SEvJ@ z0BGYdyAm=LL5F(;-9JlT2=k^ZJ}cdqmSY2a$uppeCxEhj&aoC;1`*sJs0rVNKaB=) ze=x59WhxQ&K&JKwrSTGe4H&f`ZYw9KWArlqs%C$v;(5-}bPAwNmhTV!M&=r`B;C*1 z9~8<6xZ>1J=hU`xDL^+m~>%_w{g_UIADXMdI%Wv$?dAh*+}*vd!%hI$1p<}NYAsFTDo+tTpZ z;5^@V?X(gBvAHe5Z#l|86*v6G>W$!6_*q>O{JuJKo_m9u^G;yX3)mFU#6H`vg9^9W z|6CuZZjgII7yktlwYXAIJ7p{n?1YWT3(&S)48f(KM3@>gfEE4Dd?lmdU4i`2mq5Un zprt6kunqq!b;5Jxmg*Kg+27tAZ&?Z5zX08i#ef={@oDHISBA}}nmSto^RvN2m2Gq@ zIQNR-Q<7Ku399c_t-7yhuyJ@eXcRT6b)do?L-qNBd@^kOU(?CtG{<0TLr^ID8@Z|` zZ-NQ;MOp+p<2|*!q4~q$YN_RjC-=~2*$Rl@E5NR3GPjTEK&>NI+D3-k2UC2HwLOYc zj==D1KDa$dFTd;X8g`Jf6t@>}KB8>wDd3D{`0pr#OJ>W{8=WWZ+br|U1^y@cO!b&N z5vNHMevex!?X)MxuE4R-6YGDDT_n%gxdA8^zUeenifhb#Bn5)7rG{QWP4&}~mH%*1 zdJlThR(Z5~SD)pdYOb{$urGrSSC4(oJwOP)=?2cjoS-jDlHQiD&tm=r((vu0VEl)CT{RGf=~LsD6;=;pfr| z;Qim^mugcZ0s2i_>tIK7@(KMf+Y%-4)%e|L7`K+GK}`XtSle)wU`yXQZJlD1qwpK4 z86GSbR)^@Z{s^<8rKP>D^9L2dUgU100{lbtfGf`WsXpLp=w)eWwg5+aM?eiDah_BZ z6Y>&evsTn+4@QNn*cuQHYB1A`TZPK<(f_Od@AM#Yg=4z4OQ?BZszE^YAH`lN1JLbf z`L8#n@>_5+)VZ= z#r5aD+pwST*<{#jrh-@K8hm073UOoDw)7R}8~Y8*4s)CTtG-A*B~Qk`KoNV2>nV-3 z+s3xQiO@6aJLrrtkl_PR9H8Q{$jwy+*QV*vtRF&m10JaUj>>BsfR5S&&_*xyxIV-` z+*|>txZYWb?!ii2HmU)t-z`pH-%%Bub- z53~&B4XfcO24^W<-8JJ=SKfm7@c zGyFFFfUSibd|}{kUAS3*Hii+yZSBIfgWY`pXh)UbCnH{FOFkm z0^{U*BN`@gXJoJ(vmZF>C+oe?6~M*ALEDmXQEb60@NIdu`VDS+{RQmijD4N6DBT1y z{2%1v52AHk8grUrA;T%St!?-Bf&J82xjW93O5u3vd^|EJU6(*$LYCBH@Pq7@F-x6@lgGr;m-ZD@JG0nHV|s66E_z9LPyaP zt{vNyzVDRmIhOb47k^RXIh@969EVF`4^)3W?T9fUFe$VITrKU$%k(jpLr>r{n;?R# z0*=|-oF%)#KJ8KEAKXJAz-f`fR90xxd(J_j;FA#iToCJQlEu02vw9;$&+vUYv9`}OSfR(bN3-Oo6vmj1+$*Y zhiCC}!|ws#w9=!&4ci^^raqw5CrX|+&o?AEBfQqOjHpX3gRRe>fQ(X+fVQyf=~%Ln zqngzXp2lvV-#C<$*b3)=9Db%fOHDQs1BF8MtSuddpcfxv-S9ml`NgOsV86=LOkx(` zn@+&sK5EyL(sC`V0Arj2XygAgRSnXXBs&S2`hl4bwV|RD=sH)H73jszWA@#a)sU&V z`cCzgydCqnELMQ|rGO@OFmN*T(E7x&jttWx+XjW;Z|sjExw6bd(n18R-vQrf#zf$Z z3ND2GFf}g7f529Ix__iO8|KtlXNW2Y9qu&z&z;}PuWUB4bb`&s3&_+>+!iE3Z1!>#n?`kW&IC79iaE*u7!cK6=u~mI0gjYcD1U2$ z?`I$@WLgc!c|Z+bwl?~X-l0P15&MmvL0)iNvK|QS4ZMd;9jRDBGb)77;%xaEIEC)` zFTq`(m-a)>@^nM?0ZjiiGzsAYY@>;Isy|bl>k6NE1!Zx6unTAbe4>p(FRl}qV-(bCf(};`qWa^1u^DBQfK06f zeA;l1p~thofHnMw+JiTtKNAnkf39s(cr?r#QqNcV%cF5Iyc}ZFKpm+&{Fy-+c+pQ{ z26dF_!Hq<3&>D1@E6norGH`rcvK%+B`&}@LP5BY7jk`jJo2^XMGK^D@sW+^b9n;CL z^h35FdIhnmgwk1xIYwqXa;)z{F9Shijy72_acRI*EAVxBsro@*?O$f@v7EB6cDm`x z>=o_+%0Pdh5!_8?4W$#&b{6K%Z~i~^uIfQ~E!6)IK&fw(G}tmW3bp_~-IP$t=1dgV z8e;Ph+0ah*DD>2+j;Yq6kg5AX`Dw1CLw}3GXRsEcAa8D< zuUtR23$T>1J!r`@HGh3j#UhkvxIC_lW!x52kv+zsK;O_P>nKMJ@*t?G1bPAUzb7ip z!K)HvQ=)~fB5YEB_g&KtDTU>_n835~F1fe59rjZ-&DNG4fKy&lm|4ZGM(JoZTEofA zORBze0C-H=n*;qf_4%L~?1o9z5to+tDaW)DK0RQD1RF)%B?~eEwkgE)D=H4m|0_M2 zJn1-P-5%N;cxZIedV;!D4CcmOz$wR7n{fl&{?9ER?H8T(>5lAM?h^9CX$%0IGMst< zdxqEHN5OQ!a20@wt$@FA4xR?8ND2LvZ*g!*cm?3w7%G`zxk^yQi_jUaDcc4dA8to! zaBegVtTP&EL!lZc;_*099<0>Y))~zLRYNtbsO2I6y!sL>_6FqG0 z!>xi7d^y@XrLCL-HMI&K0G#r-UK_NA29{)q%^Oe*_i_iJ`VXUnoCCH+jh%hqR$5KK zaC`JY>LGa%Mz|?(%>&9gK;kGE8!ll>BHjXn53_Y4!|x&j?FY2k0q#Mqu`UWNhuHLi zDyHR@xDtMh3FWm~(0Jp2YJRqSv!8d?rrWSDpr+E$IOzTxnV#SjdT6^AJ{NrJYXJ;? zr3|VjUJ5)sMy;&h0F7#Ec)x8mQI#4G+ncWNi3iX#t~1*n@&;CLp!OmJz(BEQ(DP`;QZG> zY?9RlpfxaNoTZ4JbshuGxR6_kve6c_gR`;UsbuG5n8icPxquqCtKa1FaEi%*#Mc0W zBYhuWlWJHs#|1Kqks&r;(MuGC&a?OFzR>;mTQ`I@1zsD2z=2`nsyGVo!(TvY48iX1 zy!ixNEvFzh?bv_03rIw>QGf0*GoJdF$hLh8zX?jdUeMuI$O~{0JQfd;{YtF9$2U8; z2wZg22shOO7<^->;a%t@H<%p(?6#7linSQ1Vq*+iD-1PN04Kp|Bq^je$!Hj82AcQ? zK#k|=lWa8fw{+A7A+9!)PF5qD!DgdIaF8!mdjqlQ1vq6c>~0#X)ARy<-YjmZZ!hnB z4x99CfErc!#BH3Pc}F#Oj<64d*evw_()X)r@>MvC&bWZQTv?`tjhBJpgG3Ax>I)A~5{HBiuZRNJYi*)$%O>Ak(PghQ+*Y+YVuilHCuyMa|?SbN>R#MeRN=WxSc)USsLz^ z7lSu-pZYw)iR@P`tJ0`nFVqpy}9xjU#D<8 zLSVbNzC@3Rf0+2yz1xivYsUQ^HIRQw{bSn|+@cwxGuNK!PMeroEVZHMYWg49J-rcX zuRywW5H*c|6;&escelMjhXSRO_9T3ZiH?}d4kVcH9perDGcO_QLE5QQ{nydd+i3-} zw&mI62;a>wmN-AIdXygt)D3H|KxK8Q_el2V^j4mT)aI#~ zo^KhB+_Dm*cQLQoMS8!mCVEDEIrp-p#YrXH)8n^9Ul$56cE=TSiGEGmojW~qa@xhz zuBm-Jx6*rNhw`T>i~MgbNhE{1N8XC%5@V8XC)tv668?@Y7Wpst)w#~n#9vQ&oL?q; zTY76x$JFbo%hPsczRwLw@Adf5B*#{!kt;DKKYqFUSS}^re>bW#Mvq#=;yvFzzszY>Rf4VlrG)y?-ews8h>7T?$aR;JS z^LMGmwu(VY>nl#qS)TFAGct8Z>K)JcjE*^##J8#uXlq+Ub>*i-?Tb5>I4bE$(tY>v zgjX>oA`Y`Vi8f)sVUZ8#)yVpq_Bb^<^+D?Uv`SeA^DJ_}XcIn2++rI?q{qxo_~ibY zG&SjH;+nXwQRVrr6#VL8V1uf83+1%WIN=$PIy2Sq+{?I{b5b0jEen3OG4w9l*PHB)&{qx8#Jt@1C)*L;Fym~$NW zF=9yUrvxtPTT;uU&WX`+=ORa>3q@;_xXfYv5z9ga5J6NEV(``ugbS(FNTa8oa#xvla`rT zC2t6BXv_#ba(rS^TnRBx<6FC@B-KmWmv}wyY}94mN&m2I4=&ZRMMrLYX7{x3srOQ; zv>h4!a|($2)sum2E25sG)JRuc!Nd%Ax1^!&A_<3M3Ps#vpA(zHDZbfqt^Ai+)6-Kt z`%;^FYNb!idYBi${~ES%L!vf&*wr%Tdwe~2%OuU+GO<%!-KgsPTxy`LL@-`kCSK3U z&S;jFpQ=J^$jqNP=fuWZ>);&QI;sv|DXLanp~U-cSCY-W51#9u?Mh_J5L)P|VdDSt zR%P``AMN>&x(8|_G5gQ_NAf=3lW-pKkmV!h#{7!s-P!Ju?u`jcVh2QaK?lf9*6D$D zYI$*0PF}{;v^Jg@ozQx2PxZO|P@Gl`FW?#et z?xFLdWvBnC@~4;0`8%UST2Idv&*=2NS;O*rV?#I0NQaLeEJQ@#k878>%00s!kvK5! zuc*6xQ@W$Qs#!xnC_TyjlIcoc;_2?0pQdGO&Z#5rQI`jfTd$CV(BQ~i%HPfmJ#cDMX-a&cePa4Vu9JIs|9of3aC z@ua)E`*^~=*z1u`QAMh(je*nHEvDs^$oxC4rKhv!O4`WGCb}Td1M29M8+^mDM(VzDMu`JT)^8XBYO4Q((_(+3p<4 z?TxU+wn^yaj!qiuo{&&GHZS5jm*c!|+2B8}boAcOZkpluke;!gQt3sr>gLtM8M@Cb z>WF1l3vHsE@qZ_NazAi)OWYB6E$SEFneJdOY)0$Tq}91wGoPk4@kDqUrCrY$lEaJh z)JcJz5SvM8UgV+J%L#wE9Z3bf zN?uVJ8*$<0L=|?8t5D3Lcq37BZ*`|9cw;|DenVBM!ZssdgG_yv!)4A&tLbUwIiEH< zvrTS6>9}?x_}2D?n#^~LY7)mLu6AE@uS$%G9~b>p7|twm3=VZQj^M+2i=j3SdCGg( zv>F-Pvm?EIl-mCOmU+&O+>(f&F(neJy7SyE-R%+*W8X(y;1uUK%WeNJWwn>dS(Z^d zt%hf%r*?X=tcrOh@iYC6soJyXfkI;Rhq$qcSKLS3jS| zGqcnBcuINNr`^jKof9K2QfCDASuc}g(cH*=v4<1JxPQ3y#H-NZ{&g*3PY|oalYNIF zHpR1lrGM}g^4#~_NcU#d$nPT;^wkXaChD=PUC}Xr$NzxSnCbo};YI9~$eYMbMcA?e ziaJ+(lHpw_eofo#Ipm?!&p`LDFJ06Q1aH{RQFVDC%80!O zRXoexJuxe;WArs)AhX0VDKx=&iQnX1$U2t(!!yFuGHr6kf7y+^vz0df6w4%MO|DcSdsBI#2nuq>KjHqw}ZA zzxfJ=ixHVj3D>r0KE7LGcel;mH(_qo=PJ5X`^3t9?0->~o=e9X-F6^R|(Hxj?czl=E%aguY9iPqRa2bB}oK&D zb^7qEK6$nAUH!ay*ZzMTU4y?H+1rnuOvaPk-rBv@*0yb%yR~iG=GN}kwr#t;86!4+ z=Y9Wxe3Cr+;yH5$+{z7|Lx+<|SL3W&S-)I$$(iV5M=$dZUh|XVLYR=831GyJ- zUwbOB*M%nDwV_^#{^|}!+V&X+7b{Wc+<#^Dao45%*dFJ6>pT6=3?Hi(ET#PBcQdOz z4|3aiiZK=W4syGI6#bp1btf%eXgDU34cu+Bj9DXGn~B57OM5d@cTL;mn6TB?M?A#B z^sU^-xrOPg>{PLgZ)~c`?I;i0KgiCB>JeE8^72dz;Eyu)D}0MRm+{1dWS6nICV?^BJ({~Em&M( z_+!i-k0*D6rycV*ze-*jC=f$3cKv-z1nPs`C-rW1))BYCRf?#CjI}3>c{L@IL&7fK zJn;wHjV3%rJ#*)W6uhey;DOC6D`&Cjh}2UVGeNdtM2Mq{oM_zD7N1@+xk@h z4#cKh(51ZRH#5sU&vOTQ8Z&+QCGxUB$yokOKK(Zf=9~-aCdXYQ>!CZ3s}fNI>1+RL z45=fDobYFFLvbHllJ@0VJQL{r93$@ZIU-_G(mXa*13h(*nCueWaMmB!X!0}K2GUz< z>FNW1``WKaGMAy7cz)zQ^hB7B!X6PYF(iGX}3yKxEm2^=LK41sYbv=VUpXh~Lb1CNQ5-FI1wC_zhjyK3EqMU1^`;>dO3nQ1I zR_L|4u&yDP#Yuk|xhCI%+3ESqgVI&m#ljaQ6x{`g7HBTf$F;}3&E42_ zk$}lgzh?|Hnx8874dg~|rH|`+Smr}A+K>Ftb=5u1 z?W4*OJ&=9&dZtO5mC5JfIX+gb$sM8FdzyNd({}EdSkt#4+$dQ=V=_&)*Fg#q0cwT& zi~Fl`H@%wcA{qRHBb8D`w1TOggGKfb zbwF$`xo5e|Whz5+TTYN$A6tqN{nPK>YRiv@peY&fsif0J@ksTuP-cn&t;OSYb=h{p*#DdUIOJn`8%%&I;ETCwBzDar7c>l4uoec)JT{-h13a-#SBX5fo-XRdkv23b77>ck#k7UxNXRd)PJU``iO?O{)T_)FIBb-yMF@0IpK)^PCD#wKJ>|lDU2cusxH~0(k!ay*3Exk!s z+0qHRfEFMJyGDcVKS*&niS)DUP2jX-@@ja7FC_Nneu2;J^eFTUuAp?v7YH9rF3>bE zZM4@yG{hOIjJuD!8F;DL3bZtYSf=TYr@hf-fxGe>USLYoCq2{YCF~V}R=x)N#dA~v z{U~d1=WJ{bxzp9n{n!;IBUsRx$94>GKO`|TG}4<_yvMGgw|TstWlUGTlI-=jjXKke zcBT26qda<+$Z|DtmvKL*suQabmE(>nTiZT$ATq%JSVH-Kn1JV&=N-^t%fT#GhqopE zRu?m_vh{-7;kBuZYpVNzYYo{A%MWz;68)LX*I373AEl~*vH9rn9)eCWuuw`Ng6lwq z|E0fcc@E)NA99XskX!BUOijU8!_RHQj7Qa<65#n&-%$}bIP?|IFHc)0%pH>&`By~h zr4a2kQ_{W+`HQ#)J|C=zhm^^Ea(6-8LHX*N}Vjs~Fj{!Lt;g1}Xjn)J>s; zO8wl>$W{PUcz#L%`9I|PmmG&RcDA)X*XvZ(lr6#tkj3quZ2AxLj(;KV4LD*i z(z|rkEN!8EsE%ypYVJ0=XMi~shuecJw%5!}{tTb?Rg!jc`Irx$*B+c%#}$%x`d){p zCEIHt(-1q3`~t}6c6W3)a>a>NXjure%m8d79^DrBAalHdZ9{+X{7WBZKL{B`0$I#b zz0ubPld&e&m2B&>x)-_bksq*JXF=Oz1EubocpG}^ohcUPc$)SUrVlZ__yY1hzcYF( zwMtvg+{5t}89;oZNH^@hN7W?`AVnQPQ#Zn~87jU%cthDIEMiyEuRJ~IqO41RmG6ND zv3UBLu92k`v>BC%Law~-cdq8tO8g#N!2ZSfmu7VGBZy5M={(nf(a;9E4fCAqCw=xA zBm0xXHK?hBU4f6{ovAl22gu@eqBjabTFWHexwIyBAdoA^c$DozfAJikPq3c^jW-+| z7q18^{2yyO=ik^oa-yq*d!y?<`4oHZQ~^Zws0t-^hjx2=gYM6z6;ECIHM5rQD_a8X zqcPy7wl$A&d_#H=x2T|tcCDdI#7M+zzile4?U%Y1ndbi`gKj9%U#l?Cm*1zp$(Qi`k|Tgu@1q7%6wrayMs=8cGGhJ_ODU~ z2A{^}WNPToS`I-UQHU()O1d_>d}JQH4!qjd$hb>QCwhll0)DfctHuy?WqJowiT^4M z_U`}{Zqgn$eX|cnOvE}+sVes~Y9R3kndInXzNt;8I!3L5!SYW2C)1YJ(MdXontl`+eF)NL!Trryq5pUbfnF+ zj;YEm6d!mWhgu~J>N5t&_Qv@DyGYJ-8QiU0JpmGfyZWu*-gMQBxGhxBn-X5L_vxVL zA38sq=KsjM1Ci+7bYC57_Bm>y+lil)=sNGJM{UCyxU0RWX}RW2vVNqH|34{<-@>$@ zYtqA*ms|_!nD1t|SyHXpZTxPV4%fqz7 zEh!qfG+i3(QrfdQf?2r|FvX6hd+I)#KRdF~aiDIlxfZ&d)F}KeT+5D_=4f7nx+&|w zCY9k&F$3w&^kPQf21s{&@4`KksOE$**ESihfP2W{u5+#{)H0$W>V)!HPU`fTp|L!{ zfy#7YJ^PAoLF<_)YZbG+{$RU!D6>T$2dME86^I|yRu|^#N>0HxJ9+CdL$-Qm0uPq} zhg@C3Qut%Co@Qioi5T%F00*kZuoRv8kio{31v z>GOz3xCP8g`aRu+P4P$Ma)A!fx2Z8&V6ND!AxChCYT|0-vQqo-vdAa<2h(8fvs9~S zslY)ni`%iU>E-k+W)JrZxV|yqZKPCd4DYP-odd9jq~5jM^`7F1ALw_;WqqVC2RLJc z&_wS)VjHd^$`jO|I+0`q3A;~A1obfpHms<>W|weUS~4yc=TnqYEr zWRO25jpBXGPI?J_iZSuyrANM3;TB21dY18!tvsBIttN5T0M~e`3sDp`LZvP5bqz8X zW7C5#6<)}&m6%<0112ArB|5#2gK+#nrj~w(-ekISwESUW}^XGPrh-7JMwMwu{Dz znm@@2K>6jB5AikF2rbfXb`1Yk%JMrSUYk z)-tIP(YAq?auHz`o1jn7JDJ;D0x~gwRkvvuhzHZxX z%&%FP%oEA$e<*e3lguOfDQ#z`^I@rtzjNe8a)gF68tn7nBKQ@ugsYFMGnI#Uj%)^s zv7v5%+8qOL)l?=5$5<1ynI6mx<>reUyhB6R;~iDGz`doRPv|S+DAnF|oeC2WR@ynw z+RE@)RXvd#virQ^E$#qw5unWywxaM;?iZLB)ugv-O=hE`3vvgrhIXK*669js3Y^Vd zrefL^DKwh)FP8&+U)E1w2KXj%<)ps8CgH=0`s!x}oo&B!0@jEOQ6pUYsJ+AzbOvVA!cqcihE61wQNzHc6jR9?SjIWr zR?m11IvMX9TIZcF4&eqc>u4==f}JI_QItUO*u``w-6iub(ETXUkZR9z1#4~I>Xr(D@uN)y1Ld= zJAi&$09~<+)PKvgit7QQwiDZNBbaM+GsemZ!d>N`;OX;aJ-=%(xtez8p%n!W)v@gGt4UI?iY3shP|RqGGv26}{;NIAhoJxtsH zGrXGBWLTy$CT@fxURiw2Jz~6cTPBy?CbU;R0&P1uO=~Nd?T%{5eEc5xkJqRX0N)nE z73|ebpEO-k!AQ`*L3Rks+478y$!5Fq`=s~2%V9XVMeQ&aw;gr%#c=Wk?HGVE--ALlH}AwI*VW+Q54tv3{UZIqEaHA0L2J zcl0*Hx^?LyF?(>S@?Oa1W-&1Hg?Yn$7e9cV&z*Q()fK&L*$J&gmlLC?f}p~`5-Kdm zxzgI#@EahiBV5Z@REl#y8HKLGoMSr)UeNvHqCZmuwKu?IRNxNye`GH8hx(7~h>P$( z`vp@k?fcZ<(H;R-ZZ4c)D>HtY0r*x+>gg*No|kZ_mm1DkTY;Y9iS1M#*Fb72F%g{& zJ+`dUL#mbWwxKQFz2YwJH0X>G48{Et4k}fGonjBt&2*d0!yL=Nyb%E2oTFNiH?fNF z8`~@6aKPYKN4EN#%b)nMY!2gQ>alBhUMlRjM}{UPb$8=P8|z$-l_xJy7FQw4L3ohY z4uj>2u5#v5Y-vzbNU<6>p2?+GGsC(5Vk>VdSS5ZTQ%yhJQWL6)HYe(V&uydPL{)66 z(`S8a=%@acSROv>TPd~T^RO6GpE<~u7p};zfGavHrPua1b+rErWB45M5%rlmM-Imc zsjbE+Ie7i$oDj2;Hr(7XBo&bSM` z4v|(yKU^ipkB0;=Ek5HOf=cbc@a(@rXXSGs5FL~jv~|t-9W9ad_#2X@u2X%L%1dOS zrJ(7+y?c@A5ic2<;aw|k;m$ESW;xSKpZmJPz1K zN5@=q4c*Oj+gQcmNhK)!#jRqpnP1F1?u+=sJ1=x8UQV@N|JpJM>WQ``N>LxF4%BYq zC2Dfcu=Y3jRAUk)!~J|Mq&&QqC7A&X%`Op&E87A`qHubd_KWGVorkOA^TMUKOu#FBz0s!_?u7;uEENaB7T857wP9Pj#$BuHxUwSJX<% zO)kbF&ULnR#)_IN$x)G2{tf^cx3fc-fy{cA#q~WbHb{%w2o3dw z>H~BbjP-N=w!SnBS4R_P!+(6YKsGwEt(Zy7JJ7{%<>G<-(HW^IK*kz?iTePf+D~1e z){!l7@ZM`XXWF4HkiHZ>5vZkX2Y54yDb7G_e!ij9(MN^50Pa`cFc2{D8|XTs6^Km< zsx8qUoe%xCT+z2yeFv4Q^4TRl?_e7+$C<`lTsRCgL)qBcv`N?8>~hpZX5gpDE7TgQ zB6%LG1b?ypG|tv&Qb!_}{3B(Ju$vvo^k$Z`-}$QY2!GSa>ZDH7+t}T94S1q|0HfYP zohEnTQ;`vl6XuCPPwk2=3+la1#5vr1rW0did4S<}yn{l^kPZBl=Ch+m2gul zsOKb$dl5S{*3wxY&TNj)4T)Ym(9_k~IZPPv>E>cc85W!ndz)^cn`3U`=!PuDkC1z) zAyk6+2m9=tZkuH+s5zSK9hvEGBFp?1b_6q#ImJ4KiSh;i-bgGtM)TNs2e`L;vBKnR z>Ns_XoQzikTc#FfgKkwiCzdaGK#2=Yz)Wq$xLF5JNG9Lu(ARh))j|DDOGl^(Y9v09 z3#c^Nf>?;YgZf%~86fq=#JX^D(3pG9%x6ZhGx^=p0bj51>O@-A%kZ~VfDWL4 z6F9Y=`cA3|1g!vVv`p5Ms&n!6p^%r53iGwuSxku8$h8z>%E;ij*rRl5T`x1`D1@}e zN0I-4EPf!mVPBmqZTpPfG~VQ~$SeO=xrXqa-NS5RZn9RPyS&KX54do4O>c z4g~iJ|W8>xvak+7za&&1brD<*|WgiMZ z!HSSQsD4xxQo?q_Q|yOL!?lL=<>=$UScMh3aKD-D%zSn|e^NT(>lJEv)yU z$!I0w7ulaWLw>_!NC{}GWijw?zQrGe%KO?%-T2Y$5e8=WajisA=@@Jg+nA1Mi<*Dh zWw7;WMz*F3Q%^x`IOjpzJSr}|Q}$?5ngWV++E`G~GXCK8i_BfQ7OUt9@x3sa5N@IS;O-oHZi;u|xH&Tcv3 z*o15au^9wVV?NW1wDibtS&M2+6##X!3jW8w+w`~A1eo}Xz%(Tw4B&jsQDzOhl|LmN_jL`=NPJP1HdL_w z2MtAYh_B>e>Lw}U4zwX)n}@)>3B*5yD*IYWE&1;3N+!rG1dQsnQa4yPwhqK5$E*Ma zR|)S+4xlPgUxqjOTUrnpIGuLbYK zl0*%v8C8N5u|x2D`$f}SEx4^M3f^9&7=WHuvFDhr>>mECbkx@&JR$L1mB*0Bx&~^D znuxPxHEJz+7nmmbpe>fw`g$sV{8y-jZx~?I%h`KOS@teBTr_w`1c%1Xf*0ymGRyWb zoQ>BZ>rzhY6j2$w<{WQZV{EJOC$B~V{^#;+p)zM<&1^~TAK|!s-#;gEFd0_o7)`de z&Sz+Q;x=gpS|b~WkwO5&hv~92A7bBvqr7)T3*U$R%q(KN@l_<1Z((R{{8y%|zP9C= zV=uA>A4is@u8{?Rm--4CVV!I!ul|y_6t?=Uvc!L6bD2EsY%V2?Q!WHHL|>)~Yukc( zQxTqt-6sNMlzd4n!w3*bys2Dh)lm^aE9X189U*R=!*tY>_&9JJfp@elM zR1VF>7n6E`{fqD;NUmduWthH{ii>+fy?o20UHnxx!t?~Fv05zUT^5`byO$<)mCZlw zU*ISPfzQ1lM-vHjxwD;Zje85{m>Ec|VA5eiX|yYuP@0RVn426Iv91ksP11-rWg(m5VX40aeB1e=un-tob1u{G%rTCZuVeLH*$ z%OwQz2|1U@#%?(`+nyPBYdV81W4}NJpf)COr9j;vTyr}<-ZR8`%Si+HLoCE@XWQ_oblaN~${X*V*{M5fuHz_x z6vFe7N%B9kI&lImO)LhLu<2>70 zCyGrZ?vOmm6VI??@PBrjIjTLCo)+5}tOF*Tji1Ka*hfHXu9y1zn2-RrjKlPQTNuY- zWDeerR8jNEKloqhI;euRiNUJAoj4vg`!PAgOKg-W!>;1Y;tb_RU~BYEs-(7?DX+aQ zybOB}xR{E1MJ&Qtk)v_`hX$Cj6bTdVMw&YwnV;)6WO~Jihce!l(j5K{TbMn?4&Vz)&%D(_W#hv#Cv;cL z?HuKiQXm^XaubOYGtdxpzagC#e)2wfjo5-shGzpe?YVY!dJs@zHN9uVEPxxuS%H1ZpO&Wk(xGI$vTC$` zh~80jOwxy4m^rRQZ+#~ z9QJ&0H*6DemAp)@CR$)-IB2V7%B%g7IvxETIHJ@R?{kCLQY^(47AnaF{nx@z6Og*8 z;V&>ZilJ`+-^eA)k$v#F$VEpru(?-*J<|g)Qx{1`_z!GRb{AWd=fwryAHjQITUbR` z&-}@L2Y!aVA+D2i$!uaTTGgquRWaH%Pm=#dl73b`Bn;u|vh~^F+$kX-I|9!lfn;sX zC}ShrT&EWuNZcg-WR&=hU4w7fadSd@COs$iZ?KK`wpfr~3%>CWdjoh4BYaXwjF(Ui z(08}Ia;!oA#w(NG$=>8u+>8!^^wun}58sp63_OD@85K~j96N#i!Sxp3Drhh_3Z*-0 zN1O85bKn8kHsTU_lAK9Y#JtYWw)`fQ_C{)J^i^PoQW?Z%1Y4Oc!POGl$#wnT!*Zgm zdZ3}XbtjmqA3dFtIWFi#!z10Kxr-ih%Le%V>|M8>6|w!q>oq4 zOw`RZTO2g}2m4H%Cr6NJd^&1#zPB2Uztjhk>mwfjdwB;y|9YTqW^qpiR4E_uMbK1N z&0J#}+brjIvl%oifsrs@Lm9Qvl?VkVc+u)r5(N^;he;1 z)d~Gx3l2R-*5WP6KV(~SGyW3EhW-O8Wu~e|qEh&X?~U|>53xDyGSE|p#4_F)!5*>Y z=_lH6rdjq$@J8%3agJO?)+N573!S}fTaA-7)l=EgzFvI@Bu&mhC0Jl6UKQvEaWJ>1eiNbVuD=lZjo*#Os1yr%>L zm!e-&E^TSkcbm^y1{+0eA$O6}h?-!N7P8eh71wg9ThTz^rqWH!<>s+1*jii*p@-bm z|2r%s3aMKgN?NBtI&>#qirh?oAymNG9^eR=_4-elGx1lU5x(nEgs;r4W}Vz|zJufe z+)o!Tm}vOd+e2pYfrn%K5@-HA?D>$-|M1KO)~1R&(Rone2Z+`PEap z1+3BRR6EU3V_{oU=Pp!3030UQ5eu+M@Jf)ynD%aZTkLLdx;G?t<)5(q*@B!(_yu%$ z!7!OQYx8ZrnnP5)+#xihi$8&S8?s{fN{8nh7?+S=bb#5bzai{pM z(r<6^P%P%kG|*Ky-?i_94`GLim1Ikj!N&lP;)4}22GrM*ry~$>ntupKxfSe2_BN*x zYb(t`g{PC{HBF5wTOsEhl*en4W5{{LbZi{F#%?l0x}WLmF)4V^TR@u62iOH{ZO$pM zU^|V36Y)Z-miqFR^^W@B1r#rd31o=qf}ce4LN6>a{TJ1l#Px7(|4?}(z~U|J54Hh+ zLCoWA7Bt7Q)6KN4OgwPK5UdW-1$0I+fpu_=kkL*~A}@mqw<2vEKh1I7`^&=+_max%G@*n#~EKd{#^H_~MRCSEx7*4seZ$?Lf#Yy~dC zKawW-K8LQve`YlLTyt|r27Za{Bs!5C(Hnn+w1Aw}7KZBTJOHQm`5(!*gmc_YfHsx* zRpM90AJ`c^n0l^xZ5(Ht>^zBj@ocgLi4p?(!uiM69Voa?={B+L!6{ysw3{!>ePIs) zbu&yZ>R%Hcn^>yat{-l>1bnz8$bWV65Rt@MAm;$v+^nCk8k(3NCjH&y37|Lbv-!An zyi=OuJrEoa8<$?MU1}oi8NgFY6BS4|`5j*c^i*xz7UNpY-@v1~5;&&(Bj(|Mu@Bid zoKG++A^(!dyyOA(MZ-Aj4#RSnhGu&f5GK>@L8Ox`An;Ij~~80(qlLj-j7@41p;Fr-Q&LuX%$ZBq;&PPqazuhQSoaH!VzOLJxnGoL=Y7F?T#Mk1E zveh{czeTF(TNLUZACp?5HKr_5TcRP35QpT|6N$PqO3I>$jVk17y zzGt6s?}cwNc=9(wB+IHR86-3dqEe!F&A|_f>&bgi4?IE;M8y==(ulj8XRhMvRLG@-zTR99iPRu=C<xC|oi<`zVw>vRiax}1iC@Gmd>uL(xM^Oa9-M{DMEeChdacqazCTxjv+^p@ zE1&UaMSO`U&_#zV9~`ZbU)UIeBN`JcvA1wdN6=gjXvV^cE@73wtGrye&S|-!9LtZ8 zK6!PaOJM51!G?sF<=1Q&>##5BAV%0nJ&TVp>>yHvmE+rUrdyf}kz%~j``@B_p# zN~^%b$dTk(^~3y=9xC}t)am_LFyn}=BjY7fYz)a z-}0%#*W=eSH*|{t+nfP6!7$=EF_H*lQxFvLTACW#tD6C*SsnOGsUVgCNY$6y$#X!# zRm*_?u#iH;)M}A9ReK%Dr;HDP!PX+w;Er)aCIDsD~ zz41nZ2V(ouC$+0hCi@rX7nH$&6W53tcttb`#jOL3V}ME-8hsP^svH*k@ufJ7%fnX` z8z@Bsha>Bght-D+ZLEW#>p*QRBVG|2q9E1~AY&D9R%CGIpZJ;3R9{5uESv{fyuu9; zV0jzZ-R_9*$sE>AGQS2J@h(^ikj3Q$j&DN#f*jV~hMwwH$>Csom!%LQa6>^hrtuF& zlNS!20Mq}P=B%-Wt+8_=dJg|X_=(^6E%b=)HhPqPD}_F@K2GC3%|JH+%nD} zER}*@JajpBI(=EY&ZM?KcRog6zAj*mjYNktoDRBJ;ib!=d;6X>ZEd}q$ZB{^C6 z2+p)wBTOQwis(;UXh$C;h%F!zM0;XA_71M(pv`%~c?fHwZdmcPmRAT*xqRFz&Mh33 zvVF}$@mM6C(Y`fRw@017(6{&nVmeVAe~K)EW?KaVSQjL-qB{atl)d6Kz7N-no6PSP zFDRP>R5Y2?Y66B8)(y}%q!zv!R5*=CPzT)7?lHkSdj^a54^;p=k&410t^)Uk+bFb= z8DHtJ6c;nB?jUds7s2&06>);7Ph7{UA#WU~EoN{sH9OfR!ug9S)y4YYKQ89p@o3IJMju@h`e$fu*CIhbt+LN^4#xKiiZ|G|?U}fnv_8wwr)$C@Cm5ANY5zq!fRKo5c;_yNGp^ zn7>mbJ4vd+`^G@`|6dl15-W)xcmZq>{LH@G{7&~PBgd);PZ*vL@u@vsS8dg95CEfKS_ooiv#DC6XFJbF}In!&WobO zD+h)}o2D9S3LB4EcSCQGJa~6vHnAFC3ugE?+bq)=?UnS~SdCB--xDwye{*xV8oWll zC3p324R=U1RF%_zGdmq?;3^o6&n2|PSd50JIl5WS>K~|HCLEEge!EgmY{^gNu7h5j zCf)Hq3HFIKNY~JsO(SiUoE6c=cpIW2U~nmfhcMd#<6F(IlsUFAxW?N{f`y0N25u%l zR_v-kfxm&CDx|g=4qC1NezOJO)D+?oZo@jlckGMIZ*_Dg8E+TP@~@JA2&H-8YjV>C ztvtjxBjk?jGEwa%6J)>ZJcw?@rw|Q@7W12a}ko6VBAQ)bqXhAf^YoQIDvw@q^Q#(4nCFTs-e7B`OLV`QM z4dE+^QF*2Rad=9im#Utg0jEsB$t~;!sBs?ejeUg2fo$B?=c;0fy1<2R3K-R5{y691 z$_opmYu?krDlsf=(7rU*v?0!Hv>M)$Xik*F?PwgzXFG2EqG40k*qq=JZzstr+~d{* zd>bqFR$PHekvho=YPaFM<*B1MvIolsz4#orV(sAT_F3j9x^Ed@ygryW%j91|Ies-~ zlgisb!zhumX#~Rr>qzJT5(RiO1!UtOde>>QpEdcl=`8bKPQKU@?cW^;yMbC zq@upsp%1a^=?mJqrk}PQ&Xwq5d_2*VFygn6RnQhIYODk>d9}%+nom>_E zr?61g`OAji#xG~~=-Qi?+q2;J=ytp#5yh8cZsdvMo~1IV)RDl4X&jiXtPqz2yt%*y z_=-|5Z_D7z=+V?}%~)fu^)B=SvEVsi-qZ%pc4g-{8)@pS9iHA8gG0FQl{89#_!}HJ zGa$N^lYS|@D=|;iPp`5Ra%_Ziu={ui;xS$p+X5GL=q!WuvsLR8zrwryT7Zmy^9Q*E z*GIT7VZN-;q1b}-IBg}kJT;99Esb*l5aY|n-<`g zHsybTefS^1i?_!oXFBULrmFVG&ZTG<+(kUVhhi4wk>j02DcJ!yf9i1c_%e05nA7ULs?R(!eK|bIaXo(2^8M}ZSgkD>R84qY~q`c87!L{CzQh6c9 zedM0=&%`Ur*ucHW)MR&cj^Tvmh(m!pVK?!7#880Yg0r8!oOzkvm0VItwpJk||2Z?MDgMf7jnLF~bcVn+dMXm5F{PpOK6(~wPpyYWp- z^7;9${1)MZ6!X3d){Mnd?=&loto0al9C-k~@f-dEyM;W4EVgq-owjUxR7?Y$=74lW z=mS2f@b|@KN}fPlpx|z*7U>-p(lHzsfZ7b91_UfUH@9$nMS9U(1dCgTryK^*f?#W*%z~IrpO7aU+OLY2f;gbPTuf`h4m}$t{sCfpf|a zF#=XsP5C9lGs)|H8mtOp^G378_}jV<`WLx?J;h()cd%2)1t@0SYm_xax?_wEroFGF z6+&~6MUj6Y?o%2E7DXx~ZR!tTU(m~O6wb!h;W4}wz7_P;M0*GGHJy?vkXRF*ooG&4il?r&j1pc?cvWkzaj{tA;R%*SbnQ^amI5ZYi>RJ3g{s6m&e1eMFz8cGE`=tMkRRmpJ zM1C(U;Op^L;iI@wDG+ED`IgwH>JOOFcYAsG7+MLxfS1HKpf<2AJYvq#4^!<=5RsUF zs`5ZI2(9>Cd|c=tFY%2DeT!{M_XoPDp-qBbA&;k%67t1m0U2EGw*6kdu;6=$GIn7kER!sPe%VKu_hw%jVk6lVH(v~z0vgw?kk^9(x_;S1(Rvf{grdFS!o@Qd| zNpxE9viH2SNtnR*<9h-OukQU5C=$JwT&Zpbc*<7CV>ll+3BQe}u)omBPQUG*si>|y zI7fwn(*mdEisEs;41a^~B?f^?85>q59%WYPvduN^=YbDr!O!FEaT=Ws*KxG5{L+_D z4@^Fd>#aX(jqWC5>EW58lwMVeg&|29ZKSB@H93U{o4d) z3TyfS|889Hg7=zqKv>StF3}VIy!HAnHK4nxhBk zsc!21pl-xKSMLI8vv82V%6|qp74ZHSOhk92dTLb0)>d#yJ5m~JhyRUF#a1Bap*%Ll z*h{-7or?V%y6f96w-$Z;Ccc@VmiB|X$rITIeBX?2lzAB7@U78YYy!yQY!rr{*uk?t z`tzzpVoaoM;F&^5O@wJ6i&n9{21YX99@HVTzeNC8&?x2<1}UJrsk`SR~xBcYTNFsZJV#Q znYzt56VKJy_SLVZibYOob$C0O+93_q}#A(Xndg;pv{{k+2wxF-1OnwX5hb>kNQ0TA- z?2^?2=--^RDE2$J)%)97L_WrkIyN|#;R^zP|jh1bIi_rRtm5R5R z1RV|Gl3#-UoWqH#@Lc~wx1K&hp!hoQQq;9XjQY#n(0?@CC&A;a6&#WzLm!Y`*f2$! z;s?49UMYJhD&T!(s$;u@W4uqCX3~g%aeQ)sCkx4|K*KE#3SxJe1HnW!Q??l{L^Bj) z6-O~E(hzz8xLD1}Ph1bT^0#%<)NI1x80VlI%LooV+C9l%9zK~E2c}JibOwZ>AFyQ# zz2YT03+^tPE|T)bGA~Bcf)$>g&ZXoI{Fvje!-z-8xbwc389Ejl!HV+QieoYcqQ?FL zzc?S;gxm+18sbl4--wICmwcZ<{@W9F5Su)_ir7qtf%CH&Oq(H2fpC`e3+P4{Kpd`O z4T{3=r9XrdK>p*Ad4XZT6|G5*#Sb~m4m~lETIcHTI~D32XR`n0zXY>?XQU(6MbS~w z6w5_A$d8IA@qe+h;>$t}d{bP5C=F5KxZqfTcOnz?63^a1TJ$5>7utlMr3kzVc!MCf8jCDjP8bNGzmAR7+%dfG+wz%Mu?_$=ZJ#d4SVx`aLPbL<9!A(9H9{x)Ly zislM7_62?-3yUrQ=dWYzW^gI!Mv5%Kzd7DJKH#s&A?hW)BEy{i~f;qgx{bN zpl{Y-4-f&gMKW99Vz*5E8_w}JbBC#IL=t|)Q4jw}{7qkSU+`x|z9d#~!UC?e0Ft10 zv9St1P}JSw3|UK&mD`-TE*cH|@^o{qB9Gw@92N(ks6o|mm3Xs54`WkV39xCZl9^#2 ziYlrp8ev_LrE)_2jNh2OK8}YD_};qCQKJYM{>rf$Z%bBzoye3xWn?d-1@|bJ;l6-5 z^(od$aRbXnFF~WEQ-mDuaK^Pr<3M%KJsKegSmE4ps zMuuZ;6`2Y*`Vsyh!^GcsEx=|w7JTJRa;Ygf;dcCSyv1*VN(EnP3OO>#W$06(NnFHc+hw}D?&;d6*bl*x6)#||Hl_hy^;T*<%k z;Q%*s6_A2J-^1@@D2Po%*3uXeybhGHfC}Jt$9Km^{26(`+0Z*WNJWn@oA6eNy2(bu z2T?nwRSd%pA};xI$vgp%Gd}S?T;SjC9z>JGG~DS}gtN$5^lkTH(8W6w^*BcbCnZAY z95M>aRD8o$peRuA2Y4QG|{lEmO^ zr(iPrh0z!rQz66Tf5cDuUBE6iE&S6bcl)So#0Xr9Kg9D%hI5o>P~c(YZwATfD6A=+ z29*GAj9}|91nlk?N{yb=M0V>>&I$-cEYO#jDhgB6D7)k?|4dVfdr{Z46FHkqLoIZ~{xG7qf`G$*$N~Juw z9}1qaladm0pJvr80;T-98 zC=1<>!HTt53|R-YmktxMxcQ7Xkx_ws57#*nWP^_n#?KMuRNVC(RO-KAdwZV$SlnJN zLENYndyQQ{55qTQGO>*}jCDWOAe8X_4YJV#C>0ow;5PESvw^oy@N0A)Q^@NpN|!Z& zXQ59pp`r)26LHGdN>&Ik&YVP1c$xpGJD-jaOK=9h4i}S4=_l?Jpi;Lc^qdWXRgz-) zLZl8>j_t>K0xsssx`@QQmCTChjNl+|p_4^ngc7fVw;?)HxvtMZ{jG>)v##rjD_6i!tK(V z;FWH(v0|(vb`5C^xg;XtO^%weIZ`+9mnT3^CqLrV@U^%dT$yxo%ly58`kTW3%`X=B zmy3}y^c8jrTaV6%H_1rRTV7|@xtJ#8_4aa&pt=+F@l>2c5abV_`$-<1-zgQQL4Zf@^&|>SDRCEDQe->vdRgY+k_Xk}(i~1X2YFcPdtS0L;uTV5Y zHXNRb?!>NPpV2VfUj7c?#!&W$_+Mdxzni-m?IRB3UGM;Yh|G4*^Gpaljr3&v;pl}d zX$$BgQV+Y2wZ%Rn|3Dq21;T9ZQ3eFA6CZd+IA4-dq8Gjk|4oQ!#QoM63oVXI*$epV z#9aA1_$qn?+k`Cwu{j`Pi_3Vkfb*XpYVAAhx(u>W0De(VgvlGuYTmlR!_h{}$J~VQ zwX_7PjjqLPSQAjGJm{w6iC`$_Ria+xx1V-jr0W7sg+Zl8h{5zaFyCGew@v&3PndL& zT$J}hVC)yR4;zlwfpcVYMeTV{nAzZRbH7*O%A@`wI)Pv8Npz!huAAO(!JaV(b2{%N zz>NX$lKAGX5x$ zK^s9f?qh>6A95PnD19Yd%jGc_MA4wsd&KD>vx#o_EHF{sq0YEE`DTP@aAWKTD1J${ z1x$aZu{+pn)B>l;4~jSN)7b0c%<{IX(z~hc_fQ(wD(ReK}k^afb~Hc#?^7 z5%M10g^j>!0bfKRD-d<%{b2qTGX~##+q(Xt77+{a`S?6y64l6c-}@=pH1?X=iZ?+d zk#XT_=um7Y_6`*wljLIHH9uzOB_4%W`k%T_(7nh~d=BX1wE#D2c*6cxktd1P0I4QP zZpfP=CUia42&+V{LT9CZ;TvvG=IiMA;8?HA*@PNO%mJ}EM_i|Nx~ls+h3>{WvL5gZ zqUo|e@JMt%wjDc%eu7ivC&l}L7P}m;8;<$9y4%tM@*zGIPbZ#}J)HYJ%K~2_{TN?4 zh|mu9DT|OOx(>szvq*2Ko^*yVkNb$xB1!}jo|8^K)s0w%-^Xd-{IcCAe6K=H;tyC^ z{F>s+via~NG#{IYO+%M}si6@-s+X+R@vosPK9O5Ndx*yXZ+a7Q>Y|h94Fq~ce=&M< z*9tpH$3y=i>43vM=s3hJzbCN>c5-0G)<~|su^ z83LcUpWFjqL+4?wFd=Y$W71Kgw!ELr0WnXo(mTO*fI3T@!jIs)i4{~A*K2QKutDqr zvkng^HmM)%j0Rxaun#B!VJn+UnV`P*|hz>F?s_&BwM zUP&gj3}j;^Cc};*?Vwa?Zz0Ux0(#>z;El=7-(+=S7XAq5kuB)9ZkI1JyfdE4o)37V zQg#TQiw?&+VGYrG;0EKp=q|56>sxGMsITvZ%TE0y9^%LGNG7GfkNcFpuo4nB*vW?ll@ zjfK)>&~1c)^~TPiB4mran`DL{m-8UeB_ao$n(n+qHX_d9sl-b1J59MS`7PnTz%$Mg z2qeShE}$F6Vj3_P--n(^Q$+#p2Bsi(Ie63C#kG%mO8mib+z&3Wp1N8CEp{lD#G1`p zAri|fAQvLX>SO)UwQ#X)g?KZ+Df?M`V7Q)tt$Q`y8(`xtd=$Z=);K?SE&}I&BE!T{ z2#pd3G!prP4#JG+1VjXtNi;%|GmjCDTo3&4Y;p3ak;HYJL39K?wZN_OcMac;*I}>V z&k+~NR>K3(2ABeiB0)$c+bi0@tIfI_8ye~j{EZmJB;B|Le@X18y1H(AF9gHU0_Jys zshgxLptDE`nuEu0fsx+>l_mkp)nJ^r3JYaQ;t6`vT86?i@n>OWenc!L%WzDc4fpj*ve#gY}vB zOEgfH4XenZNfX8^v*3MYIcf%{>vVa(1QgMYz=^2_ z5H2q7kGw=%VBiTQq*VS)!VrGtj0YbMxD_yajySWZrNnn!O-v;B(|g=`{sG}f@kZ>` z{F&mPvK4S2vB)3HBRdl>@s`A8;NYZqzWWp5NeKfx zQxFoj26|%-_(dGOfoy{gNTb3s?h2+Tb~pIKJJ@xKdP`Vv8mI;@_0rYR*E4iJreZDO ztry8;B~S&Z)J&`uS^#FheDPc`Z9a()2fOW)?(_6wvME902Z%iCI@sSl4g@1(7;iZ) z!DY!Oc{St+s=+Rytq?-~Ly{%*aMm%BqCWzD&lP7iYB})%M~DIBYI>Pl?Qb1E6;Ec5 z1-|G7SzlO-vcZ39LCT>t*>TZn-awWkwkxz1uzxc;kIWzfz)e3ywRG+9&IgltZRTd~ zX@LIipjpUc6a_v^5j;j-TQWva8z`d@k$Qmw;5Lxt45A$Wn|MqLoavsgU}H2U@tG|b zkm5%2`|xNq1^bEaM`l6GrDeiG?o1{tb|?52p#MXvf?yI!gqBRBOI;&0^Su3aD`6!HCK?fpf5GtJ{?9L?_tD+sjWmCFq6ZM_o5eedOf1+G04{$gkJ1&07U&q#h+5e^=@<71*T}fmRSBQGlHs?jp@WA}YN3c!p zAc%mi=vp`#y@%!l*5E*C(k;SG+z!mD=*?h}cfG5MQjzV5LBs@d1g&!)^z92(#Covy z^Y)2QnF;!am{A%Pp!I?Cn<~!XTUb-$l5oVA?_NL;1q|oJuMwjt(%HnT2=L5XZo?1iRpwGEG`p1S}#p?kL zpD%tXn+P{VWf*~eLEb|i>2y&(4`E%1jR{Th1zZj2cAz)(gord!%Uwm@N5Ob>4D%NE ziLjrv4Kx-xik72!=pk4O+%28J&)$=07D*3G@$`2xsqKWESWCFbmd+lY2w=uV2^(7> zs1WPr=inYF1G|qdM*0JH>y_{_w+GV_-4#3!CaTL+2_YnE6Wz$ZbWQgS-`$WrzL@m} zY&Yu29MD(fD_Vq>fw~za3y7rrcdYU8WU%?!?7l)DAg2)Z2^VpY%5n_@bu%=2o5ACz z3Lik{uNBsA}vk9x& zFZf5q<+9mu4qAm?Lsucwf%cCJ!`#cv&M|fN28JNU=Fy@1vn(b`>Vv`_R5;KVXDO3y^NkiuOgqJblH8;H{MQGqc{zEYJvL_UAa+7XusKGn|I-c#cDhC3#X zvOn+-0A?Hx^U*ix4m2P68(Jg{f!JJQ_KqQ;8om#%RJu7p@h(I=QcoKJhi8ZKWAB+s zJXo|%nh(uD{zadl5u_u0M>a=%ia(Q`oOm7n&!6tm00(zJ(U|x|4502gjh;P$N0C&< zY|ef`f5{v(L>%!R!!hFx_tB8r$KBMf!JW=E2^h!E12NdL`{sE z+@`{Bk`HnwG8lb?)LE9hZTg+T(so-y}B^1Bn#!CDqNf(K{%( zAzHy`%!u&MRj#{_mE%< z+dFZFUC7@p{vhiN6Ub?F3SiV+XrR<2v~v$JJI1h3BcIV#pB_d|0~J1r>`F&n!+dQ+ z3u51x$vlZ@m2?0!6j_L#MomZ#d{{OZ%+o{J?8NQxB`~GxoIdg#(TAXk`IN=U^4<>^ zBDsv^oPC17B!lD^;4Jhk+8i~(N94yOTw#E7kuf;hFj(Mi?s`n6lA{RVG?6Cymb-z! zPPicciWT7f5ar0;Lx+%c=pu9xvKK0ot`QyQO=My5qEMA@j{7Qon><1+Ai9uTdY9{` z_hhgT+%-<*P7?Yg7C8&)fbK>;$T&D6`z1~jMA#P-LnG}2`#qbSEvWZIH{v-_jhg0M z;L!$}M>Z!)*kZv4u}?Mu4g-ek0;b|}c|tNzxRl$T8H|1ja=tQK9sc+UAMm?@bjzYAxe+fXrj0PZGlBRMA6#p%P4Mni#)-fXZjs!gr}Ow6U! zPM&9*|KIQ*po>TF>x<{e81R3{Ds%|i5@`<2lJZ2Eyh`Sw*!0j&UlaE#pl^>5{}OY_ zPBiK2;M0T##jY`(+%n-PXPIBp!=r)U0hqzR=x`sfR54v_kOqhkc0=GOMK3l5$zG&tmyVuF9wHtP z@5o2=Qg?;#bBGo1#ahK1FM26m2#rC;fd6zY=*4u|2a$*OiZw6ZGThz&)6H@Q$dAN! z;xDq8>hD?xwl{;Lr@;0uEI24RB>w}~M-QNUbTynKmrI5VI&k8N$C29s1R�sxin$ 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 diff --git a/Mage.Client/sounds/OnPlayerWhispered.wav b/Mage.Client/sounds/OnPlayerWhispered.wav index ad26c3a9d41acf1221745abe8849d44bf0caf78f..7e58c8a5a1c3a463f295d55b62cb69af7c73f3d1 100644 GIT binary patch literal 33740 zcmYhk2UJx@_y0X}E>)ALR5ghO&{PY>6cs^Dvw)gv0W?L$mTJV3JShsO$&=VnlP5*7 zq#31{u7H}VfF(_7rdj}viBZ};Gyl)N{@%6T#iHC(X7=p*-FweD+&$usJHA}3)B{8B zzkS-Axji~6r8Hkr_bYYVHl-ZZQ9bhD+y^&sO}GlEx$v3e|6+{C%!^CAFeLvy938V z_!-J*A$)h@J5*i4_vQTT$j=UZUB)>%cA4+||MypW-IoqjtDn|OG3FE71}%c&dFbw zzGW4c!-va#cXaSwb(xQv%YAE->pJ?by^O0atxIN!U{v`jtCi0(lkie_Ajhs?B>DT& zw;U1Pv{wPX`Q-0Q=j6AH+TQowiNED|AQS|sU=_qq`74OO{W$00Qy{-P@w*dag!-h` zg})=XOC)dw*Ljp{HNS(DKUW9(?sE7Ph%U89yMj6H�F((j`8&gFfN8pYM!^YaQQx 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 literal 20336 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 z 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

    tY)5RisB= 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

    RAG(>l(OV#1V-^3+U5Di6xu|TI&y>L8v4o+Yf zHAC41+0?QCg7^h&w>zpDDC6Dd>E|2g-yZ0ov@jo{*W`ZmocKWoXa<^C>BLR5G8q zW>z&KfGQiRK9-!&w)Xvy$|zohik!Da&Ym%-=?YK{t% z4e%hcJWx!DqCdJpWDqX$2I1FtEBB>#at|$*7)SSIi!-gM#$jN@;MQO5m2*Kn_z6 z8hy}sTpeE^mcz_#9}vZQ10$m({K+1{d%A{RLGKE!f*-nHAF6-S%L7aCUzCFu0wHlJ z+yh#n1Gp-i%5{db%|?b{t1>I-6kM5{j-C)BVV>KF*lS)g4yn_Djgy#vI-qK+iN)j! zB>jIr>NFn9JZ8Pz2isQXCD%e%4cB&8p0kQAoho4cr~Lss?s%Y#mmngH#;~0j=jrRw zy`usf*l0X zTe)HUg&@&SrlJ3l&Hf@rK^k!md@~~HeRLN{S?;DgP^ZXuWN~mejkoH6#k;0;0ob<_ z;qH(lUk)S(HUXCFkbW0_(&r%CR2S7FqAj1H8cyOd9tLdsI3@+Bp##Jl_$IZ3*`f{F zo;%@$?g1wCBW;Y5Bz2RfNr$DCGOtZC4dOA}dl!K-Of{hfLB54g0~3i*YMlcVq!U`C zI#DU1eKmiRv)~!MlD-Sgu_UHBH-_8Jxw!ye*Z#}C-gZ)$#9wKe;UCD7^|u z0hQ2Jc+b87hQxE@9<+Xuub%Izzm^yxJHd9oN$ILoR=UWE;)Xy`>8f&63pPiiTsX(( zz*#6(zor*68e7*PeYKHjP8=py5=)7`K(g8kr*97mW10)M?62%F+qNALrn7yh7vyXB z?81QhcLm<0UG;0~I7s<_3@Cy5vIWej(_}%ko)|=)r`j^7nTd?b#BhDt&D0wFj5fFg z;Vico`grqbKT_ct+Swd$IP`RNs{A#uAdn8b^(#P1^MD;ogehVNxHYxL*YH6|tTn(G ze?}r?2|~?w=4hiM{8ny)9MLqrF}O3pnXR2ukI7@ii-B%psvHW0^dH<%ehK@LYED*1 zequRMhcK*KL?s}Ar@<_BqgDdw!yn}bunRb)B^p4!HGb$SP^KheEY>)JOQmZGHEmm% z!IX=+&H=p?{fqjMLGTTGKn|eNv71N$?=JMyoI? zfNsHrWh(xS7-E)LS0AAcR`$t>%04X(8Yj<)87KvKlo6DZZUIf}8Nz0vknq;F*tx+~ z&oP7V!raCx5b}?q81k95*(eNoq7e9=Hlmk#ZN)v2;1COTTkdTopagV|4*E?oewyVH8EZI;6V(VnY$$MWO6AN{wb3u<4Z6HF{F z8<9XTT1xb>nu4`tDR~&5raQ1IbBcO|zFRZRF}h8SS1Rhc)@SsP?1KBkB;qqyiSDI+ z5rfp_@Z0>{D4>$&S0;=4;=k=Hj{Rg)@q|{?)`nH^Ysa;qNA{k!XJ8jD1)edEAI)8d z&ow~QvpN7#L$unXE@Trjg{Xx_5~tMF{u3VFJKkS0FfDLX^&y`2kQ0sR+8uMPu~~Hc zPpfaN+15le8JFXWutTYRv=iS@A4_MoQ)Vk;tkPHcs8=&a$yLN5@UCjA_<@4c81}>9 z$uts(0i=nmF`Iw^@EUf<(ac(MELa@Y<6Fc5>lOJBXwe3DpIim^7$urpbB+d#% zNNGx#+E=-t{8DFX@mhx73Q`?)sq&Nye<4o66SB88kt~l#nc+ZKj|%J&Z<{QBM~;Cr zUk*XS6ss9J0M?=H)LABnZNrwQ8^hBjksJvVryXd$@mRg06w+f!2ba#>C9|Yfc|^_| z&n~qcyxH23Q>~`vcA^p0p9+}2rTzXVfp^Mlq9xmnuLbGcRB9~TAQ5+q8IGGE0dwpc zJ{j)%%em>ye^eDZ6IZqV(w7-`%>BlB{is=q{D8}ox6IpGu3AkSp^j3n2D0-Oc$-U4dWdaDqTMI1nH$&N7R5``W7bUGH2wH4UNs*R|@lu}h1+pts^p{2>YqeR=7+|g>zM`^Z9dwyEk8YC%@LS;OA7=OP8~LK_ z2I!w0hnw_Ha;=rEx7G(3hpiB@E7hI35ByL!UlMp6%Zc*ngt1g959YMJx~5+SSDj~uI2=0`5Nmi zSQhF+mZZLw0Q1H2=r&5n9qH4!CGpsdgdI;&ItK1|&zN{-CDn*(f>kRE{@)ZQr_k@% zD#8Q)CZpieRx7cvyNTzZzlDgE6{a6p`qRk{)GC@{`*Dfv3wErK!#yNJ4VUcn&-PC9 zb`MZmTl2b^3_p8WDJ6N-8KlmAa$E_bTuJ;0YM8Y{TL@F8WyUlnhab&1viEoP6#x?t z)c3_`B6)+XN(8Cj{Y!m6eVcu~{6*zA1`sr@b^2KCy;4-1;OiI|tY(_eZ z(@%k%a18Av&!PoZj?vP92E6eUH{sv&DV)GJ;QpZ&n#1JFevfZ`V1#VIC({A$8cD{# zMnPg8?f{#W7ED2A0#zRkvQ*+U=|-i9mDWUb8b88GaHiB?U;LLS`hEVRkSU9YbCF7> zkfG#EtCBWQUMN3R8=A+#H<@hhGhV^>yP|g7%A}g{i*1*LF>Em^oK#U$97&z09b6Bt z7W0NYX_S_ah*h*1KrrrPE`+y8Itfg9^FEMs2LWHcs#zNP zov8?aO1frAA>!5SMwtpgR9aX*?2yiX^RN`opMSV@BiYx@0Fk({{zSm4d6`p9vVv{ zz{N6E-=Q5aY5ay(xE4;2BbBYgjS3zTPPy6&lLbw<2yUVqjx^gW&ZK*hb1V(qSPP^C z_o2K4?pXJwyb+$nKv`)t%!b!!tBoY{7y5&odambas^?o#(aY9hDscTme#R^-{JP+P zaLu9f`SdkYRF50m^#Rg-d8V~P-I`lIFIa3Pj+J?H7ODe2_)6?n>zL<^=ZVn^Erq{( z@r`WD@lqoN3_g!FirNf&rJKgSKr4Sd;gwG0T{mapTk>@K%E*W6qWr>WFKR5VBD`El zq8zb4WM9CxDXNTO!SS&}rMMD!zZcodaX^ zN95(;J*DTAEmEdS#k6vzqBba_QzkzseRt)Dw#M+N?okC@$@-07>(UBnLE)o{w=dZ? zav2(;9LK7&j%|fi#V=+R2;_!-FSHW*bHTqQEGDX;fozhzCF_EJHrCM#X@$F!f0#Z> z3HBsN`$AropI@O?fiSZEuW!lqQp!rt!ULu27APgHd)M(*c-m3ztFWB>mGSobb6*Z~ z&YG2}e^1IdtWvg&kPcxpg!leEKU@Axk?z|sPzmBWrcUAXh;o>qMum?nak-SefX6FV&`??`pQYWAxIw@m)6IGI1NxYIf>em>jQ*|{CTI?Li$CGD(7IcUF zBV;&6IpT$QwlTNJ)?Qdc&9D%WN`2&KIBq(E`0AurZSP&1voANo)69e2MZEv1jhT&3 zGkCFml5y4hPPD7xzB`^xS}2{)rr2(UmX8Q_wZ~7SY58Bg&*1wI1kKATkOyA@Z{LFW zldXJM=K_xk=0|LCB;rfJlXhs~;2*1JOd(rR3#g849`_Feh--bTGDTjj#Ow8q7V0u7 zOdh3H(0;4))SI$b*=Yz?5)ni-p<}6Y_&csg4TnA9WBt6g#bSjO!OL8CSkZc~hH3*) zWiCXh1wFG^FdYfhOJ)UmQK=m`EsfF65fg>`&gv}erj29hAU&9oxKcs?gjD2b5DD;< z_)i)x&R56jSlS6KSHpKhK5txxJzT6WGe0A+&?t-Avtxrhg_#Z~vkSGhvW+I1?vKg; zFT1Ck(XLo0tcqaam_~4DwRKbzpn;6QepcD>&e`6PM3=+I_^*!V{75PhZ7@y9(4^`I zwUPd&c{%x?{8jwV^P9VoKTYhe7O|2cY1oih5xD3XB5qcb%?PF<(?FjrhAS71hEyq` z2fRm$!{!Ntx9lbfT|6*BEr9v*ZoRZx%q$5m#Wb=7noKN&PFE7}RVo=?*{cf1-)e;N z6=oEV$+OluEiqtvMv2Guc513`k+*$-HZH-p!3>m8BcOTNRZFu9u@(dHEOv)dA%1?gy}}a0_(egd%~Y*p62>tF~=P&*>GD||KP{? zfizcjlU3*-qM^oO-PPYQ02-0?@FL=nbVvF@%!eIR8#7iFwLEJkDV9BTwjwKqXr-4gX$ulMJUFxi`8V@G+K2|%UkJ?-wX8z=d2d@lT z@#U=erBR_>lC=dnxcuJ_w!jQbtGfB`)fi7OXla z+8lI{wq6yeYdm(igV(qk;-6|I<0+aBH;{u?!9YRJ2QdbAV3*X1S}(J^b=jP5y(P|| z$K*@A8b^^~*hvTDS1|RtO~jZ5^ym!n`F&5*nbzE7(Ts_brhPax7lbRk^4^Wv5r|~%%1wc#%}1RzcW+K1j0$R7hXB4 z+27kgIkyN!sgl6xs7Vxu+us&uw5_nc1(j~BFvjUgiU;lkw3!IAgg;Dq_5j@v4cF=@ zs&>?x0P~$PxGYr$uLW}JZa8y~z%1_)QJE^tex-X8IqG?NiQ2_{ zLY89cF~4vn6oCl%-QPs+hfT1hb_?tXU@+s|^Bwk8mo`B^d7oIr|IOp|oCCYScJn2W z8%l96DF^k9JMOeO8}Z%Q<@7>)ls*N0?P+8V(V9MM3vw*y63FVtadof04mdMo&@kKs7rQ6p+IGk_{U+#s@wbPlf3<;dZpt*kW$CY8pGF*8XZ@S;eUu%4_w7F$p>7Z9?gwe}iO5 zlAT14QB&H(n(Qv7DY?N&ghpvm#?Exb8_ZkcPWL!>nm0O7M7%22RbuqH$|vvN?z!Gy zzSjP_VnBYURy1>QRVE7eCc7|xt_H^lPh7o&+d=mshue;}7=3U>p5p656Z07xM&?-Q zmRldGCTpY2S!ONRARJUnsZZ2HWYNi|?T4Y@n`|V0_WasqxSs9wIgn zYZ_C~Zi_cR8)x;w#&RN#`o&LoO?Ax$zjYD2#!LoN&RvUEH%blEIG73U)hg?+jb+w6 zpnKIpvhh_~?jJ3_RfDbS(8e4E#Hjs9G=j~);4X6o*escPJADY;0HM88rC`OyB@f}<7(DNZD9E)sy_&n=_{Lo0J5VM2Lw&&Rr z$;yfZlpfFvY2P5NLjXHyEsjHT;j;{)BRdGmaSRUk2uk+7d^%2r~daV6qDJX;0Y04G;G!?8<^w276Y*J~Z zlk!;=jl%GR#ncC;6n~lhKo6rnL58faoTe4B?pvR&nZ#9drxcP`C`m11 zGx(|k!QFvuQw2H~yz#U7vcg_2oytWm(FIf#b+QtSU3wq06S)sBw5F+trDK73-*Hc* zC)u6qX&1NvE!*CvsW*oEIcE&gSLpkp8vuq#^qp?X+L`&xa;_0S8yE>Rm`J+A7N#S& zf=NMpEZxl4=g4(^aqi{$-Q4j$K^m?00kXhIvH;PZ{LS2DUeg43miRQ9Cmc+YJWpK9))?I3z9IH&0Z%C0^6>BH>sh)z7&l zq=~;}P41zl0VAOn8cZ}X5|w=EjeJv6tu*wv^;w-Ge)cK82{4`6tsV#KOGoNA+=E(j zH<+pjn}RiwIES|4Oj_V4@*WC^amUkunG&}25;HWT!lR!{nl zu)!$@EpT-c{-I~$1$Y|pauUr7%1zM)8`EMEr~CzTR~O+RRP(u3TY*Nr(F;gNZ&4EI zz@5-am^ZgE>l2%h4R$5m%=x5r#Fz+FoFrDrV*{+GkIpZyH6Xu2M zA-(oPk5|S@K(~@o{aIq1VG;-NS}xI^=y+nA$dcp%^R}TG6U_4P*K^~eGA*!1lA-hY zMya59%~_BQEN}nMene=;jpy=&Up5PP`&H0PYYohDTcCSr3d$x16E(n%7%V>VR}ncS zPCcZq)v9Yz+EH^Z9zdVPjCDaFrKVDl@&sn1+kh}N7g}*KTv=`#`PmAlV{FMVGakS! z!!5B&4u`kZ12_jJ8T<7ty^6WTyrUOVdO(ZjrjhzT-VyA*Y7yh~D_URJGA6;h^BXbN z`ddGxro#k&JY?0Lp=9zrFn#|+o5-73XA*?6Hm6{5L!l@1L>ObQD8#bGz!Dq3-Se|0E-y+ z^rO%$R*ceMVHppJxc267Nd4`$=AaH(qzVHmw;Pp$lEK5;Pphvq7c2OS`F92OK%eJ> zd={($*W{N#a7H2Vqd^DXZkRM*(%IevI}r|UV~%# zz2zl-;60EOI0PoDIM~7c3+$H&5|dTn#QF-@k{7_Wcvml^?v?{E@v3JwGKQH+<^^!> z_QW#e4E96rA`_gtiI6}K(W_}a6)>47AFajIA$*e{(E_S3t1ubV4m=(g!~-DNv;}62 z3ygJI1NE@7PZ_Hi@=+y4djffaGC++Si|QJURbH!LK7`-ZImQIz8vI`NRHw_~@-2Cs z+FiS^K>`fUE>Dp~o#J)~*w#Y$!VP3@;A3FzO4PT=x>N(!B4^EO)~NsE=&Zx5I@T^e zv-Mbn1WRytiaW)j#oda#wK%0v+@Uzd-HN+QfFi}+gF}MFb7b4heCvMCeeNHZ_C6%% z>^-vHwSJ2f0wuA&yh^qCW+vTUPX+zQylY*b*3eqgn2fx`{ zr2RFiJlV=$@uy-S{7JD$OSG`R+divy=xu0}v!6QX>F!U!XVEIU)@vuFjp8FaZFjOZ z*e>`&YKqqOE99d8%$yR~6R70R>Icb-G4$FmwmzC8Kz)pqlCkp@mlXM>^oeey3#9&X znEX2(N6JYP)U|qP*Gtz<&#yk8Z=Wk57r>;xv(yKwW;W@JxXiz^@AiIcmQxEq_X;>v zlSN;owpQ~r>zrBCzGdIH&RhNPMqDxK7!yLHLWrut`PIeV?-Y`{>8ks8*L{7QKFc-U zJxkxN6qHv>*XcJg1Kk!?&?L0q`NO*BVb?BHIhpipiCAfNzAe zJYnC{V$bWpTm7kb;=Vxs$jN!j#g2$9753d--Wu_x^`~AbV?*w=5gARrJa%eS33aGe z&f7qJ?KHL9*^)WbY%KaIBjx9Cnq1*ENh`aye|6g8;3X0*s$?!n*US{7Q*e+t<@+gO zrF%6R0|)5b)tp?ns?uG0guVu!Tt!}lWfeV0aZ*Hy_J;Z9%A2ifrp+G6lD1qOqrLLX zkGK?;Pah$rh|BDbrG!>O5xK}l3mIB=gnWw+CNbJ<^fdVF1=cq+%F3`4S)7QFqxCKN z6{Q~??Cc6|4)nH%({8joJ7*PRpX4_>Qx=H*b}{pWG0^_zv_#kaA!ayx$wZeKw#zqK z>qkpS#q|Dg;y)(YL_cztwk8We6a2?4X`QpKn%&Lo_8c}9tsJ9`E9|q}O*^IDS9U9V zmC5ovG+jKf_nHaD7))tuVf}j%m>-A^{N>MWyb_7h&zR{viuFOL_`T(>FyhiK5DtCgH`qF%H?)jt>f2*zbbyP{HO7i&B zRJ(OLv$v-8PKBW8HsSvvxq%>|)3sedOGOskYJDtHL)+)VOOxvUfuSJ-2A4^y88 zQlxYt82>dQDa@&XeC+S6o_j@DNBOrh`^?BiPz3Crok921KCRj8HshvdsIlJ6gUI56R@ z_M}9Cx&;~zs5&%fzU0cc%EukJnDvhS_D(Q1GCHQc?=rHY^Y}(-O!T!p+q3O(zXaWQ zEf~fl<*V`--|C##a>OamlWM;`8o%NB(q}W?!c=9J)CXogo_9ieE`Ud+SnM?Cwjrx{H%&Zh23H&_4!;NuvmHQ_2JL5`_iLEN9R^=rRVy*?DNjl+IUhHnXjORRN=R*!**Ui zi4S#dS$G+U~t z)zk9AH+e!Tqer_=NWqfEHt>PN({wAlv4^&n%l}q%YQx(L7dD1o4pXhik zrDvzBMK>|ji8SAYTEeIKo0B1)D!QY;)=*Kpn%pdAGBXqP;gjN@BbezF5Ds(8yCIvVI7+H1~7^UP$&B{kQ4 z`et~n_bJQevGO}i{0hL^r{Jt0+jE1zWmHeyms~CNoImKyRfLDb)_p4C2X_tJj?N-2 zSQKsW)70Y1KcHrxF$P=ZcoDGM=1W_ZW_lji6eM|4`E@&wIX1Kn&gsm zsCD!t&u4FjK1ew$FC#w~IWmfyb3C20wTS#te&ke=hJmzN)4rD4Ai2ALC|ipbPA|Hk z<~kG1-@s{GVYLeV6l`GU$ItZDb4T`A3o}Niha0C!tXA7K1{zKdUsZ34YV%I!4r3Nb z*L9URQQ29}u8H%`$Iw<|lG7FK%B{sUXFX_t{rE9wkbRTQm#=D_rY=^6kvI{5oZqQNwbhdzya>+Vkq?=pecKhJ0vDaG( z&I+lqUcr?`OOVoWhuBV9@uv22>jF}AYxqvM|Er_BY^T&-io#57qLQGrSJt3;d5bFo z4efCLi!9cumPx$3t@F?z<&r3nHQ2!Oo?Vl52qP)13>sIz*o%;E+G!28SF&|vHTpc`G1+e}@03TvOU3cleP#nhZn~2C zMLwMA;@M$zVn@Kg^%||OSI`*zk}g$h>uuB%qJ?$UNU=}B@0%c|%K6;S!@7pQbr)26 z(Gw(>h_ssrmB7}}QF|O=$}IgqF#qS0d*&_w^~{LiMPxHyvVj7=G4!ARO|ptORtgD> zQr6GGW`UYUdnZ-YlX7G2G2G>S3%ujh(tNrd#qMDrY9SfYHMN{)g?F7^2;IOhScutt z3rWYH=0Y~Oq;d><>{YOHRl!1S0yBLR?+|PUto8hd0TC>*t zVD)s6B{K(FZuSJ8znAciRdrghaXg7^kz?dUaT~Xui9E#I$lv@*G}%T&a}y+hNAjI~ z0hujN2g`4(tA)2i__45mJb!>7xInwEG?prgxpvU#6grgIGIdVM<+NFuCxR8Mo_Mcs zL*JPwzm#Ltn$SgtsjzM z^snIQ%sLr+GSfq7QN#H$Lvhsi>J<5;cnpF>DQmy^Bc8UB_$F53EZT+~hjMfmUFG?l zTkH%U#&hHI`WKF=*CM~Tjw!&;`cPLR*8tZwx7XJ%Y^<-5hq`X41(ow)3%*pg!`E0v z9;Nt|Me+`;h?C&Z+0RbGcX)b02Sj6M zAGXl>=p1G}`351N9q)#7ZkqNS;6q+>7Bd$EFVU>BUC&Og>4MipbRHP5;1M1U|xSpZGX z^EonV<|Ct^G134zf!`82NNZY1z7EgXC_0Ixh^gpkUdH;e-r|WgLOrWqSJIW4;BYcD z9^XP=SDbcKH`T>bYvd$<#cEkb~z%Y^E=1A2J#a(R<+gW_A8Rhgg$f z{ouRc$Iworj@i_n#;cONA{%Q87xOJ?j$B{L3Zm*9<+GYgjgpH<<>W?+DKD4Z$UIb) zqiJ3~*)C=O;@og7=N?iG^F?QR4({hKBrlmkb$O#|x;w$`fpZml?Xw{D5vw#;nqaD5N&Bcg z5ueSyAq@_rL2!>(!*|?_WYD$J9a@a|L?gVF*WfE(W_33D8(Hn%d^5R3Ct)x82VV5n zQbn{MUKTgSEpVQ*VJ@kVaili2LD1|%_DGsqQ|qL+bnVxF(RQjum3xFElUNq&^!t$G z9~!t5dStG*KG|=1N9lK^kJ3n*FKTg<`B*`_sHvNq>?z`)ln5m)Q(CFa(0)^I&{NQr zIcItwK1VwPbkjhVPq<@7w>UO`jHM0 zvqVjt`xN?k~+t5KOBt=R|j!VaMD$}2Jh@uB?O1>IK8O$ zhdi7>g#yc0g(`g>eSwMOKdFMUUjBt_aXQ(VRuywnC}%Lzzb)frMxo5?nPoEL{68Ai z&@xaMu7N794W8e<)H6okqBd8~plNw1y+Q@OOC=f)rgBrB$+sgDx)X0vX(*PGsDw<| z3?z#d^JuiYPoSgZp2`PI%I87pxj^@lnj+5GYEBD%3Z4(X45k~UkeR859rUf7M<3yu zsdIH8l>39!5t|qTW9)BdDcgdy`x>&GE<$3kpnMp+-UMYRT(w2X2vJEKLI$e?pNv-b zN}?lQ&KpDD`{L+qkkiPXYpq24$|tM0^|vKC8`(%?TH8s#t1WfO^<4i8-I~Ys-C9X? zvHXr!A;ozUxLPjTv3LhwBTpDDU4}=pnMTxZavA8bwLt+HWuHNN&Uq_8EL*X-qd(-U zkTJ|9Uy$SFS;!=wq418etgHcxV5hJa^5S2y1RGr!Ho^uf#H18M`cc2r=u=uGCTYX=!>5*H(R*_Oqga?O1}>;ewR}GnXN2 z8ON8}^@fZ1CmT8w6+Z$uS78_(%#34}_EHQgvkj?ke#LRl~5aG==hVz!~UpG>a{Eim@B4 zA#Wmd+E%K8j>%_uXZovy6qZ^bopTxA(4X>W zYVZ^IokoZda>cJf>{^U2X;o|@jiip~gdB!b!hDHh)$2w#idvWhEqA^mUztnHCU5B; z`0tvl%eAd|YMyE-N){&bWK*54ye@qUjKWTN;!qDKJqX%IwSuSqy z{8&Q=JA<798=j#a+OH{|-*0pBUj zl(P6=3y_qWNFw3Z{3yDhbLF#=(zzUpb>J{ zH>6Ftxs;MeN^!U&&V-9TJLHT=p1_VFF*{v+<~pnGM4<~y;}bz?U*!;dbM2wX{((&X zC6>a1yp)K>J^B^8UE|<_j{t#shcNg-QI_VCp3u&8GMz+!BW-yebQ0#bhFYua`fL>6 z$0J07NGCm|JJJ+<`!1Z+v*2W;kwwIZsdrhN)n6zh!KM8NXK^1j!~v|@UNK!X7oCtY zDNg^Oo9I2dmnM=caJ0q3ANZg7#>``1g2tX3io$hFz($Gv$dU(;6u&^HN+p$(>NahV z{zR{gOxp(ZxIL57$Y4AveaJWQh%;6K9Xq8&Grp1^BW37p(T|tKD*c-EbS7KJtanZU zego6DcH}9k0p@XgahOfQjU>gmV~pW4S`KwG7=*+>-Hx7S-AYe(7JHk9@ALSyRH~Bv za)b-aL}kC+4++sG@=&QX(H+TZXiv6o2IDi+GtOro_CNMF4Ll4MHFwxvUQ1Nt^;v%w z4mQJYAi%9vH)wxr&y|<-N3s*?tm32-?Ff>659OxxKw2e_Q@*P4`Wbf{PcCE{FKP$X zR9TfP$=$Kr=EZ5@Gl?VXL~r&M9{hG}4=+FzS^?RYb9gRuB0JgFY3gjpe}1-inZwN; z(8Ai96U_vxE<4IE!Fg}08(f?81?oDbqj80AGgleqH?BBUo=I(b)@M-d=J~KChP0zCxd!?wYH;lH=(DP!48`6tRwE zL+8XA{A`uzPO=D;i<|r%?~J!A8M@&)mRnSSKcl%(NIzls!jvkG27b1k=ndrpS6=fHtB+d$sDZ7HvAlWtUs)G_GdO& zgwgd#6h6nj-cLGXE&GLiuxmO)d1)Fi`*7kf;OdKvS$nlFQVtGgwf#vZo6WXi-+jj$ zl6EwKq+(tChgTPISOJG%_kV)#><`*ZdJbROUD+dVlg>y(XeBX~zu{Mq>8K=MP@AEJ z{Hrq$Y=PIo8`cTh3%^SZJu6sY+vH?<6qq8%p@)^X-WyLt8NnazarU_kZ^n1~G{1%f z@*G}S^yR`XZkf&y`w#ntYq&3so>4L)K1783!Xrv$N%l2z-}j6Qo8)We%58T@$oTS3 zlhj5DBNGSu%H%5$8KeE6mvc&g%lPuhNagJV4XxN5n~MGt`7G^2@)LHSC8b@@ysRJr zZI{eEVJzk|opa7`ZI#bK_fZEYYp8|PNuOs_&UkJ#loDObLCjp@j>OtrU0bN$W`i;Z zCs$897VPYV)A4Fk*8wRpAg49-uMI6Vs<6{=Qsq>2z9Fq;au=hZemFu2n+^@Lsh4;< zv$#MH=ap-7WDsQG(pj2$6);`@M8n0CP&U>}Dn(?ghS{Ilc6?@7#_vM&Zd6)WEvyLX zqi0>%0DXqFK5b^wz0Zd}ta*L>lgNy=4+)n$F6&RZ8{}$}{c-lsF`=COvM9QTu5+%T z9iSaLM$QIaWu~Ni(-tTBQ?{GGDweN(WHoQHG@RAKDfvf`uosfgcA`OX+n;3DaV8+Y z+)a8Q4{)#YXlSvT6!v4->hLO&YxPomE4e8BV6QWqkhZild}uTEUn1^i*%q-Nl7yGk z{QPfcvi&%tb5i@XPU+23-egv1EodsT%|qloa!2+UY1m+}Nyf9JA<20&yBJxZnI5BC z^?~5ghFn)Q0YYedx{22j*LY*_ReSRPcmx{whOi0tJku2#7Mkfa1ChL*vR?`F3=CW3 zsiI}Vdu`HV@F*6vgcap{usZW!>3e9HIq|&b6UWId+Kqdih5V@WPVIwUxC3e#WYl_~ z>F6FgjCOesQYMqlq1FH^pYglV!2ZgPlYDeBe~dk2gI(V!>fDhID0@JfuIv5PT}1bz z$#WjN>C6&a;j!G04y6ikc^-9!AUT@TZe-u%I@F#ZeT0PRIHkYRlHP_+*bn;c@L;vz za%+O)H46vp8vED^QjG63j~UUd12T@svO1L!ab_{<6H4Y^1wO0kkDdWkrwK5MZ@&6i7Qb0lHL z1RfceK+f)E4>n9=x07F*FE1xeX&pU0?3=G8nw5*W5BTbMx+(d{Mt%^^*^!3ZtZD2B z-VWJ##!g8Fvgo~()o6S@P8RU%cpKAbYx|Htce*$8W3YATx6oZ9WWKTBmoW!3znsNg z%v-_}>nf)AR>P#-P)RG`oOhp0rSoWRG0m3EB50l^=tIfHhhpvQ3yxP5S%Pd}MaKa@ ztu=Xy8_J9SB^!|(eoYH1S=4u+=6kdyN|@A)lmx;@=VuuWSLVbU5&krtCe!VPuu zvonX8$m~gyTUo7cQ=Uq7pv(UvmzH~yG*$>bCtIK?T&2HAYo*p8iT0$8rL%Z~d~Arb z*`%Sv!7yWp-Hen|;Aqs-v}+{AIOgA%s>BQ5l^SqVvGha6GM-$v(*E_KC zm#8nKxg?$Yu!5)Ac`XU)t@^>FKw`iS4TcBhCL!8W&v_)wC;L`}20nZAT@~K|+tWr-4==Jn`$`EnbYG<@JXW4bp z9Z*fmNzai{imgScmQ;*hWM}Qy7B~O3>xx3~hPCkR@kHy_l$~(O+%h)7mHo|bX|D5! z1$J5Ocs5=GU9y4{Aa}tbJtB6Ig37=8Z|EBgK7w3Q6Nv$V)!u zzhGtZo7>H$W(%vV(_Z|fe0A3eD-l-HQ(GG&_XP2DE+$VANc&%uO43@QDg1q2-T@>r zAOA^8SHiR>${QLc^;dt>Yv_a3eo&+4x#G0W(rMlfj_5WVD-VmZXIf$Kp5mOrqxej* z3>{Sc`2eBNlJZCNoK%x}wkD=v*;A2NL}G1Gz#^EEC#99?X-vf}GqEUA#5*lX^|p zNKZNMP>SPz$48C`;&9qkvV~Mqi-Qj=oS6b=l?9 zUePmbuth?fGqR?3OFfc4&TofgWcM?)kM1;2q&LxhM<1od=~uxU_|Mx5jkK088S7dj z)k`{qy3!mxiF%=i#ztd7sC95?kl+?M#3&VblaZb|Gn8sqqP5WhZE9nXgi6sC;ZWJa zxEv}DPU8^ih}z!u##KQZBop}u`4o1K2)NtUi?Y&Ra&KjiHVJO~;_kf4Q_-2VXIGpu z*k3Q%J;*Wn8C2a9yr$VS@Fg%aR5{qu9~-=2-=KSy8o2W=N3UcZ@)nb@R^kJ9SYg^! z>cAwcP|)bWV!aBTKwFxJ&cqDnKRE<% z(lVNX#NZ1%%9!VG?(gWo5d@ptwb9*0^D1TKW6%zA%9Y_3bI2b!J=B-)pj#mo8cz}J zw5~e-kXszX{o?nqf*?eVBU|Zerv0G`*Mh1b5(e zAd#K6BFv-C?@9+{GZJ1Gu#-I{WgOhrxFlUBnPR<`u=~}ewXHM#K`WvAEr8uVT zok?q)mnsUAyb}{i5?wF%cHQ!5+8%O}mtx!4ad8)p*V|-2%WmdFqwX|ogUG4pR^Q84 zmG-m{To)hsd%K4Sf}r@PCjlpu*GMZjl*`FI6qh_&48kmM=qX^@0WcJ2S3kJVVdiC40Hi)}*49_?Zur z-m0zD1H6BrnnBfP+VApZ_u0tv-d4`y)ZXd$oXg4wSDac>Jrp%Jzgf6*{$nvuv&BW1 zi;PjHWt@IB=*ACm-OrW0{QB|z^kZ4dmmOWFVU2Y~fADtxlKybn{bA2?B;E8~FBPcS zq{g{27h_7(S>N}(J@oEPLd!4XQho^z4UJ4amQeST`hBT2Bg!t8Saw;Fdr_Ti`bl|O z@aeRVV0z{-OO345r|guNO8n&4mG5tV=#o^CH_WmnPwD(qb6nNen3dAbrECwOJuJLm z#8Y*H^*BTN7MZXhc?x^)+71#*Iqz6GH55pVNy?pU2I`1y6re5rx^X0X>mGLDsIialT;6*gjnBSQtuFy}u}o4$d%M8ta57Pr-HICYyiH(#c?uxGY` zBAozb^r4;0S`K}?v$MoWW5vl9@-N*i?Enj8wb()P$xGFnE}!QoSCZBo`rZ*4`VD-T zC+y{c^XVlrs|SA$sYYGvNBR>%-?o0hv(@*~JJ>Zw8Ah@|yT4+N zGHbH_a&gz+o+7?-zQUelZLh47C)WO8jbQ0e$53%&msN|^#819KnuL}7F>avg;0xBW z4&Y52W)!lb*;NqqDw37_Ig#Z^X*hmfrVP|u!51Y{A0NrCLceI}d^cM;F0ul%zm{O^ zTf8bJ&pz>p9tSgE5&I4L_e!$|99A!^+QdR{-elbOgjS43u*UFF?Kaxu9V=rupugyu zu3WCkAPG#8zu`oX zC#pe~?rendb7)1Vn6Gx8%zV@H7S7RJACp<}%h8N@Q%ZNf+Om# zX)&Ts_8iv}?p!T-;oZHz%@z4)6l|wHPGX@oVbk1R%3S%PlDvnlil0};+wXd2#!G|P zsnAySMfhvEzLg7vlg}bQ+&3jziBKN@;FN~}+dYz>_&hsfAeoA@NmSPOLS7aX6^pNx8qgQzPAGUZCQP4iga`Zk2c{NEj!r-B?C_b{XJs>dOQngy%_$XA zj;8-=MQTSQs%1~k5y(0`tcQFE(*e*fB0fb2(1WaJkvsxtr~9s<;mN+GzRuoPYGSBw z@^j4XTctPiw{R+Y(y~nPUKFd$?Do$jFZ7$+P@M~7wo+7XuOFAXTYG}}gA+p4_)ztX zT3snBe`Z6CcE*2J9Q$4V*WJlAf{zKU2<-IV4tBF!%B#cfhX1K2$iK=5NgLeuk4ZP= z^=QIP7ftvF@Gy!q#_!^^7#A8EC>=_%8~^`wbAiaq>siM_b3*mOqihx28yadCgKzz& z5(amBQz_L}f_?p21FM1w)?32l{@}Dc<7=FoK_f%XAQ?yeeN3OQm3gjB?qTl5u4p|` zu0o#htGpo6g1O18t9QSn zJxLZJAhny@fM#%6Z7fsX!?+RZ$-dG1k_;E!B~ri& zgoasQJrJ+bSlvhZ*!k^VR*z5-voY@d#Y7xf%tt|RJk0BoWVROEm`9Cl$oK+JrG*kjp7))Qpo{7(PSiFBH7`D4whPAxG-F05JdYTTDg@Z092 zOf{oM=0<;d=y&!HnN8xva6Dsw@d+Xf_v9~_BSb>SFQn`RckmJ@uk(~m`WjHq{wB|e zMFvQ%lrP}JPIX6n>S_{NH%96e^onY{^dHVjFX%c@WOGPmZ~}}}y33UALk_8-QOXE6 zE3=WxE_XLqSNR{>k6vYI)sG=ZArgi0;N;6k~&pN%8@(?Mp z_gZ;SUt(N$)sjjz?4zT2F{G2L>QSyj$R1Q9H5_VZvKjPWWxj6e&9q2moph3Vum_cZ zhWiPrj%1!6mFNQ^;TKS*2GVlQ1MFtw*m&$fr{Unq3&%)zmR}se6ks}ww(nq$ zkcI4{N#Mgbqj%XPkcLKDBc0Ni5nticq3?bp8^sj5L@nXkq;3;e9St$rppM zy$(Kw(%L=OT(@6qEnUKN;--8Px%OMiLlCJeE0y3FID@JDYYu(_ChgVG(%P4-C9_CY zz8{L+Q$yJOSWfX=dV-|fH3sjT9l^fwNu)oaa6`m9`K*?vWd3KoGY3M=xri)hV`Sq# zV-D0(On|D=2kCt;wZw7ojwNIgw(#Cy^feWC$O`(1JiyH?$bZH+v4QUs+39S#hSC~( z-zYv#3`XKc0}1RUewRliDAw^YnDO1hbcK-8qK24=30q@y4g4c-kq5ztvJii^4Qjhh zp2!ZSg%zZ0_*^TBbda~=m1%M-BKS>lP?X|5_#sRWI6K3}vakFmEsD=>6(-$>$!m_Z z7W>h8WjAnk+BNM_xDgHHGsJ6WnB}#;f)Tt3Pkw!KidEd+=EMt`p616u+nPb%qfd4! z+?0Lsyq*<9;lOy0w&zkX={M#na}aC+HP&jGRWF zb#)~UQ-@v9&t%CLiE5X`<6xbm) zoejjqAPUpirJ?|)6jgaVA5ZpRK9Y@GqdP#pUq~P0X$PqXY}pEMat&v3@WD=lzSDvo zw>3;K9@}5-oN#`HA%9er2jLnjgZ642M85oDiWI`W{X}{xF)EW+P>HgOH}KTj^eLvL z$LKCN;WfD(+(3EBbD~QXFa>@iSyBNhFKLGx+pl=5kJ1e|vo<0niAGz{GN8Y@kX2&x z3#5uBL$PTgzsKBambiqUu^jJ(J)x4l-+pYZvc5Ss--Z-cHnIy|gG~6i)|h!&6R0}F z;BB}l)qy569lS?|oNs@!Qi{={^-kIkT5jbA4U=apb&w97By|8a@S%7LAKY$sk`zUn zX&GGtqTVyO(Z*R_tbZ*HGn^Q_<(1XWU~2D1BSm#|Cr053Sj+>UBeVlCDxkE{{?(W3 zZPj*AGv~?Az|Slo<%BEEr-VZjt_@9N5Xl79>xNy){24d5^2k^{WzEDz_$-D(Up&nk zfwnnc6ol)dHXO09>1PlG4$z(;@$XZAQMQr?AV_wB>mk|?9fBs zK`osHk49}M!0l)_O^|x1*qcGo?!g{`p7Q1$-Ixr>1m|DUn!T+gwk5SqIJQEWg4IZn?W3i zv~TkMlC5lY?eR|boI?WS8vlZPPz@syt;r_(SdcxCqqK2gNZtaQusX|a*Rj)_vX}&R zhKH{@d4SVbP5q_&NB3}L9L_9dLZQqTfz6=h#A3f)M@o}V_TbR_;Kfi6qmYx2Iueyz zLBm->a==?L3(9p4#g=-I{z$iZFxLzxvy}m!YvG%HkK{r;CswhV)^#?FE;G-i-b}q_ ztW{X#=bSThj?K0(dVEA8TC&%;I_n9dV1|`=>0_sa$H|ACyxJ74m0Cz&1ywg2y~e9M zi;bWB(}T7s?6Q58!@-R;Pk;aV{$hO8>pEZh1*c0T!*}MWnCo4RpTdXJXMxsfLo)B# zs?xzbFe0CK8SQ3WF()IX`$#?|PFrb#6&df+6Ec?><;W`ise8IBr)w2-uDA4~^A*o( z8!O(ZZQM7ym;qa&vHB3-ceD{Ti?|s+-W@IX|fGx%e; zvO?Bev{|nWbqD{WENJ)pq!_s$dJcN9i^hOJqtGwT5_(Zv<|?fACy9>F8XOuGj58$U z;9rq$q$@m2x5W@llqN{C#AIQBznKR!&@o_R{s!+yQ^inE>5=+L*$_A3;fb}jn`_Vm zu+SO|_R)Q(DyFV;*gw1>-+-z5K9-xsAT{={GhCFB%1bYZ9}c#{^dImKYT^7{S?P<3 zLwW3pHRU6Qoi-zcl?b#a&|c@ku(qB3>POa z(~6+YBVO4;AHcg(fW5WanlH^Uc7M3w8>3;P7MYF}sRHK1HSvBGffMC1LlPFfr4$+3 zW@@JVQS#GoWHDJrdWsnS1-j8baDX{JHRJ+t#xLV^w1VKoy)%ZJd*B{Fhs1skC*GcD zAF&_V>+BXF_J^YhE+E~KJAp*q)Sd3?;!4!MD_^8Cq%G@bueEaFZC7xg&V#n%+;A#3 zCQWz^Hji(DQ|foP-d-X%+pCEJaggbI?aXpumbk_!j4>{eyWc z7!J+3kG0FXg~s!XY`^%5+wM$|)fz$zeTiF4FLkmyRtb||(qY(PHSi=VVz%DQsmiXy zzq*J0O+F!MdK)LPKk;cFfyZ<{sIos{D%_jqRer-aQd_&CE>r(fKPvf^SP&!gfXSPw zewX*s{9>V<*T@!J9oQMXVz?}yHN`T}&hX4S=xoO1_eZ2(YLWrC`#!{uSwVHX%Y{`5 zKk1c_j(#D(Lr&L?{AIw20nK)(-4njHvY_TK;)%Qva_C3l;`;{YS^;M+2g!=2D#TsM zQ`L1{y8(xdCg+03cD?YBTyz~+@OSt%FfZCV6YLyLak#XL@-iS3&Eh6*nibJ7Gy`Om z%kmOkLH|h&F*w6Y`2KcCLiUW>)+1uOVQseReD)@GwAN%>UMjKvhBhr)-fFbG?wyMH zeD$6#KM>gV@K~q&4^vpSs?{e{yW`$>|K;i9_l}CH<>s__-{O3^-r~sJYUkcOz3dK_ z*5~VD~Dhw#S*OQXA?0X>dh0L>L%YIG|PndQ)Eq&IH_C{r7NH^D=?C|uv>v4(orQ2j{m$Bnz<9Fv$XQj8# z`~Xt?{ZvdEHKnk6dx+&l$~yv(;EVxZmb+th>~QVa9@s!MyU-PR7nDN@T# zvu@3H-j&172-XN}$@nt_RxP^_sO@hP{LzSVx=2&CS?ULEg|9&PDc?=+Vy%n#%yTIB zT~%Bs*vFJb3CUlwT2;fB=1j@f%=aVd6S$np{Wa7}5k*{ug5N$DN@((JOnRI-R518d zOF8kW3-PrmVFR%TSv&6Mo6?1_uco#T1-@{wc7_tXks ztEKd{M(LfxcDZVcp`jcZX3Esmk{OAa$J$-=xDs1*2F)ME{Z6e-JR`tq@(3A{K>&@$G@|*t-%;Gk9Ed8YL!98XRT-f_eXCh z7l_`Rrz@q^ulx`)hX01bt)^nQ+S7GL>j+9!0cC)%P^6rtbC!>;t;V&am!GeGZJS;u z@Gfopx0m03&L~bR#?Z1u%9hPFQhJ^odLQ}mV#*dLyL^IAw!&$%@W(mYaQL-%lXJXp8oQ5XJOz;>bdmF*z2!4t&jv8iM-$(y^1$oZ-5hA1u;Cd*?-b< z?EeDW(MhDR-h7f&AbMw^*aGvjyh182iGragW#TiOZO;4F{ma^K+maH}%iD@p+Iv;A zNH?o@M%}<hqo;Yokp(PEQo(*Zt}#zDZziqkZ=O0K@Q^=qg+;|> znIIp?7?Ko~QYB-9*^lHVJ?uV#PD!1=%t`HF4b@!HBeNg(br3tOpje_3{kdzY>!kQA zkULmaq-l-4UBXXCZ1cXC|K)4224)7AWh_juY6vpR)h)bU#1eIxf7;iGuTPV@WR$lj z$p^qV4|%Hi{GietBw5rp-uw|;qUuC9^mvTe&y7D7P2KE-xpGHF`+j7hj74cR(i&$h zFyNYTx|nMN^)u@Dw_8c%FSV#E!M)BWMP118AX`+}8qE}E{ST9;X7ob$bzkSK84;`+ zxaD+^j*EdvNVO9uGK(io3NEqkd|C9VY=)k>=gXZ>X;!104|9&nwm#3}m_L>NPSL2m zF?(EX+7ViNRhb@M+|VmHLkw28ybpq+G&z{D^r%6xXP*_ZNDcdjmW&8Gu%(uMrgb#)|^l??(wx#kA08+upxQ2`JdF+RZ`vQEcBO3Z!i|#&alS?-uVaEQ{|jWcDc9vdbkp`DElwj{tJ5~KXV?K zt%J{uj>=3=ZGD^cl1+y;G0nmakgpUqNN1e)Q=K=suaB3`C>PWRN+H#+>dJV@rNl~U z=6uis!}a;ToMAK4m`5?3`g{W^uB}!cQHdaBkh@MMp?v}kHw3W;@5}j^*2wNg;Qmad!#TVRevx&=a{MTh=LaQUl(KeYN*Ycn0g5_ATIn+a)I- zLGqEF%4&DKUQ_MhQ6uL1;C;2uc0f8DSu@9Rca)zdAM^j^_*69_HKM3D zkB%Hcx|E)W*CE{kwbRE6uU?Wpu-eN}p2n{IZX^6E64#%23FB;NsM5g)_s-Xf{$W{a zY0GayRf+ z^!y@qa&%HpdnV6!#@R)ng>94WLKE1@?l=M5!Z(Qma#b*orlN6pFxkhwdPVO^sj)S| ztZBvvt6T4+ZEoU8SM$j>8;8}VejtkEMSAL<@{^jVyb=@yw{6-M<*b-x=MK6uZ}`85 z?t&I1?3w;UX(BkDm9WiFHS@5MBd|4a-umL~X49pA^}OD}kvy74L~0yKfx#Ii z^hLiy81G}w3#GH4lxj*X_-@OXnQ3MG>qB$=WiqFlt)M==66@6C`U$0#?2(#^)%GJR zr@X`4IxH-FWaQ3>x$ZXl3yEXk?NWZdTJ zQPmy>+~(4tmH8-rVaB|`38T32-kK+^k!y+jq_P^4r_w&sL@77H8I&&}E!DZYkbUA4 zUylrON2M`20GC#2a91D9&Z##bDT_|Mrg~$JdlWf&;pg~C=w8oxO?uKd%J>aadZi|N+0aZM= zx{7Tu@>(BBQ`fODcf?@V4{VG-Hoc_3u9KpCbKxKfv!#yk`|8>!B~@C2`~R;> z9O!)|&0Y+e8P6Iz zxzY9(VqKwS^`!qIgZC#loq0}Sc2!K4F3GkWB|T!(?Agu=C)QcQh}ekX1yaOD`99(~$P@{(2HtLd+3MOvsmL2FG{^$$$AqZDW$`bG7y zq|2sk$^-8=~H&uIG}C%bdocAUcwvy#|YN}xk_70NwzuN*eTr1} zPI_93lwEWOi?>@j$DF^NSG*s59Ubi|78X^0kq@FTFppTGMyW->levdZ#Z>WCWI+>f zWv4v8!L8(1c%G{{qmXUt=uGF;$WXEv39Y=izkXnUAopEV?n~a-b&PVM%H}s#N4C@u zvY!9QztQ#3WXg$#@UIXf#V^YwFW)x7ilriv=^c)dMjC`tws~@U$m1GVaUcX z2edh)-6G-oug99PzgTr!MT5y6>w$BMXz~N<7EhhMR!y9#UqB1E$o`^+(p?Lw8{u=@ z0%F4vu~G~q37E%S!=8H36{$6r6UlLL3j63^;xf&trs`$g8?}mVDr&p;{-wnf)s?1HlXMuVM`t_EW&w+QWvK zKZIt7ENdJbL7$Oy*oMCA5=g4Q;-&Z#Yp+q%ENq9d4m<|Dwp`?ym?PJ5CBuW*M7t$p zexbK@r@JFOr(Az%6l9CO@b-0~=p^EoF=v$U-!STvw!+cWP`w3*Nnhy;l0C9=6i&ng zNK#(562(4gGH6lzB}D`+@aE0(W|UdSoM9$eJJ8?!m2Kq~?#~g{MKd0aunJ}YGkI}7 z3(nbd?04~%&VYhl7}U3Z{E9dr)zNHyyw-!(wfuq6p{|aL9+NhbBDz8gY3v-#VI`65NuZNNUZ=CsC@6;<^Awwc#NjSF61i_LIe~0-0da$Tlcsk zbvJx%`JHQa1!O!j;N1Ajd2P>h(pdq%jvaK)Sbfax*01bG@?L6)7PTqpwo0&rtS)q} zA8_}~g6`!@_B3Z0+lwh`3>^=x?Eg4A3n(d$t&dk#_sk0J?(Ptr;O>%O!QF!gcMtAP zaCdiim*7rt*JWp>yQ|)B-^t1O^6`@0neLK%|8|EntD&siAqKJgvgpa)Ed32d!w_cq zG=ot=N8yHZqD#2D`P_LY^!a>8NiY7xci#nyIlbf0-tbEuQG-mOvPpXXd zj2otlufFd+6Y$=vB{&u4$PcQBCFHL<4N99IZp`GXSbCjz1()$vw+J^(Oakvd`If|# zQ+7qte%6|-I<@Y`oYw59p?Bi)*reWAaoCaNaRpz+v%J`@X(g5)O??tH%aFcW&&^3c zRo08|O?J|vpx6de-ZGdZG&|&lEHqE!nKZit)%uyhi+~;d;OE{DTowv(pZ6VHKPmgB zDbvgM%L5<)w^V!i&dcjwcQ12uFL#TFW{HRP3N=kyz60dnFX7ETCR4D0l{r*9P}uyZ zZ2K&y?}zYyv6{qr5bG%lxXfV})SA$yFFQVV`w>E+niA!22Atzc9rCY?ohJ5kl_K~f zDm?mCAeD}d|8EE9$w#ZAzh~G_^nn#nw!akJyLWlFq7sNsMP#*?n8|44Z<+3-Rd(<$G3~DMkLA%DWCOC`tA+g)SvA(z@XTS% zR=10aC85RNuYK9^qf4j>s*S?I7E!fB`{guyIr@V%B)%kwl`?XqpY$cB9zSKKOQWzf z_6Awj%y&mQN!&+fl)qTSdf!xuqKvv=h^(wPhh7ItN3Z+Q^;@xTTYlEojqD}ZCBA^Z)_mVNYp={_ zmnX63tZM1=>^mg$<~DP@LGB4Ji+HXIs_f>K*Un6_9@+skR+)TK+;*yyf3bt?rO%#( zvD~GK`Z`ge#j{-0(pf>@+u*S}C3ee&&c9KULIp%i=k2%k-{+WO5qIoD)UJc9*XDa5hhivMNb|3$4_)?Mu-6UW48W(9ur-ox^5bw7C%+}fNB0aHM3BRy(= zC?&H5%jqYa&ku34_Lc)kWp2+Ty;d?x3^p6RMch$`nX}bKHnZOOj4zg|#%L;>tjfV#n_GR;bG`PQ z_BYibdjkD@c3)>}gQQ4_`0ln#!QZSw3WaypKSJ%=@ z-MQrDCjgtTi#Kx#86PuHQZyA;)q2t?uWZ|a6PoefqmG`3)jjWrnabnj87F`%{R`D z<8!Dhve1*(QEOE$)H^lE;~0alB-~nrS1`Z$VJgTsay0n}o0uy3LH~u%I+mzsQhLSF zD@3BE%8sfqDh3zv)`hYJR{cyKsDN9^_DVCotcN+_v~xO>CY#-C*2#25x1%%3Ev?sq zUT!0|R--o>D*O7fMAnO#8f#wMzeL$@^`gV|YVQsT)ica(K5d`$f48Q%>f5$JH#OyZ zozEeYQSJ{;l6@nllF2iOP~K{`gp({-Ia?g384 z$8K!zE9#-1p%KBO`iFV!MX7!fA%8#hEB9VmbBoE5GlQuDtpm}a1nv}PjXM}72#4k+&Zj%yjN%uF?O;^L4^@2=>!@9Z{WqpC`EXNe{ zgtCAcNuu8r|3cqg)kQ6^hu9}oB6#EDB0ZV?A8`*9<=+2S&9aSs5WVOZm@z@}-(za{ za_s4?!7~9t)^Qo;nGdD9uBQu_QgG6J#CiQg-=%^&=?rGNpD-<$YBxpkKABmR zp-MXA4HZL4fCyKuaIh!F^In!zfdyiyOs^`+8YpTzigTt6`im9raQ6->on&+ib-2$- zPGRQx6fdj$!foPBaPoy7JG(i#XUpbthF2k!Em)C+QNeHxq;bVvyrj1PFc_)VSW1p9?PZ@aD;y7+TPAcGEwM53oSt(5(UbhQ?CV*gh) z8Q1SulY`8G>2j$R3!G_+z9m!J`>e%i3F3-Wu&Cv|)-avht+RGdm6o|D=S?2i;+6Wf zo^NW)v&_?e?NuOse6tC9-RM#0$gwyC%8*N*Tr|V=5UIa;JG}a+q~bFDvYGlq{z(Rs z>n_M3$#COPRn;XCWTl#^@~UoX7AXbgSyzWqG|T~=N@i}LxZ6R`^}zV`FkK4|Y-KOn zZN*RAN*=)-CT3XfY*K%|lJ49ybiw%?Dj7OT+G#Pjx%)ROybLw65LZ2g$E}8rCwE!} zZD}{PJ6L1YVXMCXpRks`H*$fffFcj2kx3=i;NGq&(~!!sgxzu*U0Po%@EW2nC*}!} zL-v$oNM-oPTjiwj{xX%s0(0Mc>I`$M=|VV>)1wD!$mwvDE+oS0gN`I4-Ti;$AWh(I z?5nPzD?bQE)mt^Nnyb&GE;qD;YPh&>ewyQA2g$APysqvh_mmTfD`#ooFmq9IYi7mh z5OZ*MqGEbNf<#MiB=5SR-c9~fd=RKas)e#;O;Q)M9^g%52Fn|rSjHnI>2GG_J{6;Q zhr`H%t6_!l7O%QD;C+{qwq%jyp4DDxrBek+uKlFD=`b^id+oWG2KCq(k;3{$CgDx$ zxa)4TSDe)1lqz3LW|Wtbf9IChT=$`>Xl!q=R^h-*4#M-?{>|D=t(+4@Z!^mis1+$W13SN)A?kS<}!i0^a1tTlgZ}UK)&xMUlU&` zJFA_@Zcl>x0hL|71#`>iJaZP29*~7ww=K$m%;bOd^4_@$H(y%)+*^XP?-BP`X`Cp1 z-Kp+#@|GsLgWMwCGH(RE@M-S=sANg`h0M3nUKT#lAEXjYlG&|<_7Q%!XD`N!m)p0* zmk4FeZIo3dN!PqAOR22t1$WnYIhb?1IS$Xba-{f8Y~Z|Zq(|}lTB9&X;;wKyogB06*WbeE_!feBIG5Q`Fpch`EG>HD@a%QlO1#LaJUo9)Gny5}&+pHs; zT_e?7CSp85b68v4GI!a_+t9sLAvLbPZcp0n3-2bswU<-RDa|x*>F#wBkQ6!8YeE*- zco3AfZe1{wFrD1ACl|`)(>K=vW(X&!ej*Z6rtK0Zy5CR9z=!akA=X>p5OQcf7NNzGbId(rZh$!+tNH9s-U!$Q%#{ z(Qy?JFTtyC^V7St8=5iSaG5%5D}RJPj<1q^%-&}IO;X?(l~@^-kL32uG7<%tj|y+6 zc@&dfihl31H^)&P;62yhb&wtlzATmQin1keN*W5(@YqOWMLGFhKd12t2VxFuhrRs3w8qBmta zIC%^0WlGMhQaZlpr*F>AnKYGi`Xfr$^?Dm#g1+Ee@NntW_ZzUnQ zE)KbjhLv+iw!sfB{L$81CcQksT~O3^?T7Yx@Po~yoV)`+VwN~4_!8=bqNay=$n=s1 z^c!cGnzg|>ODbr4Fpi6ETsNMRgx)L_-AR;t*emMQ^iFwe&~*-Ew-zF!CkU$Ymv}B> z34!wPqnxW+Tkml~R<*zR%7cQ&@s;p30Z%Rh7PAOn?J{zVQm72@JstE5{4sx{#JVk4 zicz}1`zBa8cr%pMDTHIBgqzh#5$qBy>C6Sa{tYZ+o)>}MrjiL`ZFd5tt3VRcVUdvC z|CTdkGa98x)kbO*t`B5L<>O8sXkW9Asytxkz03_!nq4OC*;bhKpV&Y@_KvK&fSF-V z;j!o~+Uc@hfAY%WFoR+rSXfTCH@UlKLMOm02Y_Y{B;9h0H`x2({_6~KGvb>n#GLva zV6>G*K=wy3U(Bj#eYfh^gUGAt;BV+FLdIhkDv)y4RQsp>$a=$$YAR2d{+w~q_#qRM z|J9P87oVJ#Yu;?0WKHjt>v7B7M?L#aCp6Q@BO0kYqG!&hccMc6f}U*^zb&>JpsK5d z(q?|>2PITtbkC{C|J2ULg^L`>eoY8u$=?ogs zz$*x*_rs}1FP_TDiG${-ciBtorFGjm3!IkD>CnN@!q5)7lL6$vEaPr`N{Z4V>g}3T z?n!+?s~sxbbM|iX?(6#U`pVnI?Hp*`{;~IxS5`u$QBy2t`_fb8SIt!yk(Zy4R&8M7 z^h|u_XS^45?KyC)v-UVevg;E(k51&Hf~|2o6u{d$k>C3-JG`ig(lvDoRPV=74-PkH z$kUz@ld#ACpH#M$gVc7lK%Nr~I7f5KPx4ZX`$FZF3D9Ft1cN?`)^H0?Zo1h^-oetC zsS%++$dMY2{=U3!gi<)RC?&F(zq~fyQ=H~?;A?{-FQ;uRkghG968EWRa_C)pqWBJe zn8PYz#kb~?zYtS>6&6LfaWjZcBy$zit?BI=nSP{sz9*;alRmEx!9?{FTS(YhfCjG) zRp<#Fn-ls2yWhW~{}U&q z#h-uEHB5I@cYCPCSCREwRz{JmodK>JHM&`*d&3}xSg~K>WZIfFx~=;H?a02+_s}Hw zrT0MpCPs?Va5{%Lud<3^rqV!%QD{)@cx6lsp4RZ1w zhl}-M7RvXcq9$o0Uv+UR9$Tys2W5HHNL^tc7F3(5NOpl)9A~xsX%=W@hMKo}8C60K z@ftlwFXp`dg=RZ5CsQ=29osCi;on{MMm%d*29p{~N68yE3o%25z&J`3fUFhdyD5 z*Tq}N&K>O*ao@Vk$Uv7N$Tgd!ck2ascy^*Vf5@pc7Z+4#ozt}BvtJNvMO^B&bh-k{ z()H8`0r-hpxO8tt@pq`4SzA^#jiz>uP^0(Sc#>5Za zTt#_?sv<~+&I?hN%*`_DA?a%|GZD9m_a=ba^ss0u@{?e_o6NUd)Pv<f6j0xz2@x`2G-#6fWl{7g_6;^dBQ~@=`GIrW&d?3x?m|}|_>M@R@dw3!4>9yho z{p$|U$I&V+9o|X3$eG|K!WZ#a)mMjcPj_+?I!DP+9Bl5`vwVZ?B)+BAbXcHneBV={ zlF`RPwW!H0kxo@3`=yRts!I3|$37Z+lsW&S7tY*%QE$H=ay^yDeiruHU(Tv(|0}GY z89(g*y3kicWq!K$UKRN|Ndn#beV1>OyyMnFz2WDch@`pumHAROvdHqBYcnTLcQj7( zPu2cicVf}O>Blo)tMj&gJUefVd>vESk;8-iUKM_N`OQpsUeXh}_7#0xJVBl{aUZ_> z{BPS!c`p2VJ^ID0=oMi}QjgE&&s5U-`M%csj9=r!UZf99h>rRZ2vkZKH(#7$ck*vf z8*TR7Yj$wJp1|4JkJQ)Kfy~i)tVYTE=ABUN-)yzxT#L@|cKDN<5A=WO1Lcx6%6%<& z^;D_!{a4Q(EqgrlT{g8SMVV~HvUf`NGT~mG?Y~0*rv0y7Fl%`3`2KkJ6$qkqOHlW4q-2o(!dV>UwT zZ@&gITaPSbB7FTL)=}dg@LddB8TLT=U^wII!QW@U&hR?h=ZK%ujE++)Nx#@ZG1D6o zHShhg?>EDG#cdXmDpsdh?_`(I=ctFDXMGwOwMxhLZ;f@DX&;mPyCUjXjiS7-CC$-@ z$=35wUNbl1VjL0HCOA8)pE3SczOkk#l~h7GNlV<5txRVp;0D!Q-z>F2Z&4j0$AxtZ zwngKV%gzz`i~oQ=8Jvdhtuc$A<5#B+k>>H?e+uT z@4j_*OZ&L0Z1#DJ@x`tqy?zMz`~YvIi53+_6Mff7=4>I~J*`P5cc|such6K4E4kcd zMvC#E5C51srjSfc_1_LYub1p98o}7ba`xfuSu1al4VekYOSpVbm)o3afU~{KWTrl( z8fym!xRfanSMadp#P_jGW&zo&2u_xb^CF8%&YYuaa=8}~+!A!X&8SgQTi0QWU&$^e zFL_qQ=y)Yee;>^gH=jJNdccK`ux8WQj+9S5fAIIf z4Y#7`fal;TNd89d%0$*bzEfcSiDhlQof!k0aZ1I8{dsLZi0>+o96~aBRXtu@G&jvZ zDxTe&8*rGM143tU3TEf_*vu(30VRA75&}EoO?=|r5))){Im)W%U*jKT#n(4NzdJ4T zDUz86<9GO`=pRhLJ?|`YTcZ$rM-7|=AKngK%&ezQ_@PGGJMI0dKJ|LgZRwtc;Y?yG z;QCx;O=6mEJm#Oo=63#tswE@-k?ClgzE~?%O`b<=Tqf0=EIPHyj;^<`4_%Jw>lO~} zb8eCyG{6ZH<9yrv5AEOV$7%#9X;=3MS?mcyADwolg*C*kDwCobycWId=Y&9HXozF! z^D<3X=g9qJKxHSJtUJ4^CK>ldOlna|2goqphR$WXAmi8h=v*;{nOT`WY_vb8)fZOv zs=LwM>XgtsNzotYuOBws|F^RAGG`Xa?~mO_x}z%S>*f2T3YgcVAQuXzjNTDg z_ykh>QRkooxCnF6$L*!Vg~DZ6PG9ieGM{T{sFj-$tgODtEOXl{{4>H|hu8Ig7jHs; zGG{D-Gt%6!S4Vh}StAmV%_F^Rq5Q!wPIl7Pde{@V87hiild0SWPO;F=P)j(*31AEPm=?Cwt>rv$Cwoub_g-$<$0~`xFSiwk46s60 zA~lt%2>~yw=qgu<2oW+>>CC&CwETvFApAQO(?q}_#(_CpqoyzC9TmB(+V)Ie$T!VC zO)cI|2F-i3U)<+@j}mD_MUz|CVW2Oll z!!8oj&&r%&cj>5UAE4dnC^vDdmQmHwlI$TLCzEf!|Cz73%3yv{oz!;!ao_2-AnRLX z6HwqdaGY_;m(8Jz$?8D=>nyX!R{J{J<5V|tm8W~v@bA3Gd+X!x5;BYE0OIfg9oZOWDE9Iq+;^d- zZWKC1X??LP^IyHDmfEG6nNzZ$~#nJsYrUCCgZBbxQ;7ZUF3Kw`@^8nu}Qq%gX*f8 ze(px2zj*B}r3xCP)0z7*)h8_K2j&875nseBnbwllNOezc;Lm4y&D;j=ZZ89$X_~%D zoD!u(E)r2fB5F&O=gs9lyj#oZ(%h192iZb|;q4C}7kK!x2vyajc##eFp! zl%yVc){|8^m6P{8orw~Um_LRCof%~d=@q()Yv5`goL?if7H_=HULVlLw9b=Y4SMP9 zUM8Kw6r-YS1i~WBP~F35x!SsI6|?u*k#=VF2Bzp2eU?;`Y;d=k@gi9!7n}cp|GPsYqV?o)=kwRQc9aYh4gq0Rv`X|c2^i0i-#RS|L`1O8a4L)&4 z^9eSOx;G1N~|uaLNXdnM@!RRT*Rk$TjpQ_>k&GP-a4Z@ zC)Ct=1m@b;>!i=~X(jii>ki^1F05~OAGAkjUs(EO8BqbXRTq>M6>vk(XNu50nCxSw zGRmA?^kp4DSK_M?OxdVFDo%V@ypZh9T!Z^`z_tG0YkV~Wz|~iXYGNfgKwlGc=6{Cm z{Ey1|Ak4~Fd7U~lBMQ|)YNvJ08mJP;?Pekq=AxW>Fe_utH@c;vVy0XnyHnX;)xUdJ zNCxR(n1PF$s40kvB-8aI-E&eZ^iTX3Rp8U^@NT-wI8wnjzmdDaDtnsZq^o?<7M;N< z(hZi-3Dw6P_QIRzeMX1WM|--i+y@49)3WHKYMBkLADz)#?

    rt*LaQ^UkwzJo(& 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%0D%ZlYTMPW_pPpZlC!2E81Nkpln9OY-zzzO{C7 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

    vVAESjoIs#@@5F;AQgVb<1h| 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 diff --git a/Mage.Client/sounds/OnPrevPage.wav b/Mage.Client/sounds/OnPrevPage.wav index 9cafab28a64e00790651a6862500d4263fba6763..85b7179063c931e96af18679bd81e39bd19b1ae0 100644 GIT binary patch literal 17260 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

    CCcvoB)G%IB<+u8^FRjAZONX%WBO~Rw+G)UP(R} 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

    kbpk6Sq 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�@C+fk%f#^vKM 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 literal 127486 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

    *|P2?J9zv2I+>nomlX=Ax2-G9Y%N!QoB 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%0D~+v1 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 KeHS0M?fEZxQZG{g literal 111094 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∨O2ECoxETkt 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 z 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 diff --git a/Mage.Client/sounds/OnTapPermanent.wav b/Mage.Client/sounds/OnTapPermanent.wav index 7c33054ce49f6491830a725704fc228f1c7b7dbb..8760020598e09cd3898d47b88a14ee071c4fa1c8 100644 GIT binary patch literal 9480 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 P*Ysz02z|-)5Z3<%5&YXv literal 26386 zcmXV&1(+1a*Y&HqduDcL1$TFMcXtQ`4*>$fEd&S_Bv^pp5G1(sPmtijg9d`Ty9Bpo zZDzW=>irGh$2_|`(^6e^>)vzEJyk=?M)m9adkN95R@-_#2mFvTr4T~$%H39ox|@YC zL`u=U>knO@_Y~rtm~2+I8k]O(2p?K>!H2Bw9Mi;+fCbv0z$<;-}M*6tfRW%Y0- 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 PcZrh5TN$<~ZL|3o9noz1 diff --git a/Mage.Client/sounds/OnTournamentStart.wav b/Mage.Client/sounds/OnTournamentStart.wav index a6aa47f24fcd0906906745ec9d67b8506514f338..94df53fcd9f2f12de74c3c9e54986ad7844ea7f4 100644 GIT binary patch literal 67990 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 K|Ndg)ll~ur$4s99 literal 135936 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 Date: Wed, 12 Aug 2015 12:14:50 -0500 Subject: [PATCH 341/375] Implemented Rebel Informer, Mercenary Informer, Cloud Cover, Goblin War Cry, Panic, and Triassic Egg. Added alternate art Reinforcements for Alliances. --- .../mage/sets/alliances/GorillaWarCry1.java | 52 ++++++++ .../mage/sets/alliances/GorillaWarCry2.java | 52 ++++++++ ...inforcements.java => Reinforcements1.java} | 10 +- .../mage/sets/alliances/Reinforcements2.java | 52 ++++++++ .../src/mage/sets/fifthedition/Panic.java | 52 ++++++++ Mage.Sets/src/mage/sets/iceage/Panic.java | 52 ++++++++ .../src/mage/sets/legends/TriassicEgg.java | 93 +++++++++++++ .../src/mage/sets/masterseditionii/Panic.java | 120 +++++++++++++++++ .../sets/masterseditioniv/GorillaWarCry.java | 124 ++++++++++++++++++ .../sets/masterseditioniv/TriassicEgg.java | 52 ++++++++ .../src/mage/sets/planeshift/CloudCover.java | 106 +++++++++++++++ .../mage/sets/prophecy/MercenaryInformer.java | 93 +++++++++++++ .../src/mage/sets/prophecy/RebelInformer.java | 93 +++++++++++++ 13 files changed, 946 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/alliances/GorillaWarCry1.java create mode 100644 Mage.Sets/src/mage/sets/alliances/GorillaWarCry2.java rename Mage.Sets/src/mage/sets/alliances/{Reinforcements.java => Reinforcements1.java} (87%) create mode 100644 Mage.Sets/src/mage/sets/alliances/Reinforcements2.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/Panic.java create mode 100644 Mage.Sets/src/mage/sets/iceage/Panic.java create mode 100644 Mage.Sets/src/mage/sets/legends/TriassicEgg.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/Panic.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/GorillaWarCry.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/TriassicEgg.java create mode 100644 Mage.Sets/src/mage/sets/planeshift/CloudCover.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/MercenaryInformer.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/RebelInformer.java diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaWarCry1.java b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry1.java new file mode 100644 index 00000000000..8ee452418b5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry1.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class GorillaWarCry1 extends mage.sets.masterseditioniv.GorillaWarCry { + + public GorillaWarCry1(UUID ownerId) { + super(ownerId); + this.cardNumber = 108; + this.expansionSetCode = "ALL"; + } + + public GorillaWarCry1(final GorillaWarCry1 card) { + super(card); + } + + @Override + public GorillaWarCry1 copy() { + return new GorillaWarCry1(this); + } +} diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaWarCry2.java b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry2.java new file mode 100644 index 00000000000..657c2278db0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry2.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class GorillaWarCry2 extends mage.sets.masterseditioniv.GorillaWarCry { + + public GorillaWarCry2(UUID ownerId) { + super(ownerId); + this.cardNumber = 109; + this.expansionSetCode = "ALL"; + } + + public GorillaWarCry2(final GorillaWarCry2 card) { + super(card); + } + + @Override + public GorillaWarCry2 copy() { + return new GorillaWarCry2(this); + } +} diff --git a/Mage.Sets/src/mage/sets/alliances/Reinforcements.java b/Mage.Sets/src/mage/sets/alliances/Reinforcements1.java similarity index 87% rename from Mage.Sets/src/mage/sets/alliances/Reinforcements.java rename to Mage.Sets/src/mage/sets/alliances/Reinforcements1.java index 9cf544f1282..7863eca7cb7 100644 --- a/Mage.Sets/src/mage/sets/alliances/Reinforcements.java +++ b/Mage.Sets/src/mage/sets/alliances/Reinforcements1.java @@ -33,20 +33,20 @@ import java.util.UUID; * * @author fireshoes */ -public class Reinforcements extends mage.sets.masterseditionii.Reinforcements { +public class Reinforcements1 extends mage.sets.masterseditionii.Reinforcements { - public Reinforcements(UUID ownerId) { + public Reinforcements1(UUID ownerId) { super(ownerId); this.cardNumber = 142; this.expansionSetCode = "ALL"; } - public Reinforcements(final Reinforcements card) { + public Reinforcements1(final Reinforcements1 card) { super(card); } @Override - public Reinforcements copy() { - return new Reinforcements(this); + public Reinforcements1 copy() { + return new Reinforcements1(this); } } diff --git a/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java b/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java new file mode 100644 index 00000000000..c777624e42d --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Reinforcements2 extends mage.sets.masterseditionii.Reinforcements { + + public Reinforcements2(UUID ownerId) { + super(ownerId); + this.cardNumber = 142; + this.expansionSetCode = "ALL"; + } + + public Reinforcements2(final Reinforcements2 card) { + super(card); + } + + @Override + public Reinforcements2 copy() { + return new Reinforcements2(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/Panic.java b/Mage.Sets/src/mage/sets/fifthedition/Panic.java new file mode 100644 index 00000000000..589256a6c08 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/Panic.java @@ -0,0 +1,52 @@ +/* + * 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.fifthedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Panic extends mage.sets.masterseditionii.Panic { + + public Panic(UUID ownerId) { + super(ownerId); + this.cardNumber = 260; + this.expansionSetCode = "5ED"; + } + + public Panic(final Panic card) { + super(card); + } + + @Override + public Panic copy() { + return new Panic(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/Panic.java b/Mage.Sets/src/mage/sets/iceage/Panic.java new file mode 100644 index 00000000000..65e1c110b94 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/Panic.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Panic extends mage.sets.masterseditionii.Panic { + + public Panic(UUID ownerId) { + super(ownerId); + this.cardNumber = 212; + this.expansionSetCode = "ICE"; + } + + public Panic(final Panic card) { + super(card); + } + + @Override + public Panic copy() { + return new Panic(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/TriassicEgg.java b/Mage.Sets/src/mage/sets/legends/TriassicEgg.java new file mode 100644 index 00000000000..f7c9714cc40 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/TriassicEgg.java @@ -0,0 +1,93 @@ +/* + * 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.legends; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreatureCard; +import mage.target.Target; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class TriassicEgg extends CardImpl { + + public TriassicEgg(UUID ownerId) { + super(ownerId, 242, "Triassic Egg", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}"); + this.expansionSetCode = "LEG"; + + // {3}, {tap}: Put a hatchling counter on Triassic Egg. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new AddCountersSourceEffect(CounterType.HATCHLING.createInstance(), true), + new GenericManaCost(3)); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // Sacrifice Triassic Egg: Choose one - You may put a creature card from your hand onto the battlefield; + ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, + new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card")), + new SacrificeSourceCost(), + new SourceHasCounterCondition(CounterType.HATCHLING, 2, Integer.MAX_VALUE), + "Sacrifice Triassic Egg: Choose one - You may put a creature card from your hand onto the battlefield; or return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on {this}."); + + // or return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on Triassic Egg. + Mode mode = new Mode(); + mode.getEffects().add(new ReturnFromGraveyardToBattlefieldTargetEffect()); + Target target = new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard")); + mode.getTargets().add(target); + ability.addMode(mode); + + this.addAbility(ability); + } + + public TriassicEgg(final TriassicEgg card) { + super(card); + } + + @Override + public TriassicEgg copy() { + return new TriassicEgg(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/masterseditionii/Panic.java b/Mage.Sets/src/mage/sets/masterseditionii/Panic.java new file mode 100644 index 00000000000..16b034a6316 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/Panic.java @@ -0,0 +1,120 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.TurnPhase; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Panic extends CardImpl { + + public Panic(UUID ownerId) { + super(ownerId, 145, "Panic", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{R}"); + this.expansionSetCode = "ME2"; + + // Cast Panic only during combat before blockers are declared. + Ability ability = new SimpleStaticAbility(Zone.ALL, new PanicRuleModifyingEffect()); + ability.setRuleAtTheTop(true); + this.addAbility(ability); + + // Target creature can't block this turn. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new CantBlockTargetEffect(Duration.EndOfTurn)); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Panic(final Panic card) { + super(card); + } + + @Override + public Panic copy() { + return new Panic(this); + } +} + +class PanicRuleModifyingEffect extends ContinuousRuleModifyingEffectImpl { + + PanicRuleModifyingEffect() { + super(Duration.EndOfGame, Outcome.Detriment); + staticText = "Cast {this} only during combat before blockers are declared"; + } + + PanicRuleModifyingEffect(final PanicRuleModifyingEffect effect) { + super(effect); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType().equals(GameEvent.EventType.CAST_SPELL); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getSourceId().equals(source.getSourceId())) { + return !TurnPhase.COMBAT.equals(game.getTurn().getPhaseType()) || + game.getStep().getType().equals(PhaseStep.DECLARE_BLOCKERS) || + game.getStep().getType().equals(PhaseStep.FIRST_COMBAT_DAMAGE) || + game.getStep().getType().equals(PhaseStep.COMBAT_DAMAGE) || + game.getStep().getType().equals(PhaseStep.END_COMBAT); + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public PanicRuleModifyingEffect copy() { + return new PanicRuleModifyingEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/GorillaWarCry.java b/Mage.Sets/src/mage/sets/masterseditioniv/GorillaWarCry.java new file mode 100644 index 00000000000..8fdd8972bf2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/GorillaWarCry.java @@ -0,0 +1,124 @@ +/* + * 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.masterseditioniv; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.PhaseStep; +import mage.constants.Rarity; +import mage.constants.TurnPhase; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class GorillaWarCry extends CardImpl { + + public GorillaWarCry(UUID ownerId) { + super(ownerId, 124, "Gorilla War Cry", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}"); + this.expansionSetCode = "ME4"; + + // Cast Gorilla War Cry only during combat before blockers are declared. + Ability ability = new SimpleStaticAbility(Zone.ALL, new GorillaWarCryRuleModifyingEffect()); + ability.setRuleAtTheTop(true); + this.addAbility(ability); + + // All creatures gain menace until end of turn. (They can't be blocked except by two or more creatures.) + Effect effect = new GainAbilityAllEffect(new MenaceAbility(), Duration.EndOfTurn, new FilterCreaturePermanent()); + effect.setText("All creatures gain menace until end of turn. (They can't be blocked except by two or more creatures.)"); + this.getSpellAbility().addEffect(effect); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public GorillaWarCry(final GorillaWarCry card) { + super(card); + } + + @Override + public GorillaWarCry copy() { + return new GorillaWarCry(this); + } +} + +class GorillaWarCryRuleModifyingEffect extends ContinuousRuleModifyingEffectImpl { + + GorillaWarCryRuleModifyingEffect() { + super(Duration.EndOfGame, Outcome.Detriment); + staticText = "Cast {this} only during combat before blockers are declared"; + } + + GorillaWarCryRuleModifyingEffect(final GorillaWarCryRuleModifyingEffect effect) { + super(effect); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType().equals(GameEvent.EventType.CAST_SPELL); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getSourceId().equals(source.getSourceId())) { + return !TurnPhase.COMBAT.equals(game.getTurn().getPhaseType()) || + game.getStep().getType().equals(PhaseStep.DECLARE_BLOCKERS) || + game.getStep().getType().equals(PhaseStep.FIRST_COMBAT_DAMAGE) || + game.getStep().getType().equals(PhaseStep.COMBAT_DAMAGE) || + game.getStep().getType().equals(PhaseStep.END_COMBAT); + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public GorillaWarCryRuleModifyingEffect copy() { + return new GorillaWarCryRuleModifyingEffect(this); + } +} + diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/TriassicEgg.java b/Mage.Sets/src/mage/sets/masterseditioniv/TriassicEgg.java new file mode 100644 index 00000000000..ff16671e170 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/TriassicEgg.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditioniv; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class TriassicEgg extends mage.sets.legends.TriassicEgg { + + public TriassicEgg(UUID ownerId) { + super(ownerId); + this.cardNumber = 235; + this.expansionSetCode = "ME4"; + } + + public TriassicEgg(final TriassicEgg card) { + super(card); + } + + @Override + public TriassicEgg copy() { + return new TriassicEgg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/CloudCover.java b/Mage.Sets/src/mage/sets/planeshift/CloudCover.java new file mode 100644 index 00000000000..c8b82d6a5f2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planeshift/CloudCover.java @@ -0,0 +1,106 @@ +/* + * 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.planeshift; + +import java.util.UUID; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class CloudCover extends CardImpl { + + public CloudCover(UUID ownerId) { + super(ownerId, 98, "Cloud Cover", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{U}"); + this.expansionSetCode = "PLS"; + + // Whenever another permanent you control becomes the target of a spell or ability an opponent controls, you may return that permanent to its owner's hand. + this.addAbility(new CloudCoverAbility()); + } + + public CloudCover(final CloudCover card) { + super(card); + } + + @Override + public CloudCover copy() { + return new CloudCover(this); + } +} + +class CloudCoverAbility extends TriggeredAbilityImpl { + + public CloudCoverAbility() { + super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), true); + } + + public CloudCoverAbility(final CloudCoverAbility ability) { + super(ability); + } + + @Override + public CloudCoverAbility copy() { + return new CloudCoverAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.TARGETED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanent(event.getTargetId()); + Player controller = game.getPlayer(this.getControllerId()); + Player targetter = game.getPlayer(event.getPlayerId()); + if (permanent != null && !permanent.getId().equals(this.getSourceId()) + && controller != null && targetter != null + && !controller.getId().equals(targetter.getId())) { + getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId())); + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever another permanent you control becomes the target of a spell or ability an opponent controls, you may return that permanent to its owner's hand."; + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/MercenaryInformer.java b/Mage.Sets/src/mage/sets/prophecy/MercenaryInformer.java new file mode 100644 index 00000000000..2837baf4cf4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/MercenaryInformer.java @@ -0,0 +1,93 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CantBeTargetedSourceEffect; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.FilterStackObject; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class MercenaryInformer extends CardImpl { + + private static final FilterStackObject filterBlack = new FilterStackObject("black spells or abilities from black sources"); + private static final FilterPermanent filterMercenary = new FilterPermanent("nontoken Mercenary"); + + static { + filterBlack.add(new ColorPredicate(ObjectColor.BLACK)); + filterMercenary.add(Predicates.not(new TokenPredicate())); + filterMercenary.add(new SubtypePredicate("Mercenary")); + } + + public MercenaryInformer(UUID ownerId) { + super(ownerId, 15, "Mercenary Informer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Human"); + this.subtype.add("Rebel"); + this.subtype.add("Mercenary"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Mercenary Informer can't be the target of black spells or abilities from black sources. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeTargetedSourceEffect(filterBlack, Duration.WhileOnBattlefield))); + + // {2}{W}: Put target nontoken Mercenary on the bottom of its owner's library. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibraryTargetEffect(false), new ManaCostsImpl("{2}{W}")); + ability.addTarget(new TargetPermanent(filterMercenary)); + this.addAbility(ability); + } + + public MercenaryInformer(final MercenaryInformer card) { + super(card); + } + + @Override + public MercenaryInformer copy() { + return new MercenaryInformer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/RebelInformer.java b/Mage.Sets/src/mage/sets/prophecy/RebelInformer.java new file mode 100644 index 00000000000..f593ed193a6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/RebelInformer.java @@ -0,0 +1,93 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.CantBeTargetedSourceEffect; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.FilterStackObject; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class RebelInformer extends CardImpl { + + private static final FilterStackObject filterWhite = new FilterStackObject("white spells or abilities from white sources"); + private static final FilterPermanent filterRebel = new FilterPermanent("nontoken Rebel"); + + static { + filterWhite.add(new ColorPredicate(ObjectColor.WHITE)); + filterRebel.add(Predicates.not(new TokenPredicate())); + filterRebel.add(new SubtypePredicate("Rebel")); + } + + public RebelInformer(UUID ownerId) { + super(ownerId, 75, "Rebel Informer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Human"); + this.subtype.add("Mercenary"); + this.subtype.add("Rebel"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Rebel Informer can't be the target of white spells or abilities from white sources. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeTargetedSourceEffect(filterWhite, Duration.WhileOnBattlefield))); + + // {3}: Put target nontoken Rebel on the bottom of its owner's library. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibraryTargetEffect(false), new GenericManaCost(3)); + ability.addTarget(new TargetPermanent(filterRebel)); + this.addAbility(ability); + } + + public RebelInformer(final RebelInformer card) { + super(card); + } + + @Override + public RebelInformer copy() { + return new RebelInformer(this); + } +} From 733e3265e672c2a3e8c1434031dc97b2ad2abf76 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Wed, 12 Aug 2015 12:20:23 -0500 Subject: [PATCH 342/375] Fixed Reinforcement2 collector number. --- Mage.Sets/src/mage/sets/alliances/Reinforcements2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java b/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java index c777624e42d..e9010af8794 100644 --- a/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java +++ b/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java @@ -37,7 +37,7 @@ public class Reinforcements2 extends mage.sets.masterseditionii.Reinforcements { public Reinforcements2(UUID ownerId) { super(ownerId); - this.cardNumber = 142; + this.cardNumber = 143; this.expansionSetCode = "ALL"; } From af4d65d6595ab07a27e7faa51dbe75bd0765ca75 Mon Sep 17 00:00:00 2001 From: markedagain Date: Wed, 12 Aug 2015 14:36:42 -0400 Subject: [PATCH 343/375] 5 new cards --- .../src/mage/sets/exodus/SonicBurst.java | 63 ++++++++++ .../src/mage/sets/fifthedition/Deathgrip.java | 52 ++++++++ .../mage/sets/fourthedition/Deathgrip.java | 52 ++++++++ .../src/mage/sets/limitedalpha/Deathgrip.java | 52 ++++++++ .../src/mage/sets/limitedbeta/Deathgrip.java | 67 ++++++++++ .../mage/sets/masterseditioniv/Deathgrip.java | 54 ++++++++ .../src/mage/sets/mirage/WitheringBoon.java | 69 +++++++++++ .../src/mage/sets/nemesis/MoggAlarm.java | 72 +++++++++++ .../mage/sets/revisededition/Deathgrip.java | 52 ++++++++ .../src/mage/sets/tempest/Apocalypse.java | 117 ++++++++++++++++++ .../mage/sets/unlimitededition/Deathgrip.java | 52 ++++++++ 11 files changed, 702 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/exodus/SonicBurst.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/Deathgrip.java create mode 100644 Mage.Sets/src/mage/sets/fourthedition/Deathgrip.java create mode 100644 Mage.Sets/src/mage/sets/limitedalpha/Deathgrip.java create mode 100644 Mage.Sets/src/mage/sets/limitedbeta/Deathgrip.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/Deathgrip.java create mode 100644 Mage.Sets/src/mage/sets/mirage/WitheringBoon.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/MoggAlarm.java create mode 100644 Mage.Sets/src/mage/sets/revisededition/Deathgrip.java create mode 100644 Mage.Sets/src/mage/sets/tempest/Apocalypse.java create mode 100644 Mage.Sets/src/mage/sets/unlimitededition/Deathgrip.java diff --git a/Mage.Sets/src/mage/sets/exodus/SonicBurst.java b/Mage.Sets/src/mage/sets/exodus/SonicBurst.java new file mode 100644 index 00000000000..83af8608c9e --- /dev/null +++ b/Mage.Sets/src/mage/sets/exodus/SonicBurst.java @@ -0,0 +1,63 @@ +/* + * 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.exodus; + +import java.util.UUID; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author markedagain + */ +public class SonicBurst extends CardImpl { + + public SonicBurst(UUID ownerId) { + super(ownerId, 103, "Sonic Burst", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}"); + this.expansionSetCode = "EXO"; + + // As an additional cost to cast Sonic Burst, discard a card at random. + this.getSpellAbility().addCost(new DiscardCardCost(true)); + // Sonic Burst deals 4 damage to target creature or player. + this.getSpellAbility().addEffect(new DamageTargetEffect(4)); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + } + + public SonicBurst(final SonicBurst card) { + super(card); + } + + @Override + public SonicBurst copy() { + return new SonicBurst(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/Deathgrip.java b/Mage.Sets/src/mage/sets/fifthedition/Deathgrip.java new file mode 100644 index 00000000000..19879354564 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/Deathgrip.java @@ -0,0 +1,52 @@ +/* + * 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.fifthedition; + +import java.util.UUID; + +/** + * + * @author anonymous + */ +public class Deathgrip extends mage.sets.limitedbeta.Deathgrip { + + public Deathgrip(UUID ownerId) { + super(ownerId); + this.cardNumber = 16; + this.expansionSetCode = "5ED"; + } + + public Deathgrip(final Deathgrip card) { + super(card); + } + + @Override + public Deathgrip copy() { + return new Deathgrip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fourthedition/Deathgrip.java b/Mage.Sets/src/mage/sets/fourthedition/Deathgrip.java new file mode 100644 index 00000000000..a99ff56436a --- /dev/null +++ b/Mage.Sets/src/mage/sets/fourthedition/Deathgrip.java @@ -0,0 +1,52 @@ +/* + * 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.fourthedition; + +import java.util.UUID; + +/** + * + * @author anonymous + */ +public class Deathgrip extends mage.sets.limitedbeta.Deathgrip { + + public Deathgrip(UUID ownerId) { + super(ownerId); + this.cardNumber = 14; + this.expansionSetCode = "4ED"; + } + + public Deathgrip(final Deathgrip card) { + super(card); + } + + @Override + public Deathgrip copy() { + return new Deathgrip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Deathgrip.java b/Mage.Sets/src/mage/sets/limitedalpha/Deathgrip.java new file mode 100644 index 00000000000..021a7712be6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/limitedalpha/Deathgrip.java @@ -0,0 +1,52 @@ +/* + * 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.limitedalpha; + +import java.util.UUID; + +/** + * + * @author anonymous + */ +public class Deathgrip extends mage.sets.limitedbeta.Deathgrip { + + public Deathgrip(UUID ownerId) { + super(ownerId); + this.cardNumber = 9; + this.expansionSetCode = "LEA"; + } + + public Deathgrip(final Deathgrip card) { + super(card); + } + + @Override + public Deathgrip copy() { + return new Deathgrip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/limitedbeta/Deathgrip.java b/Mage.Sets/src/mage/sets/limitedbeta/Deathgrip.java new file mode 100644 index 00000000000..7d7bb2a9ce3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/limitedbeta/Deathgrip.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.limitedbeta; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterSpell; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetSpell; + +/** + * + * @author markedagain + */ +public class Deathgrip extends CardImpl { + private static final FilterSpell filter = new FilterSpell("green spell"); + static{ + filter.add(new ColorPredicate(ObjectColor.GREEN)); + } + + public Deathgrip(UUID ownerId) { + super(ownerId, 9, "Deathgrip", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}{B}"); + this.expansionSetCode = "LEB"; + + // {B}{B}: Counter target green spell. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetSpell(filter)); + } + + public Deathgrip(final Deathgrip card) { + super(card); + } + + @Override + public Deathgrip copy() { + return new Deathgrip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/Deathgrip.java b/Mage.Sets/src/mage/sets/masterseditioniv/Deathgrip.java new file mode 100644 index 00000000000..e5d9b196a87 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/Deathgrip.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.masterseditioniv; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author anonymous + */ +public class Deathgrip extends mage.sets.limitedbeta.Deathgrip { + + public Deathgrip(UUID ownerId) { + super(ownerId); + this.cardNumber = 75; + this.expansionSetCode = "ME4"; + this.rarity = Rarity.RARE; + } + + public Deathgrip(final Deathgrip card) { + super(card); + } + + @Override + public Deathgrip copy() { + return new Deathgrip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/WitheringBoon.java b/Mage.Sets/src/mage/sets/mirage/WitheringBoon.java new file mode 100644 index 00000000000..60bf5a1f635 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/WitheringBoon.java @@ -0,0 +1,69 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterSpell; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetSpell; + +/** + * + * @author markedagain + */ +public class WitheringBoon extends CardImpl { + private static final FilterSpell filter = new FilterSpell("creature spell"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + } + public WitheringBoon(UUID ownerId) { + super(ownerId, 50, "Withering Boon", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "MIR"; + + // As an additional cost to cast Withering Boon, pay 3 life. + this.getSpellAbility().addCost(new PayLifeCost(3)); + // Counter target creature spell. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetSpell(filter)); + } + + public WitheringBoon(final WitheringBoon card) { + super(card); + } + + @Override + public WitheringBoon copy() { + return new WitheringBoon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/MoggAlarm.java b/Mage.Sets/src/mage/sets/nemesis/MoggAlarm.java new file mode 100644 index 00000000000..3a7e4d58fb1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/MoggAlarm.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.nemesis; + +import java.util.UUID; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.permanent.token.GoblinToken; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author markedagain + */ +public class MoggAlarm extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("two Mountains"); + static { + filter.add(new SubtypePredicate("Mountain")); + } + + public MoggAlarm(UUID ownerId) { + super(ownerId, 93, "Mogg Alarm", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{R}{R}"); + this.expansionSetCode = "NMS"; + + // You may sacrifice two Mountains rather than pay Mogg Alarm's mana cost. + this.addAbility(new AlternativeCostSourceAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, true)))); + // Put two 1/1 red Goblin creature tokens onto the battlefield. + this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(),2)); + + } + + public MoggAlarm(final MoggAlarm card) { + super(card); + } + + @Override + public MoggAlarm copy() { + return new MoggAlarm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/revisededition/Deathgrip.java b/Mage.Sets/src/mage/sets/revisededition/Deathgrip.java new file mode 100644 index 00000000000..220647d3079 --- /dev/null +++ b/Mage.Sets/src/mage/sets/revisededition/Deathgrip.java @@ -0,0 +1,52 @@ +/* + * 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.revisededition; + +import java.util.UUID; + +/** + * + * @author anonymous + */ +public class Deathgrip extends mage.sets.limitedbeta.Deathgrip { + + public Deathgrip(UUID ownerId) { + super(ownerId); + this.cardNumber = 9; + this.expansionSetCode = "3ED"; + } + + public Deathgrip(final Deathgrip card) { + super(card); + } + + @Override + public Deathgrip copy() { + return new Deathgrip(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/Apocalypse.java b/Mage.Sets/src/mage/sets/tempest/Apocalypse.java new file mode 100644 index 00000000000..ec63ce33d58 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/Apocalypse.java @@ -0,0 +1,117 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author markedagain + */ +public class Apocalypse extends CardImpl { + + public Apocalypse(UUID ownerId) { + super(ownerId, 162, "Apocalypse", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{R}{R}{R}"); + this.expansionSetCode = "TMP"; + + // Exile all permanents. You discard your hand. + this.getSpellAbility().addEffect(new ApocalypseExileAllPermanentsEffect()); + this.getSpellAbility().addEffect(new ApocalypseDiscardEffect()); + } + + public Apocalypse(final Apocalypse card) { + super(card); + } + + @Override + public Apocalypse copy() { + return new Apocalypse(this); + } +} +class ApocalypseDiscardEffect extends OneShotEffect { + + public ApocalypseDiscardEffect() { + super(Outcome.Discard); + this.staticText = "Discard your hand"; + } + + public ApocalypseDiscardEffect(final ApocalypseDiscardEffect effect) { + super(effect); + } + + @Override + public ApocalypseDiscardEffect copy() { + return new ApocalypseDiscardEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + for (Card card : player.getHand().getCards(game)) { + player.discard(card, source, game); + } + return true; + } + return false; + } +} +class ApocalypseExileAllPermanentsEffect extends OneShotEffect { + + public ApocalypseExileAllPermanentsEffect() { + super(Outcome.Exile); + staticText = "Exile all permanents"; + } + + public ApocalypseExileAllPermanentsEffect(final ApocalypseExileAllPermanentsEffect effect) { + super(effect); + } + + @Override + public ApocalypseExileAllPermanentsEffect copy() { + return new ApocalypseExileAllPermanentsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents()) { + permanent.moveToExile(null, null, source.getSourceId(), game); + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/unlimitededition/Deathgrip.java b/Mage.Sets/src/mage/sets/unlimitededition/Deathgrip.java new file mode 100644 index 00000000000..5467ba0936c --- /dev/null +++ b/Mage.Sets/src/mage/sets/unlimitededition/Deathgrip.java @@ -0,0 +1,52 @@ +/* + * 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.unlimitededition; + +import java.util.UUID; + +/** + * + * @author anonymous + */ +public class Deathgrip extends mage.sets.limitedbeta.Deathgrip { + + public Deathgrip(UUID ownerId) { + super(ownerId); + this.cardNumber = 9; + this.expansionSetCode = "2ED"; + } + + public Deathgrip(final Deathgrip card) { + super(card); + } + + @Override + public Deathgrip copy() { + return new Deathgrip(this); + } +} From 7e10c24f42cdd329cdc046b994784c4ed00a1efd Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 13 Aug 2015 07:07:44 +0300 Subject: [PATCH 344/375] Fix Hammer of Bogardan: The returning ability works during upkeep, not at end of combat. --- Mage.Sets/src/mage/sets/mirage/HammerOfBogardan.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mirage/HammerOfBogardan.java b/Mage.Sets/src/mage/sets/mirage/HammerOfBogardan.java index 43bce3d67f7..fc954383305 100644 --- a/Mage.Sets/src/mage/sets/mirage/HammerOfBogardan.java +++ b/Mage.Sets/src/mage/sets/mirage/HammerOfBogardan.java @@ -29,15 +29,15 @@ package mage.sets.mirage; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.condition.common.IsStepCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.PhaseStep; +import mage.constants.Rarity; import mage.constants.Zone; import mage.target.common.TargetCreatureOrPlayer; @@ -58,8 +58,8 @@ public class HammerOfBogardan extends CardImpl { this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); // {2}{R}{R}{R}: Return Hammer of Bogardan from your graveyard to your hand. Activate this ability only during your upkeep. - this.addAbility(new ConditionalActivatedAbility(Zone.GRAVEYARD, - new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{2}{R}{R}{R}"), new IsStepCondition(PhaseStep.END_COMBAT), null)); + this.addAbility(new ConditionalActivatedAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{2}{R}{R}{R}"), new IsStepCondition(PhaseStep.UPKEEP), null)); } public HammerOfBogardan(final HammerOfBogardan card) { From 3471bca2041b41f4fba938937cb8a0578f6ead17 Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Wed, 12 Aug 2015 22:30:17 -0700 Subject: [PATCH 345/375] Implemented Hydromorph Guardian --- .../mage/sets/torment/HydromorphGuardian.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java diff --git a/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java new file mode 100644 index 00000000000..17b5121f4b5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.torment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetSpell; + +/** + * + * @author TaVSt + */ +public class HydromorphGuardian extends CardImpl { + + public HydromorphGuardian(UUID ownerId) { + super(ownerId, 39, "Hydromorph Guardian", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Elemental"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {U}, Sacrifice Hydromorph Guardian: Counter target spell that targets one or more creatures you control. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new ColoredManaCost(ColoredManaSymbol.U)); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetSpell()); + this.addAbility(ability); + } + + public HydromorphGuardian(final HydromorphGuardian card) { + super(card); + } + + @Override + public HydromorphGuardian copy() { + return new HydromorphGuardian(this); + } +} From 30342fe5a03c0840336e046c4b67fd725760c90e Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Thu, 13 Aug 2015 00:58:31 -0700 Subject: [PATCH 346/375] Make hydromorphguardian only counter spells that target creatures you control --- .../mage/sets/torment/HydromorphGuardian.java | 119 +++++++++++++++++- 1 file changed, 117 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java index 17b5121f4b5..cf3f69e789d 100644 --- a/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java +++ b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java @@ -27,6 +27,8 @@ */ package mage.sets.torment; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -39,7 +41,14 @@ import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Rarity; import mage.constants.Zone; -import mage.target.TargetSpell; +import mage.filter.Filter; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; +import mage.target.Target; +import mage.target.TargetObject; /** * @@ -47,6 +56,8 @@ import mage.target.TargetSpell; */ public class HydromorphGuardian extends CardImpl { + private static FilterSpell filter = new FilterSpell("spell that targets a creature you control"); + public HydromorphGuardian(UUID ownerId) { super(ownerId, 39, "Hydromorph Guardian", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.expansionSetCode = "TOR"; @@ -57,7 +68,7 @@ public class HydromorphGuardian extends CardImpl { // {U}, Sacrifice Hydromorph Guardian: Counter target spell that targets one or more creatures you control. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new ColoredManaCost(ColoredManaSymbol.U)); ability.addCost(new SacrificeSourceCost()); - ability.addTarget(new TargetSpell()); + ability.addTarget(new CustomTargetSpell(filter)); this.addAbility(ability); } @@ -69,4 +80,108 @@ public class HydromorphGuardian extends CardImpl { public HydromorphGuardian copy() { return new HydromorphGuardian(this); } + + private class CustomTargetSpell extends TargetObject { + + protected FilterSpell filter; + + public CustomTargetSpell() { + this(1, 1, new FilterSpell()); + } + + public CustomTargetSpell(FilterSpell filter) { + this(1, 1, filter); + } + + public CustomTargetSpell(int numTargets, FilterSpell filter) { + this(numTargets, numTargets, filter); + } + + public CustomTargetSpell(int minNumTargets, int maxNumTargets, FilterSpell filter) { + this.minNumberOfTargets = minNumTargets; + this.maxNumberOfTargets = maxNumTargets; + this.zone = Zone.STACK; + this.filter = filter; + this.targetName = filter.getMessage(); + } + + public CustomTargetSpell(final CustomTargetSpell target) { + super(target); + this.filter = target.filter.copy(); + } + + @Override + public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { + return canChoose(sourceControllerId, game); + } + + @Override + public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { + return possibleTargets(sourceControllerId, game); + } + + @Override + public boolean canTarget(UUID id, Ability source, Game game) { + if (super.canTarget(id, source, game)) { + if (targetsMyCreature(id, source.getControllerId(), game)) { + return true; + } + } + return false; + } + + @Override + public boolean canChoose(UUID sourceControllerId, Game game) { + int count = 0; + for (StackObject stackObject : game.getStack()) { + if (stackObject instanceof Spell && game.getPlayer(sourceControllerId).getInRange().contains(stackObject.getControllerId()) && filter.match((Spell) stackObject, game)) { + if (targetsMyCreature(stackObject.getId(), sourceControllerId, game)) { + count++; + if (count >= this.minNumberOfTargets) + return true; + } + } + } + return false; + } + + @Override + public Set possibleTargets(UUID sourceControllerId, Game game) { + Set possibleTargets = new HashSet(); + for (StackObject stackObject : game.getStack()) { + if (stackObject instanceof Spell && game.getPlayer(sourceControllerId).getInRange().contains(stackObject.getControllerId()) && filter.match((Spell) stackObject, game)) { + if (targetsMyCreature(stackObject.getId(), sourceControllerId, game)) { + possibleTargets.add(stackObject.getId()); + } + } + } + return possibleTargets; + } + + @Override + public Filter getFilter() { + return filter; + } + + private boolean targetsMyCreature(UUID id, UUID controllerId, Game game) { + StackObject spell = game.getStack().getStackObject(id); + if (spell != null) { + Ability ability = spell.getStackAbility(); + for (Target target : ability.getTargets()) { + for (UUID permanentId : target.getTargets()) { + Permanent permanent = game.getPermanent(permanentId); + if (permanent != null && permanent.getControllerId().equals(controllerId) && permanent.getCardType().contains(CardType.CREATURE)) { + return true; + } + } + } + } + return false; + } + + @Override + public CustomTargetSpell copy() { + return new CustomTargetSpell(this); + } + } } From 5c6d56a306f01ea7bfaf66fd59abd92df56964f2 Mon Sep 17 00:00:00 2001 From: Edward Gao Date: Thu, 13 Aug 2015 01:19:53 -0700 Subject: [PATCH 347/375] Minor wording change to hydromorph guardian --- Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java index cf3f69e789d..56366bdd597 100644 --- a/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java +++ b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java @@ -56,7 +56,7 @@ import mage.target.TargetObject; */ public class HydromorphGuardian extends CardImpl { - private static FilterSpell filter = new FilterSpell("spell that targets a creature you control"); + private static FilterSpell filter = new FilterSpell("spell that targets one or more creatures you control"); public HydromorphGuardian(UUID ownerId) { super(ownerId, 39, "Hydromorph Guardian", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); From 325776c9adfe1ab42851283bb224128960469ae0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 13 Aug 2015 12:01:01 +0200 Subject: [PATCH 348/375] Some changes to can't be the target of spells or abilities framework effects. --- .../mage/sets/dissension/ShieldingPlax.java | 15 +- .../src/mage/sets/magic2011/GaeasRevenge.java | 22 +-- .../src/mage/sets/worldwake/CanopyCover.java | 25 ++- .../mage/sets/zendikar/VinesOfVastwood.java | 18 +-- .../canttarget/CanopyCoverTest.java | 93 +++++++++++ .../canttarget/GaeasRevengeTest.java | 81 ++++++++++ .../common/CantBeTargetedAttachedEffect.java | 34 ++-- .../common/CantBeTargetedSourceEffect.java | 31 ++-- .../common/CantBeTargetedTargetEffect.java | 35 ++++- Mage/src/mage/filter/FilterImpl.java | 55 ++++--- Mage/src/mage/filter/FilterObject.java | 55 ++++--- Mage/src/mage/game/GameImpl.java | 7 +- Mage/src/mage/game/stack/StackAbility.java | 147 ++++++++++-------- 13 files changed, 416 insertions(+), 202 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/CanopyCoverTest.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/GaeasRevengeTest.java diff --git a/Mage.Sets/src/mage/sets/dissension/ShieldingPlax.java b/Mage.Sets/src/mage/sets/dissension/ShieldingPlax.java index 3d42a62d49e..f2367a6c851 100644 --- a/Mage.Sets/src/mage/sets/dissension/ShieldingPlax.java +++ b/Mage.Sets/src/mage/sets/dissension/ShieldingPlax.java @@ -43,8 +43,8 @@ import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.FilterObject; import mage.filter.FilterStackObject; -import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -54,12 +54,8 @@ import mage.target.common.TargetCreaturePermanent; */ public class ShieldingPlax extends CardImpl { - private static final FilterStackObject filter = new FilterStackObject("spells or abilities your opponents control"); + private static final FilterObject filter = new FilterStackObject("spells or abilities your opponents control"); - static { - filter.add(new ControllerPredicate(TargetController.OPPONENT)); - } - public ShieldingPlax(UUID ownerId) { super(ownerId, 147, "Shielding Plax", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{G/U}"); this.expansionSetCode = "DIS"; @@ -71,12 +67,13 @@ public class ShieldingPlax extends CardImpl { this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - + // When Shielding Plax enters the battlefield, draw a card. this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); - + // Enchanted creature can't be the target of spells or abilities your opponents control. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeTargetedAttachedEffect(filter, Duration.WhileOnBattlefield, AttachmentType.AURA))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new CantBeTargetedAttachedEffect(filter, Duration.WhileOnBattlefield, AttachmentType.AURA, TargetController.OPPONENT))); } public ShieldingPlax(final ShieldingPlax card) { diff --git a/Mage.Sets/src/mage/sets/magic2011/GaeasRevenge.java b/Mage.Sets/src/mage/sets/magic2011/GaeasRevenge.java index d09fae31897..1c174e38e8e 100644 --- a/Mage.Sets/src/mage/sets/magic2011/GaeasRevenge.java +++ b/Mage.Sets/src/mage/sets/magic2011/GaeasRevenge.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,19 +20,14 @@ * 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.magic2011; 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.ObjectColor; import mage.abilities.common.SimpleStaticAbility; @@ -40,6 +35,11 @@ import mage.abilities.effects.common.CantBeCounteredSourceEffect; import mage.abilities.effects.common.CantBeTargetedSourceEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterObject; import mage.filter.FilterStackObject; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; @@ -50,7 +50,7 @@ import mage.filter.predicate.mageobject.ColorPredicate; */ public class GaeasRevenge extends CardImpl { - private static final FilterStackObject filter = new FilterStackObject("nongreen spells or abilities from nongreen sources"); + private static final FilterObject filter = new FilterStackObject("nongreen spells or abilities from nongreen sources"); static { filter.add(Predicates.not(new ColorPredicate(ObjectColor.GREEN))); diff --git a/Mage.Sets/src/mage/sets/worldwake/CanopyCover.java b/Mage.Sets/src/mage/sets/worldwake/CanopyCover.java index ca6ca52f355..71c8ff7ec97 100644 --- a/Mage.Sets/src/mage/sets/worldwake/CanopyCover.java +++ b/Mage.Sets/src/mage/sets/worldwake/CanopyCover.java @@ -28,12 +28,6 @@ package mage.sets.worldwake; import java.util.UUID; -import mage.constants.AttachmentType; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.RestrictionEffect; @@ -43,33 +37,32 @@ import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ReachAbility; import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterObject; import mage.filter.FilterStackObject; -import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; - - /** * @author noxx */ public class CanopyCover extends CardImpl { - private static final FilterStackObject filter = new FilterStackObject("spells or abilities your opponents control"); + private static final FilterObject filter = new FilterStackObject("spells or abilities your opponents control"); - static { - filter.add(new ControllerPredicate(TargetController.OPPONENT)); - } - public CanopyCover(UUID ownerId) { super(ownerId, 98, "Canopy Cover", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); this.expansionSetCode = "WWK"; this.subtype.add("Aura"); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -81,7 +74,7 @@ public class CanopyCover extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OrchardSpiritEffect())); // Enchanted creature can't be the target of spells or abilities your opponents control. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeTargetedAttachedEffect(filter, Duration.WhileOnBattlefield, AttachmentType.AURA))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeTargetedAttachedEffect(filter, Duration.WhileOnBattlefield, AttachmentType.AURA, TargetController.OPPONENT))); } public CanopyCover(final CanopyCover card) { diff --git a/Mage.Sets/src/mage/sets/zendikar/VinesOfVastwood.java b/Mage.Sets/src/mage/sets/zendikar/VinesOfVastwood.java index d67de8aa3f2..cb72eb9e989 100644 --- a/Mage.Sets/src/mage/sets/zendikar/VinesOfVastwood.java +++ b/Mage.Sets/src/mage/sets/zendikar/VinesOfVastwood.java @@ -25,23 +25,22 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.zendikar; import java.util.UUID; import mage.abilities.condition.LockedInCondition; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; import mage.abilities.condition.common.KickedCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.CantBeTargetedTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; import mage.constants.TargetController; +import mage.filter.FilterObject; import mage.filter.FilterStackObject; -import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.common.TargetCreaturePermanent; /** @@ -49,12 +48,8 @@ import mage.target.common.TargetCreaturePermanent; */ public class VinesOfVastwood extends CardImpl { - private static final FilterStackObject filter = new FilterStackObject("spells or abilities your opponents control"); + private static final FilterObject filter = new FilterStackObject("spells or abilities your opponents control"); - static { - filter.add(new ControllerPredicate(TargetController.OPPONENT)); - } - private static final String staticText = "If {this} was kicked, that creature gets +4/+4 until end of turn"; public VinesOfVastwood(UUID ownerId) { @@ -66,7 +61,7 @@ public class VinesOfVastwood extends CardImpl { // Target creature can't be the target of spells or abilities your opponents control this turn. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new CantBeTargetedTargetEffect(filter, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new CantBeTargetedTargetEffect(filter, Duration.EndOfTurn, TargetController.OPPONENT)); // If Vines of Vastwood was kicked, that creature gets +4/+4 until end of turn. this.getSpellAbility().addEffect(new ConditionalContinuousEffect(new BoostTargetEffect(4, 4, Duration.EndOfTurn), @@ -82,4 +77,3 @@ public class VinesOfVastwood extends CardImpl { return new VinesOfVastwood(this); } } - diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/CanopyCoverTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/CanopyCoverTest.java new file mode 100644 index 00000000000..d3c0125f01a --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/CanopyCoverTest.java @@ -0,0 +1,93 @@ +/* + * 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 org.mage.test.cards.replacement.canttarget; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class CanopyCoverTest extends CardTestPlayerBase { + + /** + * Test spell + */ + @Test + public void testCantBeTargetedWithSpells() { + addCard(Zone.HAND, playerB, "Lightning Bolt"); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); + + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion"); // 2/2 Creature - Lion + // Enchanted creature can't be the target of spells or abilities your opponents control. + addCard(Zone.HAND, playerA, "Canopy Cover"); // Enchantment - Aura + + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Canopy Cover", "Silvercoat Lion"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Canopy Cover", 1); + assertPermanentCount(playerA, "Silvercoat Lion", 1); + + assertHandCount(playerB, "Lightning Bolt", 1); + } + + @Test + public void testCantBeTargetedWithAbilities() { + // {U},Sacrifice AEther Spellbomb: Return target creature to its owner's hand. + addCard(Zone.BATTLEFIELD, playerB, "AEther Spellbomb"); + addCard(Zone.BATTLEFIELD, playerB, "Island", 1); + + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion"); // 2/2 Creature - Lion + // Enchanted creature can't be the target of spells or abilities your opponents control. + addCard(Zone.HAND, playerA, "Canopy Cover"); // Enchantment - Aura + + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Canopy Cover", "Silvercoat Lion"); + + activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "{U},Sacrifice", "Silvercoat Lion"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Canopy Cover", 1); + assertPermanentCount(playerA, "Silvercoat Lion", 1); + + assertGraveyardCount(playerB, "AEther Spellbomb", 0); + assertPermanentCount(playerB, "AEther Spellbomb", 1); + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/GaeasRevengeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/GaeasRevengeTest.java new file mode 100644 index 00000000000..34fa2d09766 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/GaeasRevengeTest.java @@ -0,0 +1,81 @@ +/* + * 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 org.mage.test.cards.replacement.canttarget; + +import mage.abilities.keyword.TrampleAbility; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class GaeasRevengeTest extends CardTestPlayerBase { + + /** + * Test spell + */ + @Test + public void testGreenCanTargetWithSpells() { + addCard(Zone.HAND, playerA, "Titanic Growth"); + // Gaea's Revenge can't be countered. + // Haste + // Gaea's Revenge can't be the target of nongreen spells or abilities from nongreen sources. + addCard(Zone.BATTLEFIELD, playerA, "Gaea's Revenge"); // 8/5 Creature - Elemental + + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Titanic Growth", "Gaea's Revenge"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + assertPowerToughness(playerA, "Gaea's Revenge", 12, 9); + } + + @Test + public void testGreenCanTargetWithAnAbilitiy() { + // Gaea's Revenge can't be countered. + // Haste + // Gaea's Revenge can't be the target of nongreen spells or abilities from nongreen sources. + addCard(Zone.BATTLEFIELD, playerB, "Gaea's Revenge"); // 8/5 Creature - Elemental + // Whenever a creature you control becomes blocked, it gets +1/+1 until end of turn. + // {1}{G}: Target creature you control gains trample until end of turn. + addCard(Zone.BATTLEFIELD, playerB, "Somberwald Alpha"); // 3/2 Creature - Wolf + + addCard(Zone.BATTLEFIELD, playerB, "Forest", 2); + + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}{G}: Target creature", "Gaea's Revenge"); + + setStopAt(2, PhaseStep.BEGIN_COMBAT); + execute(); + assertAbility(playerB, "Gaea's Revenge", TrampleAbility.getInstance(), true); + assertPowerToughness(playerB, "Gaea's Revenge", 8, 5); + } +} diff --git a/Mage/src/mage/abilities/effects/common/CantBeTargetedAttachedEffect.java b/Mage/src/mage/abilities/effects/common/CantBeTargetedAttachedEffect.java index bf055b18060..132375bef28 100644 --- a/Mage/src/mage/abilities/effects/common/CantBeTargetedAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/CantBeTargetedAttachedEffect.java @@ -27,39 +27,43 @@ */ package mage.abilities.effects.common; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.constants.AttachmentType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.filter.FilterStackObject; +import mage.constants.TargetController; +import mage.filter.FilterObject; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; -import mage.game.stack.StackObject; +import mage.game.stack.StackAbility; /** * * @author LevelX2 */ - public class CantBeTargetedAttachedEffect extends ContinuousRuleModifyingEffectImpl { - private final FilterStackObject filterSource; + private final FilterObject filterSource; private final AttachmentType attachmentType; - - public CantBeTargetedAttachedEffect(FilterStackObject filterSource, Duration duration, AttachmentType attachmentType) { + private final TargetController targetController; + + public CantBeTargetedAttachedEffect(FilterObject filterSource, Duration duration, AttachmentType attachmentType, TargetController targetController) { super(duration, Outcome.Benefit); this.filterSource = filterSource; this.attachmentType = attachmentType; + this.targetController = targetController; } public CantBeTargetedAttachedEffect(final CantBeTargetedAttachedEffect effect) { super(effect); this.filterSource = effect.filterSource.copy(); this.attachmentType = effect.attachmentType; + this.targetController = effect.targetController; } @Override @@ -81,8 +85,18 @@ public class CantBeTargetedAttachedEffect extends ContinuousRuleModifyingEffectI public boolean applies(GameEvent event, Ability source, Game game) { Permanent attachment = game.getPermanent(source.getSourceId()); if (attachment != null && event.getTargetId().equals(attachment.getAttachedTo())) { - StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - if (sourceObject != null && filterSource.match(sourceObject, source.getControllerId(), game)) { + if (targetController.equals(TargetController.OPPONENT) + && !game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { + return false; + } + MageObject mageObject = game.getObject(event.getSourceId()); + MageObject sourceObject; + if (mageObject instanceof StackAbility) { + sourceObject = ((StackAbility) mageObject).getSourceObject(game); + } else { + sourceObject = mageObject; + } + if (mageObject != null && filterSource.match(sourceObject, game)) { return true; } } @@ -103,13 +117,13 @@ public class CantBeTargetedAttachedEffect extends ContinuousRuleModifyingEffectI sb.append(" can't be the target of "); sb.append(filterSource.getMessage()); if (!duration.toString().isEmpty()) { - sb.append(" "); + sb.append(" "); if (duration.equals(Duration.EndOfTurn)) { sb.append("this turn"); } else { sb.append(duration.toString()); } - } + } return sb.toString(); } diff --git a/Mage/src/mage/abilities/effects/common/CantBeTargetedSourceEffect.java b/Mage/src/mage/abilities/effects/common/CantBeTargetedSourceEffect.java index d49b331c814..2a09645f968 100644 --- a/Mage/src/mage/abilities/effects/common/CantBeTargetedSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/CantBeTargetedSourceEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,22 +20,23 @@ * 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.abilities.effects.common; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.constants.Duration; import mage.constants.Outcome; -import mage.filter.FilterStackObject; +import mage.filter.FilterObject; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import mage.game.stack.StackAbility; import mage.game.stack.StackObject; /** @@ -44,9 +45,9 @@ import mage.game.stack.StackObject; */ public class CantBeTargetedSourceEffect extends ContinuousRuleModifyingEffectImpl { - private final FilterStackObject filterSource; + private final FilterObject filterSource; - public CantBeTargetedSourceEffect(FilterStackObject filterSource, Duration duration) { + public CantBeTargetedSourceEffect(FilterObject filterSource, Duration duration) { super(duration, Outcome.Benefit); this.filterSource = filterSource; setText(); @@ -66,7 +67,7 @@ public class CantBeTargetedSourceEffect extends ContinuousRuleModifyingEffectImp public boolean apply(Game game, Ability source) { return true; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == EventType.TARGET; @@ -75,8 +76,14 @@ public class CantBeTargetedSourceEffect extends ContinuousRuleModifyingEffectImp @Override public boolean applies(GameEvent event, Ability source, Game game) { if (event.getTargetId().equals(source.getSourceId())) { - StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - if (sourceObject != null && filterSource.match(sourceObject, source.getControllerId(), game)) { + StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); + MageObject sourceObject; + if (stackObject instanceof StackAbility) { + sourceObject = ((StackAbility) stackObject).getSourceObject(game); + } else { + sourceObject = stackObject; + } + if (sourceObject != null && filterSource.match(sourceObject, game)) { return true; } } diff --git a/Mage/src/mage/abilities/effects/common/CantBeTargetedTargetEffect.java b/Mage/src/mage/abilities/effects/common/CantBeTargetedTargetEffect.java index 644b78b6459..387a5e03bfc 100644 --- a/Mage/src/mage/abilities/effects/common/CantBeTargetedTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/CantBeTargetedTargetEffect.java @@ -27,34 +27,43 @@ */ package mage.abilities.effects.common; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.constants.Duration; import mage.constants.Outcome; -import mage.filter.FilterStackObject; +import mage.constants.TargetController; +import mage.filter.FilterObject; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import mage.game.stack.StackAbility; import mage.game.stack.StackObject; /** * * @author LevelX2 */ - public class CantBeTargetedTargetEffect extends ContinuousRuleModifyingEffectImpl { - private final FilterStackObject filterSource; + private final FilterObject filterSource; + private final TargetController targetController; - public CantBeTargetedTargetEffect(FilterStackObject filterSource, Duration duration) { + public CantBeTargetedTargetEffect(FilterObject filterSource, Duration duration) { + this(filterSource, duration, TargetController.ANY); + } + + public CantBeTargetedTargetEffect(FilterObject filterSource, Duration duration, TargetController targetController) { super(duration, Outcome.Benefit, false, false); + this.targetController = targetController; this.filterSource = filterSource; } public CantBeTargetedTargetEffect(final CantBeTargetedTargetEffect effect) { super(effect); this.filterSource = effect.filterSource.copy(); + this.targetController = effect.targetController; } @Override @@ -75,8 +84,18 @@ public class CantBeTargetedTargetEffect extends ContinuousRuleModifyingEffectImp @Override public boolean applies(GameEvent event, Ability source, Game game) { if (getTargetPointer().getTargets(game, source).contains(event.getTargetId())) { - StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - if (sourceObject != null && filterSource.match(sourceObject, source.getControllerId(), game)) { + if (targetController.equals(TargetController.OPPONENT) + && !game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { + return false; + } + StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); + MageObject sourceObject; + if (stackObject instanceof StackAbility) { + sourceObject = ((StackAbility) stackObject).getSourceObject(game); + } else { + sourceObject = stackObject; + } + if (sourceObject != null && filterSource.match(sourceObject, game)) { return true; } } @@ -95,13 +114,13 @@ public class CantBeTargetedTargetEffect extends ContinuousRuleModifyingEffectImp sb.append(" can't be the target of "); sb.append(filterSource.getMessage()); if (!duration.toString().isEmpty()) { - sb.append(" "); + sb.append(" "); if (duration.equals(Duration.EndOfTurn)) { sb.append("this turn"); } else { sb.append(duration.toString()); } - } + } return sb.toString(); } diff --git a/Mage/src/mage/filter/FilterImpl.java b/Mage/src/mage/filter/FilterImpl.java index ecb3f9ee923..7def209d6ef 100644 --- a/Mage/src/mage/filter/FilterImpl.java +++ b/Mage/src/mage/filter/FilterImpl.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.filter; import java.util.ArrayList; @@ -52,7 +51,7 @@ public abstract class FilterImpl implements Filter { this.message = name; } - public FilterImpl(FilterImpl filter) { + public FilterImpl(FilterImpl filter) { this.message = filter.message; this.predicates = new ArrayList<>(filter.predicates); } diff --git a/Mage/src/mage/filter/FilterObject.java b/Mage/src/mage/filter/FilterObject.java index 29402389df3..3fc96e9c6b9 100644 --- a/Mage/src/mage/filter/FilterObject.java +++ b/Mage/src/mage/filter/FilterObject.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.filter; import mage.MageObject; @@ -46,7 +45,7 @@ public class FilterObject extends FilterImpl { super(name); } - public FilterObject(FilterObject filter) { + public FilterObject(FilterObject filter) { super(filter); } } diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index e4c858c6d45..2b0cd6990ca 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -390,6 +390,11 @@ public abstract class GameImpl implements Game, Serializable { object = state.getBattlefield().getPermanent(objectId); return object; } + // can be an ability of a sacrificed Token trying to get it's source object + object = getLastKnownInformation(objectId, Zone.BATTLEFIELD); + if (object != null) { + return object; + } for (CommandObject commandObject : state.getCommand()) { if (commandObject instanceof Commander && commandObject.getId().equals(objectId)) { return commandObject; @@ -402,8 +407,6 @@ public abstract class GameImpl implements Game, Serializable { return commandObject; } } - // can be an ability of a sacrificed Token trying to get it's source object - object = getLastKnownInformation(objectId, Zone.BATTLEFIELD); } return object; } diff --git a/Mage/src/mage/game/stack/StackAbility.java b/Mage/src/mage/game/stack/StackAbility.java index 0ab2eeb7bae..aa8d58de407 100644 --- a/Mage/src/mage/game/stack/StackAbility.java +++ b/Mage/src/mage/game/stack/StackAbility.java @@ -1,41 +1,45 @@ /* -* 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. -*/ - + * 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.game.stack; -import mage.constants.AbilityType; -import mage.constants.CardType; -import mage.constants.EffectType; -import mage.constants.Zone; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.ObjectColor; -import mage.abilities.*; +import mage.abilities.Abilities; +import mage.abilities.AbilitiesImpl; +import mage.abilities.Ability; +import mage.abilities.MageSingleton; +import mage.abilities.Mode; +import mage.abilities.Modes; +import mage.abilities.StateTriggeredAbility; import mage.abilities.costs.AlternativeCost; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; @@ -45,19 +49,19 @@ import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; +import mage.cards.Card; import mage.choices.Choice; import mage.choices.Choices; -import mage.game.Game; -import mage.target.Target; -import mage.target.Targets; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import mage.cards.Card; +import mage.constants.AbilityType; import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.EffectType; +import mage.constants.Zone; +import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; +import mage.target.Target; +import mage.target.Targets; import mage.util.GameLog; import mage.watchers.Watcher; @@ -96,7 +100,7 @@ public class StackAbility extends StackObjImpl implements Ability { public boolean isActivated() { return ability.isActivated(); } - + @Override public boolean resolve(Game game) { if (ability.getTargets().stillLegal(ability, game)) { @@ -110,13 +114,14 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void reset(Game game) { } + public void reset(Game game) { + } @Override public void counter(UUID sourceId, Game game) { //20100716 - 603.8 if (ability instanceof StateTriggeredAbility) { - ((StateTriggeredAbility)ability).counter(game); + ((StateTriggeredAbility) ability).counter(game); } } @@ -127,14 +132,14 @@ public class StackAbility extends StackObjImpl implements Ability { @Override public String getIdName() { - return getName() + " ["+getId().toString().substring(0,3) +"]"; + return getName() + " [" + getId().toString().substring(0, 3) + "]"; } - + @Override public String getLogName() { return GameLog.getColoredObjectIdName(this); } - + @Override public String getImageName() { return name; @@ -221,9 +226,9 @@ public class StackAbility extends StackObjImpl implements Ability { @Override public int getConvertedManaCost() { - // Activated abilities have an "activation cost" but they don't have a characteristic related to that while on the stack. + // Activated abilities have an "activation cost" but they don't have a characteristic related to that while on the stack. // There are certain effects that interact with the cost to activate an ability (e.g., Training Grounds, Power Artifact) - // but nothing that looks for that quality of an ability once it's on the stack. + // but nothing that looks for that quality of an ability once it's on the stack. return 0; } @@ -258,13 +263,16 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void setSourceId(UUID sourceID) {} + public void setSourceId(UUID sourceID) { + } @Override - public void addCost(Cost cost) {} + public void addCost(Cost cost) { + } @Override - public void addEffect(Effect effect) {} + public void addEffect(Effect effect) { + } @Override public boolean activate(Game game, boolean noMana) { @@ -277,7 +285,8 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void addTarget(Target target) {} + public void addTarget(Target target) { + } @Override public UUID getFirstTarget() { @@ -290,7 +299,8 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void addChoice(Choice choice) {} + public void addChoice(Choice choice) { + } @Override public List getAlternativeCosts() { @@ -298,7 +308,8 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void addAlternativeCost(AlternativeCost cost) { } + public void addAlternativeCost(AlternativeCost cost) { + } @Override public ManaCosts getManaCosts() { @@ -306,12 +317,13 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public ManaCosts getManaCostsToPay ( ) { + public ManaCosts getManaCostsToPay() { return ability.getManaCostsToPay(); } @Override - public void addManaCost(ManaCost cost) { } + public void addManaCost(ManaCost cost) { + } @Override public AbilityType getAbilityType() { @@ -329,7 +341,7 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void setName(String name) { + public void setName(String name) { this.name = name; } @@ -344,7 +356,7 @@ public class StackAbility extends StackObjImpl implements Ability { card.adjustChoices(ability, game); } } - + @Override public void adjustCosts(Ability ability, Game game) { Card card = game.getCard(ability.getSourceId()); @@ -367,7 +379,8 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void addOptionalCost(Cost cost) {} + public void addOptionalCost(Cost cost) { + } @Override public boolean checkIfClause(Game game) { @@ -382,7 +395,8 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void newOriginalId() {} + public void newOriginalId() { + } @Override public Ability getStackAbility() { @@ -395,7 +409,8 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void addMode(Mode mode) {} + public void addMode(Mode mode) { + } @Override public Modes getModes() { @@ -455,7 +470,7 @@ public class StackAbility extends StackObjImpl implements Ability { public void setAdditionalCostsRuleVisible(boolean ruleAdditionalCostsVisible) { this.ability.setAdditionalCostsRuleVisible(ruleAdditionalCostsVisible); } - + @Override public UUID getOriginalId() { return this.ability.getOriginalId(); @@ -478,7 +493,7 @@ public class StackAbility extends StackObjImpl implements Ability { @Override public void setCostModificationActive(boolean active) { - throw new UnsupportedOperationException("Not supported. Only neede for flashbacked spells"); + throw new UnsupportedOperationException("Not supported. Only neede for flashbacked spells"); } @Override @@ -500,7 +515,7 @@ public class StackAbility extends StackObjImpl implements Ability { public void addWatcher(Watcher watcher) { throw new UnsupportedOperationException("Not supported."); } - + @Override public List getSubAbilities() { return this.ability.getSubAbilities(); @@ -513,7 +528,7 @@ public class StackAbility extends StackObjImpl implements Ability { @Override public MageObject getSourceObject(Game game) { - throw new UnsupportedOperationException("Not supported."); + return game.getBaseObject(getSourceId()); } @Override @@ -529,7 +544,7 @@ public class StackAbility extends StackObjImpl implements Ability { @Override public void setSourceObject(MageObject sourceObject, Game game) { throw new UnsupportedOperationException("Not supported."); - } + } @Override public int getZoneChangeCounter(Game game) { From 58c0d859be1dba670bb35ff41a3df8ea60a4635b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 13 Aug 2015 12:49:58 +0200 Subject: [PATCH 349/375] * Urge to Feed - Fixed selection of vampires during resolution handling. --- .../src/mage/sets/worldwake/UrgeToFeed.java | 24 ++++++++----------- .../mageobject/NumberOfTargetsPredicate.java | 3 +-- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/Mage.Sets/src/mage/sets/worldwake/UrgeToFeed.java b/Mage.Sets/src/mage/sets/worldwake/UrgeToFeed.java index 63b2dd60258..ad2d8e2ba1b 100644 --- a/Mage.Sets/src/mage/sets/worldwake/UrgeToFeed.java +++ b/Mage.Sets/src/mage/sets/worldwake/UrgeToFeed.java @@ -28,15 +28,14 @@ package mage.sets.worldwake; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.TargetController; import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; @@ -45,6 +44,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; /** @@ -59,7 +59,6 @@ public class UrgeToFeed extends CardImpl { super(ownerId, 70, "Urge to Feed", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{B}{B}"); this.expansionSetCode = "WWK"; - // Target creature gets -3/-3 until end of turn. You may tap any number of untapped Vampire creatures you control. If you do, put a +1/+1 counter on each of those Vampires. this.getSpellAbility().addEffect(new BoostTargetEffect(-3, -3, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); @@ -97,20 +96,17 @@ class UrgeToFeedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - TargetCreaturePermanent target = new TargetCreaturePermanent(filter); - while (true) { - target.clearChosen(); - if (target.canChoose(source.getControllerId(), game) && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), game)) { - UUID vampire = target.getFirstTarget(); + TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); + if (target.canChoose(source.getControllerId(), game) && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), game)) { + for (UUID vampireId : target.getTargets()) { + Permanent vampire = game.getPermanent(vampireId); if (vampire != null) { - game.getPermanent(vampire).tap(game); - game.getPermanent(vampire).addCounters(CounterType.P1P1.createInstance(), game); + vampire.tap(game); + vampire.addCounters(CounterType.P1P1.createInstance(), game); } - } else { - break; } } - return false; + return true; } @Override diff --git a/Mage/src/mage/filter/predicate/mageobject/NumberOfTargetsPredicate.java b/Mage/src/mage/filter/predicate/mageobject/NumberOfTargetsPredicate.java index 787a14d2aca..7284bd1943d 100644 --- a/Mage/src/mage/filter/predicate/mageobject/NumberOfTargetsPredicate.java +++ b/Mage/src/mage/filter/predicate/mageobject/NumberOfTargetsPredicate.java @@ -34,7 +34,6 @@ import mage.filter.predicate.Predicate; import mage.game.Game; import mage.game.stack.Spell; import mage.target.Target; -import mage.target.Targets; /** * @@ -57,7 +56,7 @@ public class NumberOfTargetsPredicate implements Predicate { Mode mode = spell.getSpellAbility().getModes().get(modeId); for (Target target : mode.getTargets()) { numberOfTargets += target.getTargets().size(); - } + } } if (numberOfTargets == targets) { return true; From c1eec95b4cc2bc9df338a0ea31241eba2683776e Mon Sep 17 00:00:00 2001 From: fireshoes Date: Thu, 13 Aug 2015 10:25:40 -0500 Subject: [PATCH 350/375] Implemented Magister of Worth, Crescendo of War, and Dong Zhou, the Tyrant. Added Strife counters to CounterType. --- .../mage/sets/commander/CrescendoOfWar.java | 52 +++++ .../mage/sets/conspiracy/MagisterOfWorth.java | 54 +++++ .../masterseditioniii/DongZhouTheTyrant.java | 52 +++++ .../sets/mediainserts/MagisterOfWorth.java | 196 ++++++++++++++++++ .../DongZhouTheTyrant.java | 114 ++++++++++ .../sets/vintagemasters/CrescendoOfWar.java | 77 +++++++ .../sets/vintagemasters/MagisterOfWorth.java | 54 +++++ Mage/src/mage/counters/CounterType.java | 1 + 8 files changed, 600 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/commander/CrescendoOfWar.java create mode 100644 Mage.Sets/src/mage/sets/conspiracy/MagisterOfWorth.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/DongZhouTheTyrant.java create mode 100644 Mage.Sets/src/mage/sets/mediainserts/MagisterOfWorth.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/DongZhouTheTyrant.java create mode 100644 Mage.Sets/src/mage/sets/vintagemasters/CrescendoOfWar.java create mode 100644 Mage.Sets/src/mage/sets/vintagemasters/MagisterOfWorth.java diff --git a/Mage.Sets/src/mage/sets/commander/CrescendoOfWar.java b/Mage.Sets/src/mage/sets/commander/CrescendoOfWar.java new file mode 100644 index 00000000000..a2799d9dfc0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/CrescendoOfWar.java @@ -0,0 +1,52 @@ +/* + * 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.commander; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class CrescendoOfWar extends mage.sets.vintagemasters.CrescendoOfWar { + + public CrescendoOfWar(UUID ownerId) { + super(ownerId); + this.cardNumber = 12; + this.expansionSetCode = "CMD"; + } + + public CrescendoOfWar(final CrescendoOfWar card) { + super(card); + } + + @Override + public CrescendoOfWar copy() { + return new CrescendoOfWar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/MagisterOfWorth.java b/Mage.Sets/src/mage/sets/conspiracy/MagisterOfWorth.java new file mode 100644 index 00000000000..c9ede50c8d7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conspiracy/MagisterOfWorth.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.conspiracy; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class MagisterOfWorth extends mage.sets.mediainserts.MagisterOfWorth { + + public MagisterOfWorth(UUID ownerId) { + super(ownerId); + this.cardNumber = 48; + this.expansionSetCode = "CNS"; + this.rarity = Rarity.RARE; + } + + public MagisterOfWorth(final MagisterOfWorth card) { + super(card); + } + + @Override + public MagisterOfWorth copy() { + return new MagisterOfWorth(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/DongZhouTheTyrant.java b/Mage.Sets/src/mage/sets/masterseditioniii/DongZhouTheTyrant.java new file mode 100644 index 00000000000..979841a4a14 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/DongZhouTheTyrant.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class DongZhouTheTyrant extends mage.sets.portalthreekingdoms.DongZhouTheTyrant { + + public DongZhouTheTyrant(UUID ownerId) { + super(ownerId); + this.cardNumber = 96; + this.expansionSetCode = "ME3"; + } + + public DongZhouTheTyrant(final DongZhouTheTyrant card) { + super(card); + } + + @Override + public DongZhouTheTyrant copy() { + return new DongZhouTheTyrant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mediainserts/MagisterOfWorth.java b/Mage.Sets/src/mage/sets/mediainserts/MagisterOfWorth.java new file mode 100644 index 00000000000..8730131d3ba --- /dev/null +++ b/Mage.Sets/src/mage/sets/mediainserts/MagisterOfWorth.java @@ -0,0 +1,196 @@ +/* + * 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.mediainserts; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreatureCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class MagisterOfWorth extends CardImpl { + + public MagisterOfWorth(UUID ownerId) { + super(ownerId, 86, "Magister of Worth", Rarity.SPECIAL, new CardType[]{CardType.CREATURE}, "{4}{W}{B}"); + this.expansionSetCode = "MBP"; + this.subtype.add("Angel"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Will of the council - When Magister of Worth enters the battlefield, starting with you, each player votes for grace or condemnation. If grace gets more votes, each player returns each creature card from his or her graveyard to the battlefield. If condemnation gets more votes or the vote is tied, destroy all creatures other than Magister of Worth. + Effect effect = new MagisterOfWorthVoteEffect(); + effect.setText("Will of the council - When Magister of Worth enters the battlefield, starting with you, each player votes for grace or condemnation. If grace gets more votes, each player returns each creature card from his or her graveyard to the battlefield. If condemnation gets more votes or the vote is tied, destroy all creatures other than Magister of Worth"); + this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false, true)); + } + + public MagisterOfWorth(final MagisterOfWorth card) { + super(card); + } + + @Override + public MagisterOfWorth copy() { + return new MagisterOfWorth(this); + } +} + +class MagisterOfWorthVoteEffect extends OneShotEffect { + + MagisterOfWorthVoteEffect() { + super(Outcome.Benefit); + this.staticText = "Will of the council - When {this} enters the battlefield, starting with you, each player votes for grace or condemnation. If grace gets more votes, each player returns each creature card from his or her graveyard to the battlefield. If condemnation gets more votes or the vote is tied, destroy all creatures other than {this}."; + } + + MagisterOfWorthVoteEffect(final MagisterOfWorthVoteEffect effect) { + super(effect); + } + + @Override + public MagisterOfWorthVoteEffect copy() { + return new MagisterOfWorthVoteEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int graceCount = 0; + int condemnationCount = 0; + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + if (player.chooseUse(Outcome.DestroyPermanent, "Choose grace?", source, game)) { + graceCount++; + game.informPlayers(player.getLogName() + " has chosen: grace"); + } + else { + condemnationCount++; + game.informPlayers(player.getLogName() + " has chosen: condemnation"); + } + } + } + if (graceCount > condemnationCount) { + new MagisterOfWorthReturnFromGraveyardEffect().apply(game, source); + } else { + new MagisterOfWorthDestroyEffect().apply(game, source); + } + return true; + } + return false; + } +} + +class MagisterOfWorthDestroyEffect extends OneShotEffect { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creatures other than {this}"); + + static { + filter.add(new AnotherPredicate()); + } + + public MagisterOfWorthDestroyEffect() { + super(Outcome.DestroyPermanent); + staticText = "destroy all creatures other than {this}"; + } + + public MagisterOfWorthDestroyEffect(final MagisterOfWorthDestroyEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { + permanent.destroy(source.getSourceId(), game, false); + } + return true; + } + + @Override + public MagisterOfWorthDestroyEffect copy() { + return new MagisterOfWorthDestroyEffect(this); + } + +} + +class MagisterOfWorthReturnFromGraveyardEffect extends OneShotEffect { + + public MagisterOfWorthReturnFromGraveyardEffect() { + super(Outcome.PutCreatureInPlay); + staticText = "each player returns each creature card from his or her graveyard to the battlefield"; + } + + public MagisterOfWorthReturnFromGraveyardEffect(final MagisterOfWorthReturnFromGraveyardEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + for (UUID playerId: controller.getInRange()) { + Player player = game.getPlayer(playerId); + if (player != null) { + for (Card card :player.getGraveyard().getCards(new FilterCreatureCard(), game)) { + player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId()); + } + } + } + return true; + } + return false; + } + + @Override + public MagisterOfWorthReturnFromGraveyardEffect copy() { + return new MagisterOfWorthReturnFromGraveyardEffect(this); + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/DongZhouTheTyrant.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/DongZhouTheTyrant.java new file mode 100644 index 00000000000..6fc74eb1296 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/DongZhouTheTyrant.java @@ -0,0 +1,114 @@ +/* + * 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.portalthreekingdoms; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class DongZhouTheTyrant extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public DongZhouTheTyrant(UUID ownerId) { + super(ownerId, 109, "Dong Zhou, the Tyrant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{R}"); + this.expansionSetCode = "PTK"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When Dong Zhou, the Tyrant enters the battlefield, target creature an opponent controls deals damage equal to its power to that player. + Ability ability = new EntersBattlefieldTriggeredAbility(new DongZhouTheTyrantEffect(), false); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public DongZhouTheTyrant(final DongZhouTheTyrant card) { + super(card); + } + + @Override + public DongZhouTheTyrant copy() { + return new DongZhouTheTyrant(this); + } +} + +class DongZhouTheTyrantEffect extends OneShotEffect { + + public DongZhouTheTyrantEffect() { + super(Outcome.Damage); + staticText = "target creature an opponent controls deals damage equal to its power to that player"; + } + + public DongZhouTheTyrantEffect(final DongZhouTheTyrantEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanent(source.getFirstTarget()); + if (creature != null) { + int amount = creature.getPower().getValue(); + Player controller = game.getPlayer(creature.getControllerId()); + if (controller != null) { + controller.damage(amount, creature.getId(), game, false, true); + return true; + } + } + return false; + } + + @Override + public DongZhouTheTyrantEffect copy() { + return new DongZhouTheTyrantEffect(this); + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/vintagemasters/CrescendoOfWar.java b/Mage.Sets/src/mage/sets/vintagemasters/CrescendoOfWar.java new file mode 100644 index 00000000000..45773d8f0af --- /dev/null +++ b/Mage.Sets/src/mage/sets/vintagemasters/CrescendoOfWar.java @@ -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.vintagemasters; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.CountersCount; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.common.FilterBlockingCreature; + +/** + * + * @author fireshoes + */ +public class CrescendoOfWar extends CardImpl { + + public CrescendoOfWar(UUID ownerId) { + super(ownerId, 21, "Crescendo of War", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + this.expansionSetCode = "VMA"; + + // At the beginning of each upkeep, put a strife counter on Crescendo of War. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.STRIFE.createInstance(1), true), TargetController.ANY, false)); + + // Attacking creatures get +1/+0 for each strife counter on Crescendo of War. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(new CountersCount(CounterType.STRIFE), new StaticValue(0), + Duration.WhileOnBattlefield, new FilterAttackingCreature(), false))); + + // Blocking creatures you control get +1/+0 for each strife counter on Crescendo of War. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(new CountersCount(CounterType.STRIFE), new StaticValue(0), + Duration.WhileOnBattlefield, new FilterBlockingCreature(), false))); + } + + public CrescendoOfWar(final CrescendoOfWar card) { + super(card); + } + + @Override + public CrescendoOfWar copy() { + return new CrescendoOfWar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/vintagemasters/MagisterOfWorth.java b/Mage.Sets/src/mage/sets/vintagemasters/MagisterOfWorth.java new file mode 100644 index 00000000000..5242c1ab252 --- /dev/null +++ b/Mage.Sets/src/mage/sets/vintagemasters/MagisterOfWorth.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.vintagemasters; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class MagisterOfWorth extends mage.sets.mediainserts.MagisterOfWorth { + + public MagisterOfWorth(UUID ownerId) { + super(ownerId); + this.cardNumber = 255; + this.expansionSetCode = "VMA"; + this.rarity = Rarity.RARE; + } + + public MagisterOfWorth(final MagisterOfWorth card) { + super(card); + } + + @Override + public MagisterOfWorth copy() { + return new MagisterOfWorth(this); + } +} diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java index b41502df694..4ed223d9f26 100644 --- a/Mage/src/mage/counters/CounterType.java +++ b/Mage/src/mage/counters/CounterType.java @@ -80,6 +80,7 @@ public enum CounterType { SLIME("slime"), SPORE("spore"), STORAGE("storage"), + STRIFE("strife"), STUDY("study"), THEFT("theft"), TIME("time"), From a47b0490d485ccd2dc689e77a8cfd2e23dbdcbe7 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Thu, 13 Aug 2015 21:24:13 -0500 Subject: [PATCH 351/375] Implemented 15 cards --- .../mage/sets/alliances/WanderingMage.java | 52 ++++++ .../sets/antiquities/ArgivianBlacksmith.java | 81 +++++++++ .../mage/sets/coldsnap/PhyrexianIronfoot.java | 71 ++++++++ .../src/mage/sets/coldsnap/SwiftManeuver.java | 68 ++++++++ .../sets/fallenempires/BalmOfRestoration.java | 78 +++++++++ .../src/mage/sets/homelands/Headstone.java | 67 +++++++ Mage.Sets/src/mage/sets/homelands/Jinx.java | 68 ++++++++ .../src/mage/sets/legends/KeiTakahashi.java | 54 ++++++ .../src/mage/sets/legions/AvenRedeemer.java | 75 ++++++++ .../mage/sets/lorwyn/TideshaperMystic.java | 73 ++++++++ .../mastersedition/GoblinsOfTheFlarg.java | 52 ++++++ .../sets/masterseditioniii/KeiTakahashi.java | 73 ++++++++ .../sets/masterseditioniii/ManaVortex.java | 163 ++++++++++++++++++ .../sets/masterseditioniii/WanderingMage.java | 140 +++++++++++++++ .../masterseditioniv/ArgivianBlacksmith.java | 54 ++++++ .../src/mage/sets/mirrodin/PearlShard.java | 72 ++++++++ .../src/mage/sets/nemesis/DefenderEnVec.java | 77 +++++++++ .../mage/sets/thedark/GoblinsOfTheFlarg.java | 79 +++++++++ .../src/mage/sets/thedark/ManaVortex.java | 52 ++++++ .../mage/sets/urzassaga/SanctumCustodian.java | 71 ++++++++ 20 files changed, 1520 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/alliances/WanderingMage.java create mode 100644 Mage.Sets/src/mage/sets/antiquities/ArgivianBlacksmith.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/PhyrexianIronfoot.java create mode 100644 Mage.Sets/src/mage/sets/coldsnap/SwiftManeuver.java create mode 100644 Mage.Sets/src/mage/sets/fallenempires/BalmOfRestoration.java create mode 100644 Mage.Sets/src/mage/sets/homelands/Headstone.java create mode 100644 Mage.Sets/src/mage/sets/homelands/Jinx.java create mode 100644 Mage.Sets/src/mage/sets/legends/KeiTakahashi.java create mode 100644 Mage.Sets/src/mage/sets/legions/AvenRedeemer.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/TideshaperMystic.java create mode 100644 Mage.Sets/src/mage/sets/mastersedition/GoblinsOfTheFlarg.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/KeiTakahashi.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/ManaVortex.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniii/WanderingMage.java create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/ArgivianBlacksmith.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/PearlShard.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/DefenderEnVec.java create mode 100644 Mage.Sets/src/mage/sets/thedark/GoblinsOfTheFlarg.java create mode 100644 Mage.Sets/src/mage/sets/thedark/ManaVortex.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/SanctumCustodian.java diff --git a/Mage.Sets/src/mage/sets/alliances/WanderingMage.java b/Mage.Sets/src/mage/sets/alliances/WanderingMage.java new file mode 100644 index 00000000000..20d38dca7c9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/alliances/WanderingMage.java @@ -0,0 +1,52 @@ +/* + * 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.alliances; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class WanderingMage extends mage.sets.masterseditioniii.WanderingMage { + + public WanderingMage(UUID ownerId) { + super(ownerId); + this.cardNumber = 198; + this.expansionSetCode = "ALL"; + } + + public WanderingMage(final WanderingMage card) { + super(card); + } + + @Override + public WanderingMage copy() { + return new WanderingMage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/antiquities/ArgivianBlacksmith.java b/Mage.Sets/src/mage/sets/antiquities/ArgivianBlacksmith.java new file mode 100644 index 00000000000..c789f94e247 --- /dev/null +++ b/Mage.Sets/src/mage/sets/antiquities/ArgivianBlacksmith.java @@ -0,0 +1,81 @@ +/* + * 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.antiquities; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class ArgivianBlacksmith extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("target artifact creature"); + + static { + filter.add(new CardTypePredicate(CardType.ARTIFACT)); + filter.add(new CardTypePredicate(CardType.CREATURE)); + } + + public ArgivianBlacksmith(UUID ownerId) { + super(ownerId, 95, "Argivian Blacksmith", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); + this.expansionSetCode = "ATQ"; + this.subtype.add("Human"); + this.subtype.add("Artificer"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {tap}: Prevent the next 2 damage that would be dealt to target artifact creature this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new TapSourceCost()); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public ArgivianBlacksmith(final ArgivianBlacksmith card) { + super(card); + } + + @Override + public ArgivianBlacksmith copy() { + return new ArgivianBlacksmith(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/PhyrexianIronfoot.java b/Mage.Sets/src/mage/sets/coldsnap/PhyrexianIronfoot.java new file mode 100644 index 00000000000..e647764b4ac --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/PhyrexianIronfoot.java @@ -0,0 +1,71 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; +import mage.abilities.effects.common.UntapSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class PhyrexianIronfoot extends CardImpl { + + public PhyrexianIronfoot(UUID ownerId) { + super(ownerId, 139, "Phyrexian Ironfoot", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + this.expansionSetCode = "CSP"; + this.supertype.add("Snow"); + this.subtype.add("Construct"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Phyrexian Ironfoot doesn't untap during your untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepSourceEffect())); + + // {1}{snow}: Untap Phyrexian Ironfoot. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new ManaCostsImpl("{1}{snow}"))); + } + + public PhyrexianIronfoot(final PhyrexianIronfoot card) { + super(card); + } + + @Override + public PhyrexianIronfoot copy() { + return new PhyrexianIronfoot(this); + } +} diff --git a/Mage.Sets/src/mage/sets/coldsnap/SwiftManeuver.java b/Mage.Sets/src/mage/sets/coldsnap/SwiftManeuver.java new file mode 100644 index 00000000000..a503d425883 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/SwiftManeuver.java @@ -0,0 +1,68 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class SwiftManeuver extends CardImpl { + + public SwiftManeuver(UUID ownerId) { + super(ownerId, 21, "Swift Maneuver", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "CSP"; + + // Prevent the next 2 damage that would be dealt to target creature or player this turn. + this.getSpellAbility().addEffect(new PreventDamageToTargetEffect(Duration.EndOfTurn, 2)); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public SwiftManeuver(final SwiftManeuver card) { + super(card); + } + + @Override + public SwiftManeuver copy() { + return new SwiftManeuver(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fallenempires/BalmOfRestoration.java b/Mage.Sets/src/mage/sets/fallenempires/BalmOfRestoration.java new file mode 100644 index 00000000000..cbb123398ac --- /dev/null +++ b/Mage.Sets/src/mage/sets/fallenempires/BalmOfRestoration.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.fallenempires; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class BalmOfRestoration extends CardImpl { + + public BalmOfRestoration(UUID ownerId) { + super(ownerId, 167, "Balm of Restoration", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "FEM"; + + // {1}, {tap}, Sacrifice Balm of Restoration: Choose one - You gain 2 life; + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(2), new GenericManaCost(1)); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + + // or prevent the next 2 damage that would be dealt to target creature or player this turn. + Mode mode = new Mode(); + mode.getEffects().add(new PreventDamageToTargetEffect(Duration.EndOfTurn, 2)); + mode.getTargets().add(new TargetCreatureOrPlayer()); + ability.addMode(mode); + + this.addAbility(ability); + } + + public BalmOfRestoration(final BalmOfRestoration card) { + super(card); + } + + @Override + public BalmOfRestoration copy() { + return new BalmOfRestoration(this); + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/Headstone.java b/Mage.Sets/src/mage/sets/homelands/Headstone.java new file mode 100644 index 00000000000..789598ae7ac --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/Headstone.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.homelands; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author fireshoes + */ +public class Headstone extends CardImpl { + + public Headstone(UUID ownerId) { + super(ownerId, 15, "Headstone", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "HML"; + + // Exile target card from a graveyard. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addTarget(new TargetCardInGraveyard()); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Headstone(final Headstone card) { + super(card); + } + + @Override + public Headstone copy() { + return new Headstone(this); + } +} diff --git a/Mage.Sets/src/mage/sets/homelands/Jinx.java b/Mage.Sets/src/mage/sets/homelands/Jinx.java new file mode 100644 index 00000000000..7cadd458908 --- /dev/null +++ b/Mage.Sets/src/mage/sets/homelands/Jinx.java @@ -0,0 +1,68 @@ +/* + * 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.homelands; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class Jinx extends CardImpl { + + public Jinx(UUID ownerId) { + super(ownerId, 36, "Jinx", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "HML"; + + // Target land becomes the basic land type of your choice until end of turn. + this.getSpellAbility().addEffect(new BecomesBasicLandTargetEffect(Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetLandPermanent()); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Jinx(final Jinx card) { + super(card); + } + + @Override + public Jinx copy() { + return new Jinx(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/KeiTakahashi.java b/Mage.Sets/src/mage/sets/legends/KeiTakahashi.java new file mode 100644 index 00000000000..ebc26302d2c --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/KeiTakahashi.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.legends; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class KeiTakahashi extends mage.sets.masterseditioniii.KeiTakahashi { + + public KeiTakahashi(UUID ownerId) { + super(ownerId); + this.cardNumber = 278; + this.expansionSetCode = "LEG"; + this.rarity = Rarity.RARE; + } + + public KeiTakahashi(final KeiTakahashi card) { + super(card); + } + + @Override + public KeiTakahashi copy() { + return new KeiTakahashi(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legions/AvenRedeemer.java b/Mage.Sets/src/mage/sets/legions/AvenRedeemer.java new file mode 100644 index 00000000000..e8cfc75f388 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legions/AvenRedeemer.java @@ -0,0 +1,75 @@ +/* + * 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.legions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class AvenRedeemer extends CardImpl { + + public AvenRedeemer(UUID ownerId) { + super(ownerId, 3, "Aven Redeemer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "LGN"; + this.subtype.add("Bird"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {tap}: Prevent the next 2 damage that would be dealt to target creature or player this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public AvenRedeemer(final AvenRedeemer card) { + super(card); + } + + @Override + public AvenRedeemer copy() { + return new AvenRedeemer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/TideshaperMystic.java b/Mage.Sets/src/mage/sets/lorwyn/TideshaperMystic.java new file mode 100644 index 00000000000..38dfda46dfe --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/TideshaperMystic.java @@ -0,0 +1,73 @@ +/* + * 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.lorwyn; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.condition.common.MyTurnCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author fireshoes + */ +public class TideshaperMystic extends CardImpl { + + public TideshaperMystic(UUID ownerId) { + super(ownerId, 93, "Tideshaper Mystic", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{U}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {tap}: Target land becomes the basic land type of your choice until end of turn. Activate this ability only during your turn. + Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, + new BecomesBasicLandTargetEffect(Duration.EndOfTurn), new TapSourceCost(), MyTurnCondition.getInstance()); + ability.addTarget(new TargetLandPermanent()); + this.addAbility(ability); + } + + public TideshaperMystic(final TideshaperMystic card) { + super(card); + } + + @Override + public TideshaperMystic copy() { + return new TideshaperMystic(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/GoblinsOfTheFlarg.java b/Mage.Sets/src/mage/sets/mastersedition/GoblinsOfTheFlarg.java new file mode 100644 index 00000000000..0fa43306c59 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/GoblinsOfTheFlarg.java @@ -0,0 +1,52 @@ +/* + * 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.mastersedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class GoblinsOfTheFlarg extends mage.sets.thedark.GoblinsOfTheFlarg { + + public GoblinsOfTheFlarg(UUID ownerId) { + super(ownerId); + this.cardNumber = 98; + this.expansionSetCode = "MED"; + } + + public GoblinsOfTheFlarg(final GoblinsOfTheFlarg card) { + super(card); + } + + @Override + public GoblinsOfTheFlarg copy() { + return new GoblinsOfTheFlarg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/KeiTakahashi.java b/Mage.Sets/src/mage/sets/masterseditioniii/KeiTakahashi.java new file mode 100644 index 00000000000..a1042182d0e --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/KeiTakahashi.java @@ -0,0 +1,73 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class KeiTakahashi extends CardImpl { + + public KeiTakahashi(UUID ownerId) { + super(ownerId, 155, "Kei Takahashi", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{W}"); + this.expansionSetCode = "ME3"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {tap}: Prevent the next 2 damage that would be dealt to target creature this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public KeiTakahashi(final KeiTakahashi card) { + super(card); + } + + @Override + public KeiTakahashi copy() { + return new KeiTakahashi(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/ManaVortex.java b/Mage.Sets/src/mage/sets/masterseditioniii/ManaVortex.java new file mode 100644 index 00000000000..6cf19b12be0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/ManaVortex.java @@ -0,0 +1,163 @@ +/* + * 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.masterseditioniii; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CastSourceTriggeredAbility; +import mage.abilities.effects.common.SacrificeEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; +import mage.players.Player; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class ManaVortex extends CardImpl { + + public static final FilterLandPermanent filter = new FilterLandPermanent(); + + public ManaVortex(UUID ownerId) { + super(ownerId, 44, "Mana Vortex", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{U}"); + this.expansionSetCode = "ME3"; + + // When you cast Mana Vortex, counter it unless you sacrifice a land. + this.addAbility(new CastSourceTriggeredAbility(new CounterSourceEffect())); + + // At the beginning of each player's upkeep, that player sacrifices a land. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeEffect(new FilterLandPermanent(), 1, "that player"), + TargetController.ANY, false)); + + // When there are no lands on the battlefield, sacrifice Mana Vortex. + this.addAbility(new ManaVortexStateTriggeredAbility()); + } + + public ManaVortex(final ManaVortex card) { + super(card); + } + + @Override + public ManaVortex copy() { + return new ManaVortex(this); + } +} + +class CounterSourceEffect extends OneShotEffect { + + public CounterSourceEffect() { + super(Outcome.Detriment); + } + + public CounterSourceEffect(final CounterSourceEffect effect) { + super(effect); + } + + @Override + public CounterSourceEffect copy() { + return new CounterSourceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + + StackObject spell = null; + for(StackObject objet : game.getStack()){ + if(objet instanceof Spell && objet.getSourceId().equals(source.getSourceId())){ + spell = objet; + } + } + if(spell != null){ + Player controller = game.getPlayer(source.getControllerId()); + if(controller.chooseUse(Outcome.Detriment, "Sacrifice a land to not counter " + spell.getName() + "?", source, game)){ + SacrificeTargetCost cost = new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent())); + if(cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)){ + game.informPlayers(controller.getLogName() + " sacrifices a land to not counter " + spell.getName() + "."); + return true; + } + else { + game.getStack().counter(spell.getId(), source.getSourceId(), game); + } + } + return true; + } + return false; + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + return "counter it unless you sacrifice a land"; + } +} + +class ManaVortexStateTriggeredAbility extends StateTriggeredAbility { + + public ManaVortexStateTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public ManaVortexStateTriggeredAbility(final ManaVortexStateTriggeredAbility ability) { + super(ability); + } + + @Override + public ManaVortexStateTriggeredAbility copy() { + return new ManaVortexStateTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return game.getBattlefield().count(ManaVortex.filter, this.getSourceId(), this.getControllerId(), game) == 0; + } + + @Override + public String getRule() { + return new StringBuilder("When there are no lands on the battlefield, ").append(super.getRule()).toString() ; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/WanderingMage.java b/Mage.Sets/src/mage/sets/masterseditioniii/WanderingMage.java new file mode 100644 index 00000000000..a09c453c49b --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniii/WanderingMage.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.masterseditioniii; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.CostImpl; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.Target; +import mage.target.TargetPlayer; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class WanderingMage extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Cleric or Wizard"); + + static { + filter.add(Predicates.or( + new SubtypePredicate("Cleric"), + new SubtypePredicate("Wizard"))); + } + + public WanderingMage(UUID ownerId) { + super(ownerId, 186, "Wandering Mage", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{W}{U}{B}"); + this.expansionSetCode = "ME3"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.subtype.add("Wizard"); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // {W}, Pay 1 life: Prevent the next 2 damage that would be dealt to target creature this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new ManaCostsImpl("{W}")); + ability.addCost(new PayLifeCost(1)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // {U}: Prevent the next 1 damage that would be dealt to target Cleric or Wizard creature this turn. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 1), new ManaCostsImpl("{U}")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + // {B}, Put a -1/-1 counter on a creature you control: Prevent the next 2 damage that would be dealt to target player this turn. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new ManaCostsImpl("{B}")); + ability.addCost(new WanderingMageCost()); + ability.addTarget(new TargetPlayer()); + Target target = new TargetControlledCreaturePermanent(); + target.setNotTarget(true); + ability.addTarget(target); + this.addAbility(ability); + } + + public WanderingMage(final WanderingMage card) { + super(card); + } + + @Override + public WanderingMage copy() { + return new WanderingMage(this); + } +} + +class WanderingMageCost extends CostImpl { + + public WanderingMageCost() { + this.text = "Put a -1/-1 counter on a creature you control"; + } + + public WanderingMageCost(WanderingMageCost cost) { + super(cost); + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + return true; + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { + Permanent permanent = game.getPermanent(ability.getTargets().get(1).getFirstTarget()); + if (permanent != null) { + permanent.addCounters(CounterType.M1M1.createInstance(), game); + this.paid = true; + } + return paid; + } + + @Override + public WanderingMageCost copy() { + return new WanderingMageCost(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/ArgivianBlacksmith.java b/Mage.Sets/src/mage/sets/masterseditioniv/ArgivianBlacksmith.java new file mode 100644 index 00000000000..39f60c163ab --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/ArgivianBlacksmith.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.masterseditioniv; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class ArgivianBlacksmith extends mage.sets.antiquities.ArgivianBlacksmith { + + public ArgivianBlacksmith(UUID ownerId) { + super(ownerId); + this.cardNumber = 4; + this.expansionSetCode = "ME4"; + this.rarity = Rarity.UNCOMMON; + } + + public ArgivianBlacksmith(final ArgivianBlacksmith card) { + super(card); + } + + @Override + public ArgivianBlacksmith copy() { + return new ArgivianBlacksmith(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/PearlShard.java b/Mage.Sets/src/mage/sets/mirrodin/PearlShard.java new file mode 100644 index 00000000000..de7459c3113 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/PearlShard.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirrodin; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class PearlShard extends CardImpl { + + public PearlShard(UUID ownerId) { + super(ownerId, 225, "Pearl Shard", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "MRD"; + + // {3}, {tap} or {W}, {tap}: Prevent the next 2 damage that would be dealt to target creature or player this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new ManaCostsImpl("{3}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public PearlShard(final PearlShard card) { + super(card); + } + + @java.lang.Override + public PearlShard copy() { + return new PearlShard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/DefenderEnVec.java b/Mage.Sets/src/mage/sets/nemesis/DefenderEnVec.java new file mode 100644 index 00000000000..e6a7c7557f9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/DefenderEnVec.java @@ -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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.abilities.keyword.FadingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class DefenderEnVec extends CardImpl { + + public DefenderEnVec(UUID ownerId) { + super(ownerId, 5, "Defender en-Vec", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Fading 4 + this.addAbility(new FadingAbility(4, this)); + + // Remove a fade counter from Defender en-Vec: Prevent the next 2 damage that would be dealt to target creature or player this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new RemoveCountersSourceCost(CounterType.FADE.createInstance())); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public DefenderEnVec(final DefenderEnVec card) { + super(card); + } + + @Override + public DefenderEnVec copy() { + return new DefenderEnVec(this); + } +} diff --git a/Mage.Sets/src/mage/sets/thedark/GoblinsOfTheFlarg.java b/Mage.Sets/src/mage/sets/thedark/GoblinsOfTheFlarg.java new file mode 100644 index 00000000000..c3d1e28e435 --- /dev/null +++ b/Mage.Sets/src/mage/sets/thedark/GoblinsOfTheFlarg.java @@ -0,0 +1,79 @@ +/* + * 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.thedark; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.keyword.MountainwalkAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class GoblinsOfTheFlarg extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a Dwarf"); + + static { + filter.add(new SubtypePredicate("Dwarf")); + } + + public GoblinsOfTheFlarg(UUID ownerId) { + super(ownerId, 69, "Goblins of the Flarg", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "DRK"; + this.subtype.add("Goblin"); + this.subtype.add("Warrior"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Mountainwalk + this.addAbility(new MountainwalkAbility()); + + // When you control a Dwarf, sacrifice Goblins of the Flarg. + this.addAbility(new ControlsPermanentsControllerTriggeredAbility( + filter, Filter.ComparisonType.GreaterThan, 0, + new SacrificeSourceEffect())); + } + + public GoblinsOfTheFlarg(final GoblinsOfTheFlarg card) { + super(card); + } + + @Override + public GoblinsOfTheFlarg copy() { + return new GoblinsOfTheFlarg(this); + } +} diff --git a/Mage.Sets/src/mage/sets/thedark/ManaVortex.java b/Mage.Sets/src/mage/sets/thedark/ManaVortex.java new file mode 100644 index 00000000000..c14a4934509 --- /dev/null +++ b/Mage.Sets/src/mage/sets/thedark/ManaVortex.java @@ -0,0 +1,52 @@ +/* + * 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.thedark; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class ManaVortex extends mage.sets.masterseditioniii.ManaVortex { + + public ManaVortex(UUID ownerId) { + super(ownerId); + this.cardNumber = 30; + this.expansionSetCode = "DRK"; + } + + public ManaVortex(final ManaVortex card) { + super(card); + } + + @Override + public ManaVortex copy() { + return new ManaVortex(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/SanctumCustodian.java b/Mage.Sets/src/mage/sets/urzassaga/SanctumCustodian.java new file mode 100644 index 00000000000..bdad5a972f7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/SanctumCustodian.java @@ -0,0 +1,71 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class SanctumCustodian extends CardImpl { + + public SanctumCustodian(UUID ownerId) { + super(ownerId, 42, "Sanctum Custodian", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "USG"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // {tap}: Prevent the next 2 damage that would be dealt to target creature or player this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public SanctumCustodian(final SanctumCustodian card) { + super(card); + } + + @Override + public SanctumCustodian copy() { + return new SanctumCustodian(this); + } +} From 472eb287fa4f936ef34e8e39ca8cf4e8d604e45c Mon Sep 17 00:00:00 2001 From: LoneFox Date: Fri, 14 Aug 2015 07:12:23 +0300 Subject: [PATCH 352/375] Implement cards: Flowstone Crusher, Flowstone Shambler, Inspirit, Sage Aven, Sanctum Guardian, and Whip Sergeant --- .../mage/sets/nemesis/FlowstoneCrusher.java | 54 ++++++++++++++ .../sets/ninthedition/FlowstoneCrusher.java | 67 +++++++++++++++++ .../sets/ninthedition/FlowstoneShambler.java | 67 +++++++++++++++++ .../src/mage/sets/ninthedition/Inspirit.java | 52 +++++++++++++ .../src/mage/sets/ninthedition/SageAven.java | 67 +++++++++++++++++ .../sets/ninthedition/SanctumGuardian.java | 72 ++++++++++++++++++ .../mage/sets/ninthedition/WhipSergeant.java | 52 +++++++++++++ .../src/mage/sets/onslaught/Inspirit.java | 66 +++++++++++++++++ .../src/mage/sets/onslaught/SageAven.java | 52 +++++++++++++ .../src/mage/sets/prophecy/WhipSergeant.java | 73 +++++++++++++++++++ .../sets/stronghold/FlowstoneShambler.java | 52 +++++++++++++ .../mage/sets/urzassaga/SanctumGuardian.java | 52 +++++++++++++ 12 files changed, 726 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/nemesis/FlowstoneCrusher.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/FlowstoneCrusher.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/FlowstoneShambler.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/Inspirit.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/SageAven.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/SanctumGuardian.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/WhipSergeant.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/Inspirit.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/SageAven.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/WhipSergeant.java create mode 100644 Mage.Sets/src/mage/sets/stronghold/FlowstoneShambler.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/SanctumGuardian.java diff --git a/Mage.Sets/src/mage/sets/nemesis/FlowstoneCrusher.java b/Mage.Sets/src/mage/sets/nemesis/FlowstoneCrusher.java new file mode 100644 index 00000000000..6c85d1c1a37 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/FlowstoneCrusher.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.nemesis; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class FlowstoneCrusher extends mage.sets.ninthedition.FlowstoneCrusher { + + public FlowstoneCrusher(UUID ownerId) { + super(ownerId); + this.cardNumber = 81; + this.expansionSetCode = "NMS"; + this.rarity = Rarity.COMMON; + } + + public FlowstoneCrusher(final FlowstoneCrusher card) { + super(card); + } + + @Override + public FlowstoneCrusher copy() { + return new FlowstoneCrusher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/FlowstoneCrusher.java b/Mage.Sets/src/mage/sets/ninthedition/FlowstoneCrusher.java new file mode 100644 index 00000000000..d05061444b4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/FlowstoneCrusher.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.ninthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class FlowstoneCrusher extends CardImpl { + + public FlowstoneCrusher(UUID ownerId) { + super(ownerId, 184, "Flowstone Crusher", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + this.expansionSetCode = "9ED"; + this.subtype.add("Beast"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // {R}: Flowstone Crusher gets +1/-1 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BoostSourceEffect(1, -1, Duration.EndOfTurn), new ManaCostsImpl("{R}"))); + } + + public FlowstoneCrusher(final FlowstoneCrusher card) { + super(card); + } + + @Override + public FlowstoneCrusher copy() { + return new FlowstoneCrusher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/FlowstoneShambler.java b/Mage.Sets/src/mage/sets/ninthedition/FlowstoneShambler.java new file mode 100644 index 00000000000..4ec8d5747a6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/FlowstoneShambler.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.ninthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class FlowstoneShambler extends CardImpl { + + public FlowstoneShambler(UUID ownerId) { + super(ownerId, 185, "Flowstone Shambler", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "9ED"; + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {R}: Flowstone Shambler gets +1/-1 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new BoostSourceEffect(1, -1, Duration.EndOfTurn), new ManaCostsImpl("{R}"))); + } + + public FlowstoneShambler(final FlowstoneShambler card) { + super(card); + } + + @Override + public FlowstoneShambler copy() { + return new FlowstoneShambler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/Inspirit.java b/Mage.Sets/src/mage/sets/ninthedition/Inspirit.java new file mode 100644 index 00000000000..12112f59e1d --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/Inspirit.java @@ -0,0 +1,52 @@ +/* + * 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.ninthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class Inspirit extends mage.sets.onslaught.Inspirit { + + public Inspirit(UUID ownerId) { + super(ownerId); + this.cardNumber = 22; + this.expansionSetCode = "9ED"; + } + + public Inspirit(final Inspirit card) { + super(card); + } + + @Override + public Inspirit copy() { + return new Inspirit(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/SageAven.java b/Mage.Sets/src/mage/sets/ninthedition/SageAven.java new file mode 100644 index 00000000000..c7a91f38e44 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/SageAven.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.ninthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.LookLibraryControllerEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class SageAven extends CardImpl { + + public SageAven(UUID ownerId) { + super(ownerId, 95, "Sage Aven", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "9ED"; + this.subtype.add("Bird"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Sage Aven enters the battlefield, look at the top four cards of your library, then put them back in any order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryControllerEffect(4))); + } + + public SageAven(final SageAven card) { + super(card); + } + + @Override + public SageAven copy() { + return new SageAven(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/SanctumGuardian.java b/Mage.Sets/src/mage/sets/ninthedition/SanctumGuardian.java new file mode 100644 index 00000000000..938fc482053 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/SanctumGuardian.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.ninthedition; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.PreventNextDamageFromChosenSourceToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LoneFox + */ +public class SanctumGuardian extends CardImpl { + + public SanctumGuardian(UUID ownerId) { + super(ownerId, 40, "Sanctum Guardian", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); + this.expansionSetCode = "9ED"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // Sacrifice Sanctum Guardian: The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventNextDamageFromChosenSourceToTargetEffect(Duration.EndOfTurn), + new SacrificeSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public SanctumGuardian(final SanctumGuardian card) { + super(card); + } + + @Override + public SanctumGuardian copy() { + return new SanctumGuardian(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/WhipSergeant.java b/Mage.Sets/src/mage/sets/ninthedition/WhipSergeant.java new file mode 100644 index 00000000000..9342c790986 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/WhipSergeant.java @@ -0,0 +1,52 @@ +/* + * 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.ninthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class WhipSergeant extends mage.sets.prophecy.WhipSergeant { + + public WhipSergeant(UUID ownerId) { + super(ownerId); + this.cardNumber = 227; + this.expansionSetCode = "9ED"; + } + + public WhipSergeant(final WhipSergeant card) { + super(card); + } + + @Override + public WhipSergeant copy() { + return new WhipSergeant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/Inspirit.java b/Mage.Sets/src/mage/sets/onslaught/Inspirit.java new file mode 100644 index 00000000000..fd26c17183a --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/Inspirit.java @@ -0,0 +1,66 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class Inspirit extends CardImpl { + + public Inspirit(UUID ownerId) { + super(ownerId, 41, "Inspirit", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); + this.expansionSetCode = "ONS"; + + // Untap target creature. It gets +2/+4 until end of turn. + this.getSpellAbility().addEffect(new UntapTargetEffect()); + Effect effect = new BoostTargetEffect(2, 4, Duration.EndOfTurn); + effect.setText("It gets +2/+4 until end of turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public Inspirit(final Inspirit card) { + super(card); + } + + @Override + public Inspirit copy() { + return new Inspirit(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/SageAven.java b/Mage.Sets/src/mage/sets/onslaught/SageAven.java new file mode 100644 index 00000000000..d1d40e34d7f --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/SageAven.java @@ -0,0 +1,52 @@ +/* + * 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.onslaught; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class SageAven extends mage.sets.ninthedition.SageAven { + + public SageAven(UUID ownerId) { + super(ownerId); + this.cardNumber = 111; + this.expansionSetCode = "ONS"; + } + + public SageAven(final SageAven card) { + super(card); + } + + @Override + public SageAven copy() { + return new SageAven(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/WhipSergeant.java b/Mage.Sets/src/mage/sets/prophecy/WhipSergeant.java new file mode 100644 index 00000000000..60678399313 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/WhipSergeant.java @@ -0,0 +1,73 @@ +/* + * 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.prophecy; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class WhipSergeant extends CardImpl { + + public WhipSergeant(UUID ownerId) { + super(ownerId, 107, "Whip Sergeant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // {R}: Target creature gains haste until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{R}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public WhipSergeant(final WhipSergeant card) { + super(card); + } + + @Override + public WhipSergeant copy() { + return new WhipSergeant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/stronghold/FlowstoneShambler.java b/Mage.Sets/src/mage/sets/stronghold/FlowstoneShambler.java new file mode 100644 index 00000000000..b64a081c058 --- /dev/null +++ b/Mage.Sets/src/mage/sets/stronghold/FlowstoneShambler.java @@ -0,0 +1,52 @@ +/* + * 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.stronghold; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class FlowstoneShambler extends mage.sets.ninthedition.FlowstoneShambler { + + public FlowstoneShambler(UUID ownerId) { + super(ownerId); + this.cardNumber = 86; + this.expansionSetCode = "STH"; + } + + public FlowstoneShambler(final FlowstoneShambler card) { + super(card); + } + + @Override + public FlowstoneShambler copy() { + return new FlowstoneShambler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/SanctumGuardian.java b/Mage.Sets/src/mage/sets/urzassaga/SanctumGuardian.java new file mode 100644 index 00000000000..2b40cfa1a64 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/SanctumGuardian.java @@ -0,0 +1,52 @@ +/* + * 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.urzassaga; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class SanctumGuardian extends mage.sets.ninthedition.SanctumGuardian { + + public SanctumGuardian(UUID ownerId) { + super(ownerId); + this.cardNumber = 43; + this.expansionSetCode = "USG"; + } + + public SanctumGuardian(final SanctumGuardian card) { + super(card); + } + + @Override + public SanctumGuardian copy() { + return new SanctumGuardian(this); + } +} From f71a0c05e6e2051d50e7e797caa7270b8a95c11a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 14 Aug 2015 15:34:16 +0200 Subject: [PATCH 353/375] * Hydromorph Guardian - Used custom predicate instead of custom target. --- .../mage/sets/magic2014/DoorOfDestinies.java | 5 +- .../sets/magicorigins/PyromancersGoggles.java | 2 +- .../mage/sets/timespiral/OpalineSliver.java | 2 +- .../mage/sets/torment/HydromorphGuardian.java | 130 ++++-------------- .../src/mage/sets/urzassaga/Oppression.java | 10 +- .../src/mage/sets/visions/Desertion.java | 7 +- .../common/SpellCastAllTriggeredAbility.java | 4 +- .../SpellCastControllerTriggeredAbility.java | 7 +- .../CantBeCounteredControlledEffect.java | 55 ++++---- .../common/CantBeTargetedAllEffect.java | 20 ++- Mage/src/mage/filter/FilterSpell.java | 59 ++++---- Mage/src/mage/filter/FilterStackObject.java | 16 +-- .../filter/common/FilterSpellOrPermanent.java | 9 +- Mage/src/mage/target/TargetSpell.java | 77 +++++------ 14 files changed, 158 insertions(+), 245 deletions(-) diff --git a/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java b/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java index 5bc3c1c2891..95ef1ee6103 100644 --- a/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java +++ b/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java @@ -155,7 +155,7 @@ class AddCounterAbility extends TriggeredAbilityImpl { filter.add(new ControllerPredicate(TargetController.YOU)); filter.add(new SubtypePredicate(subtype)); Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && filter.match(spell, controllerId, game)) { + if (spell != null && filter.match(spell, getSourceId(), getControllerId(), game)) { return true; } } @@ -169,7 +169,6 @@ class AddCounterAbility extends TriggeredAbilityImpl { } } - class BoostCreatureEffectEffect extends ContinuousEffectImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); @@ -194,7 +193,7 @@ class BoostCreatureEffectEffect extends ContinuousEffectImpl { if (permanent != null) { String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); if (subtype != null) { - for (Permanent perm: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { + for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { if (perm.hasSubtype(subtype)) { int boost = permanent.getCounters().getCount(CounterType.CHARGE); perm.addPower(boost); diff --git a/Mage.Sets/src/mage/sets/magicorigins/PyromancersGoggles.java b/Mage.Sets/src/mage/sets/magicorigins/PyromancersGoggles.java index f9729a180dd..02e4590a04b 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/PyromancersGoggles.java +++ b/Mage.Sets/src/mage/sets/magicorigins/PyromancersGoggles.java @@ -112,7 +112,7 @@ class PyromancersGogglesTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getData().equals(abilityOriginalId)) { Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && filter.match(spell, getControllerId(), game)) { + if (spell != null && filter.match(spell, getSourceId(), getControllerId(), game)) { for (Effect effect : getEffects()) { effect.setTargetPointer(new FixedTarget(event.getTargetId())); } diff --git a/Mage.Sets/src/mage/sets/timespiral/OpalineSliver.java b/Mage.Sets/src/mage/sets/timespiral/OpalineSliver.java index b891c5f5c31..f653af6f14a 100644 --- a/Mage.Sets/src/mage/sets/timespiral/OpalineSliver.java +++ b/Mage.Sets/src/mage/sets/timespiral/OpalineSliver.java @@ -112,7 +112,7 @@ class OpalineSliverTriggeredAbility extends TriggeredAbilityImpl { } else { return event.getTargetId().equals(this.getSourceId()) && game.getOpponents(this.controllerId).contains(event.getPlayerId()) - && spellCard.match(spell, event.getPlayerId(), game); + && spellCard.match(spell, getSourceId(), getControllerId(), game); } } diff --git a/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java index 56366bdd597..261fc1c2e34 100644 --- a/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java +++ b/Mage.Sets/src/mage/sets/torment/HydromorphGuardian.java @@ -27,11 +27,11 @@ */ package mage.sets.torment; -import java.util.HashSet; -import java.util.Set; import java.util.UUID; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.Mode; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ColoredManaCost; @@ -41,14 +41,14 @@ import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.Filter; import mage.filter.FilterSpell; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; -import mage.game.stack.StackObject; import mage.target.Target; -import mage.target.TargetObject; +import mage.target.TargetSpell; /** * @@ -56,7 +56,11 @@ import mage.target.TargetObject; */ public class HydromorphGuardian extends CardImpl { - private static FilterSpell filter = new FilterSpell("spell that targets one or more creatures you control"); + private final static FilterSpell filter = new FilterSpell("spell that targets one or more creatures you control"); + + static { + filter.add(new HydromorphGuardianPredicate()); + } public HydromorphGuardian(UUID ownerId) { super(ownerId, 39, "Hydromorph Guardian", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); @@ -68,7 +72,7 @@ public class HydromorphGuardian extends CardImpl { // {U}, Sacrifice Hydromorph Guardian: Counter target spell that targets one or more creatures you control. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new ColoredManaCost(ColoredManaSymbol.U)); ability.addCost(new SacrificeSourceCost()); - ability.addTarget(new CustomTargetSpell(filter)); + ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); } @@ -80,108 +84,32 @@ public class HydromorphGuardian extends CardImpl { public HydromorphGuardian copy() { return new HydromorphGuardian(this); } - - private class CustomTargetSpell extends TargetObject { +} - protected FilterSpell filter; +class HydromorphGuardianPredicate implements ObjectSourcePlayerPredicate> { - public CustomTargetSpell() { - this(1, 1, new FilterSpell()); - } - - public CustomTargetSpell(FilterSpell filter) { - this(1, 1, filter); - } - - public CustomTargetSpell(int numTargets, FilterSpell filter) { - this(numTargets, numTargets, filter); - } - - public CustomTargetSpell(int minNumTargets, int maxNumTargets, FilterSpell filter) { - this.minNumberOfTargets = minNumTargets; - this.maxNumberOfTargets = maxNumTargets; - this.zone = Zone.STACK; - this.filter = filter; - this.targetName = filter.getMessage(); - } - - public CustomTargetSpell(final CustomTargetSpell target) { - super(target); - this.filter = target.filter.copy(); - } - - @Override - public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { - return canChoose(sourceControllerId, game); - } - - @Override - public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { - return possibleTargets(sourceControllerId, game); - } - - @Override - public boolean canTarget(UUID id, Ability source, Game game) { - if (super.canTarget(id, source, game)) { - if (targetsMyCreature(id, source.getControllerId(), game)) { - return true; - } - } - return false; - } - - @Override - public boolean canChoose(UUID sourceControllerId, Game game) { - int count = 0; - for (StackObject stackObject : game.getStack()) { - if (stackObject instanceof Spell && game.getPlayer(sourceControllerId).getInRange().contains(stackObject.getControllerId()) && filter.match((Spell) stackObject, game)) { - if (targetsMyCreature(stackObject.getId(), sourceControllerId, game)) { - count++; - if (count >= this.minNumberOfTargets) - return true; - } - } - } - return false; - } - - @Override - public Set possibleTargets(UUID sourceControllerId, Game game) { - Set possibleTargets = new HashSet(); - for (StackObject stackObject : game.getStack()) { - if (stackObject instanceof Spell && game.getPlayer(sourceControllerId).getInRange().contains(stackObject.getControllerId()) && filter.match((Spell) stackObject, game)) { - if (targetsMyCreature(stackObject.getId(), sourceControllerId, game)) { - possibleTargets.add(stackObject.getId()); - } - } - } - return possibleTargets; - } - - @Override - public Filter getFilter() { - return filter; - } - - private boolean targetsMyCreature(UUID id, UUID controllerId, Game game) { - StackObject spell = game.getStack().getStackObject(id); - if (spell != null) { - Ability ability = spell.getStackAbility(); - for (Target target : ability.getTargets()) { - for (UUID permanentId : target.getTargets()) { - Permanent permanent = game.getPermanent(permanentId); - if (permanent != null && permanent.getControllerId().equals(controllerId) && permanent.getCardType().contains(CardType.CREATURE)) { + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + Spell spell = game.getStack().getSpell(input.getObject().getId()); + if (spell != null) { + for (UUID modeId : spell.getSpellAbility().getModes().getSelectedModes()) { + Mode mode = spell.getSpellAbility().getModes().get(modeId); + for (Target target : mode.getTargets()) { + for (UUID targetId : target.getTargets()) { + Permanent permanent = game.getPermanent(targetId); + if (permanent.getCardType().contains(CardType.CREATURE) + && permanent.getControllerId().equals(input.getPlayerId())) { return true; } } } } - return false; } + return false; + } - @Override - public CustomTargetSpell copy() { - return new CustomTargetSpell(this); - } + @Override + public String toString() { + return "that targets one or more creatures you control"; } } diff --git a/Mage.Sets/src/mage/sets/urzassaga/Oppression.java b/Mage.Sets/src/mage/sets/urzassaga/Oppression.java index 5c626c2089e..dee4dea7f2b 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/Oppression.java +++ b/Mage.Sets/src/mage/sets/urzassaga/Oppression.java @@ -28,16 +28,11 @@ package mage.sets.urzassaga; import java.util.UUID; - -import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SpellCastAllTriggeredAbility; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.Zone; -import mage.filter.FilterSpell; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; @@ -53,7 +48,6 @@ public class Oppression extends CardImpl { super(ownerId, 143, "Oppression", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}{B}"); this.expansionSetCode = "USG"; - // Whenever a player casts a spell, that player discards a card. this.addAbility(new OppressionTriggeredAbility()); } @@ -82,7 +76,7 @@ class OppressionTriggeredAbility extends SpellCastAllTriggeredAbility { public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.SPELL_CAST) { Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && filter.match(spell, getControllerId(), game)) { + if (spell != null && filter.match(spell, getSourceId(), getControllerId(), game)) { this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); return true; } @@ -94,4 +88,4 @@ class OppressionTriggeredAbility extends SpellCastAllTriggeredAbility { public OppressionTriggeredAbility copy() { return new OppressionTriggeredAbility(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/visions/Desertion.java b/Mage.Sets/src/mage/sets/visions/Desertion.java index 728c4856058..5c2f1b08387 100644 --- a/Mage.Sets/src/mage/sets/visions/Desertion.java +++ b/Mage.Sets/src/mage/sets/visions/Desertion.java @@ -56,7 +56,6 @@ public class Desertion extends CardImpl { super(ownerId, 30, "Desertion", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{U}{U}"); this.expansionSetCode = "VIS"; - // Counter target spell. If an artifact or creature spell is countered this way, put that card onto the battlefield under your control instead of into its owner's graveyard. this.getSpellAbility().addEffect(new DesertionEffect()); this.getSpellAbility().addTarget(new TargetSpell()); @@ -81,7 +80,7 @@ class DesertionEffect extends OneShotEffect { new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE))); } - + public DesertionEffect() { super(Outcome.Detriment); this.staticText = "Counter target spell. If an artifact or creature spell is countered this way, put that card onto the battlefield under your control instead of into its owner's graveyard."; @@ -106,7 +105,7 @@ class DesertionEffect extends OneShotEffect { if (stackObject instanceof Spell) { game.rememberLKI(objectId, Zone.STACK, (Spell) stackObject); game.getStack().remove(stackObject); - if (!((Spell) stackObject).isCopiedSpell() && filter.match(stackObject, source.getControllerId(), game)) { + if (!((Spell) stackObject).isCopiedSpell() && filter.match(stackObject, source.getSourceId(), source.getControllerId(), game)) { MageObject card = game.getObject(stackObject.getSourceId()); if (card instanceof Card) { ((Card) card).putOntoBattlefield(game, Zone.STACK, source.getSourceId(), source.getControllerId()); @@ -120,5 +119,5 @@ class DesertionEffect extends OneShotEffect { } return false; } - + } diff --git a/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java b/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java index 51882dc3bbd..4b552ae9ed0 100644 --- a/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java @@ -86,10 +86,10 @@ public class SpellCastAllTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && filter.match(spell, getControllerId(), game)) { + if (spell != null && filter.match(spell, getSourceId(), getControllerId(), game)) { if (!setTargetPointer.equals(SetTargetPointer.NONE)) { for (Effect effect : this.getEffects()) { - switch(setTargetPointer) { + switch (setTargetPointer) { case SPELL: effect.setTargetPointer(new FixedTarget(spell.getId())); break; diff --git a/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java b/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java index 471bda4c7ec..d576a13690a 100644 --- a/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java @@ -47,7 +47,8 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl { protected String rule; /** - * If true, the source that triggered the ability will be set as target to effect. + * If true, the source that triggered the ability will be set as target to + * effect. */ protected boolean rememberSource = false; @@ -58,7 +59,7 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl { public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional) { this(effect, filter, optional, false); } - + public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional, String rule) { this(effect, filter, optional, false); this.rule = rule; @@ -90,7 +91,7 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getPlayerId().equals(this.getControllerId())) { Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && filter.match(spell, getControllerId(), game)) { + if (spell != null && filter.match(spell, getSourceId(), getControllerId(), game)) { if (rememberSource) { this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId())); } diff --git a/Mage/src/mage/abilities/effects/common/CantBeCounteredControlledEffect.java b/Mage/src/mage/abilities/effects/common/CantBeCounteredControlledEffect.java index 4776c73bf84..1d4de4da42d 100644 --- a/Mage/src/mage/abilities/effects/common/CantBeCounteredControlledEffect.java +++ b/Mage/src/mage/abilities/effects/common/CantBeCounteredControlledEffect.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.effects.common; import mage.MageObject; @@ -89,7 +88,7 @@ public class CantBeCounteredControlledEffect extends ContinuousRuleModifyingEffe public boolean applies(GameEvent event, Ability source, Game game) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getControllerId().equals(source.getControllerId()) - && filterTarget.match(spell, source.getControllerId(), game)) { + && filterTarget.match(spell, source.getSourceId(), source.getControllerId(), game)) { if (filterSource == null) { return true; } else { diff --git a/Mage/src/mage/abilities/effects/common/CantBeTargetedAllEffect.java b/Mage/src/mage/abilities/effects/common/CantBeTargetedAllEffect.java index 8fd76143d28..6e4322ca0cb 100644 --- a/Mage/src/mage/abilities/effects/common/CantBeTargetedAllEffect.java +++ b/Mage/src/mage/abilities/effects/common/CantBeTargetedAllEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.abilities.effects.common; import mage.abilities.Ability; @@ -60,7 +59,6 @@ public class CantBeTargetedAllEffect extends ContinuousRuleModifyingEffectImpl { setText(); } - public CantBeTargetedAllEffect(final CantBeTargetedAllEffect effect) { super(effect); if (effect.filterTarget != null) { @@ -92,10 +90,9 @@ public class CantBeTargetedAllEffect extends ContinuousRuleModifyingEffectImpl { if (permanent != null && filterTarget.match(permanent, source.getSourceId(), source.getControllerId(), game)) { if (filterSource == null) { return true; - } - else { + } else { StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - if (sourceObject != null && filterSource.match(sourceObject, sourceObject.getSourceId(), game)) { + if (sourceObject != null && filterSource.match(sourceObject, source.getSourceId(), sourceObject.getControllerId(), game)) { return true; } } @@ -108,8 +105,7 @@ public class CantBeTargetedAllEffect extends ContinuousRuleModifyingEffectImpl { sb.append(filterTarget.getMessage()).append(" can't be the targets of "); if (filterSource != null) { sb.append(filterSource.getMessage()); - } - else { + } else { sb.append("spells"); } if (!duration.toString().isEmpty()) { diff --git a/Mage/src/mage/filter/FilterSpell.java b/Mage/src/mage/filter/FilterSpell.java index 258f2c9083d..9b6342aed7d 100644 --- a/Mage/src/mage/filter/FilterSpell.java +++ b/Mage/src/mage/filter/FilterSpell.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.filter; import java.util.UUID; @@ -50,13 +49,13 @@ public class FilterSpell extends FilterStackObject { public FilterSpell(final FilterSpell filter) { super(filter); } - + @Override - public boolean match(StackObject stackObject, UUID playerId, Game game) { + public boolean match(StackObject stackObject, UUID sourceId, UUID playerId, Game game) { if (!(stackObject instanceof Spell)) { return false; } - return super.match(stackObject, playerId, game); + return super.match(stackObject, sourceId, playerId, game); } @Override diff --git a/Mage/src/mage/filter/FilterStackObject.java b/Mage/src/mage/filter/FilterStackObject.java index 60a10aa913c..a7c478bd78a 100644 --- a/Mage/src/mage/filter/FilterStackObject.java +++ b/Mage/src/mage/filter/FilterStackObject.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.filter; import java.util.ArrayList; @@ -33,6 +32,7 @@ import java.util.List; import java.util.UUID; import mage.filter.predicate.ObjectPlayer; import mage.filter.predicate.ObjectPlayerPredicate; +import mage.filter.predicate.ObjectSourcePlayer; import mage.filter.predicate.Predicates; import mage.game.Game; import mage.game.permanent.Permanent; @@ -59,12 +59,12 @@ public class FilterStackObject extends FilterObject { this.extraPredicates = new ArrayList<>(filter.extraPredicates); } - public boolean match(StackObject stackObject, UUID playerId, Game game) { + public boolean match(StackObject stackObject, UUID sourceId, UUID playerId, Game game) { if (!this.match(stackObject, game)) { return false; } - return Predicates.and(extraPredicates).apply(new ObjectPlayer(stackObject, playerId), game); + return Predicates.and(extraPredicates).apply(new ObjectSourcePlayer(stackObject, sourceId, playerId), game); } public void add(ObjectPlayerPredicate predicate) { diff --git a/Mage/src/mage/filter/common/FilterSpellOrPermanent.java b/Mage/src/mage/filter/common/FilterSpellOrPermanent.java index 96631bbaaff..a4d3371cf63 100644 --- a/Mage/src/mage/filter/common/FilterSpellOrPermanent.java +++ b/Mage/src/mage/filter/common/FilterSpellOrPermanent.java @@ -1,5 +1,5 @@ /* - * + * * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are @@ -25,10 +25,11 @@ * 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.filter.common; +import java.util.UUID; import mage.filter.FilterImpl; import mage.filter.FilterInPlay; import mage.filter.FilterPermanent; @@ -37,8 +38,6 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; -import java.util.UUID; - /** * * @author LevelX @@ -77,7 +76,7 @@ public class FilterSpellOrPermanent extends FilterImpl implements Filter @Override public boolean match(Object o, UUID sourceId, UUID playerId, Game game) { if (o instanceof Spell) { - return spellFilter.match((Spell) o, playerId, game); + return spellFilter.match((Spell) o, sourceId, playerId, game); } else if (o instanceof Permanent) { return permanentFilter.match((Permanent) o, sourceId, playerId, game); } diff --git a/Mage/src/mage/target/TargetSpell.java b/Mage/src/mage/target/TargetSpell.java index ec8dd9c6435..a070bbc3b7c 100644 --- a/Mage/src/mage/target/TargetSpell.java +++ b/Mage/src/mage/target/TargetSpell.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.target; import java.util.HashSet; @@ -84,7 +83,7 @@ public class TargetSpell extends TargetObject { } Spell spell = game.getStack().getSpell(id); if (spell != null) { - return filter.match(spell, source.getControllerId(), game); + return filter.match(spell, source.getSourceId(), source.getControllerId(), game); } return false; } @@ -92,12 +91,12 @@ public class TargetSpell extends TargetObject { @Override public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { int count = 0; - for (StackObject stackObject: game.getStack()) { + for (StackObject stackObject : game.getStack()) { // rule 114.4. A spell or ability on the stack is an illegal target for itself. if (sourceId != null && sourceId.equals(stackObject.getSourceId())) { continue; } - if (canBeChosen(stackObject, sourceControllerId, game)) { + if (canBeChosen(stackObject, sourceId, sourceControllerId, game)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -114,28 +113,28 @@ public class TargetSpell extends TargetObject { @Override public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { - return possibleTargets(sourceControllerId, game); - } - - @Override - public Set possibleTargets(UUID sourceControllerId, Game game) { Set possibleTargets = new HashSet<>(); - for (StackObject stackObject: game.getStack()) { - if (canBeChosen(stackObject, sourceControllerId, game)) { + for (StackObject stackObject : game.getStack()) { + if (canBeChosen(stackObject, sourceId, sourceControllerId, game)) { possibleTargets.add(stackObject.getId()); } } return possibleTargets; } + @Override + public Set possibleTargets(UUID sourceControllerId, Game game) { + return this.possibleTargets(null, sourceControllerId, game); + } + @Override public TargetSpell copy() { return new TargetSpell(this); } - private boolean canBeChosen(StackObject stackObject, UUID sourceControllerId, Game game) { + private boolean canBeChosen(StackObject stackObject, UUID sourceID, UUID sourceControllerId, Game game) { return stackObject instanceof Spell && game.getPlayer(sourceControllerId).getInRange().contains(stackObject.getControllerId()) - && filter.match((Spell) stackObject, sourceControllerId, game); + && filter.match((Spell) stackObject, sourceID, sourceControllerId, game); } } From bff35a5b1674ead5c898e2a3733f84c96d08053e Mon Sep 17 00:00:00 2001 From: benjamin Date: Sat, 15 Aug 2015 13:15:15 -0400 Subject: [PATCH 354/375] Fixed error where timeshifted cards were not validated. --- .../src/mage/deck/HistoricalStandard.java | 4 ++-- .../Mage.Deck.Constructed/src/mage/deck/SuperStandard.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java index 9fef3463b57..9f15bf867dc 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java @@ -73,9 +73,9 @@ public class HistoricalStandard extends Constructed { // 18th Standard {"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, // 19th Standard - {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"}, + {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, // 20th Standard - {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, + {"10E", "CSP", "TSP", "TSB", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, // 21st Standard {"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"} }; diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java index 4eb4d5c4e8a..de7ff76aae7 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java @@ -49,9 +49,9 @@ public class SuperStandard extends Constructed { // 18th Standard {"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, // 19th Standard - {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"}, + {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"}, // 20th Standard - {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, + {"10E", "CSP", "TSP", "TSB", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"}, // 21st Standard {"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"} }; From 55295d136a389a70452846338edfe2372d6f327c Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sun, 16 Aug 2015 02:16:10 -0500 Subject: [PATCH 355/375] Implmented 38 cards. Fixed subtypes on UrzaTron lands to be "Urza's" and "Mine, Tower, or Power-Plant" instead of "Urza's Mine", etc. Added ChooseLandTypeEffect. Fixed some collector's numbers in Mirage. Added Shred counter type.Added ExileTopCardOfGraveyardCost and ExileTopCreatureCardOfGraveyardCost.Added PhaseOutSourceEffect and PhaseOutTargetEffect --- .../src/mage/sets/coldsnap/MysticMelting.java | 68 ++ .../src/mage/sets/fifthedition/Enervate.java | 52 ++ .../src/mage/sets/fifthedition/MindRavel.java | 66 ++ .../mage/sets/fifthedition/TouchOfDeath.java | 52 ++ .../src/mage/sets/fifthedition/UrzasMine.java | 7 +- .../sets/fifthedition/UrzasPowerPlant.java | 7 +- .../mage/sets/fifthedition/UrzasTower.java | 7 +- .../mage/sets/guildpact/Schismotivate.java | 97 +++ Mage.Sets/src/mage/sets/iceage/Enervate.java | 52 ++ Mage.Sets/src/mage/sets/iceage/MindRavel.java | 52 ++ .../src/mage/sets/iceage/Stonehands.java | 81 ++ .../src/mage/sets/iceage/TouchOfDeath.java | 68 ++ Mage.Sets/src/mage/sets/invasion/DoOrDie.java | 132 +++ .../src/mage/sets/judgment/CabalTrainee.java | 71 ++ Mage.Sets/src/mage/sets/lorwyn/GiantsIre.java | 76 ++ .../mage/sets/lorwyn/SurgeOfThoughtweft.java | 75 ++ .../mage/sets/masterseditionii/Enervate.java | 78 ++ .../sets/masterseditionii/Stonehands.java | 52 ++ .../sets/mercadianmasques/LumberingSatyr.java | 69 ++ .../mage/sets/mirage/CloakOfInvisibility.java | 118 +++ .../src/mage/sets/mirage/CrystalGolem.java | 64 ++ .../src/mage/sets/mirage/FreneticEfreet.java | 106 +++ .../src/mage/sets/mirage/MistDragon.java | 79 ++ .../src/mage/sets/mirage/RealityRipple.java | 72 ++ .../src/mage/sets/mirage/RitualOfSteel.java | 82 ++ Mage.Sets/src/mage/sets/mirage/Shimmer.java | 72 ++ .../src/mage/sets/mirage/TeferisCurse.java | 86 ++ .../src/mage/sets/mirage/VaporousDjinn.java | 109 +++ .../src/mage/sets/mirrodin/GridMonitor.java | 103 +++ .../mage/sets/morningtide/SagesDousing.java | 77 ++ .../morningtide/StreamOfUnconsciousness.java | 77 ++ .../src/mage/sets/prophecy/StealStrength.java | 99 +++ .../src/mage/sets/scourge/PemminsAura.java | 144 ++++ .../src/mage/sets/stronghold/MindGames.java | 76 ++ .../sets/timespiral/GhituFirebreathing.java | 86 ++ .../src/mage/sets/torment/CephalidVandal.java | 105 +++ .../mage/sets/urzaslegacy/AngelsTrumpet.java | 119 +++ .../src/mage/sets/urzassaga/FieryMantle.java | 82 ++ Mage.Sets/src/mage/sets/urzassaga/Sunder.java | 89 ++ .../src/mage/sets/visions/RainbowEfreet.java | 69 ++ .../mage/sets/visions/TeferisHonorGuard.java | 70 ++ .../src/mage/sets/weatherlight/Alms.java | 68 ++ .../mage/sets/weatherlight/BarrowGhoul.java | 65 ++ .../mage/sets/weatherlight/NaturesKiss.java | 52 +- .../src/mage/sets/weatherlight/Necratog.java | 66 ++ .../weatherlight/VodalianIllusionist.java | 72 ++ .../sets/weatherlight/ZombieScavengers.java | 65 ++ .../common/ExileTopCardOfGraveyardCost.java | 63 ++ .../ExileTopCreatureCardOfGraveyardCost.java | 66 ++ .../effects/common/ChooseLandTypeEffect.java | 61 ++ .../effects/common/PhaseOutSourceEffect.java | 44 + .../effects/common/PhaseOutTargetEffect.java | 68 ++ .../continuous/LoseAbilitySourceEffect.java | 108 +-- .../mage/cards/repository/CardRepository.java | 784 +++++++++--------- Mage/src/mage/counters/CounterType.java | 1 + Utils/mtg-cards-data.txt | 38 +- 56 files changed, 4252 insertions(+), 515 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/coldsnap/MysticMelting.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/Enervate.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/MindRavel.java create mode 100644 Mage.Sets/src/mage/sets/fifthedition/TouchOfDeath.java create mode 100644 Mage.Sets/src/mage/sets/guildpact/Schismotivate.java create mode 100644 Mage.Sets/src/mage/sets/iceage/Enervate.java create mode 100644 Mage.Sets/src/mage/sets/iceage/MindRavel.java create mode 100644 Mage.Sets/src/mage/sets/iceage/Stonehands.java create mode 100644 Mage.Sets/src/mage/sets/iceage/TouchOfDeath.java create mode 100644 Mage.Sets/src/mage/sets/invasion/DoOrDie.java create mode 100644 Mage.Sets/src/mage/sets/judgment/CabalTrainee.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/GiantsIre.java create mode 100644 Mage.Sets/src/mage/sets/lorwyn/SurgeOfThoughtweft.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/Enervate.java create mode 100644 Mage.Sets/src/mage/sets/masterseditionii/Stonehands.java create mode 100644 Mage.Sets/src/mage/sets/mercadianmasques/LumberingSatyr.java create mode 100644 Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java create mode 100644 Mage.Sets/src/mage/sets/mirage/CrystalGolem.java create mode 100644 Mage.Sets/src/mage/sets/mirage/FreneticEfreet.java create mode 100644 Mage.Sets/src/mage/sets/mirage/MistDragon.java create mode 100644 Mage.Sets/src/mage/sets/mirage/RealityRipple.java create mode 100644 Mage.Sets/src/mage/sets/mirage/RitualOfSteel.java create mode 100644 Mage.Sets/src/mage/sets/mirage/Shimmer.java create mode 100644 Mage.Sets/src/mage/sets/mirage/TeferisCurse.java create mode 100644 Mage.Sets/src/mage/sets/mirage/VaporousDjinn.java create mode 100644 Mage.Sets/src/mage/sets/mirrodin/GridMonitor.java create mode 100644 Mage.Sets/src/mage/sets/morningtide/SagesDousing.java create mode 100644 Mage.Sets/src/mage/sets/morningtide/StreamOfUnconsciousness.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/StealStrength.java create mode 100644 Mage.Sets/src/mage/sets/scourge/PemminsAura.java create mode 100644 Mage.Sets/src/mage/sets/stronghold/MindGames.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/GhituFirebreathing.java create mode 100644 Mage.Sets/src/mage/sets/torment/CephalidVandal.java create mode 100644 Mage.Sets/src/mage/sets/urzaslegacy/AngelsTrumpet.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/FieryMantle.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/Sunder.java create mode 100644 Mage.Sets/src/mage/sets/visions/RainbowEfreet.java create mode 100644 Mage.Sets/src/mage/sets/visions/TeferisHonorGuard.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/Alms.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/BarrowGhoul.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/Necratog.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/VodalianIllusionist.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/ZombieScavengers.java create mode 100644 Mage/src/mage/abilities/costs/common/ExileTopCardOfGraveyardCost.java create mode 100644 Mage/src/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java create mode 100644 Mage/src/mage/abilities/effects/common/ChooseLandTypeEffect.java create mode 100644 Mage/src/mage/abilities/effects/common/PhaseOutSourceEffect.java create mode 100644 Mage/src/mage/abilities/effects/common/PhaseOutTargetEffect.java diff --git a/Mage.Sets/src/mage/sets/coldsnap/MysticMelting.java b/Mage.Sets/src/mage/sets/coldsnap/MysticMelting.java new file mode 100644 index 00000000000..df32d4ef617 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/MysticMelting.java @@ -0,0 +1,68 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterArtifactOrEnchantmentPermanent; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class MysticMelting extends CardImpl { + + public MysticMelting(UUID ownerId) { + super(ownerId, 114, "Mystic Melting", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{G}"); + this.expansionSetCode = "CSP"; + + // Destroy target artifact or enchantment. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactOrEnchantmentPermanent())); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public MysticMelting(final MysticMelting card) { + super(card); + } + + @Override + public MysticMelting copy() { + return new MysticMelting(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/Enervate.java b/Mage.Sets/src/mage/sets/fifthedition/Enervate.java new file mode 100644 index 00000000000..b89b480d39f --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/Enervate.java @@ -0,0 +1,52 @@ +/* + * 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.fifthedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Enervate extends mage.sets.masterseditionii.Enervate { + + public Enervate(UUID ownerId) { + super(ownerId); + this.cardNumber = 84; + this.expansionSetCode = "5ED"; + } + + public Enervate(final Enervate card) { + super(card); + } + + @Override + public Enervate copy() { + return new Enervate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/MindRavel.java b/Mage.Sets/src/mage/sets/fifthedition/MindRavel.java new file mode 100644 index 00000000000..403a463d34b --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/MindRavel.java @@ -0,0 +1,66 @@ +/* + * 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.fifthedition; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class MindRavel extends CardImpl { + + public MindRavel(UUID ownerId) { + super(ownerId, 38, "Mind Ravel", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{B}"); + this.expansionSetCode = "5ED"; + + // Target player discards a card. + this.getSpellAbility().addEffect(new DiscardTargetEffect(1)); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public MindRavel(final MindRavel card) { + super(card); + } + + @Override + public MindRavel copy() { + return new MindRavel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/TouchOfDeath.java b/Mage.Sets/src/mage/sets/fifthedition/TouchOfDeath.java new file mode 100644 index 00000000000..7b1768d4d94 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthedition/TouchOfDeath.java @@ -0,0 +1,52 @@ +/* + * 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.fifthedition; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class TouchOfDeath extends mage.sets.iceage.TouchOfDeath { + + public TouchOfDeath(UUID ownerId) { + super(ownerId); + this.cardNumber = 62; + this.expansionSetCode = "5ED"; + } + + public TouchOfDeath(final TouchOfDeath card) { + super(card); + } + + @Override + public TouchOfDeath copy() { + return new TouchOfDeath(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthedition/UrzasMine.java b/Mage.Sets/src/mage/sets/fifthedition/UrzasMine.java index b23c2be148a..9d1bb0ab1d5 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/UrzasMine.java +++ b/Mage.Sets/src/mage/sets/fifthedition/UrzasMine.java @@ -28,13 +28,13 @@ package mage.sets.fifthedition; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.Mana; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.UrzaTerrainValue; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; /** * @@ -43,7 +43,8 @@ import mage.cards.CardImpl; public class UrzasMine extends CardImpl { public UrzasMine(UUID ownerId) { super(ownerId, 447, "Urza's Mine", Rarity.COMMON, new CardType[]{CardType.LAND}, ""); - this.subtype.add("Urza's Mine"); + this.subtype.add("Urza's"); + this.subtype.add("Mine"); this.expansionSetCode = "5ED"; // {T}: Add {1} to your mana pool. If you control an Urza's Power-Plant and an Urza's Tower, add {2} to your mana pool instead. diff --git a/Mage.Sets/src/mage/sets/fifthedition/UrzasPowerPlant.java b/Mage.Sets/src/mage/sets/fifthedition/UrzasPowerPlant.java index dfa679c2fd5..4690665b40c 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/UrzasPowerPlant.java +++ b/Mage.Sets/src/mage/sets/fifthedition/UrzasPowerPlant.java @@ -28,13 +28,13 @@ package mage.sets.fifthedition; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.Mana; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.UrzaTerrainValue; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; /** * @@ -43,7 +43,8 @@ import mage.cards.CardImpl; public class UrzasPowerPlant extends CardImpl { public UrzasPowerPlant(UUID ownerId) { super(ownerId, 448, "Urza's Power Plant", Rarity.COMMON, new CardType[]{CardType.LAND}, ""); - this.subtype.add("Urza's Power-Plant"); + this.subtype.add("Urza's"); + this.subtype.add("Power-Plant"); this.expansionSetCode = "5ED"; // {T}: Add {1} to your mana pool. If you control an Urza's Mine and an Urza's Tower, add {2} to your mana pool instead. diff --git a/Mage.Sets/src/mage/sets/fifthedition/UrzasTower.java b/Mage.Sets/src/mage/sets/fifthedition/UrzasTower.java index 0fab9d741cb..1096b1dd5e0 100644 --- a/Mage.Sets/src/mage/sets/fifthedition/UrzasTower.java +++ b/Mage.Sets/src/mage/sets/fifthedition/UrzasTower.java @@ -28,13 +28,13 @@ package mage.sets.fifthedition; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.Mana; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.UrzaTerrainValue; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; /** * @@ -43,7 +43,8 @@ import mage.cards.CardImpl; public class UrzasTower extends CardImpl { public UrzasTower(UUID ownerId) { super(ownerId, 449, "Urza's Tower", Rarity.COMMON, new CardType[]{CardType.LAND}, ""); - this.subtype.add("Urza's Tower"); + this.subtype.add("Urza's"); + this.subtype.add("Tower"); this.expansionSetCode = "5ED"; // {T}: Add {1} to your mana pool. If you control an Urza's Mine and an Urza's Power-Plant, add {3} to your mana pool instead. diff --git a/Mage.Sets/src/mage/sets/guildpact/Schismotivate.java b/Mage.Sets/src/mage/sets/guildpact/Schismotivate.java new file mode 100644 index 00000000000..4a1b7ac9ecb --- /dev/null +++ b/Mage.Sets/src/mage/sets/guildpact/Schismotivate.java @@ -0,0 +1,97 @@ +/* + * 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.guildpact; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Schismotivate extends CardImpl { + + public Schismotivate(UUID ownerId) { + super(ownerId, 129, "Schismotivate", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{U}{R}"); + this.expansionSetCode = "GPT"; + + // Target creature gets +4/+0 until end of turn. Another target creature gets -4/-0 until end of turn. + this.getSpellAbility().addEffect(new SchismotivateEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(2)); + } + + public Schismotivate(final Schismotivate card) { + super(card); + } + + @Override + public Schismotivate copy() { + return new Schismotivate(this); + } +} + +class SchismotivateEffect extends ContinuousEffectImpl { + + public SchismotivateEffect() { + super(Duration.EndOfTurn, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); + this.staticText = "Target creature gets +4/+0 until end of turn. Another target creature gets -4/-0 until end of turn"; + } + + public SchismotivateEffect(final SchismotivateEffect effect) { + super(effect); + } + + @Override + public SchismotivateEffect copy() { + return new SchismotivateEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent != null) { + permanent.addPower(4); + } + permanent = game.getPermanent(source.getTargets().get(0).getTargets().get(1)); + if (permanent != null) { + permanent.addPower(-4); + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/iceage/Enervate.java b/Mage.Sets/src/mage/sets/iceage/Enervate.java new file mode 100644 index 00000000000..fa18468d1e0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/Enervate.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Enervate extends mage.sets.masterseditionii.Enervate { + + public Enervate(UUID ownerId) { + super(ownerId); + this.cardNumber = 67; + this.expansionSetCode = "ICE"; + } + + public Enervate(final Enervate card) { + super(card); + } + + @Override + public Enervate copy() { + return new Enervate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/MindRavel.java b/Mage.Sets/src/mage/sets/iceage/MindRavel.java new file mode 100644 index 00000000000..2495044d096 --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/MindRavel.java @@ -0,0 +1,52 @@ +/* + * 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.iceage; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class MindRavel extends mage.sets.fifthedition.MindRavel { + + public MindRavel(UUID ownerId) { + super(ownerId); + this.cardNumber = 35; + this.expansionSetCode = "ICE"; + } + + public MindRavel(final MindRavel card) { + super(card); + } + + @Override + public MindRavel copy() { + return new MindRavel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/Stonehands.java b/Mage.Sets/src/mage/sets/iceage/Stonehands.java new file mode 100644 index 00000000000..f95b429eb5b --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/Stonehands.java @@ -0,0 +1,81 @@ +/* + * 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.iceage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Stonehands extends CardImpl { + + public Stonehands(UUID ownerId) { + super(ownerId, 219, "Stonehands", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + this.expansionSetCode = "ICE"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +0/+2. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(0,2, Duration.WhileOnBattlefield))); + + // {R}: Enchanted creature gets +1/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.R))); + } + + public Stonehands(final Stonehands card) { + super(card); + } + + @Override + public Stonehands copy() { + return new Stonehands(this); + } +} diff --git a/Mage.Sets/src/mage/sets/iceage/TouchOfDeath.java b/Mage.Sets/src/mage/sets/iceage/TouchOfDeath.java new file mode 100644 index 00000000000..a10fd45d37f --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/TouchOfDeath.java @@ -0,0 +1,68 @@ +/* + * 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.iceage; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class TouchOfDeath extends CardImpl { + + public TouchOfDeath(UUID ownerId) { + super(ownerId, 55, "Touch of Death", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{B}"); + this.expansionSetCode = "ICE"; + + // Touch of Death deals 1 damage to target player. You gain 1 life. + this.getSpellAbility().addEffect(new DamageTargetEffect(1)); + this.getSpellAbility().addTarget(new TargetPlayer()); + this.getSpellAbility().addEffect(new GainLifeEffect(1)); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public TouchOfDeath(final TouchOfDeath card) { + super(card); + } + + @Override + public TouchOfDeath copy() { + return new TouchOfDeath(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/DoOrDie.java b/Mage.Sets/src/mage/sets/invasion/DoOrDie.java new file mode 100644 index 00000000000..20689f03e0e --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/DoOrDie.java @@ -0,0 +1,132 @@ +/* + * 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.invasion; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class DoOrDie extends CardImpl { + + public DoOrDie(UUID ownerId) { + super(ownerId, 102, "Do or Die", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{B}"); + this.expansionSetCode = "INV"; + + // Separate all creatures target player controls into two piles. Destroy all creatures in the pile of that player's choice. They can't be regenerated. + this.getSpellAbility().addEffect(new DoOrDieEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public DoOrDie(final DoOrDie card) { + super(card); + } + + @Override + public DoOrDie copy() { + return new DoOrDie(this); + } +} + +class DoOrDieEffect extends OneShotEffect { + + public DoOrDieEffect() { + super(Outcome.Sacrifice); + this.staticText = "Separate all creatures target player controls into two piles. Destroy all creatures in the pile of that player's choice. They can't be regenerated"; + } + + public DoOrDieEffect(final DoOrDieEffect effect) { + super(effect); + } + + @Override + public DoOrDieEffect copy() { + return new DoOrDieEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Player targetPlayer = game.getPlayer(source.getFirstTarget()); + if (player != null && targetPlayer != null) { + int count = game.getBattlefield().countAll(new FilterCreaturePermanent(), targetPlayer.getId(), game); + TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, count, new FilterCreaturePermanent("creatures to put in the first pile"), true); + List pile1 = new ArrayList<>(); + creatures.setRequired(false); + if (player.choose(Outcome.Neutral, creatures, source.getSourceId(), game)) { + List targets = creatures.getTargets(); + for (UUID targetId : targets) { + Permanent p = game.getPermanent(targetId); + if (p != null) { + pile1.add(p); + } + } + } + List pile2 = new ArrayList<>(); + for (Permanent p: game.getBattlefield().getAllActivePermanents(targetPlayer.getId())) { + if (!pile1.contains(p)) { + pile2.add(p); + } + } + + boolean choice = targetPlayer.choosePile(Outcome.DestroyPermanent, "Choose a pile to destroy.", pile1, pile2, game); + + if (choice) { + destroyPermanents(pile1, game, source); + } else { + destroyPermanents(pile2, game, source); + } + + return true; + } + return false; + } + + private void destroyPermanents(List pile, Game game, Ability source) { + for (Permanent permanent : pile) { + if (permanent != null) { + permanent.destroy(source.getSourceId(), game, true); + } + } + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/CabalTrainee.java b/Mage.Sets/src/mage/sets/judgment/CabalTrainee.java new file mode 100644 index 00000000000..fb0817a70c9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/CabalTrainee.java @@ -0,0 +1,71 @@ +/* + * 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.judgment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CabalTrainee extends CardImpl { + + public CabalTrainee(UUID ownerId) { + super(ownerId, 63, "Cabal Trainee", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}"); + this.expansionSetCode = "JUD"; + this.subtype.add("Human"); + this.subtype.add("Minion"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Sacrifice Cabal Trainee: Target creature gets -2/-0 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-2, 0, Duration.EndOfTurn), new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public CabalTrainee(final CabalTrainee card) { + super(card); + } + + @Override + public CabalTrainee copy() { + return new CabalTrainee(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/GiantsIre.java b/Mage.Sets/src/mage/sets/lorwyn/GiantsIre.java new file mode 100644 index 00000000000..82e62f769a0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/GiantsIre.java @@ -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.lorwyn; + +import java.util.UUID; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class GiantsIre extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Giant"); + + static { + filter.add(new SubtypePredicate("Giant")); + } + + public GiantsIre(UUID ownerId) { + super(ownerId, 170, "Giant's Ire", Rarity.COMMON, new CardType[]{CardType.TRIBAL, CardType.SORCERY}, "{3}{R}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Giant"); + + // Giant's Ire deals 4 damage to target player. + this.getSpellAbility().addEffect(new DamageTargetEffect(4)); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // If you control a Giant, draw a card. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DrawCardSourceControllerEffect(1), + new PermanentsOnTheBattlefieldCondition(filter),"If you control a Giant, draw a card")); + } + + public GiantsIre(final GiantsIre card) { + super(card); + } + + @Override + public GiantsIre copy() { + return new GiantsIre(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/SurgeOfThoughtweft.java b/Mage.Sets/src/mage/sets/lorwyn/SurgeOfThoughtweft.java new file mode 100644 index 00000000000..371828e4318 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/SurgeOfThoughtweft.java @@ -0,0 +1,75 @@ +/* + * 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.lorwyn; + +import java.util.UUID; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class SurgeOfThoughtweft extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Kithkin"); + + static { + filter.add(new SubtypePredicate("Kithkin")); + } + + public SurgeOfThoughtweft(UUID ownerId) { + super(ownerId, 43, "Surge of Thoughtweft", Rarity.COMMON, new CardType[]{CardType.TRIBAL, CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Kithkin"); + + // Creatures you control get +1/+1 until end of turn. + this.getSpellAbility().addEffect(new BoostControlledEffect(1, 1, Duration.EndOfTurn)); + + // If you control a Kithkin, draw a card. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DrawCardSourceControllerEffect(1), + new PermanentsOnTheBattlefieldCondition(filter),"If you control a Kithkin, draw a card")); + } + + public SurgeOfThoughtweft(final SurgeOfThoughtweft card) { + super(card); + } + + @Override + public SurgeOfThoughtweft copy() { + return new SurgeOfThoughtweft(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/Enervate.java b/Mage.Sets/src/mage/sets/masterseditionii/Enervate.java new file mode 100644 index 00000000000..a0cb61ea422 --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/Enervate.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.masterseditionii; + +import java.util.UUID; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class Enervate extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact, creature, or land"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public Enervate(UUID ownerId) { + super(ownerId, 47, "Enervate", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "ME2"; + + // Tap target artifact, creature, or land. + this.getSpellAbility().addEffect(new TapTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + + // Draw a card at the beginning of the next turn's upkeep. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false)); + } + + public Enervate(final Enervate card) { + super(card); + } + + @Override + public Enervate copy() { + return new Enervate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditionii/Stonehands.java b/Mage.Sets/src/mage/sets/masterseditionii/Stonehands.java new file mode 100644 index 00000000000..6e666840ffa --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditionii/Stonehands.java @@ -0,0 +1,52 @@ +/* + * 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.masterseditionii; + +import java.util.UUID; + +/** + * + * @author fireshoes + */ +public class Stonehands extends mage.sets.iceage.Stonehands { + + public Stonehands(UUID ownerId) { + super(ownerId); + this.cardNumber = 151; + this.expansionSetCode = "ME2"; + } + + public Stonehands(final Stonehands card) { + super(card); + } + + @Override + public Stonehands copy() { + return new Stonehands(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/LumberingSatyr.java b/Mage.Sets/src/mage/sets/mercadianmasques/LumberingSatyr.java new file mode 100644 index 00000000000..60bec905e18 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/LumberingSatyr.java @@ -0,0 +1,69 @@ +/* + * 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.mercadianmasques; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.ForestwalkAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class LumberingSatyr extends CardImpl { + + public LumberingSatyr(UUID ownerId) { + super(ownerId, 257, "Lumbering Satyr", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + this.expansionSetCode = "MMQ"; + this.subtype.add("Satyr"); + this.subtype.add("Beast"); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // All creatures have forestwalk. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new GainAbilityAllEffect(new ForestwalkAbility(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()))); + } + + public LumberingSatyr(final LumberingSatyr card) { + super(card); + } + + @Override + public LumberingSatyr copy() { + return new LumberingSatyr(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java b/Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java new file mode 100644 index 00000000000..1e9f7b1c966 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java @@ -0,0 +1,118 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.PhasingAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CloakOfInvisibility extends CardImpl { + + public CloakOfInvisibility(UUID ownerId) { + super(ownerId, 58, "Cloak of Invisibility", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature has phasing and can't be blocked except by Walls. + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(PhasingAbility.getInstance(), AttachmentType.AURA)); + ability.addEffect(new CantBeBlockedByWallsEffect()); + this.addAbility(ability); + } + + public CloakOfInvisibility(final CloakOfInvisibility card) { + super(card); + } + + @Override + public CloakOfInvisibility copy() { + return new CloakOfInvisibility(this); + } +} + +class CantBeBlockedByWallsEffect extends RestrictionEffect { + + public CantBeBlockedByWallsEffect() { + super(Duration.WhileOnBattlefield); + staticText = "Enchanted creature can't be blocked except by Walls"; + } + + public CantBeBlockedByWallsEffect(final CantBeBlockedByWallsEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (enchantment != null && enchantment.getAttachedTo() != null) { + if (permanent.getId().equals(enchantment.getAttachedTo())) { + return true; + } + } + return false; + } + + @Override + public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { + if (!blocker.hasSubtype("Wall")) { + return false; + } + return true; + } + + @Override + public CantBeBlockedByWallsEffect copy() { + return new CantBeBlockedByWallsEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/CrystalGolem.java b/Mage.Sets/src/mage/sets/mirage/CrystalGolem.java new file mode 100644 index 00000000000..4b069186add --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/CrystalGolem.java @@ -0,0 +1,64 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.effects.common.PhaseOutSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author fireshoes + */ +public class CrystalGolem extends CardImpl { + + public CrystalGolem(UUID ownerId) { + super(ownerId, 263, "Crystal Golem", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Golem"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // At the beginning of your end step, Crystal Golem phases out. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new PhaseOutSourceEffect(), TargetController.YOU, false)); + } + + public CrystalGolem(final CrystalGolem card) { + super(card); + } + + @Override + public CrystalGolem copy() { + return new CrystalGolem(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/FreneticEfreet.java b/Mage.Sets/src/mage/sets/mirage/FreneticEfreet.java new file mode 100644 index 00000000000..3cefcde4f4e --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/FreneticEfreet.java @@ -0,0 +1,106 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class FreneticEfreet extends CardImpl { + + public FreneticEfreet(UUID ownerId) { + super(ownerId, 324, "Frenetic Efreet", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}{R}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Efreet"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {0}: Flip a coin. If you win the flip, Frenetic Efreet phases out. If you lose the flip, sacrifice Frenetic Efreet. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new FreneticEfreetEffect(), new GenericManaCost(0))); + } + + public FreneticEfreet(final FreneticEfreet card) { + super(card); + } + + @Override + public FreneticEfreet copy() { + return new FreneticEfreet(this); + } +} + +class FreneticEfreetEffect extends OneShotEffect { + + public FreneticEfreetEffect() { + super(Outcome.Damage); + staticText = "Flip a coin. If you win the flip, Frenetic Efreet phases out. If you lose the flip, sacrifice Frenetic Efreet"; + } + + public FreneticEfreetEffect(FreneticEfreetEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && permanent != null) { + if (controller.flipCoin(game)) { + return permanent.phaseOut(game); + } else { + permanent.sacrifice(source.getSourceId(), game); + return true; + } + } + return false; + } + + @Override + public FreneticEfreetEffect copy() { + return new FreneticEfreetEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/MistDragon.java b/Mage.Sets/src/mage/sets/mirage/MistDragon.java new file mode 100644 index 00000000000..672b23b45e5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/MistDragon.java @@ -0,0 +1,79 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PhaseOutSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.continuous.LoseAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class MistDragon extends CardImpl { + + public MistDragon(UUID ownerId) { + super(ownerId, 79, "Mist Dragon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{U}{U}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Dragon"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // {0}: Mist Dragon gains flying. This effect lasts indefinitely + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield), new GenericManaCost(0))); + + // {0}: Mist Dragon loses flying. This effect lasts indefinitely + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new LoseAbilitySourceEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield), new GenericManaCost(0))); + + // {3}{U}{U}: Mist Dragon phases out. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + new PhaseOutSourceEffect(), new ManaCostsImpl("{3}{U}{U}"))); + } + + public MistDragon(final MistDragon card) { + super(card); + } + + @Override + public MistDragon copy() { + return new MistDragon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/RealityRipple.java b/Mage.Sets/src/mage/sets/mirage/RealityRipple.java new file mode 100644 index 00000000000..1ec6929a7c6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/RealityRipple.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirage; + +import java.util.UUID; +import mage.abilities.effects.common.PhaseOutTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class RealityRipple extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact, creature, or land"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public RealityRipple(UUID ownerId) { + super(ownerId, 87, "Reality Ripple", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "MIR"; + + // Target artifact, creature, or land phases out. + this.getSpellAbility().addEffect(new PhaseOutTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + public RealityRipple(final RealityRipple card) { + super(card); + } + + @Override + public RealityRipple copy() { + return new RealityRipple(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/RitualOfSteel.java b/Mage.Sets/src/mage/sets/mirage/RitualOfSteel.java new file mode 100644 index 00000000000..b3e56b3a3e9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/RitualOfSteel.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class RitualOfSteel extends CardImpl { + + public RitualOfSteel(UUID ownerId) { + super(ownerId, 240, "Ritual of Steel", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Ritual of Steel enters the battlefield, draw a card at the beginning of the next turn's upkeep. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false))); + + // Enchanted creature gets +0/+2. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(0,2, Duration.WhileOnBattlefield))); + } + + public RitualOfSteel(final RitualOfSteel card) { + super(card); + } + + @Override + public RitualOfSteel copy() { + return new RitualOfSteel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/Shimmer.java b/Mage.Sets/src/mage/sets/mirage/Shimmer.java new file mode 100644 index 00000000000..0f17fa2768d --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/Shimmer.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirage; + +import java.util.UUID; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.ChooseLandTypeEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.PhasingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; + +/** + * + * @author fireshoes + */ +public class Shimmer extends CardImpl { + + public Shimmer(UUID ownerId) { + super(ownerId, 92, "Shimmer", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); + this.expansionSetCode = "MIR"; + + // As Shimmer enters the battlefield, choose a land type. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseLandTypeEffect(Outcome.Detriment))); + + // Each land of the chosen type has phasing. + FilterLandPermanent filter = new FilterLandPermanent("Each land of the chosen type"); + filter.add(new ChosenSubtypePredicate(this.getId())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(PhasingAbility.getInstance(), Duration.WhileOnBattlefield, filter, false))); + } + + public Shimmer(final Shimmer card) { + super(card); + } + + @Override + public Shimmer copy() { + return new Shimmer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/TeferisCurse.java b/Mage.Sets/src/mage/sets/mirage/TeferisCurse.java new file mode 100644 index 00000000000..340d1172f01 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/TeferisCurse.java @@ -0,0 +1,86 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.PhasingAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class TeferisCurse extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact or creature"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.ARTIFACT))); + } + + public TeferisCurse(UUID ownerId) { + super(ownerId, 96, "Teferi's Curse", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Aura"); + + // Enchant artifact or creature + TargetPermanent auraTarget = new TargetPermanent(filter); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted permanent has phasing. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(PhasingAbility.getInstance(), AttachmentType.AURA))); + } + + public TeferisCurse(final TeferisCurse card) { + super(card); + } + + @Override + public TeferisCurse copy() { + return new TeferisCurse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/VaporousDjinn.java b/Mage.Sets/src/mage/sets/mirage/VaporousDjinn.java new file mode 100644 index 00000000000..5d264035798 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/VaporousDjinn.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.mirage; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class VaporousDjinn extends CardImpl { + + public VaporousDjinn(UUID ownerId) { + super(ownerId, 101, "Vaporous Djinn", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + this.expansionSetCode = "MIR"; + this.subtype.add("Djinn"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // At the beginning of your upkeep, Vaporous Djinn phases out unless you pay {U}{U}. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new VaporousDjinnEffect(), TargetController.YOU, false)); + } + + public VaporousDjinn(final VaporousDjinn card) { + super(card); + } + + @Override + public VaporousDjinn copy() { + return new VaporousDjinn(this); + } +} + +class VaporousDjinnEffect extends OneShotEffect { + + public VaporousDjinnEffect() { + super(Outcome.Damage); + this.staticText = "{this} phases out unless you pay {U}{U}"; + } + + public VaporousDjinnEffect(final VaporousDjinnEffect effect) { + super(effect); + } + + @Override + public VaporousDjinnEffect copy() { + return new VaporousDjinnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cost cost = new ManaCostsImpl("{U}{U}"); + String message = "Would you like to pay {U}{U} to prevent {this} from phasing out?"; + if (!(controller.chooseUse(Outcome.Benefit, message, source, game) + && cost.pay(source, game, source.getSourceId(), controller.getId(), false))) { + permanent.phaseOut(game); + } + return true; + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/sets/mirrodin/GridMonitor.java b/Mage.Sets/src/mage/sets/mirrodin/GridMonitor.java new file mode 100644 index 00000000000..7ef1888e8c9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/GridMonitor.java @@ -0,0 +1,103 @@ +/* + * 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.mirrodin; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class GridMonitor extends CardImpl { + + public GridMonitor(UUID ownerId) { + super(ownerId, 183, "Grid Monitor", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + this.expansionSetCode = "MRD"; + this.subtype.add("Construct"); + this.power = new MageInt(4); + this.toughness = new MageInt(6); + + // You can't cast creature spells. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GridMonitorEffect())); + } + + public GridMonitor(final GridMonitor card) { + super(card); + } + + @java.lang.Override + public GridMonitor copy() { + return new GridMonitor(this); + } +} + +class GridMonitorEffect extends ContinuousRuleModifyingEffectImpl { + + public GridMonitorEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "You can't cast creature spells"; + } + + public GridMonitorEffect(final GridMonitorEffect effect) { + super(effect); + } + + @java.lang.Override + public GridMonitorEffect copy() { + return new GridMonitorEffect(this); + } + + @java.lang.Override + public boolean apply(Game game, Ability source) { + return true; + } + + @java.lang.Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.CAST_SPELL && event.getPlayerId().equals(source.getControllerId())) { + MageObject object = game.getObject(event.getSourceId()); + if (object.getCardType().contains(CardType.CREATURE)) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/morningtide/SagesDousing.java b/Mage.Sets/src/mage/sets/morningtide/SagesDousing.java new file mode 100644 index 00000000000..d6c235a11ff --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/SagesDousing.java @@ -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.morningtide; + +import java.util.UUID; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class SagesDousing extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Wizard"); + + static { + filter.add(new SubtypePredicate("Wizard")); + } + + public SagesDousing(UUID ownerId) { + super(ownerId, 48, "Sage's Dousing", Rarity.UNCOMMON, new CardType[]{CardType.TRIBAL, CardType.INSTANT}, "{2}{U}"); + this.expansionSetCode = "MOR"; + this.subtype.add("Wizard"); + + // Counter target spell unless its controller pays {3}. + this.getSpellAbility().addTarget(new TargetSpell()); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new GenericManaCost(3))); + + // If you control a Wizard, draw a card. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DrawCardSourceControllerEffect(1), + new PermanentsOnTheBattlefieldCondition(filter),"If you control a Wizard, draw a card")); + } + + public SagesDousing(final SagesDousing card) { + super(card); + } + + @Override + public SagesDousing copy() { + return new SagesDousing(this); + } +} diff --git a/Mage.Sets/src/mage/sets/morningtide/StreamOfUnconsciousness.java b/Mage.Sets/src/mage/sets/morningtide/StreamOfUnconsciousness.java new file mode 100644 index 00000000000..dceb753b77e --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/StreamOfUnconsciousness.java @@ -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.morningtide; + +import java.util.UUID; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class StreamOfUnconsciousness extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Wizard"); + + static { + filter.add(new SubtypePredicate("Wizard")); + } + + public StreamOfUnconsciousness(UUID ownerId) { + super(ownerId, 52, "Stream of Unconsciousness", Rarity.COMMON, new CardType[]{CardType.TRIBAL, CardType.INSTANT}, "{U}"); + this.expansionSetCode = "MOR"; + this.subtype.add("Wizard"); + + // Target creature gets -4/-0 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(-4, 0, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // If you control a Wizard, draw a card. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DrawCardSourceControllerEffect(1), + new PermanentsOnTheBattlefieldCondition(filter),"If you control a Wizard, draw a card")); + } + + public StreamOfUnconsciousness(final StreamOfUnconsciousness card) { + super(card); + } + + @Override + public StreamOfUnconsciousness copy() { + return new StreamOfUnconsciousness(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/StealStrength.java b/Mage.Sets/src/mage/sets/prophecy/StealStrength.java new file mode 100644 index 00000000000..c0dc42b53d9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/StealStrength.java @@ -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.prophecy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class StealStrength extends CardImpl { + + public StealStrength(UUID ownerId) { + super(ownerId, 79, "Steal Strength", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{B}"); + this.expansionSetCode = "PCY"; + + // Target creature gets +1/+1 until end of turn. Another target creature gets -1/-1 until end of turn. + this.getSpellAbility().addEffect(new StealStrengthEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(2)); + } + + public StealStrength(final StealStrength card) { + super(card); + } + + @Override + public StealStrength copy() { + return new StealStrength(this); + } +} + +class StealStrengthEffect extends ContinuousEffectImpl { + + public StealStrengthEffect() { + super(Duration.EndOfTurn, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); + this.staticText = "Target creature gets +1/+1 until end of turn. Another target creature gets -1/-1 until end of turn"; + } + + public StealStrengthEffect(final StealStrengthEffect effect) { + super(effect); + } + + @Override + public StealStrengthEffect copy() { + return new StealStrengthEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent != null) { + permanent.addPower(1); + permanent.addToughness(1); + } + permanent = game.getPermanent(source.getTargets().get(0).getTargets().get(1)); + if (permanent != null) { + permanent.addPower(-1); + permanent.addToughness(-1); + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/scourge/PemminsAura.java b/Mage.Sets/src/mage/sets/scourge/PemminsAura.java new file mode 100644 index 00000000000..82fb31f25e7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scourge/PemminsAura.java @@ -0,0 +1,144 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.scourge; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.UntapEnchantedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.choices.Choice; +import mage.choices.ChoiceImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class PemminsAura extends CardImpl { + + public PemminsAura(UUID ownerId) { + super(ownerId, 45, "Pemmin's Aura", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{U}"); + this.expansionSetCode = "SCG"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // {U}: Untap enchanted creature. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapEnchantedEffect(), new ManaCostsImpl("{U}"))); + + // {U}: Enchanted creature gains flying until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), + AttachmentType.AURA, Duration.EndOfTurn), new ManaCostsImpl("{U}"))); + + // {U}: Enchanted creature gains shroud until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ShroudAbility.getInstance(), + AttachmentType.AURA, Duration.EndOfTurn), new ManaCostsImpl("{U}"))); + + // {1}: Enchanted creature gets +1/-1 or -1/+1 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PemminsAuraBoostEnchantedEffect(), new ManaCostsImpl("U"))); + } + + public PemminsAura(final PemminsAura card) { + super(card); + } + + @Override + public PemminsAura copy() { + return new PemminsAura(this); + } +} + +class PemminsAuraBoostEnchantedEffect extends OneShotEffect { + + private static String CHOICE_1 = "+1/-1"; + private static String CHOICE_2 = "-1/+1"; + + public PemminsAuraBoostEnchantedEffect() { + super(Outcome.BoostCreature); + this.staticText = "Enchanted creature gets +1/-1 or -1/+1 until end of turn"; + } + + public PemminsAuraBoostEnchantedEffect(final PemminsAuraBoostEnchantedEffect effect) { + super(effect); + } + + @Override + public PemminsAuraBoostEnchantedEffect copy() { + return new PemminsAuraBoostEnchantedEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent enchantment = game.getPermanent(source.getSourceId()); + Permanent creature = game.getPermanent(enchantment.getAttachedTo()); + if (controller != null && creature != null) { + Choice choice = new ChoiceImpl(true); + choice.setMessage("Select how to boost"); + choice.getChoices().add(CHOICE_1); + choice.getChoices().add(CHOICE_2); + while (!choice.isChosen()) { + if (!controller.canRespond()) { + return false; + } + controller.choose(outcome, choice, game); + } + if (choice.getChoice().equals(CHOICE_1)) { + game.addEffect(new BoostEnchantedEffect(+1, -1, Duration.EndOfTurn), source); + } else { + game.addEffect(new BoostEnchantedEffect(-1, +1, Duration.EndOfTurn), source); + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/stronghold/MindGames.java b/Mage.Sets/src/mage/sets/stronghold/MindGames.java new file mode 100644 index 00000000000..4c8062a91ee --- /dev/null +++ b/Mage.Sets/src/mage/sets/stronghold/MindGames.java @@ -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.stronghold; + +import java.util.UUID; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.keyword.BuybackAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author fireshoes + */ +public class MindGames extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact, creature, or land"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public MindGames(UUID ownerId) { + super(ownerId, 38, "Mind Games", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{U}"); + this.expansionSetCode = "STH"; + + // Buyback {2}{U} + this.addAbility(new BuybackAbility("{3}")); + + // Tap target artifact, creature, or land. + this.getSpellAbility().addEffect(new TapTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + public MindGames(final MindGames card) { + super(card); + } + + @Override + public MindGames copy() { + return new MindGames(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/GhituFirebreathing.java b/Mage.Sets/src/mage/sets/timespiral/GhituFirebreathing.java new file mode 100644 index 00000000000..e8203ac9728 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/GhituFirebreathing.java @@ -0,0 +1,86 @@ +/* + * 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.timespiral; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class GhituFirebreathing extends CardImpl { + + public GhituFirebreathing(UUID ownerId) { + super(ownerId, 158, "Ghitu Firebreathing", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Aura"); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // {R}: Enchanted creature gets +1/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.R))); + + // {R}: Return Ghitu Firebreathing to its owner's hand. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(), new ManaCostsImpl("{R}"))); + } + + public GhituFirebreathing(final GhituFirebreathing card) { + super(card); + } + + @Override + public GhituFirebreathing copy() { + return new GhituFirebreathing(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/CephalidVandal.java b/Mage.Sets/src/mage/sets/torment/CephalidVandal.java new file mode 100644 index 00000000000..6aa724c6288 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/CephalidVandal.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.torment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class CephalidVandal extends CardImpl { + + public CephalidVandal(UUID ownerId) { + super(ownerId, 31, "Cephalid Vandal", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Cephalid"); + this.subtype.add("Rogue"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // At the beginning of your upkeep, put a shred counter on Cephalid Vandal. Then put the top card of your library into your graveyard for each shred counter on Cephalid Vandal. + Effect effect = new CephalidVandalEffect(); + Ability ability = new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.SHRED.createInstance(), false), TargetController.YOU, false); + ability.addEffect(effect); + this.addAbility(ability); + } + + public CephalidVandal(final CephalidVandal card) { + super(card); + } + + @Override + public CephalidVandal copy() { + return new CephalidVandal(this); + } +} + +class CephalidVandalEffect extends OneShotEffect { + + public CephalidVandalEffect() { + super(Outcome.Neutral); + staticText = "Then put the top card of your library into your graveyard for each shred counter on {this}"; + } + + public CephalidVandalEffect(final CephalidVandalEffect effect) { + super(effect); + } + + @Override + public CephalidVandalEffect copy() { + return new CephalidVandalEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null && controller != null) { + int amount = permanent.getCounters().getCount(CounterType.SHRED); + controller.moveCards(controller.getLibrary().getTopCards(game, amount), Zone.LIBRARY, Zone.GRAVEYARD, source, game); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/urzaslegacy/AngelsTrumpet.java b/Mage.Sets/src/mage/sets/urzaslegacy/AngelsTrumpet.java new file mode 100644 index 00000000000..0ae0bd87bcd --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzaslegacy/AngelsTrumpet.java @@ -0,0 +1,119 @@ +/* + * 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.urzaslegacy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.watchers.common.AttackedThisTurnWatcher; + +/** + * + * @author fireshoes + */ +public class AngelsTrumpet extends CardImpl { + + public AngelsTrumpet(UUID ownerId) { + super(ownerId, 121, "Angel's Trumpet", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "ULG"; + + // All creatures have vigilance. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()))); + + // At the beginning of each player's end step, tap all untapped creatures that player controls that didn't attack this turn. Angel's Trumpet deals damage to the player equal to the number of creatures tapped this way. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new AngelsTrumpetTapEffect(), TargetController.ANY, false), new AttackedThisTurnWatcher()); + } + + public AngelsTrumpet(final AngelsTrumpet card) { + super(card); + } + + @Override + public AngelsTrumpet copy() { + return new AngelsTrumpet(this); + } +} + +class AngelsTrumpetTapEffect extends OneShotEffect { + + AngelsTrumpetTapEffect() { + super(Outcome.Tap); + this.staticText = "tap all untapped creatures that player controls that didn't attack this turn. Angel's Trumpet deals damage to the player equal to the number of creatures tapped this way"; + } + + AngelsTrumpetTapEffect(final AngelsTrumpetTapEffect effect) { + super(effect); + } + + @Override + public AngelsTrumpetTapEffect copy() { + return new AngelsTrumpetTapEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(game.getActivePlayerId()); + int count = 0; + if (player != null) { + for (Permanent creature : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), player.getId(), game)) { + // Untapped creatures are safe. + if (creature.isTapped()) { + continue; + } + // Creatures that attacked are safe. + AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get("AttackedThisTurn"); + if (watcher != null && watcher.getAttackedThisTurnCreatures().contains(creature.getId())) { + continue; + } + // Tap the rest. + creature.tap(game); + count++; + } + if (count > 0) { + player.damage(count, source.getSourceId(), game, false, true); + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/urzassaga/FieryMantle.java b/Mage.Sets/src/mage/sets/urzassaga/FieryMantle.java new file mode 100644 index 00000000000..483bbd2fa38 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/FieryMantle.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.urzassaga; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ColoredManaCost; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class FieryMantle extends CardImpl { + + public FieryMantle(UUID ownerId) { + super(ownerId, 186, "Fiery Mantle", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "USG"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // {R}: Enchanted creature gets +1/+0 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.R))); + + // When Fiery Mantle is put into a graveyard from the battlefield, return Fiery Mantle to its owner's hand. + this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect())); + } + + public FieryMantle(final FieryMantle card) { + super(card); + } + + @Override + public FieryMantle copy() { + return new FieryMantle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/Sunder.java b/Mage.Sets/src/mage/sets/urzassaga/Sunder.java new file mode 100644 index 00000000000..ee8ff761003 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/Sunder.java @@ -0,0 +1,89 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author fireshoes + */ +public class Sunder extends CardImpl { + + public Sunder(UUID ownerId) { + super(ownerId, 101, "Sunder", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{U}"); + this.expansionSetCode = "USG"; + + // Return all lands to their owners' hands. + this.getSpellAbility().addEffect(new SunderEffect()); + } + + public Sunder(final Sunder card) { + super(card); + } + + @Override + public Sunder copy() { + return new Sunder(this); + } +} + +class SunderEffect extends OneShotEffect { + + public SunderEffect() { + super(Outcome.ReturnToHand); + staticText = "Return all lands to their owners' hands"; + } + + public SunderEffect(final SunderEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent land : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), source.getSourceId(), game)) { + land.moveToZone(Zone.HAND, source.getSourceId(), game, true); + } + return true; + } + + @Override + public SunderEffect copy() { + return new SunderEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/visions/RainbowEfreet.java b/Mage.Sets/src/mage/sets/visions/RainbowEfreet.java new file mode 100644 index 00000000000..654cb7b4e1a --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/RainbowEfreet.java @@ -0,0 +1,69 @@ +/* + * 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.visions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PhaseOutSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class RainbowEfreet extends CardImpl { + + public RainbowEfreet(UUID ownerId) { + super(ownerId, 41, "Rainbow Efreet", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "VIS"; + this.subtype.add("Efreet"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {U}{U}: Rainbow Efreet phases out. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PhaseOutSourceEffect(), new ManaCostsImpl("{U}{U}"))); + } + + public RainbowEfreet(final RainbowEfreet card) { + super(card); + } + + @Override + public RainbowEfreet copy() { + return new RainbowEfreet(this); + } +} diff --git a/Mage.Sets/src/mage/sets/visions/TeferisHonorGuard.java b/Mage.Sets/src/mage/sets/visions/TeferisHonorGuard.java new file mode 100644 index 00000000000..8b8d79bf05d --- /dev/null +++ b/Mage.Sets/src/mage/sets/visions/TeferisHonorGuard.java @@ -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.visions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PhaseOutSourceEffect; +import mage.abilities.keyword.FlankingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class TeferisHonorGuard extends CardImpl { + + public TeferisHonorGuard(UUID ownerId) { + super(ownerId, 122, "Teferi's Honor Guard", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "VIS"; + this.subtype.add("Human"); + this.subtype.add("Knight"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flanking + this.addAbility(new FlankingAbility()); + + // {U}{U}: Teferi's Honor Guard phases out. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PhaseOutSourceEffect(), new ManaCostsImpl("{U}{U}"))); + } + + public TeferisHonorGuard(final TeferisHonorGuard card) { + super(card); + } + + @Override + public TeferisHonorGuard copy() { + return new TeferisHonorGuard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/Alms.java b/Mage.Sets/src/mage/sets/weatherlight/Alms.java new file mode 100644 index 00000000000..d9f4aaf5416 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/Alms.java @@ -0,0 +1,68 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileTopCardOfGraveyardCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Alms extends CardImpl { + + public Alms(UUID ownerId) { + super(ownerId, 119, "Alms", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + this.expansionSetCode = "WTH"; + + // {1}, Exile the top card of your graveyard: Prevent the next 1 damage that would be dealt to target creature this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageToTargetEffect(Duration.EndOfTurn, 1), new GenericManaCost(1)); + ability.addCost(new ExileTopCardOfGraveyardCost(1)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public Alms(final Alms card) { + super(card); + } + + @Override + public Alms copy() { + return new Alms(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/BarrowGhoul.java b/Mage.Sets/src/mage/sets/weatherlight/BarrowGhoul.java new file mode 100644 index 00000000000..24451a04e2a --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/BarrowGhoul.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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.costs.common.ExileTopCreatureCardOfGraveyardCost; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author fireshoes + */ +public class BarrowGhoul extends CardImpl { + + public BarrowGhoul(UUID ownerId) { + super(ownerId, 3, "Barrow Ghoul", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Zombie"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // At the beginning of your upkeep, sacrifice Barrow Ghoul unless you exile the top creature card of your graveyard. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ExileTopCreatureCardOfGraveyardCost(1)), TargetController.YOU, false)); + } + + public BarrowGhoul(final BarrowGhoul card) { + super(card); + } + + @Override + public BarrowGhoul copy() { + return new BarrowGhoul(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java b/Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java index c0f1bbeec55..abf514ddc89 100644 --- a/Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java +++ b/Mage.Sets/src/mage/sets/weatherlight/NaturesKiss.java @@ -30,20 +30,17 @@ package mage.sets.weatherlight; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.CostImpl; +import mage.abilities.costs.common.ExileTopCardOfGraveyardCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -66,7 +63,7 @@ public class NaturesKiss extends CardImpl { // {1}, Exile the top card of your graveyard: Enchanted creature gets +1/+1 until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{1}")); - ability.addCost(new ExileFromTopOfGraveyardCost(1)); + ability.addCost(new ExileTopCardOfGraveyardCost(1)); this.addAbility(ability); } @@ -79,48 +76,3 @@ public class NaturesKiss extends CardImpl { return new NaturesKiss(this); } } - -class ExileFromTopOfGraveyardCost extends CostImpl { - - private final int amount; - - public ExileFromTopOfGraveyardCost(int amount) { - this.amount = amount; - this.text = "Exile the top card of your graveyard"; - } - - public ExileFromTopOfGraveyardCost(ExileFromTopOfGraveyardCost cost) { - super(cost); - this.amount = cost.amount; - } - - @Override - public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { - Player controller = game.getPlayer(controllerId); - if(controller == null) { - return false; - } - return controller.getGraveyard().size() >= amount; - } - - @Override - public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - Player controller = game.getPlayer(controllerId); - if(controller != null) { - Card topCard = null; - for (Card card :controller.getGraveyard().getCards(game)) { - topCard = card; - } - if (topCard != null) { - controller.moveCardToExileWithInfo(topCard, null, "", ability.getSourceId(), game, Zone.GRAVEYARD, true); - paid = true; - } - } - return paid; - } - - @Override - public ExileFromTopOfGraveyardCost copy() { - return new ExileFromTopOfGraveyardCost(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/weatherlight/Necratog.java b/Mage.Sets/src/mage/sets/weatherlight/Necratog.java new file mode 100644 index 00000000000..24dbc5189d4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/Necratog.java @@ -0,0 +1,66 @@ +/* + * 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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileTopCreatureCardOfGraveyardCost; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class Necratog extends CardImpl { + + public Necratog(UUID ownerId) { + super(ownerId, 18, "Necratog", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Atog"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Exile the top creature card of your graveyard: Necratog gets +2/+2 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2, 2, Duration.EndOfTurn), new ExileTopCreatureCardOfGraveyardCost(1))); + } + + public Necratog(final Necratog card) { + super(card); + } + + @Override + public Necratog copy() { + return new Necratog(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/weatherlight/VodalianIllusionist.java b/Mage.Sets/src/mage/sets/weatherlight/VodalianIllusionist.java new file mode 100644 index 00000000000..8684a6b2bdf --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/VodalianIllusionist.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PhaseOutTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class VodalianIllusionist extends CardImpl { + + public VodalianIllusionist(UUID ownerId) { + super(ownerId, 58, "Vodalian Illusionist", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {U}{U}, {tap}: Target creature phases out. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PhaseOutTargetEffect(), new ManaCostsImpl("{U}{U}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public VodalianIllusionist(final VodalianIllusionist card) { + super(card); + } + + @Override + public VodalianIllusionist copy() { + return new VodalianIllusionist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/ZombieScavengers.java b/Mage.Sets/src/mage/sets/weatherlight/ZombieScavengers.java new file mode 100644 index 00000000000..126280485b5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/ZombieScavengers.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.weatherlight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileTopCreatureCardOfGraveyardCost; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ZombieScavengers extends CardImpl { + + public ZombieScavengers(UUID ownerId) { + super(ownerId, 29, "Zombie Scavengers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "WTH"; + this.subtype.add("Zombie"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Exile the top creature card of your graveyard: Regenerate Zombie Scavengers. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ExileTopCreatureCardOfGraveyardCost(1))); + } + + public ZombieScavengers(final ZombieScavengers card) { + super(card); + } + + @Override + public ZombieScavengers copy() { + return new ZombieScavengers(this); + } +} diff --git a/Mage/src/mage/abilities/costs/common/ExileTopCardOfGraveyardCost.java b/Mage/src/mage/abilities/costs/common/ExileTopCardOfGraveyardCost.java new file mode 100644 index 00000000000..997753dc722 --- /dev/null +++ b/Mage/src/mage/abilities/costs/common/ExileTopCardOfGraveyardCost.java @@ -0,0 +1,63 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.costs.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.CostImpl; +import mage.cards.Card; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class ExileTopCardOfGraveyardCost extends CostImpl { + + private final int amount; + + public ExileTopCardOfGraveyardCost(int amount) { + this.amount = amount; + this.text = "Exile the top card of your graveyard"; + } + + public ExileTopCardOfGraveyardCost(ExileTopCardOfGraveyardCost cost) { + super(cost); + this.amount = cost.amount; + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + Player controller = game.getPlayer(controllerId); + if(controller == null) { + return false; + } + return controller.getGraveyard().size() >= amount; + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { + Player controller = game.getPlayer(controllerId); + if(controller != null) { + Card topCard = null; + for (Card card :controller.getGraveyard().getCards(game)) { + topCard = card; + } + if (topCard != null) { + controller.moveCardToExileWithInfo(topCard, null, "", ability.getSourceId(), game, Zone.GRAVEYARD, true); + paid = true; + } + } + return paid; + } + + @Override + public ExileTopCardOfGraveyardCost copy() { + return new ExileTopCardOfGraveyardCost(this); + } +} \ No newline at end of file diff --git a/Mage/src/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java b/Mage/src/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java new file mode 100644 index 00000000000..00f0b18eef0 --- /dev/null +++ b/Mage/src/mage/abilities/costs/common/ExileTopCreatureCardOfGraveyardCost.java @@ -0,0 +1,66 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.costs.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.CostImpl; +import mage.cards.Card; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class ExileTopCreatureCardOfGraveyardCost extends CostImpl { + + private final int amount; + + public ExileTopCreatureCardOfGraveyardCost(int amount) { + this.amount = amount; + this.text = "Exile the top creature card of your graveyard"; + } + + public ExileTopCreatureCardOfGraveyardCost(ExileTopCreatureCardOfGraveyardCost cost) { + super(cost); + this.amount = cost.amount; + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + Player controller = game.getPlayer(controllerId); + if(controller == null) { + return false; + } + return controller.getGraveyard().size() >= amount; + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { + Player controller = game.getPlayer(controllerId); + if(controller != null) { + Card topCard = null; + for (Card card :controller.getGraveyard().getCards(game)) { + if (card.getCardType().contains(CardType.CREATURE)) { + topCard = card; + } + } + if (topCard != null) { + controller.moveCardToExileWithInfo(topCard, null, "", ability.getSourceId(), game, Zone.GRAVEYARD, true); + paid = true; + } + } + return paid; + } + + @Override + public ExileTopCreatureCardOfGraveyardCost copy() { + return new ExileTopCreatureCardOfGraveyardCost(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/ChooseLandTypeEffect.java b/Mage/src/mage/abilities/effects/common/ChooseLandTypeEffect.java new file mode 100644 index 00000000000..0480effa493 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/ChooseLandTypeEffect.java @@ -0,0 +1,61 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.repository.CardRepository; +import mage.choices.Choice; +import mage.choices.ChoiceImpl; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author fireshoes + */ +public class ChooseLandTypeEffect extends OneShotEffect { + + public ChooseLandTypeEffect(Outcome outcome) { + super(outcome); + staticText = "choose a land type"; + } + + public ChooseLandTypeEffect(final ChooseLandTypeEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (controller != null && permanent != null) { + Choice typeChoice = new ChoiceImpl(true); + typeChoice.setMessage("Choose land type"); + typeChoice.setChoices(CardRepository.instance.getLandTypes()); + while (!controller.choose(outcome, typeChoice, game)) { + if (!controller.canRespond()) { + return false; + } + } + if (!game.isSimulation()) { + game.informPlayers(permanent.getName() + ": " + controller.getLogName() + " has chosen " + typeChoice.getChoice()); + } + game.getState().setValue(permanent.getId() + "_type", typeChoice.getChoice()); + permanent.addInfo("chosen type", CardUtil.addToolTipMarkTags("Chosen type: " + typeChoice.getChoice()), game); + } + return false; + } + + @Override + public ChooseLandTypeEffect copy() { + return new ChooseLandTypeEffect(this); + } + +} diff --git a/Mage/src/mage/abilities/effects/common/PhaseOutSourceEffect.java b/Mage/src/mage/abilities/effects/common/PhaseOutSourceEffect.java new file mode 100644 index 00000000000..1df8ff9ff37 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/PhaseOutSourceEffect.java @@ -0,0 +1,44 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.effects.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author fireshoes + */ +public class PhaseOutSourceEffect extends OneShotEffect { + + public PhaseOutSourceEffect() { + super(Outcome.Detriment); + this.staticText = "{this} phases out"; + } + + public PhaseOutSourceEffect(final PhaseOutSourceEffect effect) { + super(effect); + } + + @Override + public PhaseOutSourceEffect copy() { + return new PhaseOutSourceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject sourceObject = source.getSourceObjectIfItStillExists(game); + if (sourceObject instanceof Permanent) { + Permanent permanent = (Permanent) sourceObject; + return permanent.phaseOut(game); + } + return false; + } +} diff --git a/Mage/src/mage/abilities/effects/common/PhaseOutTargetEffect.java b/Mage/src/mage/abilities/effects/common/PhaseOutTargetEffect.java new file mode 100644 index 00000000000..68383139cf9 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/PhaseOutTargetEffect.java @@ -0,0 +1,68 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.effects.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.Target; +import mage.util.CardUtil; + +/** + * + * @author fireshoes + */ +public class PhaseOutTargetEffect extends OneShotEffect { + + public PhaseOutTargetEffect() { + super(Outcome.Detriment); + } + + public PhaseOutTargetEffect(final PhaseOutTargetEffect effect) { + super(effect); + } + + @Override + public PhaseOutTargetEffect copy() { + return new PhaseOutTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (UUID target : targetPointer.getTargets(game, source)) { + Permanent permanent = game.getPermanent(target); + if (permanent != null) { + permanent.phaseOut(game); + } + } + return true; + } + + @Override + public String getText(Mode mode) { + if (staticText.length() > 0) { + return staticText + " phases out"; + } + + Target target = mode.getTargets().get(0); + if (target.getMaxNumberOfTargets() > 1) { + if (target.getMaxNumberOfTargets() == target.getNumberOfTargets()) { + return CardUtil.numberToText(target.getNumberOfTargets()) + " target " + target.getTargetName() + "s phase out"; + } else { + return "up to " + CardUtil.numberToText(target.getMaxNumberOfTargets()) + " target " + target.getTargetName() + "s phase out"; + } + } else if (target.getMaxNumberOfTargets() == 0){ + return "X target " + mode.getTargets().get(0).getTargetName() + " phase out"; + } else { + return "target " + mode.getTargets().get(0).getTargetName() + " phase out"; + } + } + +} \ No newline at end of file diff --git a/Mage/src/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java b/Mage/src/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java index fcfafd3dca0..2c898399a06 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java @@ -1,54 +1,54 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package mage.abilities.effects.common.continuous; - -import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; -import mage.game.Game; -import mage.game.permanent.Permanent; -/** - * - * @author Noahsark - */ -public class LoseAbilitySourceEffect extends ContinuousEffectImpl{ - - protected Ability ability; - - public LoseAbilitySourceEffect(Ability ability){ - this(ability, Duration.WhileOnBattlefield); - } - - public LoseAbilitySourceEffect(Ability ability, Duration duration){ - super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.LoseAbility); - this.ability = ability; - staticText = "{this} loses \"" + ability.getRule() + "\"" + duration.toString(); - } - - public LoseAbilitySourceEffect(final LoseAbilitySourceEffect effect){ - super(effect); - this.ability = effect.ability.copy(); - } - - @Override - public LoseAbilitySourceEffect copy(){ - return new LoseAbilitySourceEffect(this); - } - - @Override - public boolean apply(Game game, Ability source){ - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null){ - // 112.10 - while (permanent.getAbilities().remove(ability)) { - - } - } - return true; - } -} +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.effects.common.continuous; + +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.game.Game; +import mage.game.permanent.Permanent; +/** + * + * @author Noahsark + */ +public class LoseAbilitySourceEffect extends ContinuousEffectImpl{ + + protected Ability ability; + + public LoseAbilitySourceEffect(Ability ability){ + this(ability, Duration.WhileOnBattlefield); + } + + public LoseAbilitySourceEffect(Ability ability, Duration duration){ + super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.LoseAbility); + this.ability = ability; + staticText = "{this} loses " + ability.getRule() + duration.toString(); + } + + public LoseAbilitySourceEffect(final LoseAbilitySourceEffect effect){ + super(effect); + this.ability = effect.ability.copy(); + } + + @Override + public LoseAbilitySourceEffect copy(){ + return new LoseAbilitySourceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source){ + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null){ + // 112.10 + while (permanent.getAbilities().remove(ability)) { + + } + } + return true; + } +} diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index 13c6e972164..96b798397b0 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -1,383 +1,401 @@ -/* - * 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.cards.repository; - -import com.j256.ormlite.dao.Dao; -import com.j256.ormlite.dao.DaoManager; -import com.j256.ormlite.jdbc.JdbcConnectionSource; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.SelectArg; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.table.TableUtils; -import java.io.File; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.Callable; -import mage.constants.CardType; -import mage.constants.SetType; -import org.apache.log4j.Logger; - -/** - * - * @author North - */ -public enum CardRepository { - - instance; - - private static final String JDBC_URL = "jdbc:h2:file:./db/cards.h2;AUTO_SERVER=TRUE"; - private static final String VERSION_ENTITY_NAME = "card"; - // raise this if db structure was changed - private static final long CARD_DB_VERSION = 41; - // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 32; - - private final Random random = new Random(); - private Dao cardDao; - private Set classNames; - - private CardRepository() { - File file = new File("db"); - if (!file.exists()) { - file.mkdirs(); - } - try { - ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL); - boolean obsolete = RepositoryUtil.isDatabaseObsolete(connectionSource, VERSION_ENTITY_NAME, CARD_DB_VERSION); - - if (obsolete) { - TableUtils.dropTable(connectionSource, CardInfo.class, true); - } - - TableUtils.createTableIfNotExists(connectionSource, CardInfo.class); - cardDao = DaoManager.createDao(connectionSource, CardInfo.class); - } catch (SQLException ex) { - ex.printStackTrace(); - } - } - - public void addCards(final List cards) { - try { - cardDao.callBatchTasks(new Callable() { - @Override - public Object call() throws Exception { - try { - for (CardInfo card : cards) { - cardDao.create(card); - if (classNames != null) { - classNames.add(card.getClassName()); - } - } - } catch (SQLException ex) { - Logger.getLogger(CardRepository.class).error("Error adding cards to DB: " + ex.getCause()); - } - return null; - } - }); - } catch (Exception ex) { - } - } - - public boolean cardExists(String className) { - try { - if (classNames == null) { - QueryBuilder qb = cardDao.queryBuilder(); - qb.distinct().selectColumns("className").where().isNotNull("className"); - List results = cardDao.query(qb.prepare()); - classNames = new TreeSet<>(); - for (CardInfo card : results) { - classNames.add(card.getClassName()); - } - } - return classNames.contains(className); - } catch (SQLException ex) { - } - return false; - } - - public Set getNames() { - Set names = new TreeSet<>(); - try { - QueryBuilder qb = cardDao.queryBuilder(); - qb.distinct().selectColumns("name"); - List results = cardDao.query(qb.prepare()); - for (CardInfo card : results) { - int result = card.getName().indexOf(" // "); - if (result > 0) { - names.add(card.getName().substring(0, result)); - names.add(card.getName().substring(result + 4)); - } else { - names.add(card.getName()); - } - } - } catch (SQLException ex) { - } - return names; - } - - public Set getNonLandNames() { - Set names = new TreeSet<>(); - try { - QueryBuilder qb = cardDao.queryBuilder(); - qb.distinct().selectColumns("name"); - qb.where().not().like("types", new SelectArg('%' + CardType.LAND.name() + '%')); - List results = cardDao.query(qb.prepare()); - for (CardInfo card : results) { - int result = card.getName().indexOf(" // "); - if (result > 0) { - names.add(card.getName().substring(0, result)); - names.add(card.getName().substring(result + 4)); - } else { - names.add(card.getName()); - } - } - } catch (SQLException ex) { - } - return names; - } - - public Set getCreatureNames() { - Set names = new TreeSet<>(); - try { - QueryBuilder qb = cardDao.queryBuilder(); - qb.distinct().selectColumns("name"); - qb.where().like("types", new SelectArg('%' + CardType.CREATURE.name() + '%')); - List results = cardDao.query(qb.prepare()); - for (CardInfo card : results) { - int result = card.getName().indexOf(" // "); - if (result > 0) { - names.add(card.getName().substring(0, result)); - names.add(card.getName().substring(result + 4)); - } else { - names.add(card.getName()); - } - } - } catch (SQLException ex) { - } - return names; - } - - public Set getNonLandAndNonCreatureNames() { - Set names = new TreeSet<>(); - try { - QueryBuilder qb = cardDao.queryBuilder(); - qb.distinct().selectColumns("name"); - Where where = qb.where(); - where.and(where.not().like("types", '%' + CardType.CREATURE.name() + '%'), where.not().like("types", '%' + CardType.LAND.name() + '%')); - List results = cardDao.query(qb.prepare()); - for (CardInfo card : results) { - int result = card.getName().indexOf(" // "); - if (result > 0) { - names.add(card.getName().substring(0, result)); - names.add(card.getName().substring(result + 4)); - } else { - names.add(card.getName()); - } - } - } catch (SQLException ex) { - } - return names; - } - - public Set getCreatureTypes() { - TreeSet subtypes = new TreeSet<>(); - try { - QueryBuilder qb = cardDao.queryBuilder(); - qb.distinct().selectColumns("subtypes"); - qb.where().like("types", new SelectArg('%' + CardType.CREATURE.name() + '%')); - List results = cardDao.query(qb.prepare()); - for (CardInfo card : results) { - subtypes.addAll(card.getSubTypes()); - } - // Removing Forest because of Dryad Arbor - subtypes.remove("Forest"); - // Some creature types are not directly included in card types and are added here manually - subtypes.add("Blinkmoth"); - subtypes.add("Camarid"); - subtypes.add("Caribou"); - subtypes.add("Citizen"); - subtypes.add("Coward"); - subtypes.add("Deserter"); - subtypes.add("Germ"); - subtypes.add("Graveborn"); - subtypes.add("Orb"); - subtypes.add("Pentavite"); - subtypes.add("Pincher"); - subtypes.add("Prism"); - subtypes.add("Reflection"); - subtypes.add("Sand"); - subtypes.add("Saproling"); - subtypes.add("Serf"); - subtypes.add("Splinter"); - subtypes.add("Survivor"); - subtypes.add("Tetravite"); - subtypes.add("Triskelavite"); - - } catch (SQLException ex) { - } - return subtypes; - } - - public CardInfo findCard(String setCode, int cardNumber) { - try { - QueryBuilder queryBuilder = cardDao.queryBuilder(); - queryBuilder.where().eq("setCode", new SelectArg(setCode)).and().eq("cardNumber", cardNumber).and().eq("nightCard", false); - List result = cardDao.query(queryBuilder.prepare()); - if (!result.isEmpty()) { - return result.get(0); - } - } catch (SQLException ex) { - } - return null; - } - - public List getClassNames() { - List names = new ArrayList<>(); - try { - List results = cardDao.queryForAll(); - for (CardInfo card : results) { - names.add(card.getClassName()); - } - } catch (SQLException ex) { - } - return names; - } - - public List getMissingCards(List classNames) { - try { - QueryBuilder queryBuilder = cardDao.queryBuilder(); - queryBuilder.where().not().in("className", classNames); - - return cardDao.query(queryBuilder.prepare()); - } catch (SQLException ex) { - } - return new ArrayList<>(); - } - - /** - * - * @param name - * @return random card with the provided name or null if none is found - */ - public CardInfo findCard(String name) { - List cards = findCards(name); - if (!cards.isEmpty()) { - return cards.get(random.nextInt(cards.size())); - } - return null; - } - - public CardInfo findPreferedCoreExpansionCard(String name) { - List cards = findCards(name); - if (!cards.isEmpty()) { - Date lastReleaseDate = new GregorianCalendar(1900, 1, 1).getTime(); - Date lastExpansionDate = new GregorianCalendar(1900, 1, 1).getTime(); - CardInfo cardToUse = null; - for (CardInfo cardinfo : cards) { - ExpansionInfo set = ExpansionRepository.instance.getSetByCode(cardinfo.getSetCode()); - if (set != null) { - if ((set.getType().equals(SetType.EXPANSION) || set.getType().equals(SetType.CORE)) - && (lastExpansionDate == null || set.getReleaseDate().after(lastExpansionDate))) { - cardToUse = cardinfo; - lastExpansionDate = set.getReleaseDate(); - } - if (lastExpansionDate == null && (lastReleaseDate == null || set.getReleaseDate().after(lastReleaseDate))) { - cardToUse = cardinfo; - lastReleaseDate = set.getReleaseDate(); - } - } - } - return cardToUse; - } - return null; - } - - public List findCards(String name) { - try { - QueryBuilder queryBuilder = cardDao.queryBuilder(); - queryBuilder.where().eq("name", new SelectArg(name)); - return cardDao.query(queryBuilder.prepare()); - } catch (SQLException ex) { - } - return new ArrayList<>(); - } - - public List findCards(CardCriteria criteria) { - try { - QueryBuilder queryBuilder = cardDao.queryBuilder(); - criteria.buildQuery(queryBuilder); - - return cardDao.query(queryBuilder.prepare()); - } catch (SQLException ex) { - } - return new ArrayList<>(); - } - - public long getContentVersionFromDB() { - try { - ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL); - return RepositoryUtil.getDatabaseVersion(connectionSource, VERSION_ENTITY_NAME + "Content"); - } catch (SQLException ex) { - ex.printStackTrace(); - } - return 0; - } - - public void setContentVersion(long version) { - try { - ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL); - RepositoryUtil.updateVersion(connectionSource, VERSION_ENTITY_NAME + "Content", version); - } catch (SQLException ex) { - ex.printStackTrace(); - } - } - - public long getContentVersionConstant() { - return CARD_CONTENT_VERSION; - } - - public void closeDB() { - try { - if (cardDao != null && cardDao.getConnectionSource() != null) { - DatabaseConnection conn = cardDao.getConnectionSource().getReadWriteConnection(); - conn.executeStatement("shutdown compact", 0); - } - - } catch (SQLException ex) { - - } - } -} +/* + * 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.cards.repository; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.stmt.SelectArg; +import com.j256.ormlite.stmt.Where; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.support.DatabaseConnection; +import com.j256.ormlite.table.TableUtils; +import java.io.File; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.Callable; +import mage.constants.CardType; +import mage.constants.SetType; +import org.apache.log4j.Logger; + +/** + * + * @author North + */ +public enum CardRepository { + + instance; + + private static final String JDBC_URL = "jdbc:h2:file:./db/cards.h2;AUTO_SERVER=TRUE"; + private static final String VERSION_ENTITY_NAME = "card"; + // raise this if db structure was changed + private static final long CARD_DB_VERSION = 41; + // raise this if new cards were added to the server + private static final long CARD_CONTENT_VERSION = 32; + + private final Random random = new Random(); + private Dao cardDao; + private Set classNames; + + private CardRepository() { + File file = new File("db"); + if (!file.exists()) { + file.mkdirs(); + } + try { + ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL); + boolean obsolete = RepositoryUtil.isDatabaseObsolete(connectionSource, VERSION_ENTITY_NAME, CARD_DB_VERSION); + + if (obsolete) { + TableUtils.dropTable(connectionSource, CardInfo.class, true); + } + + TableUtils.createTableIfNotExists(connectionSource, CardInfo.class); + cardDao = DaoManager.createDao(connectionSource, CardInfo.class); + } catch (SQLException ex) { + ex.printStackTrace(); + } + } + + public void addCards(final List cards) { + try { + cardDao.callBatchTasks(new Callable() { + @Override + public Object call() throws Exception { + try { + for (CardInfo card : cards) { + cardDao.create(card); + if (classNames != null) { + classNames.add(card.getClassName()); + } + } + } catch (SQLException ex) { + Logger.getLogger(CardRepository.class).error("Error adding cards to DB: " + ex.getCause()); + } + return null; + } + }); + } catch (Exception ex) { + } + } + + public boolean cardExists(String className) { + try { + if (classNames == null) { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("className").where().isNotNull("className"); + List results = cardDao.query(qb.prepare()); + classNames = new TreeSet<>(); + for (CardInfo card : results) { + classNames.add(card.getClassName()); + } + } + return classNames.contains(className); + } catch (SQLException ex) { + } + return false; + } + + public Set getNames() { + Set names = new TreeSet<>(); + try { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("name"); + List results = cardDao.query(qb.prepare()); + for (CardInfo card : results) { + int result = card.getName().indexOf(" // "); + if (result > 0) { + names.add(card.getName().substring(0, result)); + names.add(card.getName().substring(result + 4)); + } else { + names.add(card.getName()); + } + } + } catch (SQLException ex) { + } + return names; + } + + public Set getNonLandNames() { + Set names = new TreeSet<>(); + try { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("name"); + qb.where().not().like("types", new SelectArg('%' + CardType.LAND.name() + '%')); + List results = cardDao.query(qb.prepare()); + for (CardInfo card : results) { + int result = card.getName().indexOf(" // "); + if (result > 0) { + names.add(card.getName().substring(0, result)); + names.add(card.getName().substring(result + 4)); + } else { + names.add(card.getName()); + } + } + } catch (SQLException ex) { + } + return names; + } + + public Set getCreatureNames() { + Set names = new TreeSet<>(); + try { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("name"); + qb.where().like("types", new SelectArg('%' + CardType.CREATURE.name() + '%')); + List results = cardDao.query(qb.prepare()); + for (CardInfo card : results) { + int result = card.getName().indexOf(" // "); + if (result > 0) { + names.add(card.getName().substring(0, result)); + names.add(card.getName().substring(result + 4)); + } else { + names.add(card.getName()); + } + } + } catch (SQLException ex) { + } + return names; + } + + public Set getNonLandAndNonCreatureNames() { + Set names = new TreeSet<>(); + try { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("name"); + Where where = qb.where(); + where.and(where.not().like("types", '%' + CardType.CREATURE.name() + '%'), where.not().like("types", '%' + CardType.LAND.name() + '%')); + List results = cardDao.query(qb.prepare()); + for (CardInfo card : results) { + int result = card.getName().indexOf(" // "); + if (result > 0) { + names.add(card.getName().substring(0, result)); + names.add(card.getName().substring(result + 4)); + } else { + names.add(card.getName()); + } + } + } catch (SQLException ex) { + } + return names; + } + + public Set getCreatureTypes() { + TreeSet subtypes = new TreeSet<>(); + try { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("subtypes"); + qb.where().like("types", new SelectArg('%' + CardType.CREATURE.name() + '%')); + List results = cardDao.query(qb.prepare()); + for (CardInfo card : results) { + subtypes.addAll(card.getSubTypes()); + } + // Removing Forest because of Dryad Arbor + subtypes.remove("Forest"); + // Some creature types are not directly included in card types and are added here manually + subtypes.add("Blinkmoth"); + subtypes.add("Camarid"); + subtypes.add("Caribou"); + subtypes.add("Citizen"); + subtypes.add("Coward"); + subtypes.add("Deserter"); + subtypes.add("Germ"); + subtypes.add("Graveborn"); + subtypes.add("Orb"); + subtypes.add("Pentavite"); + subtypes.add("Pincher"); + subtypes.add("Prism"); + subtypes.add("Reflection"); + subtypes.add("Sand"); + subtypes.add("Saproling"); + subtypes.add("Serf"); + subtypes.add("Splinter"); + subtypes.add("Survivor"); + subtypes.add("Tetravite"); + subtypes.add("Triskelavite"); + + } catch (SQLException ex) { + } + return subtypes; + } + + public Set getLandTypes() { + TreeSet subtypes = new TreeSet<>(); + try { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("subtypes"); + qb.where().like("types", new SelectArg('%' + CardType.LAND.name() + '%')); + List results = cardDao.query(qb.prepare()); + for (CardInfo card : results) { + subtypes.addAll(card.getSubTypes()); + } + // Removing Dryad because of Dryad Arbor + subtypes.remove("Dryad"); + + } catch (SQLException ex) { + } + return subtypes; + } + + public CardInfo findCard(String setCode, int cardNumber) { + try { + QueryBuilder queryBuilder = cardDao.queryBuilder(); + queryBuilder.where().eq("setCode", new SelectArg(setCode)).and().eq("cardNumber", cardNumber).and().eq("nightCard", false); + List result = cardDao.query(queryBuilder.prepare()); + if (!result.isEmpty()) { + return result.get(0); + } + } catch (SQLException ex) { + } + return null; + } + + public List getClassNames() { + List names = new ArrayList<>(); + try { + List results = cardDao.queryForAll(); + for (CardInfo card : results) { + names.add(card.getClassName()); + } + } catch (SQLException ex) { + } + return names; + } + + public List getMissingCards(List classNames) { + try { + QueryBuilder queryBuilder = cardDao.queryBuilder(); + queryBuilder.where().not().in("className", classNames); + + return cardDao.query(queryBuilder.prepare()); + } catch (SQLException ex) { + } + return new ArrayList<>(); + } + + /** + * + * @param name + * @return random card with the provided name or null if none is found + */ + public CardInfo findCard(String name) { + List cards = findCards(name); + if (!cards.isEmpty()) { + return cards.get(random.nextInt(cards.size())); + } + return null; + } + + public CardInfo findPreferedCoreExpansionCard(String name) { + List cards = findCards(name); + if (!cards.isEmpty()) { + Date lastReleaseDate = new GregorianCalendar(1900, 1, 1).getTime(); + Date lastExpansionDate = new GregorianCalendar(1900, 1, 1).getTime(); + CardInfo cardToUse = null; + for (CardInfo cardinfo : cards) { + ExpansionInfo set = ExpansionRepository.instance.getSetByCode(cardinfo.getSetCode()); + if (set != null) { + if ((set.getType().equals(SetType.EXPANSION) || set.getType().equals(SetType.CORE)) + && (lastExpansionDate == null || set.getReleaseDate().after(lastExpansionDate))) { + cardToUse = cardinfo; + lastExpansionDate = set.getReleaseDate(); + } + if (lastExpansionDate == null && (lastReleaseDate == null || set.getReleaseDate().after(lastReleaseDate))) { + cardToUse = cardinfo; + lastReleaseDate = set.getReleaseDate(); + } + } + } + return cardToUse; + } + return null; + } + + public List findCards(String name) { + try { + QueryBuilder queryBuilder = cardDao.queryBuilder(); + queryBuilder.where().eq("name", new SelectArg(name)); + return cardDao.query(queryBuilder.prepare()); + } catch (SQLException ex) { + } + return new ArrayList<>(); + } + + public List findCards(CardCriteria criteria) { + try { + QueryBuilder queryBuilder = cardDao.queryBuilder(); + criteria.buildQuery(queryBuilder); + + return cardDao.query(queryBuilder.prepare()); + } catch (SQLException ex) { + } + return new ArrayList<>(); + } + + public long getContentVersionFromDB() { + try { + ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL); + return RepositoryUtil.getDatabaseVersion(connectionSource, VERSION_ENTITY_NAME + "Content"); + } catch (SQLException ex) { + ex.printStackTrace(); + } + return 0; + } + + public void setContentVersion(long version) { + try { + ConnectionSource connectionSource = new JdbcConnectionSource(JDBC_URL); + RepositoryUtil.updateVersion(connectionSource, VERSION_ENTITY_NAME + "Content", version); + } catch (SQLException ex) { + ex.printStackTrace(); + } + } + + public long getContentVersionConstant() { + return CARD_CONTENT_VERSION; + } + + public void closeDB() { + try { + if (cardDao != null && cardDao.getConnectionSource() != null) { + DatabaseConnection conn = cardDao.getConnectionSource().getReadWriteConnection(); + conn.executeStatement("shutdown compact", 0); + } + + } catch (SQLException ex) { + + } + } +} diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java index a8dc32e0ef1..9b8aee1c616 100644 --- a/Mage/src/mage/counters/CounterType.java +++ b/Mage/src/mage/counters/CounterType.java @@ -78,6 +78,7 @@ public enum CounterType { PRESSURE("pressure"), QUEST("quest"), SHIELD("shield"), + SHRED("shred"), SLIME("slime"), SPORE("spore"), STORAGE("storage"), diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 16b1a1bce1d..9568d092c30 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -11920,7 +11920,7 @@ Tidal Wave|Mirage|100|U|{2}{U}|Instant|||Put a 5/5 blue Wall creature token with Vaporous Djinn|Mirage|101|U|{2}{U}{U}|Creature - Djinn|3|4|Flying$At the beginning of your upkeep, Vaporous Djinn phases out unless you pay {U}{U}. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.)| Wave Elemental|Mirage|102|U|{2}{U}{U}|Creature - Elemental|2|3|{U}, {tap}, Sacrifice Wave Elemental: Tap up to three target creatures without flying.| Afiya Grove|Mirage|103|R|{1}{G}|Enchantment|||Afiya Grove enters the battlefield with three +1/+1 counters on it.$At the beginning of your upkeep, move a +1/+1 counter from Afiya Grove onto target creature.$When Afiya Grove has no +1/+1 counters on it, sacrifice it.| -Thirst|Mirage|104|C|{2}{U}|Enchantment - Aura|||Enchant creature$When Thirst enters the battlefield, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.$At the beginning of your upkeep, sacrifice Thirst unless you pay {U}.| +Thirst|Mirage|99|C|{2}{U}|Enchantment - Aura|||Enchant creature$When Thirst enters the battlefield, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.$At the beginning of your upkeep, sacrifice Thirst unless you pay {U}.| Armor of Thorns|Mirage|104|C|{1}{G}|Enchantment - Aura|||You may cast Armor of Thorns as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step.$Enchant nonblack creature$Enchanted creature gets +2/+2.| Barbed Foliage|Mirage|105|U|{2}{G}{G}|Enchantment|||Whenever a creature attacks you, it loses flanking until end of turn.$$Whenever a creature without flying attacks you, Barbed Foliage deals 1 damage to it.| Brushwagg|Mirage|106|R|{1}{G}{G}|Creature - Brushwagg|3|2|Whenever Brushwagg blocks or becomes blocked, it gets -2/+2 until end of turn.| @@ -11929,7 +11929,7 @@ Crash of Rhinos|Mirage|108|C|{6}{G}{G}|Creature - Rhino|8|4|Trample| Cycle of Life|Mirage|109|R|{1}{G}{G}|Enchantment|||Return Cycle of Life to its owner's hand: Target creature you cast this turn becomes 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature.| Choking Sands|Mirage|11|C|{1}{B}{B}|Sorcery|||Destroy target non-Swamp land. If that land was nonbasic, Choking Sands deals 2 damage to the land's controller.| Decomposition|Mirage|110|U|{1}{G}|Enchantment - Aura|||Enchant black creature$Enchanted creature has "Cumulative upkeep-Pay 1 life." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless he or she pays its upkeep cost for each age counter on it.)$When enchanted creature dies, its controller loses 2 life.| -Wellspring|Mirage|110|R|{1}{G}{W}|Enchantment - Aura|||Enchant land$When Wellspring enters the battlefield, gain control of enchanted land until end of turn.$At the beginning of your upkeep, untap enchanted land. You gain control of that land until end of turn.| +Wellspring|Mirage|348|R|{1}{G}{W}|Enchantment - Aura|||Enchant land$When Wellspring enters the battlefield, gain control of enchanted land until end of turn.$At the beginning of your upkeep, untap enchanted land. You gain control of that land until end of turn.| Early Harvest|Mirage|111|R|{1}{G}{G}|Instant|||Target player untaps all basic lands he or she controls.| Fallow Earth|Mirage|112|U|{2}{G}|Sorcery|||Put target land on top of its owner's library.| Femeref Archers|Mirage|113|U|{2}{G}|Creature - Human Archer|2|2|{tap}: Femeref Archers deals 4 damage to target attacking creature with flying.| @@ -12025,7 +12025,7 @@ Subterranean Spirit|Mirage|195|R|{3}{R}{R}|Creature - Elemental Spirit|3|3|Prote Talruum Minotaur|Mirage|196|C|{2}{R}{R}|Creature - Minotaur Berserker|3|3|Haste| Telim'Tor|Mirage|197|R|{4}{R}|Legendary Creature - Human Knight|2|2|Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)$Whenever Telim'Tor attacks, all attacking creatures with flanking get +1/+1 until end of turn.| Telim'Tor's Edict|Mirage|198|R|{R}|Instant|||Exile target permanent you own or control.$Draw a card at the beginning of the next turn's upkeep.| -Dwarven Miner|Mirage|199|U|{1}{R}|Creature - Dwarf|1|2|{2}{R}, {tap}: Destroy target nonbasic land.| +Dwarven Miner|Mirage|169|U|{1}{R}|Creature - Dwarf|1|2|{2}{R}, {tap}: Destroy target nonbasic land.| Torrent of Lava|Mirage|199|R|{X}{R}{R}|Sorcery|||Torrent of Lava deals X damage to each creature without flying.$As long as Torrent of Lava is on the stack, each creature has "{tap}: Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn."| Ashen Powder|Mirage|2|R|{2}{B}{B}|Sorcery|||Put target creature card from an opponent's graveyard onto the battlefield under your control.| Feral Shadow|Mirage|20|C|{2}{B}|Creature - Nightstalker|2|1|Flying| @@ -12131,32 +12131,32 @@ Mire Shade|Mirage|29|U|{1}{B}|Creature - Shade|1|1|{B}, Sacrifice a Swamp: Put a Crystal Vein|Mirage|290|U||Land|||{tap}: Add {1} to your mana pool.${tap}, Sacrifice Crystal Vein: Add {2} to your mana pool.| Flood Plain|Mirage|291|U||Land|||Flood Plain enters the battlefield tapped.${tap}, Sacrifice Flood Plain: Search your library for a Plains or Island card and put it onto the battlefield. Then shuffle your library.| Forest|Mirage|292|L||Basic Land - Forest|||G| -Forest|Mirage|292|L||Basic Land - Forest|||G| -Forest|Mirage|292|L||Basic Land - Forest|||G| -Forest|Mirage|292|L||Basic Land - Forest|||G| +Forest|Mirage|293|L||Basic Land - Forest|||G| +Forest|Mirage|294|L||Basic Land - Forest|||G| +Forest|Mirage|295|L||Basic Land - Forest|||G| Grasslands|Mirage|296|U||Land|||Grasslands enters the battlefield tapped.${tap}, Sacrifice Grasslands: Search your library for a Forest or Plains card and put it onto the battlefield. Then shuffle your library.| Island|Mirage|297|L||Basic Land - Island|||U| -Island|Mirage|297|L||Basic Land - Island|||U| -Island|Mirage|297|L||Basic Land - Island|||U| -Island|Mirage|297|L||Basic Land - Island|||U| +Island|Mirage|298|L||Basic Land - Island|||U| +Island|Mirage|299|L||Basic Land - Island|||U| +Island|Mirage|300|L||Basic Land - Island|||U| Barbed-Back Wurm|Mirage|3|U|{4}{B}|Creature - Wurm|4|3|{B}: Target green creature blocking Barbed-Back Wurm gets -1/-1 until end of turn.| Nocturnal Raid|Mirage|30|U|{2}{B}{B}|Instant|||Black creatures get +2/+0 until end of turn.| -Shimmer|Mirage|30|R|{2}{U}{U}|Enchantment|||As Shimmer enters the battlefield, choose a land type.$Each land of the chosen type has phasing. (It phases in or out before its controller untaps during each of his or her untap steps. While it's phased out, it's treated as though it doesn't exist.)| -Mountain|Mirage|301|L||Basic Land - Mountain|||R| -Mountain|Mirage|301|L||Basic Land - Mountain|||R| -Mountain|Mirage|301|L||Basic Land - Mountain|||R| +Shimmer|Mirage|92|R|{2}{U}{U}|Enchantment|||As Shimmer enters the battlefield, choose a land type.$Each land of the chosen type has phasing. (It phases in or out before its controller untaps during each of his or her untap steps. While it's phased out, it's treated as though it doesn't exist.)| Mountain|Mirage|301|L||Basic Land - Mountain|||R| +Mountain|Mirage|302|L||Basic Land - Mountain|||R| +Mountain|Mirage|303|L||Basic Land - Mountain|||R| +Mountain|Mirage|304|L||Basic Land - Mountain|||R| Mountain Valley|Mirage|305|U||Land|||Mountain Valley enters the battlefield tapped.${tap}, Sacrifice Mountain Valley: Search your library for a Mountain or Forest card and put it onto the battlefield. Then shuffle your library.| Plains|Mirage|306|L||Basic Land - Plains|||W| -Plains|Mirage|306|L||Basic Land - Plains|||W| -Plains|Mirage|306|L||Basic Land - Plains|||W| -Plains|Mirage|306|L||Basic Land - Plains|||W| +Plains|Mirage|307|L||Basic Land - Plains|||W| +Plains|Mirage|308|L||Basic Land - Plains|||W| +Plains|Mirage|309|L||Basic Land - Plains|||W| Painful Memories|Mirage|31|U|{1}{B}|Sorcery|||Look at target opponent's hand and choose a card from it. Put that card on top of that player's library.| Rocky Tar Pit|Mirage|310|U||Land|||Rocky Tar Pit enters the battlefield tapped.${tap}, Sacrifice Rocky Tar Pit: Search your library for a Swamp or Mountain card and put it onto the battlefield. Then shuffle your library.| Swamp|Mirage|311|L||Basic Land - Swamp|||B| -Swamp|Mirage|311|L||Basic Land - Swamp|||B| -Swamp|Mirage|311|L||Basic Land - Swamp|||B| -Swamp|Mirage|311|L||Basic Land - Swamp|||B| +Swamp|Mirage|312|L||Basic Land - Swamp|||B| +Swamp|Mirage|313|L||Basic Land - Swamp|||B| +Swamp|Mirage|314|L||Basic Land - Swamp|||B| Teferi's Isle|Mirage|315|R||Legendary Land|||Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.)$Teferi's Isle enters the battlefield tapped.${tap}: Add {U}{U} to your mana pool.| Asmira, Holy Avenger|Mirage|316|R|{2}{G}{W}|Legendary Creature - Human Cleric|2|3|Flying$At the beginning of each end step, put a +1/+1 counter on Asmira, Holy Avenger for each creature put into your graveyard from the battlefield this turn.| Benthic Djinn|Mirage|317|R|{2}{U}{B}|Creature - Djinn|5|3|Islandwalk$$At the beginning of your upkeep, you lose 2 life.| From c6e08a8872614836ea3c02f13693554663a9cd9d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 16 Aug 2015 13:02:02 +0200 Subject: [PATCH 356/375] * Fixed that effects created from attachments to the attached object by activated or triggered abilities did not exists independent from the attachment (fixes #1206). --- .../sets/bornofthegods/EverflameEidolon.java | 45 +++++++-- .../mage/sets/magic2012/Firebreathing.java | 16 +++- .../cards/continuous/BoostEnchantedTest.java | 92 +++++++++++++++++++ .../effects/ContinuousEffectImpl.java | 80 ++++++++-------- .../combat/CantBlockAttachedEffect.java | 19 +++- .../continuous/BoostEnchantedEffect.java | 65 ++++++++----- .../continuous/GainAbilityAttachedEffect.java | 65 +++++++------ 7 files changed, 275 insertions(+), 107 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/continuous/BoostEnchantedTest.java diff --git a/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java b/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java index 3239aff414b..dc091c0b57f 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java @@ -29,19 +29,22 @@ package mage.sets.bornofthegods; import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.common.SourceHasSubtypeCondition; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.BestowAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; /** * @@ -60,12 +63,7 @@ public class EverflameEidolon extends CardImpl { // Bestow {2}{R} this.addAbility(new BestowAbility(this, "{2}{R}")); // {R}: Everflame Eidolon gets +1/+0 until end of turn. If it's an Aura, enchanted creature gets +1/+0 until end of turn instead. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( - new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), - new BoostSourceEffect(1, 0, Duration.EndOfTurn), - new SourceHasSubtypeCondition("Aura"), - "{this} gets +1/+0 until end of turn. If it's an Aura, enchanted creature gets +1/+0 until end of turn instead"), - new ManaCostsImpl("{R}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new EverflameEidolonEffect(), new ManaCostsImpl("{R}"))); // Enchanted creature gets +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield))); } @@ -79,3 +77,34 @@ public class EverflameEidolon extends CardImpl { return new EverflameEidolon(this); } } + +class EverflameEidolonEffect extends OneShotEffect { + + public EverflameEidolonEffect() { + super(Outcome.BoostCreature); + this.staticText = "{this} gets +1/+0 until end of turn. If it's an Aura, enchanted creature gets +1/+0 until end of turn instead"; + } + + public EverflameEidolonEffect(final EverflameEidolonEffect effect) { + super(effect); + } + + @Override + public EverflameEidolonEffect copy() { + return new EverflameEidolonEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (sourceObject != null) { + if (sourceObject.getSubtype().contains("Aura")) { + new BoostEnchantedEffect(1, 0, Duration.EndOfTurn).apply(game, source); + } else { + game.addEffect(new BoostSourceEffect(1, 0, Duration.EndOfTurn), source); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2012/Firebreathing.java b/Mage.Sets/src/mage/sets/magic2012/Firebreathing.java index 6cd00148230..e7d349cee9f 100644 --- a/Mage.Sets/src/mage/sets/magic2012/Firebreathing.java +++ b/Mage.Sets/src/mage/sets/magic2012/Firebreathing.java @@ -25,12 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.magic2012; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ColoredManaCost; @@ -38,6 +35,12 @@ import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -47,20 +50,23 @@ import mage.target.common.TargetCreaturePermanent; */ public class Firebreathing extends CardImpl { - public Firebreathing (UUID ownerId) { + public Firebreathing(UUID ownerId) { super(ownerId, 132, "Firebreathing", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{R}"); this.expansionSetCode = "M12"; this.subtype.add("Aura"); + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + + // {R}: Enchanted creature gets +1/+0 until end of turn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.R))); } - public Firebreathing (final Firebreathing card) { + public Firebreathing(final Firebreathing card) { super(card); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/BoostEnchantedTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/BoostEnchantedTest.java new file mode 100644 index 00000000000..f7db7fd18d7 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/BoostEnchantedTest.java @@ -0,0 +1,92 @@ +/* + * 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 org.mage.test.cards.continuous; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class BoostEnchantedTest extends CardTestPlayerBase { + + @Test + public void testFirebreathingNormal() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); + // {R}: Enchanted creature gets +1/+0 until end of turn. + addCard(Zone.HAND, playerA, "Firebreathing"); // {R} Enchantment - Aura + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Firebreathing", "Silvercoat Lion"); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: Enchanted creature"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Firebreathing", 1); + assertPowerToughness(playerA, "Silvercoat Lion", 3, 2); + } + + /** + * On Ghitu Firebreathing (and probably other similar cards), when you + * activate the ability to give +1/0 to the enchanted creature and the + * return Ghitu Firebreathing to your hand, the +1/0 goes away on the + * creature. If you re-cast Ghitu Firebreathing onto the creature, the boost + * returns. + * + * Gatherer Rulings: 9/25/2006 If you return Ghitu Firebreathing to its + * owner's hand while the +1/+0 ability is on the stack, that ability will + * still give the creature that was last enchanted by Ghitu Firebreathing + * +1/+0. + * + */ + @Test + public void testFirebreathingReturnToHand() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); + // {R}: Enchanted creature gets +1/+0 until end of turn. + addCard(Zone.HAND, playerA, "Firebreathing"); // {R} Enchantment - Aura + + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + addCard(Zone.HAND, playerB, "Boomerang"); // {U}{U} Instant + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Firebreathing", "Silvercoat Lion"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Boomerang", "Firebreathing"); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: Enchanted creature", NO_TARGET, "Boomerang"); + + setStopAt(1, PhaseStep.END_COMBAT); + execute(); + + assertHandCount(playerA, "Firebreathing", 1); + assertGraveyardCount(playerB, "Boomerang", 1); + assertPowerToughness(playerA, "Silvercoat Lion", 3, 2); + } +} diff --git a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java index a3603203321..e793058a81d 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java @@ -1,31 +1,30 @@ /* -* 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. -*/ - + * 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.abilities.effects; import java.util.ArrayList; @@ -69,7 +68,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu protected boolean affectedObjectsSet = false; protected List affectedObjectList = new ArrayList<>(); protected boolean temporary = false; - + // until your next turn protected int startingTurn; protected UUID startingControllerId; @@ -96,7 +95,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu this.used = effect.used; this.discarded = effect.discarded; this.affectedObjectsSet = effect.affectedObjectsSet; - this.affectedObjectList.addAll(effect.affectedObjectList); + this.affectedObjectList.addAll(effect.affectedObjectList); this.temporary = effect.temporary; this.startingTurn = effect.startingTurn; this.startingControllerId = effect.startingControllerId; @@ -148,8 +147,8 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu } /** - * Sets the discarded state of the effect. So it - * will be removed on next check. + * Sets the discarded state of the effect. So it will be removed on next + * check. */ @Override public void discard() { @@ -160,7 +159,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu public void init(Ability source, Game game) { targetPointer.init(game, source); //20100716 - 611.2c - if (AbilityType.ACTIVATED.equals(source.getAbilityType()) + if (AbilityType.ACTIVATED.equals(source.getAbilityType()) || AbilityType.SPELL.equals(source.getAbilityType()) || AbilityType.TRIGGERED.equals(source.getAbilityType())) { if (layer != null) { @@ -174,11 +173,10 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu case PTChangingEffects_7: this.affectedObjectsSet = true; } - } - else { - if (hasLayer(Layer.CopyEffects_1) || hasLayer(Layer.ControlChangingEffects_2) || hasLayer(Layer.TextChangingEffects_3) || - hasLayer(Layer.TypeChangingEffects_4) || hasLayer(Layer.ColorChangingEffects_5) || hasLayer(Layer.AbilityAddingRemovingEffects_6) || - hasLayer(Layer.PTChangingEffects_7)) { + } else { + if (hasLayer(Layer.CopyEffects_1) || hasLayer(Layer.ControlChangingEffects_2) || hasLayer(Layer.TextChangingEffects_3) + || hasLayer(Layer.TypeChangingEffects_4) || hasLayer(Layer.ColorChangingEffects_5) || hasLayer(Layer.AbilityAddingRemovingEffects_6) + || hasLayer(Layer.PTChangingEffects_7)) { this.affectedObjectsSet = true; } } @@ -226,7 +224,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu return true; } if (toughness instanceof DomainValue) { - return ((DomainValue)toughness).getAmount() < 0; + return ((DomainValue) toughness).getAmount() < 0; } return false; } @@ -237,8 +235,10 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu } /** - * Returns the status if the effect is temporary added to the ContinuousEffects - * @return + * Returns the status if the effect is temporary added to the + * ContinuousEffects + * + * @return */ @Override public boolean isTemporary() { diff --git a/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java index d58293e927c..b42d9e082b1 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java @@ -27,12 +27,13 @@ */ package mage.abilities.effects.common.combat; -import mage.constants.AttachmentType; -import mage.constants.Duration; import mage.abilities.Ability; import mage.abilities.effects.RestrictionEffect; +import mage.constants.AttachmentType; +import mage.constants.Duration; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; /** * @@ -62,8 +63,22 @@ public class CantBlockAttachedEffect extends RestrictionEffect { super(effect); } + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (affectedObjectsSet) { + Permanent equipment = game.getPermanent(source.getSourceId()); + if (equipment != null && equipment.getAttachedTo() != null) { + this.setTargetPointer(new FixedTarget(equipment.getAttachedTo(), game.getState().getZoneChangeCounter(equipment.getAttachedTo()))); + } + } + } + @Override public boolean applies(Permanent permanent, Ability source, Game game) { + if (affectedObjectsSet) { + return targetPointer.getFirst(game, source).equals(permanent.getId()); + } return permanent.getAttachments().contains(source.getSourceId()); } diff --git a/Mage/src/mage/abilities/effects/common/continuous/BoostEnchantedEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BoostEnchantedEffect.java index f806ef6541a..0f60a80c170 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BoostEnchantedEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BoostEnchantedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,24 +20,24 @@ * 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.abilities.effects.common.continuous; -import mage.constants.Duration; -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.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; /** * @@ -79,15 +79,37 @@ public class BoostEnchantedEffect extends ContinuousEffectImpl { } @Override - public boolean apply(Game game, Ability source) { - Permanent enchantment = game.getPermanent(source.getSourceId()); - if (enchantment != null && enchantment.getAttachedTo() != null) { - Permanent creature = game.getPermanent(enchantment.getAttachedTo()); - if (creature != null) { - creature.addPower(power.calculate(game, source, this)); - creature.addToughness(toughness.calculate(game, source, this)); + public void init(Ability source, Game game) { + super.init(source, game); + if (affectedObjectsSet) { + // Added boosts of activated or triggered abilities exist independent from the source they are created by + // so a continuous effect for the permanent itself with the attachment is created + Permanent equipment = game.getPermanent(source.getSourceId()); + if (equipment != null && equipment.getAttachedTo() != null) { + this.setTargetPointer(new FixedTarget(equipment.getAttachedTo(), game.getState().getZoneChangeCounter(equipment.getAttachedTo()))); } } + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = null; + if (affectedObjectsSet) { + permanent = game.getPermanent(targetPointer.getFirst(game, source)); + if (permanent == null) { + discard(); + return true; + } + } else { + Permanent equipment = game.getPermanent(source.getSourceId()); + if (equipment != null && equipment.getAttachedTo() != null) { + permanent = game.getPermanent(equipment.getAttachedTo()); + } + } + if (permanent != null) { + permanent.addPower(power.calculate(game, source, this)); + permanent.addToughness(toughness.calculate(game, source, this)); + } return true; } @@ -95,16 +117,15 @@ public class BoostEnchantedEffect extends ContinuousEffectImpl { StringBuilder sb = new StringBuilder(); sb.append("Enchanted creature gets "); String p = power.toString(); - if(!p.startsWith("-")) { + if (!p.startsWith("-")) { sb.append("+"); } sb.append(p).append("/"); String t = toughness.toString(); - if(!t.startsWith("-")){ - if(p.startsWith("-")) { + if (!t.startsWith("-")) { + if (p.startsWith("-")) { sb.append("-"); - } - else { + } else { sb.append("+"); } } diff --git a/Mage/src/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java b/Mage/src/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java index 3029a00fc14..9120ccb5512 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java @@ -45,35 +45,36 @@ public class GainAbilityAttachedEffect extends ContinuousEffectImpl { protected Ability ability; protected AttachmentType attachmentType; - protected boolean fixedTarget = false; + protected boolean independentEffect; + + public GainAbilityAttachedEffect(Ability ability, AttachmentType attachmentType) { + this(ability, attachmentType, Duration.WhileOnBattlefield); + } + + public GainAbilityAttachedEffect(Ability ability, AttachmentType attachmentType, Duration duration) { + this(ability, attachmentType, duration, null); + } public GainAbilityAttachedEffect(Ability ability, AttachmentType attachmentType, Duration duration, String rule) { super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); this.ability = ability; this.attachmentType = attachmentType; - this.duration = duration; - if (duration == Duration.EndOfTurn) { - fixedTarget = true; + switch (duration) { + case WhileOnBattlefield: + case WhileInGraveyard: + case WhileOnStack: + independentEffect = false; + break; + default: + // such effects exist independent from the enchantment that created the effect + independentEffect = true; } - this.staticText = rule; - } - public GainAbilityAttachedEffect(Ability ability, AttachmentType attachmentType, Duration duration) { - super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.ability = ability; - this.attachmentType = attachmentType; - this.duration = duration; - if (duration == Duration.EndOfTurn) { - fixedTarget = true; + if (rule == null) { + setText(); + } else { + this.staticText = rule; } - setText(); - } - - public GainAbilityAttachedEffect(Ability ability, AttachmentType attachmentType) { - super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.ability = ability; - this.attachmentType = attachmentType; - setText(); } public GainAbilityAttachedEffect(final GainAbilityAttachedEffect effect) { @@ -81,7 +82,7 @@ public class GainAbilityAttachedEffect extends ContinuousEffectImpl { this.ability = effect.ability.copy(); ability.newId(); // This is needed if the effect is copied e.g. by a clone so the ability can be added multiple times to permanents this.attachmentType = effect.attachmentType; - this.fixedTarget = effect.fixedTarget; + this.independentEffect = effect.independentEffect; } @Override @@ -92,27 +93,31 @@ public class GainAbilityAttachedEffect extends ContinuousEffectImpl { @Override public void init(Ability source, Game game) { super.init(source, game); - if (fixedTarget) { + if (affectedObjectsSet) { Permanent equipment = game.getPermanent(source.getSourceId()); if (equipment != null && equipment.getAttachedTo() != null) { - this.setTargetPointer(new FixedTarget(equipment.getAttachedTo())); + this.setTargetPointer(new FixedTarget(equipment.getAttachedTo(), game.getState().getZoneChangeCounter(equipment.getAttachedTo()))); } } } @Override public boolean apply(Game game, Ability source) { - Permanent creature = null; - if (fixedTarget) { - creature = game.getPermanent(targetPointer.getFirst(game, source)); + Permanent permanent = null; + if (affectedObjectsSet) { + permanent = game.getPermanent(targetPointer.getFirst(game, source)); + if (permanent == null) { + discard(); + return true; + } } else { Permanent equipment = game.getPermanent(source.getSourceId()); if (equipment != null && equipment.getAttachedTo() != null) { - creature = game.getPermanent(equipment.getAttachedTo()); + permanent = game.getPermanent(equipment.getAttachedTo()); } } - if (creature != null) { - creature.addAbility(ability, source.getSourceId(), game, false); + if (permanent != null) { + permanent.addAbility(ability, source.getSourceId(), game, false); } return true; } From 257cec78197944bee57259c519b0084782dc67cd Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 16 Aug 2015 15:10:10 +0300 Subject: [PATCH 357/375] Implement cards: Horror of Horrors, Imaginary Pet, and Marble Titan --- .../mage/sets/legends/HorrorOfHorrors.java | 80 +++++++++++++++++++ .../sets/ninthedition/HorrorOfHorrors.java | 52 ++++++++++++ .../mage/sets/ninthedition/ImaginaryPet.java | 52 ++++++++++++ .../mage/sets/ninthedition/MarbleTitan.java | 52 ++++++++++++ .../src/mage/sets/tempest/MarbleTitan.java | 75 +++++++++++++++++ .../src/mage/sets/urzassaga/ImaginaryPet.java | 69 ++++++++++++++++ 6 files changed, 380 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/legends/HorrorOfHorrors.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/HorrorOfHorrors.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/ImaginaryPet.java create mode 100644 Mage.Sets/src/mage/sets/ninthedition/MarbleTitan.java create mode 100644 Mage.Sets/src/mage/sets/tempest/MarbleTitan.java create mode 100644 Mage.Sets/src/mage/sets/urzassaga/ImaginaryPet.java diff --git a/Mage.Sets/src/mage/sets/legends/HorrorOfHorrors.java b/Mage.Sets/src/mage/sets/legends/HorrorOfHorrors.java new file mode 100644 index 00000000000..99db10a8060 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/HorrorOfHorrors.java @@ -0,0 +1,80 @@ +/* + * 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.legends; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.RegenerateTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class HorrorOfHorrors extends CardImpl { + + private static final FilterControlledPermanent filter1 = new FilterControlledPermanent("a Swamp"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("black creature"); + + static { + filter1.add(new SubtypePredicate("Swamp")); + filter2.add(new ColorPredicate(ObjectColor.BLACK)); + } + + public HorrorOfHorrors(UUID ownerId) { + super(ownerId, 20, "Horror of Horrors", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); + this.expansionSetCode = "LEG"; + + // Sacrifice a Swamp: Regenerate target black creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateTargetEffect(), + new SacrificeTargetCost(new TargetControlledPermanent(filter1))); + ability.addTarget(new TargetCreaturePermanent(filter2)); + this.addAbility(ability); + } + + public HorrorOfHorrors(final HorrorOfHorrors card) { + super(card); + } + + @Override + public HorrorOfHorrors copy() { + return new HorrorOfHorrors(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/HorrorOfHorrors.java b/Mage.Sets/src/mage/sets/ninthedition/HorrorOfHorrors.java new file mode 100644 index 00000000000..5f229c7da13 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/HorrorOfHorrors.java @@ -0,0 +1,52 @@ +/* + * 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.ninthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class HorrorOfHorrors extends mage.sets.legends.HorrorOfHorrors { + + public HorrorOfHorrors(UUID ownerId) { + super(ownerId); + this.cardNumber = 140; + this.expansionSetCode = "9ED"; + } + + public HorrorOfHorrors(final HorrorOfHorrors card) { + super(card); + } + + @Override + public HorrorOfHorrors copy() { + return new HorrorOfHorrors(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/ImaginaryPet.java b/Mage.Sets/src/mage/sets/ninthedition/ImaginaryPet.java new file mode 100644 index 00000000000..cbc264edc80 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/ImaginaryPet.java @@ -0,0 +1,52 @@ +/* + * 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.ninthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class ImaginaryPet extends mage.sets.urzassaga.ImaginaryPet { + + public ImaginaryPet(UUID ownerId) { + super(ownerId); + this.cardNumber = 82; + this.expansionSetCode = "9ED"; + } + + public ImaginaryPet(final ImaginaryPet card) { + super(card); + } + + @Override + public ImaginaryPet copy() { + return new ImaginaryPet(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ninthedition/MarbleTitan.java b/Mage.Sets/src/mage/sets/ninthedition/MarbleTitan.java new file mode 100644 index 00000000000..61d49319d2f --- /dev/null +++ b/Mage.Sets/src/mage/sets/ninthedition/MarbleTitan.java @@ -0,0 +1,52 @@ +/* + * 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.ninthedition; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class MarbleTitan extends mage.sets.tempest.MarbleTitan { + + public MarbleTitan(UUID ownerId) { + super(ownerId); + this.cardNumber = 26; + this.expansionSetCode = "9ED"; + } + + public MarbleTitan(final MarbleTitan card) { + super(card); + } + + @Override + public MarbleTitan copy() { + return new MarbleTitan(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/MarbleTitan.java b/Mage.Sets/src/mage/sets/tempest/MarbleTitan.java new file mode 100644 index 00000000000..77aca3a45da --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/MarbleTitan.java @@ -0,0 +1,75 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; + +/** + * + * @author LoneFox + */ +public class MarbleTitan extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures with power 3 or greater"); + + static { + filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 2)); + } + + public MarbleTitan(UUID ownerId) { + super(ownerId, 240, "Marble Titan", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "TMP"; + this.subtype.add("Giant"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Creatures with power 3 or greater don't untap during their controllers' untap steps. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, filter))); + } + + public MarbleTitan(final MarbleTitan card) { + super(card); + } + + @Override + public MarbleTitan copy() { + return new MarbleTitan(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/ImaginaryPet.java b/Mage.Sets/src/mage/sets/urzassaga/ImaginaryPet.java new file mode 100644 index 00000000000..69a4a490c45 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/ImaginaryPet.java @@ -0,0 +1,69 @@ +/* + * 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.urzassaga; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author LoneFox + */ +public class ImaginaryPet extends CardImpl { + + public ImaginaryPet(UUID ownerId) { + super(ownerId, 81, "Imaginary Pet", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "USG"; + this.subtype.add("Illusion"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // At the beginning of your upkeep, if you have a card in hand, return Imaginary Pet to its owner's hand. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new ReturnToHandSourceEffect(true), TargetController.YOU, false); + this.addAbility(new ConditionalTriggeredAbility(ability, new CardsInHandCondition(CardsInHandCondition.CountType.MORE_THAN, 0), + "At the beginning of your upkeep, if you have a card in hand, return {this} to its owner's hand.")); + } + + public ImaginaryPet(final ImaginaryPet card) { + super(card); + } + + @Override + public ImaginaryPet copy() { + return new ImaginaryPet(this); + } +} From bb3b476e91f00aa28d6280d89c9c111fb528cf62 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 16 Aug 2015 16:25:53 +0300 Subject: [PATCH 358/375] Implement cards: Ancient Hydra; Crested Craghorn; Jeska, Warrior Adept; and Lovisa Coldeyes --- .../mage/sets/coldsnap/LovisaColdeyes.java | 85 +++++++++++++++++++ .../mage/sets/judgment/JeskaWarriorAdept.java | 78 +++++++++++++++++ .../mage/sets/legions/CrestedCraghorn.java | 66 ++++++++++++++ .../src/mage/sets/nemesis/AncientHydra.java | 75 ++++++++++++++++ 4 files changed, 304 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/coldsnap/LovisaColdeyes.java create mode 100644 Mage.Sets/src/mage/sets/judgment/JeskaWarriorAdept.java create mode 100644 Mage.Sets/src/mage/sets/legions/CrestedCraghorn.java create mode 100644 Mage.Sets/src/mage/sets/nemesis/AncientHydra.java diff --git a/Mage.Sets/src/mage/sets/coldsnap/LovisaColdeyes.java b/Mage.Sets/src/mage/sets/coldsnap/LovisaColdeyes.java new file mode 100644 index 00000000000..ebdff5a9086 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/LovisaColdeyes.java @@ -0,0 +1,85 @@ +/* + * 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.coldsnap; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author LoneFox + */ +public class LovisaColdeyes extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control that's a Barbarian, a Warrior, or a Berserker"); + + static { + filter.add(Predicates.or(new SubtypePredicate("Barbarian"), new SubtypePredicate("Warrior"), new SubtypePredicate("Berserker"))); + } + + public LovisaColdeyes(UUID ownerId) { + super(ownerId, 90, "Lovisa Coldeyes", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + this.expansionSetCode = "CSP"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Each creature you control that's a Barbarian, a Warrior, or a Berserker gets +2/+2 and has haste. + Effect effect = new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, filter, false); + effect.setText("Each creature you control that's a Barbarian, a Warrior, or a Berserker gets +2/+2"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter, false); + effect.setText("and has haste"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public LovisaColdeyes(final LovisaColdeyes card) { + super(card); + } + + @Override + public LovisaColdeyes copy() { + return new LovisaColdeyes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/judgment/JeskaWarriorAdept.java b/Mage.Sets/src/mage/sets/judgment/JeskaWarriorAdept.java new file mode 100644 index 00000000000..7d12fb0dd3a --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/JeskaWarriorAdept.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.judgment; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LoneFox + */ +public class JeskaWarriorAdept extends CardImpl { + + public JeskaWarriorAdept(UUID ownerId) { + super(ownerId, 93, "Jeska, Warrior Adept", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + this.expansionSetCode = "JUD"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Barbarian"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + // Haste + this.addAbility(HasteAbility.getInstance()); + // {tap}: Jeska, Warrior Adept deals 1 damage to target creature or player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public JeskaWarriorAdept(final JeskaWarriorAdept card) { + super(card); + } + + @Override + public JeskaWarriorAdept copy() { + return new JeskaWarriorAdept(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legions/CrestedCraghorn.java b/Mage.Sets/src/mage/sets/legions/CrestedCraghorn.java new file mode 100644 index 00000000000..aed2e22cc9d --- /dev/null +++ b/Mage.Sets/src/mage/sets/legions/CrestedCraghorn.java @@ -0,0 +1,66 @@ +/* + * 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.legions; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.ProvokeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class CrestedCraghorn extends CardImpl { + + public CrestedCraghorn(UUID ownerId) { + super(ownerId, 91, "Crested Craghorn", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{R}"); + this.expansionSetCode = "LGN"; + this.subtype.add("Goat"); + this.subtype.add("Beast"); + this.power = new MageInt(4); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + // Provoke + this.addAbility(new ProvokeAbility()); + } + + public CrestedCraghorn(final CrestedCraghorn card) { + super(card); + } + + @Override + public CrestedCraghorn copy() { + return new CrestedCraghorn(this); + } +} diff --git a/Mage.Sets/src/mage/sets/nemesis/AncientHydra.java b/Mage.Sets/src/mage/sets/nemesis/AncientHydra.java new file mode 100644 index 00000000000..a9ea30a9979 --- /dev/null +++ b/Mage.Sets/src/mage/sets/nemesis/AncientHydra.java @@ -0,0 +1,75 @@ +/* + * 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.nemesis; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.FadingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LoneFox + */ +public class AncientHydra extends CardImpl { + + public AncientHydra(UUID ownerId) { + super(ownerId, 76, "Ancient Hydra", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{R}"); + this.expansionSetCode = "NMS"; + this.subtype.add("Hydra"); + this.power = new MageInt(5); + this.toughness = new MageInt(1); + + // Fading 5 + this.addAbility(new FadingAbility(5, this)); + // {1}, Remove a fade counter from Ancient Hydra: Ancient Hydra deals 1 damage to target creature or player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{1}")); + ability.addCost(new RemoveCountersSourceCost(CounterType.FADE.createInstance(1))); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public AncientHydra(final AncientHydra card) { + super(card); + } + + @Override + public AncientHydra copy() { + return new AncientHydra(this); + } +} From 5ee01868a9f1fd343fb47513966b643237cbc8ea Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 16 Aug 2015 17:59:14 +0200 Subject: [PATCH 359/375] * Fixed a bug of AI target card in hand selection leading to UI hang if AI had no valid targets in hand (e.g. Show and Tell or Hypergenesis). --- .../java/mage/player/ai/ComputerPlayer.java | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 89d7ab37637..9670c6f17f5 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -74,6 +74,7 @@ import mage.abilities.mana.ManaAbility; import mage.abilities.mana.ManaOptions; import mage.cards.Card; import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.cards.decks.Deck; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; @@ -161,7 +162,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { private transient final static Logger log = Logger.getLogger(ComputerPlayer.class); protected int PASSIVITY_PENALTY = 5; // Penalty value for doing nothing if some actions are availble - protected boolean ALLOW_INTERRUPT = true; // change this for test / debugging purposes to false to switch off interrupts while debugging + protected boolean ALLOW_INTERRUPT = true; // change this for test / debugging purposes to false to switch off interrupts while debugging private transient Map unplayable = new TreeMap<>(); private transient List playableNonInstant = new ArrayList<>(); @@ -522,8 +523,11 @@ public class ComputerPlayer extends PlayerImpl implements Player { } if (target instanceof TargetDiscard || target instanceof TargetCardInHand) { if (outcome.isGood()) { - ArrayList cardsInHand = new ArrayList<>(hand.getCards(game)); - while (!target.isChosen() && !cardsInHand.isEmpty() && target.getMaxNumberOfTargets() > target.getTargets().size()) { + Cards cards = new CardsImpl(target.possibleTargets(source.getSourceId(), getId(), game)); + ArrayList cardsInHand = new ArrayList<>(cards.getCards(game)); + while (!target.isChosen() + && target.possibleTargets(source.getSourceId(), getId(), game).size() > 0 + && target.getMaxNumberOfTargets() > target.getTargets().size()) { Card card = pickBestCard(cardsInHand, null, target, source, game); if (card != null) { if (target.canTarget(getId(), card.getId(), source, game)) { @@ -684,17 +688,6 @@ public class ComputerPlayer extends PlayerImpl implements Player { } return target.isChosen(); } - if (target instanceof TargetCardInHand) { - List cards = new ArrayList<>(); - cards.addAll(this.hand.getCards(game)); - while (!target.isChosen() && !cards.isEmpty()) { - Card pick = pickTarget(cards, outcome, target, source, game); - if (pick != null) { - target.addTarget(pick.getId(), source, game); - } - } - return target.isChosen(); - } if (target instanceof TargetSpell) { if (game.getStack().size() > 0) { Iterator it = game.getStack().iterator(); From f50e67e38581991bb55e5bebe7747f7dc14f4c1f Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 16 Aug 2015 19:16:41 +0200 Subject: [PATCH 360/375] * Fixed card movement handling for face down cards. --- Mage.Common/src/mage/view/CardsView.java | 3 ++ .../src/mage/sets/iceage/Necropotence.java | 8 ++-- .../sets/khansoftarkir/VillainousWealth.java | 2 +- Mage.Sets/src/mage/sets/tempest/Lobotomy.java | 2 +- .../src/mage/sets/tempest/ScrollRack.java | 7 +++- .../java/org/mage/test/player/TestPlayer.java | 29 +++++++------- Mage/src/mage/players/Player.java | 9 ++--- Mage/src/mage/players/PlayerImpl.java | 40 ++++++++++--------- 8 files changed, 53 insertions(+), 47 deletions(-) diff --git a/Mage.Common/src/mage/view/CardsView.java b/Mage.Common/src/mage/view/CardsView.java index 2b72e78a1c2..4a7ee78da5b 100644 --- a/Mage.Common/src/mage/view/CardsView.java +++ b/Mage.Common/src/mage/view/CardsView.java @@ -152,6 +152,9 @@ public class CardsView extends LinkedHashMap { for (UUID uuid : abilityTargets) { MageObject mageObject = game.getObject(uuid); if (mageObject != null) { + if ((mageObject instanceof Card) && ((Card) mageObject).isFaceDown(game)) { + continue; + } names.add(GameLog.getColoredObjectIdNameForTooltip(mageObject)); } } diff --git a/Mage.Sets/src/mage/sets/iceage/Necropotence.java b/Mage.Sets/src/mage/sets/iceage/Necropotence.java index 0b1bb6d547e..40d11e6a202 100644 --- a/Mage.Sets/src/mage/sets/iceage/Necropotence.java +++ b/Mage.Sets/src/mage/sets/iceage/Necropotence.java @@ -143,10 +143,10 @@ class NecropotenceEffect extends OneShotEffect { Card card = controller.getLibrary().removeFromTop(game); if (controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, false)) { card.setFaceDown(true, game); - Effect returnToHandeffect = new ReturnToHandTargetEffect(false); - returnToHandeffect.setText("put that face down card into your hand"); - returnToHandeffect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToHandeffect, TargetController.YOU); + Effect returnToHandEffect = new ReturnToHandTargetEffect(false); + returnToHandEffect.setText("put that face down card into your hand"); + returnToHandEffect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToHandEffect, TargetController.YOU); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); delayedAbility.setSourceObject(source.getSourceObject(game), game); diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java b/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java index 919ade12531..4780c7e18a2 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java @@ -103,7 +103,7 @@ class VillainousWealthEffect extends OneShotEffect { if (player != null) { Cards cardsToExile = new CardsImpl(); cardsToExile.addAll(player.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); - controller.moveCards(cardsToExile, null, Zone.EXILED, source, game, true); + controller.moveCards(cardsToExile, null, Zone.EXILED, source, game); if (controller.chooseUse(Outcome.PlayForFree, "Cast cards exiled with " + mageObject.getLogName() + " without paying its mana cost?", source, game)) { OuterLoop: while (cardsToExile.count(filter, game) > 0) { diff --git a/Mage.Sets/src/mage/sets/tempest/Lobotomy.java b/Mage.Sets/src/mage/sets/tempest/Lobotomy.java index f96e3c8b7bb..440bfc01707 100644 --- a/Mage.Sets/src/mage/sets/tempest/Lobotomy.java +++ b/Mage.Sets/src/mage/sets/tempest/Lobotomy.java @@ -153,7 +153,7 @@ class LobotomyEffect extends OneShotEffect { } if (!cardsToExile.isEmpty()) { - controller.moveCards(cardsToExile, null, Zone.EXILED, source, game, true); + controller.moveCards(cardsToExile, null, Zone.EXILED, source, game); } targetPlayer.shuffleLibrary(game); return true; diff --git a/Mage.Sets/src/mage/sets/tempest/ScrollRack.java b/Mage.Sets/src/mage/sets/tempest/ScrollRack.java index 4d5ece41394..db4100fe0e7 100644 --- a/Mage.Sets/src/mage/sets/tempest/ScrollRack.java +++ b/Mage.Sets/src/mage/sets/tempest/ScrollRack.java @@ -27,6 +27,7 @@ */ package mage.sets.tempest; +import java.util.Set; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; @@ -110,7 +111,11 @@ class ScrollRackEffect extends OneShotEffect { } // Put that many cards from the top of your library into your hand. if (amountExiled > 0) { - controller.moveCards(controller.getLibrary().getTopCards(game, amountExiled), null, Zone.HAND, source, game, false); + Set cards = controller.getLibrary().getTopCards(game, amountExiled); + for (Card card : cards) { + card.setFaceDown(true, game); + } + controller.moveCards(cards, null, Zone.HAND, source, game); } // Then look at the exiled cards and put them on top of your library in any order controller.putCardsOnTopOfLibrary(game.getExile().getExileZone(source.getSourceId()), game, source, true); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index e76f6cc21ea..7806999ead1 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1677,21 +1677,20 @@ public class TestPlayer implements Player { return computerPlayer.moveCards(cards, fromZone, toZone, source, game); } - @Override - public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { - return computerPlayer.moveCards(cards, fromZone, toZone, source, game); - } - - @Override - public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { - return computerPlayer.moveCards(card, fromZone, toZone, source, game); - } - - @Override - public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { - return computerPlayer.moveCards(cards, fromZone, toZone, source, game); - } - +// @Override +// public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { +// return computerPlayer.moveCards(cards, fromZone, toZone, source, game); +// } +// +// @Override +// public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { +// return computerPlayer.moveCards(card, fromZone, toZone, source, game); +// } +// +// @Override +// public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { +// return computerPlayer.moveCards(cards, fromZone, toZone, source, game); +// } @Override public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game) { return computerPlayer.moveCardToHandWithInfo(card, sourceId, game); diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 88aa373b59c..4d450a9d58a 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -620,16 +620,13 @@ public interface Player extends MageItem, Copyable { */ boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game); - boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); - +// boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game); - boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); - +// boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game); - boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); - + // boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName); boolean moveCardsToExile(Set cards, Ability source, Game game, boolean withName, UUID exileId, String exileZoneName); /** diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index b5b2029a92e..6924f3e92b7 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2873,14 +2873,14 @@ public abstract class PlayerImpl implements Player, Serializable { public UUID getCommanderId() { return this.commanderId; } +// +// @Override +// public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game) { +// return moveCards(cards, fromZone, toZone, source, game, true); +// } @Override public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game) { - return moveCards(cards, fromZone, toZone, source, game, true); - } - - @Override - public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { Set cardList = new HashSet<>(); for (UUID cardId : cards) { if (fromZone == null) { @@ -2898,30 +2898,28 @@ public abstract class PlayerImpl implements Player, Serializable { } } } - return moveCards(cardList, fromZone, toZone, source, game, withName); + return moveCards(cardList, fromZone, toZone, source, game); } +// @Override +// public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game) { +// return moveCards(card, fromZone, toZone, source, game, true); +// } @Override public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game) { - return moveCards(card, fromZone, toZone, source, game, true); - } - - @Override - public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { Set cardList = new HashSet<>(); if (card != null) { cardList.add(card); } - return moveCards(cardList, fromZone, toZone, source, game, withName); + return moveCards(cardList, fromZone, toZone, source, game); } +// @Override +// public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game) { +// return moveCards(cards, fromZone, toZone, source, game, true); +// } @Override public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game) { - return moveCards(cards, fromZone, toZone, source, game, true); - } - - @Override - public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game, boolean withName) { if (cards.isEmpty()) { return true; } @@ -2931,6 +2929,7 @@ public abstract class PlayerImpl implements Player, Serializable { boolean result = false; for (Card card : cards) { fromZone = game.getState().getZone(card.getId()); + boolean withName = (fromZone.equals(Zone.BATTLEFIELD) || fromZone.equals(Zone.STACK)) || !card.isFaceDown(game); result |= moveCardToExileWithInfo(card, null, "", source == null ? null : source.getSourceId(), game, fromZone, withName); } return result; @@ -2940,20 +2939,23 @@ public abstract class PlayerImpl implements Player, Serializable { result = false; for (Card card : cards) { fromZone = game.getState().getZone(card.getId()); - result |= moveCardToHandWithInfo(card, source == null ? null : source.getSourceId(), game, withName); + boolean hideCard = fromZone.equals(Zone.LIBRARY) + || (card.isFaceDown(game) && !fromZone.equals(Zone.STACK) && !fromZone.equals(Zone.BATTLEFIELD)); + result |= moveCardToHandWithInfo(card, source == null ? null : source.getSourceId(), game, !hideCard); } return result; case BATTLEFIELD: result = false; for (Card card : cards) { fromZone = game.getState().getZone(card.getId()); - result |= putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId(), false, !withName); + result |= putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId(), false, !card.isFaceDown(game)); } return result; case LIBRARY: result = false; for (Card card : cards) { fromZone = game.getState().getZone(card.getId()); + boolean withName = fromZone.equals(Zone.BATTLEFIELD) || !card.isFaceDown(game); result |= moveCardToLibraryWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, true, withName); } return result; From f16dcac52c1629c96acb9979924fd15079ddac1e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 16 Aug 2015 19:38:25 +0200 Subject: [PATCH 361/375] Heartstone, Training Grounds, Power Artifact - Fixed that costs of activated mana abilities were not reduced. --- .../mage/sets/antiquities/PowerArtifact.java | 40 +++++++++---------- .../mage/sets/eventide/GroundlingPouncer.java | 6 +-- .../mage/sets/ravnica/SuppressionField.java | 13 ++---- .../riseoftheeldrazi/TrainingGrounds.java | 25 ++++++------ .../saviorsofkamigawa/GodosIrregulars.java | 9 +++-- .../src/mage/sets/stronghold/Heartstone.java | 4 +- 6 files changed, 48 insertions(+), 49 deletions(-) diff --git a/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java b/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java index 64ac7fd00bf..b36596b5cbe 100644 --- a/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java +++ b/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java @@ -8,6 +8,7 @@ package mage.sets.antiquities; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.cost.CostModificationEffectImpl; @@ -32,48 +33,46 @@ import mage.util.CardUtil; * @author nick.myers */ public class PowerArtifact extends CardImpl { - + public PowerArtifact(UUID ownerId) { super(ownerId, 55, "Power Artifact", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}{U}"); this.expansionSetCode = "ATQ"; this.subtype.add("Aura"); - + // Enchant artifact TargetPermanent auraTarget = new TargetArtifactPermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - - // The activation cost of target artifact is reduced by {2}. If this would reduce target - // artifact's activation cost below {1}, target artifact's activation cost becomes {1}. - // Power Artifact has no effect on artifacts that have no activation cost or whose activation - // cost is {0}. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PowerArtifactCostModificationEffect())); + + // Enchanted artifact's activated abilities cost less to activate. + // This effect can't reduce the amount of mana an ability costs to activate to less than one mana. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PowerArtifactCostModificationEffect())); } - + public PowerArtifact(final PowerArtifact card) { super(card); } - + @Override public PowerArtifact copy() { return new PowerArtifact(this); - } + } } class PowerArtifactCostModificationEffect extends CostModificationEffectImpl { - + PowerArtifactCostModificationEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); staticText = "The activation cost of target artifact is reduced by {2}. If this would reduce target artifact's activation cost below {1}, target artifact's activation cost becomes {1}. Power artifact has no effect on artifacts that have no activation cost or whose activation cost is {0}."; - + } - + PowerArtifactCostModificationEffect(PowerArtifactCostModificationEffect effect) { super(effect); } - + @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { Player controller = game.getPlayer(abilityToModify.getControllerId()); @@ -90,21 +89,22 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl { } return true; } - + @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { Permanent artifact = game.getPermanent(abilityToModify.getSourceId()); if (artifact != null && artifact.getAttachments().contains(source.getSourceId())) { - if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED)) { + if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED) + || (abilityToModify.getAbilityType().equals(AbilityType.MANA) && (abilityToModify instanceof ActivatedAbility))) { return true; } } return false; } - - @Override + + @Override public PowerArtifactCostModificationEffect copy() { return new PowerArtifactCostModificationEffect(this); } - + } diff --git a/Mage.Sets/src/mage/sets/eventide/GroundlingPouncer.java b/Mage.Sets/src/mage/sets/eventide/GroundlingPouncer.java index 1d7e0ead21c..79141ba5cc4 100644 --- a/Mage.Sets/src/mage/sets/eventide/GroundlingPouncer.java +++ b/Mage.Sets/src/mage/sets/eventide/GroundlingPouncer.java @@ -60,7 +60,7 @@ import mage.watchers.Watcher; * */ public class GroundlingPouncer extends CardImpl { - + private String rule = "{this} gets +1/+3 and gains flying until end of turn. Activate this ability only once each turn and only if an opponent controls a creature with flying."; public GroundlingPouncer(UUID ownerId) { @@ -118,7 +118,7 @@ class GroundingPouncerCondition implements Condition { class ActivatedAbilityUsedThisTurnWatcher extends Watcher { - public Set activatedThisTurn = new HashSet(); + public Set activatedThisTurn = new HashSet<>(); public ActivatedAbilityUsedThisTurnWatcher() { super("ActivatedAbilityUsedThisTurn", WatcherScope.GAME); @@ -156,4 +156,4 @@ class ActivatedAbilityUsedThisTurnWatcher extends Watcher { super.reset(); this.activatedThisTurn.clear(); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/ravnica/SuppressionField.java b/Mage.Sets/src/mage/sets/ravnica/SuppressionField.java index 7c4142711e2..ae8f16d7458 100644 --- a/Mage.Sets/src/mage/sets/ravnica/SuppressionField.java +++ b/Mage.Sets/src/mage/sets/ravnica/SuppressionField.java @@ -29,11 +29,8 @@ package mage.sets.ravnica; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.ActivatedAbility; -import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.mana.ManaAbility; import mage.cards.CardImpl; import mage.constants.AbilityType; import mage.constants.CardType; @@ -55,9 +52,8 @@ public class SuppressionField extends CardImpl { super(ownerId, 31, "Suppression Field", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); this.expansionSetCode = "RAV"; - // Activated abilities cost {2} more to activate unless they're mana abilities. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SuppressionFieldCostReductionEffect() )); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SuppressionFieldCostReductionEffect())); } public SuppressionField(final SuppressionField card) { @@ -72,7 +68,7 @@ public class SuppressionField extends CardImpl { class SuppressionFieldCostReductionEffect extends CostModificationEffectImpl { - SuppressionFieldCostReductionEffect ( ) { + SuppressionFieldCostReductionEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); staticText = "Activated abilities cost {2} more to activate unless they're mana abilities"; } @@ -89,10 +85,7 @@ class SuppressionFieldCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED)) { - return true; - } - return false; + return abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED); } @Override diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java index d1aeb9882d5..9919547c67c 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.riseoftheeldrazi; import java.util.LinkedHashSet; @@ -33,6 +32,7 @@ import java.util.Set; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.cards.CardImpl; @@ -56,14 +56,14 @@ import mage.util.CardUtil; */ public class TrainingGrounds extends CardImpl { - public TrainingGrounds (UUID ownerId) { + public TrainingGrounds(UUID ownerId) { super(ownerId, 91, "Training Grounds", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{U}"); this.expansionSetCode = "ROE"; this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new TrainingGroundsEffect())); } - public TrainingGrounds (final TrainingGrounds card) { + public TrainingGrounds(final TrainingGrounds card) { super(card); } @@ -74,7 +74,7 @@ public class TrainingGrounds extends CardImpl { } class TrainingGroundsEffect extends CostModificationEffectImpl { - + private static final String effectText = "Activated abilities of creatures you control cost up to {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana"; private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); @@ -90,41 +90,42 @@ class TrainingGroundsEffect extends CostModificationEffectImpl { @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { Player controller = game.getPlayer(abilityToModify.getControllerId()); - if (controller != null){ + if (controller != null) { Mana mana = abilityToModify.getManaCostsToPay().getMana(); int reduceMax = mana.getColorless(); - if (reduceMax > 0 && mana.count() == mana.getColorless()){ + if (reduceMax > 0 && mana.count() == mana.getColorless()) { reduceMax--; } - if (reduceMax > 2){ + if (reduceMax > 2) { reduceMax = 2; } if (reduceMax > 0) { ChoiceImpl choice = new ChoiceImpl(true); Set set = new LinkedHashSet<>(); - for(int i = 0; i <= reduceMax; i++){ + for (int i = 0; i <= reduceMax; i++) { set.add(String.valueOf(i)); } choice.setChoices(set); choice.setMessage("Reduce ability cost"); - if(controller.choose(Outcome.Benefit, choice, game)){ + if (controller.choose(Outcome.Benefit, choice, game)) { int reduce = Integer.parseInt(choice.getChoice()); CardUtil.reduceCost(abilityToModify, reduce); } } return true; } - return false; + return false; } @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED)) { + if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED) + || (abilityToModify.getAbilityType().equals(AbilityType.MANA) && (abilityToModify instanceof ActivatedAbility))) { //Activated abilities of creatures you control Permanent permanent = game.getPermanent(abilityToModify.getSourceId()); if (permanent != null && filter.match(permanent, source.getSourceId(), source.getControllerId(), game)) { - return true; + return true; } } return false; diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/GodosIrregulars.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/GodosIrregulars.java index ed5fe602c33..f346e94a319 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/GodosIrregulars.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/GodosIrregulars.java @@ -34,11 +34,9 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; -import mage.constants.AbilityType; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.Filter; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.BlockingAttackerIdPredicate; import mage.filter.predicate.permanent.BlockingPredicate; @@ -53,10 +51,13 @@ import mage.target.common.TargetCreaturePermanent; public class GodosIrregulars extends CardImpl { private static final FilterCreaturePermanent basicFilter = new FilterCreaturePermanent("creature blocking it"); + static { basicFilter.add(new BlockingPredicate()); } + public UUID originalAbilityIdToAdjust; + public GodosIrregulars(UUID ownerId) { super(ownerId, 101, "Godo's Irregulars", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}"); this.expansionSetCode = "SOK"; @@ -69,12 +70,13 @@ public class GodosIrregulars extends CardImpl { // {R}: Godo's Irregulars deals 1 damage to target creature blocking it. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{R")); ability.addTarget(new TargetCreaturePermanent()); + originalAbilityIdToAdjust = ability.getOriginalId(); this.addAbility(ability); } @Override public void adjustTargets(Ability ability, Game game) { - if (ability.getAbilityType().equals(AbilityType.ACTIVATED)) { + if (originalAbilityIdToAdjust.equals(ability.getOriginalId())) { ability.getTargets().clear(); FilterCreaturePermanent filter = basicFilter.copy(); filter.add(new BlockingAttackerIdPredicate(this.getId())); @@ -85,6 +87,7 @@ public class GodosIrregulars extends CardImpl { public GodosIrregulars(final GodosIrregulars card) { super(card); + this.originalAbilityIdToAdjust = card.originalAbilityIdToAdjust; } @Override diff --git a/Mage.Sets/src/mage/sets/stronghold/Heartstone.java b/Mage.Sets/src/mage/sets/stronghold/Heartstone.java index 4b4af5e2c9a..0d530dfacd3 100644 --- a/Mage.Sets/src/mage/sets/stronghold/Heartstone.java +++ b/Mage.Sets/src/mage/sets/stronghold/Heartstone.java @@ -30,6 +30,7 @@ package mage.sets.stronghold; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.cards.CardImpl; @@ -99,7 +100,8 @@ class HeartstoneEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED)) { + if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED) + || (abilityToModify.getAbilityType().equals(AbilityType.MANA) && (abilityToModify instanceof ActivatedAbility))) { // Activated abilities of creatures Permanent permanent = game.getPermanent(abilityToModify.getSourceId()); if (permanent != null && filter.match(permanent, source.getSourceId(), source.getControllerId(), game)) { From a6012c72ac6f0ddeb5b559372032f0f52bbd7aae Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 16 Aug 2015 19:58:45 +0200 Subject: [PATCH 362/375] * Lobotomy - Fixed bug with selecting cards from target players hand. --- Mage.Sets/src/mage/sets/tempest/Lobotomy.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Mage.Sets/src/mage/sets/tempest/Lobotomy.java b/Mage.Sets/src/mage/sets/tempest/Lobotomy.java index 440bfc01707..e666c50d0ec 100644 --- a/Mage.Sets/src/mage/sets/tempest/Lobotomy.java +++ b/Mage.Sets/src/mage/sets/tempest/Lobotomy.java @@ -46,8 +46,8 @@ import mage.filter.predicate.mageobject.NamePredicate; import mage.filter.predicate.mageobject.SupertypePredicate; import mage.game.Game; import mage.players.Player; +import mage.target.TargetCard; import mage.target.TargetPlayer; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetCardInLibrary; /** @@ -100,13 +100,13 @@ class LobotomyEffect extends OneShotEffect { if (targetPlayer != null && sourceObject != null && controller != null) { // reveal hand of target player - targetPlayer.revealCards(sourceObject.getName(), targetPlayer.getHand(), game); + targetPlayer.revealCards(sourceObject.getIdName(), targetPlayer.getHand(), game); // You choose card other than a basic land card - TargetCardInHand target = new TargetCardInHand(filter); + TargetCard target = new TargetCard(Zone.HAND, filter); target.setNotTarget(true); Card chosenCard = null; - if (controller.choose(Outcome.Benefit, targetPlayer.getHand(), target, game)) { + if (controller.chooseTarget(Outcome.Benefit, targetPlayer.getHand(), target, source, game)) { chosenCard = game.getCard(target.getFirstTarget()); } @@ -115,6 +115,7 @@ class LobotomyEffect extends OneShotEffect { FilterCard filterNamedCards = new FilterCard(); if (chosenCard != null) { filterNamedCards.add(new NamePredicate(chosenCard.getName())); + filterNamedCards.setMessage("cards named " + chosenCard.getName()); } else { filterNamedCards.add(new NamePredicate("----")); // so no card matches } @@ -129,8 +130,8 @@ class LobotomyEffect extends OneShotEffect { } } // search cards in hand - TargetCardInHand targetCardsHand = new TargetCardInHand(0, Integer.MAX_VALUE, filterNamedCards); - controller.chooseTarget(outcome, targetPlayer.getGraveyard(), targetCardsHand, source, game); + TargetCard targetCardsHand = new TargetCard(0, Integer.MAX_VALUE, Zone.HAND, filterNamedCards); + controller.chooseTarget(outcome, targetPlayer.getHand(), targetCardsHand, source, game); for (UUID cardId : targetCardsHand.getTargets()) { Card card = game.getCard(cardId); if (card != null) { From 5f698a54f434ac1baf89d6e8a769431a6314e489 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 16 Aug 2015 22:00:02 +0300 Subject: [PATCH 363/375] Fix Complicate and Death Pulse: the triggered ability is optional. Implement cards: Primal Boost and Sunfire Balm --- .../src/mage/sets/onslaught/Complicate.java | 6 +- .../src/mage/sets/onslaught/DeathPulse.java | 4 +- .../src/mage/sets/onslaught/PrimalBoost.java | 71 ++++++++++++++++++ .../src/mage/sets/onslaught/SunfireBalm.java | 72 +++++++++++++++++++ 4 files changed, 148 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/onslaught/PrimalBoost.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/SunfireBalm.java diff --git a/Mage.Sets/src/mage/sets/onslaught/Complicate.java b/Mage.Sets/src/mage/sets/onslaught/Complicate.java index 29e679a624c..3d5023a5869 100644 --- a/Mage.Sets/src/mage/sets/onslaught/Complicate.java +++ b/Mage.Sets/src/mage/sets/onslaught/Complicate.java @@ -52,12 +52,12 @@ public class Complicate extends CardImpl { // Counter target spell unless its controller pays {3}. this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new GenericManaCost(3))); this.getSpellAbility().addTarget(new TargetSpell()); - + // Cycling {2}{U} this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}{U}"))); - + // When you cycle Complicate, you may counter target spell unless its controller pays {1}. - Ability ability = new CycleTriggeredAbility(new CounterUnlessPaysEffect(new GenericManaCost(1))); + Ability ability = new CycleTriggeredAbility(new CounterUnlessPaysEffect(new GenericManaCost(1)), true); ability.addTarget(new TargetSpell()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/onslaught/DeathPulse.java b/Mage.Sets/src/mage/sets/onslaught/DeathPulse.java index be0c44a8f87..0cf9e25b03d 100644 --- a/Mage.Sets/src/mage/sets/onslaught/DeathPulse.java +++ b/Mage.Sets/src/mage/sets/onslaught/DeathPulse.java @@ -52,11 +52,11 @@ public class DeathPulse extends CardImpl { // Target creature gets -4/-4 until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect(-4, -4, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - + // Cycling {1}{B}{B} this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{B}{B}"))); // When you cycle Death Pulse, you may have target creature get -1/-1 until end of turn. - Ability ability = new CycleTriggeredAbility(new BoostTargetEffect(-1, -1, Duration.EndOfTurn)); + Ability ability = new CycleTriggeredAbility(new BoostTargetEffect(-1, -1, Duration.EndOfTurn), true); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/onslaught/PrimalBoost.java b/Mage.Sets/src/mage/sets/onslaught/PrimalBoost.java new file mode 100644 index 00000000000..9d050f1fc28 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/PrimalBoost.java @@ -0,0 +1,71 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.CycleTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class PrimalBoost extends CardImpl { + + public PrimalBoost(UUID ownerId) { + super(ownerId, 277, "Primal Boost", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{G}"); + this.expansionSetCode = "ONS"; + + // Target creature gets +4/+4 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(4, 4, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + // Cycling {2}{G} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}{G}"))); + // When you cycle Primal Boost, you may have target creature get +1/+1 until end of turn. + Ability ability = new CycleTriggeredAbility(new BoostTargetEffect(1, 1, Duration.EndOfTurn), true); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public PrimalBoost(final PrimalBoost card) { + super(card); + } + + @Override + public PrimalBoost copy() { + return new PrimalBoost(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/SunfireBalm.java b/Mage.Sets/src/mage/sets/onslaught/SunfireBalm.java new file mode 100644 index 00000000000..896fcdc29a9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/SunfireBalm.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.onslaught; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.CycleTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LoneFox + */ +public class SunfireBalm extends CardImpl { + + public SunfireBalm(UUID ownerId) { + super(ownerId, 56, "Sunfire Balm", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); + this.expansionSetCode = "ONS"; + + // Prevent the next 4 damage that would be dealt to target creature or player this turn. + this.getSpellAbility().addEffect(new PreventDamageToTargetEffect(Duration.EndOfTurn, 4)); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + // Cycling {1}{W} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{W}"))); + // When you cycle Sunfire Balm, you may prevent the next 1 damage that would be dealt to target creature or player this turn. + Ability ability = new CycleTriggeredAbility(new PreventDamageToTargetEffect(Duration.EndOfTurn, 1), true); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + + } + + public SunfireBalm(final SunfireBalm card) { + super(card); + } + + @Override + public SunfireBalm copy() { + return new SunfireBalm(this); + } +} From c570f3b637bc263e70ba73d3c3aa647a9481e9e0 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 16 Aug 2015 22:01:22 +0300 Subject: [PATCH 364/375] Fix Seaside Haven: add missing card drawing effect. --- Mage.Sets/src/mage/sets/onslaught/SeasideHaven.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/onslaught/SeasideHaven.java b/Mage.Sets/src/mage/sets/onslaught/SeasideHaven.java index 193ab18919c..eaccc8185cf 100644 --- a/Mage.Sets/src/mage/sets/onslaught/SeasideHaven.java +++ b/Mage.Sets/src/mage/sets/onslaught/SeasideHaven.java @@ -33,6 +33,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.constants.CardType; @@ -47,9 +48,9 @@ import mage.target.common.TargetControlledPermanent; * @author anonymous */ public class SeasideHaven extends CardImpl { - + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Bird"); - + static{ filter.add(new SubtypePredicate("Bird")); } @@ -61,7 +62,7 @@ public class SeasideHaven extends CardImpl { // {tap}: Add {1} to your mana pool. this.addAbility(new ColorlessManaAbility()); // {W}{U}, {tap}, Sacrifice a Bird: Draw a card. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, null, new ManaCostsImpl<>("{W}{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl<>("{W}{U}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); this.addAbility(ability); From 40d2eabedb1022823bcddc3330d62756fb1012cd Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 16 Aug 2015 22:06:06 +0300 Subject: [PATCH 365/375] Update the text of Goblin Burrows --- Mage.Sets/src/mage/sets/onslaught/GoblinBurrows.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/onslaught/GoblinBurrows.java b/Mage.Sets/src/mage/sets/onslaught/GoblinBurrows.java index c54781b82e8..66bcc8033fe 100644 --- a/Mage.Sets/src/mage/sets/onslaught/GoblinBurrows.java +++ b/Mage.Sets/src/mage/sets/onslaught/GoblinBurrows.java @@ -49,7 +49,7 @@ import mage.target.common.TargetCreaturePermanent; */ public class GoblinBurrows extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin creature"); static { filter.add(new SubtypePredicate(("Goblin"))); From 60bc09ca4f0cbe0ddb6aedef224d359f5ac6baf6 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 16 Aug 2015 22:22:31 +0300 Subject: [PATCH 366/375] Fix Beacon of Immortality: use target player's current life total instead of starting life total. --- Mage.Sets/src/mage/sets/tenthedition/BeaconOfImmortality.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/tenthedition/BeaconOfImmortality.java b/Mage.Sets/src/mage/sets/tenthedition/BeaconOfImmortality.java index b9a3ecc2241..b382e323c53 100644 --- a/Mage.Sets/src/mage/sets/tenthedition/BeaconOfImmortality.java +++ b/Mage.Sets/src/mage/sets/tenthedition/BeaconOfImmortality.java @@ -87,9 +87,9 @@ class BeaconOfImmortalityEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getFirstTarget()); if (player != null) { - int amount = game.getLife(); + int amount = player.getLife(); if (amount < 0) { - player.loseLife(amount, game); + player.loseLife(-amount, game); return true; } if (amount > 0) { From cb88f5d920f94ed3bf476976a5d77c1c3da8a59d Mon Sep 17 00:00:00 2001 From: fireshoes Date: Sun, 16 Aug 2015 23:15:59 -0500 Subject: [PATCH 367/375] Implemented 10 cards. --- .../mage/sets/futuresight/UtopiaMycon.java | 91 ++++++++++++ .../src/mage/sets/mirage/PaupersCage.java | 67 +++++++++ .../src/mage/sets/mirage/SapphireCharm.java | 93 ++++++++++++ .../mage/sets/onslaught/KrosanColossus.java | 63 ++++++++ .../mage/sets/onslaught/OversoldCemetery.java | 69 +++++++++ .../saviorsofkamigawa/IvoryCraneNetsuke.java | 134 +++++++++--------- .../sets/stronghold/TorturedExistence.java | 68 +++++++++ .../src/mage/sets/tempest/HandToHand.java | 118 +++++++++++++++ .../src/mage/sets/tempest/ScaldingTongs.java | 68 +++++++++ .../src/mage/sets/tempest/Thumbscrews.java | 69 +++++++++ .../src/mage/sets/weatherlight/Abeyance.java | 121 ++++++++++++++++ 11 files changed, 894 insertions(+), 67 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/futuresight/UtopiaMycon.java create mode 100644 Mage.Sets/src/mage/sets/mirage/PaupersCage.java create mode 100644 Mage.Sets/src/mage/sets/mirage/SapphireCharm.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/KrosanColossus.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/OversoldCemetery.java create mode 100644 Mage.Sets/src/mage/sets/stronghold/TorturedExistence.java create mode 100644 Mage.Sets/src/mage/sets/tempest/HandToHand.java create mode 100644 Mage.Sets/src/mage/sets/tempest/ScaldingTongs.java create mode 100644 Mage.Sets/src/mage/sets/tempest/Thumbscrews.java create mode 100644 Mage.Sets/src/mage/sets/weatherlight/Abeyance.java diff --git a/Mage.Sets/src/mage/sets/futuresight/UtopiaMycon.java b/Mage.Sets/src/mage/sets/futuresight/UtopiaMycon.java new file mode 100644 index 00000000000..45f3a6749af --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/UtopiaMycon.java @@ -0,0 +1,91 @@ +/* + * 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.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.permanent.token.SaprolingToken; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class UtopiaMycon extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Saproling"); + + static { + filter.add(new SubtypePredicate("Saproling")); + } + + public UtopiaMycon(UUID ownerId) { + super(ownerId, 140, "Utopia Mycon", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{G}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Fungus"); + this.power = new MageInt(0); + this.toughness = new MageInt(2); + + // At the beginning of your upkeep, put a spore counter on Utopia Mycon. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.SPORE.createInstance()), TargetController.YOU, false)); + + // Remove three spore counters from Utopia Mycon: Put a 1/1 green Saproling creature token onto the battlefield. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken()), new RemoveCountersSourceCost(CounterType.SPORE.createInstance(3)))); + + // Sacrifice a Saproling: Add one mana of any color to your mana pool. + Ability ability = new AnyColorManaAbility(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1, filter, false))); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public UtopiaMycon(final UtopiaMycon card) { + super(card); + } + + @Override + public UtopiaMycon copy() { + return new UtopiaMycon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/PaupersCage.java b/Mage.Sets/src/mage/sets/mirage/PaupersCage.java new file mode 100644 index 00000000000..7a2d0d3741d --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/PaupersCage.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.mirage; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class PaupersCage extends CardImpl { + + public PaupersCage(UUID ownerId) { + super(ownerId, 279, "Paupers' Cage", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}"); + this.expansionSetCode = "MIR"; + + // At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Paupers' Cage deals 2 damage to him or her. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, + new DamageTargetEffect(2), TargetController.OPPONENT, false, true); + CardsInHandCondition condition = new CardsInHandCondition(CardsInHandCondition.CountType.FEWER_THAN, 3); + this.addAbility(new ConditionalTriggeredAbility(ability, condition, "At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, {this} deals 2 damage to him or her.")); + } + + public PaupersCage(final PaupersCage card) { + super(card); + } + + @Override + public PaupersCage copy() { + return new PaupersCage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/SapphireCharm.java b/Mage.Sets/src/mage/sets/mirage/SapphireCharm.java new file mode 100644 index 00000000000..187e8399b5f --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirage/SapphireCharm.java @@ -0,0 +1,93 @@ +/* + * 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.mirage; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardTargetEffect; +import mage.abilities.effects.common.PhaseOutTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class SapphireCharm extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public SapphireCharm(UUID ownerId) { + super(ownerId, 89, "Sapphire Charm", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{U}"); + this.expansionSetCode = "MIR"; + + // Choose one - Target player draws a card at the beginning of the next turn's upkeep; + Effect effect = new DrawCardTargetEffect(1); + effect.setText("Target player draws a card"); + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(effect), true)); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // or target creature gains flying until end of turn; + Mode mode = new Mode(); + mode.getEffects().add(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn)); + mode.getTargets().add(new TargetCreaturePermanent()); + this.getSpellAbility().addMode(mode); + + // or target creature an opponent controls phases out. + mode = new Mode(); + mode.getEffects().add(new PhaseOutTargetEffect()); + mode.getTargets().add(new TargetCreaturePermanent(filter)); + this.getSpellAbility().addMode(mode); + } + + public SapphireCharm(final SapphireCharm card) { + super(card); + } + + @Override + public SapphireCharm copy() { + return new SapphireCharm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/KrosanColossus.java b/Mage.Sets/src/mage/sets/onslaught/KrosanColossus.java new file mode 100644 index 00000000000..bc7d6f1918e --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/KrosanColossus.java @@ -0,0 +1,63 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class KrosanColossus extends CardImpl { + + public KrosanColossus(UUID ownerId) { + super(ownerId, 270, "Krosan Colossus", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{G}{G}{G}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Beast"); + this.power = new MageInt(9); + this.toughness = new MageInt(9); + + // Morph {6}{G}{G} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{6}{G}{G}"))); + } + + public KrosanColossus(final KrosanColossus card) { + super(card); + } + + @Override + public KrosanColossus copy() { + return new KrosanColossus(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/OversoldCemetery.java b/Mage.Sets/src/mage/sets/onslaught/OversoldCemetery.java new file mode 100644 index 00000000000..1f5ff6efbeb --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/OversoldCemetery.java @@ -0,0 +1,69 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author fireshoes + */ +public class OversoldCemetery extends CardImpl { + + public OversoldCemetery(UUID ownerId) { + super(ownerId, 160, "Oversold Cemetery", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + this.expansionSetCode = "ONS"; + + // At the beginning of your upkeep, if you have four or more creature cards in your graveyard, you may return target creature card from your graveyard to your hand. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(), TargetController.YOU, true); + ability.addTarget(new TargetCardInGraveyard(new FilterCreatureCard())); + CardsInControllerGraveCondition condition = new CardsInControllerGraveCondition(4, new FilterCreatureCard("creature card from your graveyard")); + this.addAbility(new ConditionalTriggeredAbility(ability, condition, "At the beginning of your upkeep, if you have four or more creature cards in your graveyard, you may return target creature card from your graveyard to your hand.")); + } + + public OversoldCemetery(final OversoldCemetery card) { + super(card); + } + + @Override + public OversoldCemetery copy() { + return new OversoldCemetery(this); + } +} diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/IvoryCraneNetsuke.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/IvoryCraneNetsuke.java index 0ab2b4e3fdb..313615c5fae 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/IvoryCraneNetsuke.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/IvoryCraneNetsuke.java @@ -1,67 +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.saviorsofkamigawa; - -import java.util.UUID; -import mage.abilities.TriggeredAbility; -import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.condition.common.CardsInHandCondition; -import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.GainLifeEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.TargetController; -import mage.constants.Zone; - -/** - * - * @author LevelX2 - */ -public class IvoryCraneNetsuke extends CardImpl { - - public IvoryCraneNetsuke(UUID ownerId) { - super(ownerId, 155, "Ivory Crane Netsuke", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); - this.expansionSetCode = "SOK"; - - // At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life. - TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(4), TargetController.YOU, false); - CardsInHandCondition contition = new CardsInHandCondition(CardsInHandCondition.CountType.MORE_THAN, 6); - this.addAbility(new ConditionalTriggeredAbility(ability, contition, "At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life.")); - - } - - public IvoryCraneNetsuke(final IvoryCraneNetsuke card) { - super(card); - } - - @Override - public IvoryCraneNetsuke copy() { - return new IvoryCraneNetsuke(this); - } -} +/* + * 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.saviorsofkamigawa; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class IvoryCraneNetsuke extends CardImpl { + + public IvoryCraneNetsuke(UUID ownerId) { + super(ownerId, 155, "Ivory Crane Netsuke", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "SOK"; + + // At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(4), TargetController.YOU, false); + CardsInHandCondition condition = new CardsInHandCondition(CardsInHandCondition.CountType.MORE_THAN, 6); + this.addAbility(new ConditionalTriggeredAbility(ability, condition, "At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life.")); + + } + + public IvoryCraneNetsuke(final IvoryCraneNetsuke card) { + super(card); + } + + @Override + public IvoryCraneNetsuke copy() { + return new IvoryCraneNetsuke(this); + } +} diff --git a/Mage.Sets/src/mage/sets/stronghold/TorturedExistence.java b/Mage.Sets/src/mage/sets/stronghold/TorturedExistence.java new file mode 100644 index 00000000000..8c9bb1aea4f --- /dev/null +++ b/Mage.Sets/src/mage/sets/stronghold/TorturedExistence.java @@ -0,0 +1,68 @@ +/* + * 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.stronghold; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class TorturedExistence extends CardImpl { + + public TorturedExistence(UUID ownerId) { + super(ownerId, 24, "Tortured Existence", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}"); + this.expansionSetCode = "STH"; + + // {B}, Discard a creature card: Return target creature card from your graveyard to your hand. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(), new ManaCostsImpl("{B}")); + ability.addCost(new DiscardCardCost(new FilterCreatureCard())); + ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); + this.addAbility(ability); + } + + public TorturedExistence(final TorturedExistence card) { + super(card); + } + + @Override + public TorturedExistence copy() { + return new TorturedExistence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/HandToHand.java b/Mage.Sets/src/mage/sets/tempest/HandToHand.java new file mode 100644 index 00000000000..0e6ce50ad75 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/HandToHand.java @@ -0,0 +1,118 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.mana.ManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TurnPhase; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class HandToHand extends CardImpl { + + public HandToHand(UUID ownerId) { + super(ownerId, 180, "Hand to Hand", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + this.expansionSetCode = "TMP"; + + // During combat, players can't cast instant spells or activate abilities that aren't mana abilities. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HandToHandEffect())); + } + + public HandToHand(final HandToHand card) { + super(card); + } + + @Override + public HandToHand copy() { + return new HandToHand(this); + } +} + +class HandToHandEffect extends ContinuousRuleModifyingEffectImpl { + + public HandToHandEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "During combat, players can't cast instant spells or activate abilities that aren't mana abilities"; + } + + public HandToHandEffect(final HandToHandEffect effect) { + super(effect); + } + + @Override + public HandToHandEffect copy() { + return new HandToHandEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public String getInfoMessage(Ability source, GameEvent event, Game game) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + return "During combat, players can't cast instant spells or activate abilities that aren't mana abilities (" + mageObject.getLogName() + ")."; + } + return null; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (game.getPhase().getType() == TurnPhase.COMBAT) { + MageObject object = game.getObject(event.getSourceId()); + if (event.getType() == GameEvent.EventType.CAST_SPELL) { + if (object.getCardType().contains(CardType.INSTANT)) { + return true; + } + } + if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { + Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability != null && !(ability instanceof ManaAbility)) { + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/ScaldingTongs.java b/Mage.Sets/src/mage/sets/tempest/ScaldingTongs.java new file mode 100644 index 00000000000..fd52fed1e12 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/ScaldingTongs.java @@ -0,0 +1,68 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class ScaldingTongs extends CardImpl { + + public ScaldingTongs(UUID ownerId) { + super(ownerId, 297, "Scalding Tongs", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "TMP"; + + // At the beginning of your upkeep, if you have three or fewer cards in hand, Scalding Tongs deals 1 damage to target opponent. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), TargetController.YOU, false); + ability.addTarget(new TargetOpponent()); + CardsInHandCondition condition = new CardsInHandCondition(CardsInHandCondition.CountType.FEWER_THAN, 4); + this.addAbility(new ConditionalTriggeredAbility(ability, condition, "At the beginning of your upkeep, if you have three or fewer cards in hand, {this} deals 1 damage to target opponent.")); + } + + public ScaldingTongs(final ScaldingTongs card) { + super(card); + } + + @Override + public ScaldingTongs copy() { + return new ScaldingTongs(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/Thumbscrews.java b/Mage.Sets/src/mage/sets/tempest/Thumbscrews.java new file mode 100644 index 00000000000..0d43d04e3ce --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/Thumbscrews.java @@ -0,0 +1,69 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class Thumbscrews extends CardImpl { + + public Thumbscrews(UUID ownerId) { + super(ownerId, 302, "Thumbscrews", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "TMP"; + + // At the beginning of your upkeep, if you have five or more cards in hand, Thumbscrews deals 1 damage to target opponent. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, + new DamageTargetEffect(1), TargetController.YOU, false); + ability.addTarget(new TargetOpponent()); + CardsInHandCondition condition = new CardsInHandCondition(CardsInHandCondition.CountType.MORE_THAN, 4); + this.addAbility(new ConditionalTriggeredAbility(ability, condition, "At the beginning of your upkeep, if you have five or more cards in hand, {this} deals 1 damage to target opponent.")); + } + + public Thumbscrews(final Thumbscrews card) { + super(card); + } + + @Override + public Thumbscrews copy() { + return new Thumbscrews(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/Abeyance.java b/Mage.Sets/src/mage/sets/weatherlight/Abeyance.java new file mode 100644 index 00000000000..fe3b4d4f6e4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/Abeyance.java @@ -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.weatherlight; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.mana.ManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class Abeyance extends CardImpl { + + public Abeyance(UUID ownerId) { + super(ownerId, 117, "Abeyance", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "WTH"; + + // Until end of turn, target player can't cast instant or sorcery spells, and that player can't activate abilities that aren't mana abilities. + this.getSpellAbility().addEffect(new AbeyanceEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public Abeyance(final Abeyance card) { + super(card); + } + + @Override + public Abeyance copy() { + return new Abeyance(this); + } +} + +class AbeyanceEffect extends ContinuousRuleModifyingEffectImpl { + + public AbeyanceEffect() { + super(Duration.EndOfTurn, Outcome.Detriment); + staticText = "Until end of turn, target player can't cast instant or sorcery spells, and that player can't activate abilities that aren't mana abilities"; + } + + public AbeyanceEffect(final AbeyanceEffect effect) { + super(effect); + } + + @Override + public AbeyanceEffect copy() { + return new AbeyanceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public String getInfoMessage(Ability source, GameEvent event, Game game) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + return "You can't cast instant or sorcery spells or activate abilities that aren't mana abilities this turn (" + mageObject.getLogName() + ")."; + } + return null; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getPlayerId().equals(source.getFirstTarget())) { + MageObject object = game.getObject(event.getSourceId()); + if (event.getType() == GameEvent.EventType.CAST_SPELL) { + if (object.getCardType().contains(CardType.INSTANT) || object.getCardType().contains(CardType.SORCERY)) { + return true; + } + } + if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { + Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability != null && !(ability instanceof ManaAbility)) { + return true; + } + } + } + return false; + } +} From 889d18af725197e0332b0f86a17eaaedc195a7bc Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 10:21:03 +0200 Subject: [PATCH 368/375] * Curse of Shallow Graves - Fixed that the correct player may decide to create the token. --- .../commander2013/CurseOfShallowGraves.java | 36 +++++++++++++++++-- .../common/CreateTokenTargetEffect.java | 13 ++----- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java b/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java index fa2e34e982f..d51655b3c7d 100644 --- a/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java +++ b/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java @@ -28,9 +28,11 @@ package mage.sets.commander2013; import java.util.UUID; +import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.abilities.keyword.EnchantAbility; @@ -44,6 +46,7 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.game.permanent.token.ZombieToken; +import mage.players.Player; import mage.target.TargetPlayer; import mage.target.targetpointer.FixedTarget; @@ -59,7 +62,6 @@ public class CurseOfShallowGraves extends CardImpl { this.subtype.add("Aura"); this.subtype.add("Curse"); - // Enchant player TargetPlayer auraTarget = new TargetPlayer(); this.getSpellAbility().addTarget(auraTarget); @@ -83,7 +85,7 @@ public class CurseOfShallowGraves extends CardImpl { class CurseOfShallowTriggeredAbility extends TriggeredAbilityImpl { public CurseOfShallowTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenTargetEffect(new ZombieToken(), new StaticValue(1), true, false), true); + super(Zone.BATTLEFIELD, new CurseOfShallowEffect()); } public CurseOfShallowTriggeredAbility(Effect effect, boolean optional, String text) { @@ -105,7 +107,7 @@ class CurseOfShallowTriggeredAbility extends TriggeredAbilityImpl { if (enchantment != null && enchantment.getAttachedTo() != null && game.getCombat().getPlayerDefenders(game).contains(enchantment.getAttachedTo())) { - for (Effect effect: this.getEffects()) { + for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackerId())); } return true; @@ -124,3 +126,31 @@ class CurseOfShallowTriggeredAbility extends TriggeredAbilityImpl { } } + +class CurseOfShallowEffect extends OneShotEffect { + + public CurseOfShallowEffect() { + super(Outcome.Benefit); + this.staticText = "that attacking player may put a 2/2 black Zombie creature token onto the battlefield tapped"; + } + + public CurseOfShallowEffect(final CurseOfShallowEffect effect) { + super(effect); + } + + @Override + public CurseOfShallowEffect copy() { + return new CurseOfShallowEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player attacker = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (attacker != null && attacker.chooseUse(outcome, "Put a 2/2 black Zombie creature token onto the battlefield tapped?", source, game)) { + Effect effect = new CreateTokenTargetEffect(new ZombieToken(), new StaticValue(1), true, false); + effect.setTargetPointer(targetPointer); + return effect.apply(game, source); + } + return false; + } +} diff --git a/Mage/src/mage/abilities/effects/common/CreateTokenTargetEffect.java b/Mage/src/mage/abilities/effects/common/CreateTokenTargetEffect.java index 9c0e72eef9e..91fcdb1c40d 100644 --- a/Mage/src/mage/abilities/effects/common/CreateTokenTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/CreateTokenTargetEffect.java @@ -1,23 +1,20 @@ package mage.abilities.effects.common; -import java.util.Locale; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.token.Token; -import mage.players.Player; import mage.util.CardUtil; /** * @author Loki */ - public class CreateTokenTargetEffect extends OneShotEffect { + private Token token; private DynamicValue amount; private boolean tapped; @@ -59,14 +56,10 @@ public class CreateTokenTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int value = amount.calculate(game, source, this); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - if (value < 1) { - return true; - } + if (value > 0) { return token.putOntoBattlefield(value, game, source.getSourceId(), targetPointer.getFirst(game, source), tapped, attacking); } - return false; + return true; } @Override From 3b08d1ca8c41d4e7702bc569d541dc53122d4d3d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 11:57:41 +0200 Subject: [PATCH 369/375] * Commander Greven il-Vec - Fixed that the sacrifice was handled targeted. --- .../src/mage/sets/tempest/CommanderGrevenIlVec.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Mage.Sets/src/mage/sets/tempest/CommanderGrevenIlVec.java b/Mage.Sets/src/mage/sets/tempest/CommanderGrevenIlVec.java index 1ca56981e19..b7e5293c30a 100644 --- a/Mage.Sets/src/mage/sets/tempest/CommanderGrevenIlVec.java +++ b/Mage.Sets/src/mage/sets/tempest/CommanderGrevenIlVec.java @@ -31,12 +31,11 @@ import java.util.UUID; import mage.constants.CardType; import mage.constants.Rarity; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.keyword.FearAbility; import mage.cards.CardImpl; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; /** * @@ -53,10 +52,12 @@ public class CommanderGrevenIlVec extends CardImpl { this.power = new MageInt(7); this.toughness = new MageInt(5); - Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeTargetEffect(), false); - ability.addTarget(new TargetControlledCreaturePermanent()); - this.addAbility(ability); + + // Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) this.addAbility(FearAbility.getInstance()); + + // When Commander Greven il-Vec enters the battlefield, sacrifice a creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterCreaturePermanent(), 1, ""), false)); } public CommanderGrevenIlVec(final CommanderGrevenIlVec card) { From d7e64287efca3b20e57856988812c237151daba8 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 12:01:48 +0200 Subject: [PATCH 370/375] * Phyrexian War Beast - Fixed that the land sacrifice was handled targeted. --- Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java index 5dad7465e1b..e91607c20c2 100644 --- a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java +++ b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageControllerEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; @@ -54,10 +54,8 @@ public class PhyrexianWarBeast1 extends CardImpl { this.toughness = new MageInt(4); // When Phyrexian War Beast leaves the battlefield, sacrifice a land and Phyrexian War Beast deals 1 damage to you. - Effect effect = new SacrificeTargetEffect(); - effect.setText("sacrifice a land"); - Ability ability = new LeavesBattlefieldTriggeredAbility(effect, false); - effect = new DamageControllerEffect(1); + Ability ability = new LeavesBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterControlledLandPermanent(), 1, ""), false); + Effect effect = new DamageControllerEffect(1); effect.setText("and {this} deals 1 damage to you"); ability.addEffect(effect); ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); From 8d1da5c35fc9ef8bee1bb217a81313186896d9b7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 12:36:42 +0200 Subject: [PATCH 371/375] * Fixed a lot of sacrifice handling that was targeted and some sacrifice where the player that could sacrifice was not checked correctly (e.g. Kiki-Jiki, Mirror Breaker Token). --- .../mage/sets/alarareborn/SlaveOfBolas.java | 25 ++++--- .../sets/alliances/LordOfTresserhorn.java | 11 +-- .../sets/avacynrestored/ThatcherRevolt.java | 26 ++++--- .../sets/championsofkamigawa/JunkyoBell.java | 71 +++++++++--------- .../KikiJikiMirrorBreaker.java | 10 +-- .../championsofkamigawa/OniPossession.java | 28 ++++--- .../championsofkamigawa/ThroughTheBreach.java | 9 +-- .../commander2014/FeldonOfTheThirdPath.java | 20 ++--- .../mage/sets/commander2014/WakeTheDead.java | 10 +-- .../sets/eventide/AshlingTheExtinguisher.java | 9 ++- Mage.Sets/src/mage/sets/invasion/Dredge.java | 8 +- .../src/mage/sets/legions/GoblinFirebug.java | 13 +--- .../sets/lorwyn/IncandescentSoulstoke.java | 15 ++-- .../mage/sets/magic2014/ShadowbornDemon.java | 22 +++--- .../sets/masterseditioniv/FoulSpirit.java | 15 +--- .../mage/sets/planarchaos/FatalFrenzy.java | 27 ++++--- .../mage/sets/planarchaos/RealityAcid.java | 3 +- .../riseoftheeldrazi/DemonicAppetite.java | 49 ++++++------ .../FootstepsOfTheGoryo.java | 11 +-- .../saviorsofkamigawa/WineOfBloodAndIron.java | 44 ++--------- .../mage/sets/scarsofmirrodin/ShapeAnew.java | 33 ++++---- .../mage/sets/shadowmoor/ImpromptuRaid.java | 24 +++--- .../mage/sets/tempest/ServantOfVolrath.java | 11 +-- .../src/mage/sets/urzassaga/SneakAttack.java | 38 +++++----- .../mage/sets/zendikar/RuinousMinotaur.java | 49 ++---------- .../cards/copy/KikiJikiMirrorBreakerTest.java | 40 +++++++++- ...DealsDamageToOpponentTriggeredAbility.java | 3 +- .../effects/common/SacrificeTargetEffect.java | 75 +++++++++++-------- 28 files changed, 326 insertions(+), 373 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java b/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java index 414e9e9cee0..da0c98d4ea7 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java +++ b/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java @@ -43,6 +43,7 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; @@ -56,10 +57,6 @@ public class SlaveOfBolas extends CardImpl { super(ownerId, 136, "Slave of Bolas", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{U/R}{B}"); this.expansionSetCode = "ARB"; - - - - // Gain control of target creature. Untap that creature. It gains haste until end of turn. Sacrifice it at the beginning of the next end step. this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)); this.getSpellAbility().addEffect(new UntapTargetEffect()); @@ -96,13 +93,17 @@ class SlaveOfBolasEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this"); - sacrificeEffect.setTargetPointer(new FixedTarget(source.getFirstTarget())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); - return true; + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent != null) { + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this", source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + return true; + } + return false; } } diff --git a/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java b/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java index 615bff39518..12dc40a8961 100644 --- a/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java +++ b/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java @@ -37,16 +37,13 @@ import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.effects.common.RegenerateSourceEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.target.Target; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetOpponent; -import mage.target.targetpointer.SecondTargetPointer; /** * @@ -65,15 +62,13 @@ public class LordOfTresserhorn extends CardImpl { // When Lord of Tresserhorn enters the battlefield, you lose 2 life, you sacrifice two creatures, and target opponent draws two cards. Ability ability = new EntersBattlefieldTriggeredAbility(new LoseLifeSourceControllerEffect(2), false); - ability.addEffect(new SacrificeTargetEffect(", you sacrifice two creatures")); - Target target = new TargetControlledCreaturePermanent(2,2, new FilterControlledCreaturePermanent(), true); - ability.addTarget(target); + ability.addEffect(new SacrificeControllerEffect(new FilterControlledCreaturePermanent("creatures"), 2, "you")); Effect effect = new DrawCardTargetEffect(2); effect.setText(", and target opponent draws two cards"); - effect.setTargetPointer(new SecondTargetPointer()); ability.addEffect(effect); ability.addTarget(new TargetOpponent()); this.addAbility(ability); + // {B}: Regenerate Lord of Tresserhorn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B}"))); } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java b/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java index 141d60e8284..c2fc5802c19 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java @@ -28,9 +28,6 @@ package mage.sets.avacynrestored; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; @@ -40,7 +37,11 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.SacrificeTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; import mage.target.targetpointer.FixedTarget; @@ -54,7 +55,6 @@ public class ThatcherRevolt extends CardImpl { super(ownerId, 158, "Thatcher Revolt", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{R}"); this.expansionSetCode = "AVR"; - // Put three 1/1 red Human creature tokens with haste onto the battlefield. Sacrifice those tokens at the beginning of the next end step. this.getSpellAbility().addEffect(new ThatcherRevoltEffect()); } @@ -90,14 +90,16 @@ class ThatcherRevoltEffect extends OneShotEffect { for (int i = 0; i < 3; i++) { RedHumanToken token = new RedHumanToken(); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this token"); - sacrificeEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); + Permanent permanent = game.getPermanent(token.getLastAddedToken()); + if (permanent != null) { + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this token", source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + } } return true; } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java b/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java index 7e1c9efce0f..da08e4cd46b 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java @@ -25,13 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.championsofkamigawa; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -41,8 +37,10 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.SacrificeTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.TargetController; import mage.filter.common.FilterControlledCreaturePermanent; import mage.game.Game; @@ -58,8 +56,8 @@ public class JunkyoBell extends CardImpl { public JunkyoBell(UUID ownerId) { super(ownerId, 258, "Junkyo Bell", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}"); this.expansionSetCode = "CHK"; - - // At the beginning of your upkeep, you may have target creature you control get +X/+X until end of turn, + + // At the beginning of your upkeep, you may have target creature you control get +X/+X until end of turn, // where X is the number of creatures you control. If you do, sacrifice that creature at the beginning of the next end step. PermanentsOnBattlefieldCount amount = new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent()); Ability ability = new BeginningOfUpkeepTriggeredAbility(new BoostTargetEffect(amount, amount, Duration.EndOfTurn), TargetController.YOU, true); @@ -77,37 +75,36 @@ public class JunkyoBell extends CardImpl { return new JunkyoBell(this); } - -private class JunkyoBellSacrificeEffect extends OneShotEffect { + private class JunkyoBellSacrificeEffect extends OneShotEffect { - public JunkyoBellSacrificeEffect() { - super(Outcome.Sacrifice); - this.staticText = "If you do, sacrifice that creature at the beginning of the next end step"; - } - - public JunkyoBellSacrificeEffect(final JunkyoBellSacrificeEffect effect) { - super(effect); - } - - @Override - public JunkyoBellSacrificeEffect copy() { - return new JunkyoBellSacrificeEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent creature = game.getPermanent(source.getFirstTarget()); - if (creature != null) { - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice boosted " + creature.getName()); - sacrificeEffect.setTargetPointer(new FixedTarget(source.getFirstTarget())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); - return true; + public JunkyoBellSacrificeEffect() { + super(Outcome.Sacrifice); + this.staticText = "If you do, sacrifice that creature at the beginning of the next end step"; + } + + public JunkyoBellSacrificeEffect(final JunkyoBellSacrificeEffect effect) { + super(effect); + } + + @Override + public JunkyoBellSacrificeEffect copy() { + return new JunkyoBellSacrificeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanent(source.getFirstTarget()); + if (creature != null) { + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice boosted " + creature.getName(), source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(creature, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + return true; + } + return false; } - return false; } - } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java b/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java index 3d8eac8a7cd..2cf5cc1ea2b 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java @@ -28,10 +28,6 @@ package mage.sets.championsofkamigawa; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; @@ -42,7 +38,10 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.SacrificeTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.SupertypePredicate; @@ -124,8 +123,7 @@ class KikiJikiMirrorBreakerEffect extends OneShotEffect { token.addAbility(HasteAbility.getInstance()); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect(); - sacrificeEffect.setText("Sacrifice the token at the beginning of the next end step"); + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("Sacrifice the token at the beginning of the next end step", source.getControllerId()); sacrificeEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken())); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java b/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java index bc1c23d49e2..44fd1be0eb2 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java @@ -30,22 +30,26 @@ package mage.sets.championsofkamigawa; import java.util.ArrayList; import java.util.List; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.effects.common.continuous.SetCardSubtypeAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.target.TargetPermanent; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; /** @@ -54,7 +58,8 @@ import mage.target.common.TargetCreaturePermanent; */ public class OniPossession extends CardImpl { - private static final List setSubtypes = new ArrayList(); + private static final List setSubtypes = new ArrayList<>(); + static { setSubtypes.add("Demon"); setSubtypes.add("Spirit"); @@ -67,13 +72,14 @@ public class OniPossession extends CardImpl { // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); - this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); - Ability ability = new EnchantAbility(auraTarget.getTargetName()); - this.addAbility(ability); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // At the beginning of your upkeep, sacrifice a creature. - Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new SacrificeTargetEffect("sacrifice a creature"), TargetController.YOU, false); - ability2.addTarget(new TargetControlledCreaturePermanent(1,1, new FilterControlledCreaturePermanent(),false)); + Ability ability2 = new BeginningOfUpkeepTriggeredAbility( + new SacrificeControllerEffect(new FilterControlledCreaturePermanent(), 1, ""), TargetController.YOU, false); this.addAbility(ability2); // Enchanted creature gets +3/+3 and has trample. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield))); diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java b/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java index 86980d0f771..bf4e4d5139b 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java @@ -63,7 +63,6 @@ public class ThroughTheBreach extends CardImpl { this.expansionSetCode = "CHK"; this.subtype.add("Arcane"); - // You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice that creature at the beginning of the next end step. this.getSpellAbility().addEffect(new ThroughTheBreachEffect()); // Splice onto Arcane {2}{R}{R} @@ -81,7 +80,7 @@ public class ThroughTheBreach extends CardImpl { } class ThroughTheBreachEffect extends OneShotEffect { - + private static final String choiceText = "Put a creature card from your hand onto the battlefield?"; public ThroughTheBreachEffect() { @@ -111,10 +110,10 @@ class ThroughTheBreachEffect extends OneShotEffect { Permanent permanent = game.getPermanent(card.getId()); if (permanent != null) { ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - effect.setTargetPointer(new FixedTarget(permanent.getId())); + effect.setTargetPointer(new FixedTarget(permanent, game)); game.addEffect(effect, source); - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName()); - sacrificeEffect.setTargetPointer(new FixedTarget(card.getId())); + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName(), source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java b/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java index ad667be3a2f..a3c53ae6d78 100644 --- a/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java +++ b/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java @@ -46,6 +46,7 @@ import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.game.permanent.token.EmptyToken; import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetpointer.FixedTarget; @@ -113,15 +114,16 @@ class FeldonOfTheThirdPathEffect extends OneShotEffect { } token.addAbility(HasteAbility.getInstance()); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect(); - sacrificeEffect.setText("Sacrifice the token at the beginning of the next end step"); - sacrificeEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); + Permanent permanent = game.getPermanent(token.getLastAddedToken()); + if (permanent != null) { + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("Sacrifice the token at the beginning of the next end step", source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + } return true; } diff --git a/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java b/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java index f196efa60cf..fc1c258ea11 100644 --- a/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java +++ b/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java @@ -33,7 +33,6 @@ import mage.abilities.DelayedTriggeredAbility; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; -import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -64,7 +63,6 @@ public class WakeTheDead extends CardImpl { super(ownerId, 31, "Wake the Dead", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{X}{B}{B}"); this.expansionSetCode = "C14"; - // Cast Wake the Dead only during combat on an opponent's turn. Ability ability = new SimpleStaticAbility(Zone.ALL, new WakeTheDeadEffect()); ability.setRuleAtTheTop(true); @@ -72,7 +70,7 @@ public class WakeTheDead extends CardImpl { // Return X target creature cards from your graveyard to the battlefield. Sacrifice those creatures at the beginning of the next end step. this.getSpellAbility().addEffect(new WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect()); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard"))); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard"))); } @Override @@ -80,7 +78,7 @@ public class WakeTheDead extends CardImpl { if (ability instanceof SpellAbility) { int xValue = ability.getManaCostsToPay().getX(); ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(xValue,xValue, new FilterCreatureCard("creature cards from your graveyard"))); + ability.addTarget(new TargetCardInYourGraveyard(xValue, xValue, new FilterCreatureCard("creature cards from your graveyard"))); } } @@ -159,8 +157,8 @@ class WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEff Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { permanent.changeControllerId(source.getControllerId(), game); - Effect effect = new SacrificeTargetEffect("Sacrifice those creatures at the beginning of the next end step"); - effect.setTargetPointer(new FixedTarget(permanent.getId())); + Effect effect = new SacrificeTargetEffect("Sacrifice those creatures at the beginning of the next end step", source.getControllerId()); + effect.setTargetPointer(new FixedTarget(permanent, game)); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/eventide/AshlingTheExtinguisher.java b/Mage.Sets/src/mage/sets/eventide/AshlingTheExtinguisher.java index 3b525f22126..e8fbba42e5e 100644 --- a/Mage.Sets/src/mage/sets/eventide/AshlingTheExtinguisher.java +++ b/Mage.Sets/src/mage/sets/eventide/AshlingTheExtinguisher.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.eventide; import java.util.UUID; @@ -51,19 +50,20 @@ import mage.target.common.TargetCreaturePermanent; */ public class AshlingTheExtinguisher extends CardImpl { - public AshlingTheExtinguisher (UUID ownerId) { + public AshlingTheExtinguisher(UUID ownerId) { super(ownerId, 33, "Ashling, the Extinguisher", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); this.expansionSetCode = "EVE"; this.supertype.add("Legendary"); this.subtype.add("Elemental"); this.subtype.add("Shaman"); + // Whenever Ashling, the Extinguisher deals combat damage to a player, choose target creature that player controls. He or she sacrifices that creature. this.power = new MageInt(4); this.toughness = new MageInt(4); this.addAbility(new AshlingTheExtinguisherTriggeredAbility()); } - public AshlingTheExtinguisher (final AshlingTheExtinguisher card) { + public AshlingTheExtinguisher(final AshlingTheExtinguisher card) { super(card); } @@ -75,6 +75,7 @@ public class AshlingTheExtinguisher extends CardImpl { } class AshlingTheExtinguisherTriggeredAbility extends TriggeredAbilityImpl { + public AshlingTheExtinguisherTriggeredAbility() { super(Zone.BATTLEFIELD, new SacrificeTargetEffect()); this.addTarget(new TargetCreaturePermanent()); @@ -115,4 +116,4 @@ class AshlingTheExtinguisherTriggeredAbility extends TriggeredAbilityImpl { public String getRule() { return "Whenever {this} deals combat damage to a player, choose target creature that player controls. He or she sacrifices that creature."; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/invasion/Dredge.java b/Mage.Sets/src/mage/sets/invasion/Dredge.java index 9f9d27e9ced..9d0d8a0f142 100644 --- a/Mage.Sets/src/mage/sets/invasion/Dredge.java +++ b/Mage.Sets/src/mage/sets/invasion/Dredge.java @@ -30,14 +30,12 @@ package mage.sets.invasion; import java.util.UUID; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.SacrificeControllerEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.target.TargetPermanent; /** * @@ -46,18 +44,18 @@ import mage.target.TargetPermanent; public class Dredge extends CardImpl { private static final FilterPermanent filter = new FilterPermanent("a creature or land"); - + static { filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND))); } - + public Dredge(UUID ownerId) { super(ownerId, 103, "Dredge", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{B}"); this.expansionSetCode = "INV"; // Sacrifice a creature or land. this.getSpellAbility().addEffect(new SacrificeControllerEffect(filter, 1, "")); - + // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); } diff --git a/Mage.Sets/src/mage/sets/legions/GoblinFirebug.java b/Mage.Sets/src/mage/sets/legions/GoblinFirebug.java index 907f6577eb9..67a12a03a7c 100644 --- a/Mage.Sets/src/mage/sets/legions/GoblinFirebug.java +++ b/Mage.Sets/src/mage/sets/legions/GoblinFirebug.java @@ -29,15 +29,12 @@ package mage.sets.legions; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.filter.common.FilterControlledLandPermanent; -import mage.target.common.TargetControlledPermanent; +import mage.filter.common.FilterLandPermanent; /** * @@ -53,11 +50,7 @@ public class GoblinFirebug extends CardImpl { this.toughness = new MageInt(2); // When Goblin Firebug leaves the battlefield, sacrifice a land. - Effect effect = new SacrificeTargetEffect(); - effect.setText("sacrifice a land"); - Ability ability = new LeavesBattlefieldTriggeredAbility(effect, false); - ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); - this.addAbility(ability); + this.addAbility(new LeavesBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterLandPermanent(), 1, ""), false)); } public GoblinFirebug(final GoblinFirebug card) { diff --git a/Mage.Sets/src/mage/sets/lorwyn/IncandescentSoulstoke.java b/Mage.Sets/src/mage/sets/lorwyn/IncandescentSoulstoke.java index 1d2c1474769..f3ceefded0e 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/IncandescentSoulstoke.java +++ b/Mage.Sets/src/mage/sets/lorwyn/IncandescentSoulstoke.java @@ -70,7 +70,7 @@ public class IncandescentSoulstoke extends CardImpl { static { filter.add(new SubtypePredicate("Elemental")); } - + public IncandescentSoulstoke(UUID ownerId) { super(ownerId, 178, "Incandescent Soulstoke", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.expansionSetCode = "LRW"; @@ -81,13 +81,12 @@ public class IncandescentSoulstoke extends CardImpl { // Other Elemental creatures you control get +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true))); - - + // {1}{R}, {T}: You may put an Elemental creature card from your hand onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new IncandescentSoulstokeEffect(), new ManaCostsImpl<>("{1}{R}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); - + } public IncandescentSoulstoke(final IncandescentSoulstoke card) { @@ -101,7 +100,7 @@ public class IncandescentSoulstoke extends CardImpl { } class IncandescentSoulstokeEffect extends OneShotEffect { - + private static final String choiceText = "Put an Elemental creature card from your hand onto the battlefield?"; public IncandescentSoulstokeEffect() { @@ -133,10 +132,10 @@ class IncandescentSoulstokeEffect extends OneShotEffect { Permanent permanent = game.getPermanent(card.getId()); if (permanent != null) { ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - effect.setTargetPointer(new FixedTarget(permanent.getId())); + effect.setTargetPointer(new FixedTarget(permanent, game)); game.addEffect(effect, source); - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName()); - sacrificeEffect.setTargetPointer(new FixedTarget(card.getId())); + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName(), source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/magic2014/ShadowbornDemon.java b/Mage.Sets/src/mage/sets/magic2014/ShadowbornDemon.java index 08eda6473f3..c81ad6839b1 100644 --- a/Mage.Sets/src/mage/sets/magic2014/ShadowbornDemon.java +++ b/Mage.Sets/src/mage/sets/magic2014/ShadowbornDemon.java @@ -30,14 +30,13 @@ package mage.sets.magic2014; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.InvertCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; @@ -50,7 +49,6 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; /** @@ -60,6 +58,7 @@ import mage.target.common.TargetCreaturePermanent; public class ShadowbornDemon extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Demon creature"); + static { filter.add(Predicates.not(new SubtypePredicate("Demon"))); } @@ -75,17 +74,14 @@ public class ShadowbornDemon extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // When Shadowborn Demon enters the battlefield, destroy target non-Demon creature. - Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(),false); + Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), false); Target target = new TargetCreaturePermanent(filter); ability.addTarget(target); this.addAbility(ability); + // At the beginning of your upkeep, if there are fewer than six creature cards in your graveyard, sacrifice a creature. - TriggeredAbility triggeredAbility = new BeginningOfUpkeepTriggeredAbility(new SacrificeTargetEffect(), TargetController.YOU, false); - target = new TargetControlledCreaturePermanent(); - target.setNotTarget(false); - triggeredAbility.addTarget(target); this.addAbility(new ConditionalTriggeredAbility( - triggeredAbility, + new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(new FilterCreaturePermanent(), 1, ""), TargetController.YOU, false), new InvertCondition(new CreatureCardsInControllerGraveCondition(6)), "At the beginning of your upkeep, if there are fewer than six creature cards in your graveyard, sacrifice a creature")); @@ -102,6 +98,7 @@ public class ShadowbornDemon extends CardImpl { } class CreatureCardsInControllerGraveCondition implements Condition { + private int value; public CreatureCardsInControllerGraveCondition(int value) { @@ -111,10 +108,9 @@ class CreatureCardsInControllerGraveCondition implements Condition { @Override public boolean apply(Game game, Ability source) { Player p = game.getPlayer(source.getControllerId()); - if (p != null && p.getGraveyard().count(new FilterCreatureCard(), game) >= value) - { - return true; + if (p != null && p.getGraveyard().count(new FilterCreatureCard(), game) >= value) { + return true; } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java b/Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java index bf83c7d77ad..4a00e1cc953 100644 --- a/Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java +++ b/Mage.Sets/src/mage/sets/masterseditioniv/FoulSpirit.java @@ -29,16 +29,13 @@ package mage.sets.masterseditioniv; 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.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.filter.common.FilterControlledLandPermanent; -import mage.target.common.TargetControlledPermanent; +import mage.filter.common.FilterLandPermanent; /** * @@ -55,13 +52,9 @@ public class FoulSpirit extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // When Foul Spirit enters the battlefield, sacrifice a land. - Effect effect = new SacrificeTargetEffect(); - effect.setText("sacrifice a land"); - Ability ability = new EntersBattlefieldTriggeredAbility(effect, false); - ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); - this.addAbility(ability); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterLandPermanent(), 1, ""), false)); } public FoulSpirit(final FoulSpirit card) { diff --git a/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java b/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java index 43ba60a9041..0bbef4cfb3c 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java +++ b/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java @@ -28,10 +28,6 @@ package mage.sets.planarchaos; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Rarity; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; @@ -43,7 +39,12 @@ import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.targetpointer.FixedTarget; @@ -57,7 +58,6 @@ public class FatalFrenzy extends CardImpl { super(ownerId, 98, "Fatal Frenzy", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{R}"); this.expansionSetCode = "PLC"; - // Until end of turn, target creature you control gains trample and gets +X/+0, where X is its power. Sacrifice it at the beginning of the next end step. this.getSpellAbility().addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); this.getSpellAbility().addEffect(new BoostTargetEffect(new TargetPermanentPowerCount(), new StaticValue(0), Duration.EndOfTurn, true)); @@ -94,13 +94,16 @@ class FatalFrenzyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this"); - sacrificeEffect.setTargetPointer(new FixedTarget(source.getFirstTarget())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); + Permanent targetCreature = game.getPermanent(source.getFirstTarget()); + if (targetCreature != null) { + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this", source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(targetCreature, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + } return true; } } diff --git a/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java index 425d94127d0..ac39868c19b 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java +++ b/Mage.Sets/src/mage/sets/planarchaos/RealityAcid.java @@ -76,8 +76,7 @@ public class RealityAcid extends CardImpl { this.addAbility(new VanishingSacrificeAbility()); // When Reality Acid leaves the battlefield, enchanted permanent's controller sacrifices it. - Effect effect = new SacrificeTargetEffect(); - effect.setText("enchanted permanent's controller sacrifices it"); + Effect effect = new SacrificeTargetEffect("enchanted permanent's controller sacrifices it"); this.addAbility(new RealityAcidTriggeredAbility(effect, false)); } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/DemonicAppetite.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/DemonicAppetite.java index d467a009fb5..efaaf2c58a8 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/DemonicAppetite.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/DemonicAppetite.java @@ -25,20 +25,25 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.riseoftheeldrazi; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.abilities.effects.common.SacrificeTargetEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; @@ -48,29 +53,27 @@ import mage.target.common.TargetControlledCreaturePermanent; */ public class DemonicAppetite extends CardImpl { - public DemonicAppetite (UUID ownerId) { + public DemonicAppetite(UUID ownerId) { super(ownerId, 106, "Demonic Appetite", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}"); this.expansionSetCode = "ROE"; this.subtype.add("Aura"); - + // Enchant creature you control TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); - Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + + // Enchanted creature gets +3/+3. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield))); - ability = new BeginningOfUpkeepTriggeredAbility( - new DemonicAppetiteEffect(), - TargetController.YOU, - false); - ability.addTarget(new TargetControlledCreaturePermanent()); - this.addAbility(ability); + // At the beginning of your upkeep, sacrifice a creature. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(new FilterCreaturePermanent("a creature"), 1, ""), + TargetController.YOU, false)); } - public DemonicAppetite (final DemonicAppetite card) { + public DemonicAppetite(final DemonicAppetite card) { super(card); } @@ -80,16 +83,16 @@ public class DemonicAppetite extends CardImpl { } } - class DemonicAppetiteEffect extends SacrificeTargetEffect { +class DemonicAppetiteEffect extends SacrificeTargetEffect { - DemonicAppetiteEffect() { - super(); - staticText = "sacrifice a creature"; - } + DemonicAppetiteEffect() { + super(); + staticText = "sacrifice a creature"; + } - @Override - public DemonicAppetiteEffect copy() { - return new DemonicAppetiteEffect(); - } + @Override + public DemonicAppetiteEffect copy() { + return new DemonicAppetiteEffect(); + } -} +} diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java index d558731be79..1e3be38179f 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java @@ -32,15 +32,9 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; -import mage.abilities.effects.common.ExileTargetEffect; -import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.effects.common.SacrificeTargetEffect; -import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; -import mage.abilities.keyword.HasteAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.*; @@ -62,7 +56,6 @@ public class FootstepsOfTheGoryo extends CardImpl { this.expansionSetCode = "SOK"; this.subtype.add("Arcane"); - // Return target creature card from your graveyard to the battlefield. Sacrifice that creature at the beginning of the next end step. this.getSpellAbility().addEffect(new FootstepsOfTheGoryoEffect()); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard())); @@ -104,8 +97,8 @@ class FootstepsOfTheGoryoEffect extends OneShotEffect { Permanent permanent = game.getPermanent(card.getId()); if (permanent != null) { // Sacrifice it at end of turn - Effect sacrificeEffect = new SacrificeTargetEffect("Sacrifice that creature at the beginning of next end step"); - sacrificeEffect.setTargetPointer(new FixedTarget(card.getId())); + Effect sacrificeEffect = new SacrificeTargetEffect("Sacrifice that creature at the beginning of next end step", source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java index 2a831a03a06..bfe6007c45b 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java @@ -30,23 +30,19 @@ package mage.sets.saviorsofkamigawa; import java.util.UUID; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.abilities.Ability; -import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.dynamicvalue.common.TargetPermanentPowerCount; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -62,7 +58,10 @@ public class WineOfBloodAndIron extends CardImpl { SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(new TargetPermanentPowerCount(), new StaticValue(0), Duration.EndOfTurn, true), new GenericManaCost(4)); - ability.addEffect(new WineOfBloodAndIronEffect()); + Effect effect = new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new SacrificeSourceEffect()), false); + effect.setText("Sacrifice {this} at the beginning of the next end step"); + ability.addEffect(effect); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -76,32 +75,3 @@ public class WineOfBloodAndIron extends CardImpl { return new WineOfBloodAndIron(this); } } - -class WineOfBloodAndIronEffect extends OneShotEffect { - - public WineOfBloodAndIronEffect() { - super(Outcome.Sacrifice); - this.staticText = "Sacrifice {this} at the beginning of the next end step"; - } - - public WineOfBloodAndIronEffect(final WineOfBloodAndIronEffect effect) { - super(effect); - } - - @Override - public WineOfBloodAndIronEffect copy() { - return new WineOfBloodAndIronEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this"); - sacrificeEffect.setTargetPointer(new FixedTarget(source.getSourceId())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); - return true; - } -} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/ShapeAnew.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/ShapeAnew.java index cef5f23b882..b02ce34d87e 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/ShapeAnew.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/ShapeAnew.java @@ -25,13 +25,9 @@ * 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.Rarity; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.SacrificeTargetEffect; @@ -39,7 +35,9 @@ 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.predicate.mageobject.CardTypePredicate; @@ -60,16 +58,19 @@ public class ShapeAnew extends CardImpl { filter.add(new CardTypePredicate(CardType.ARTIFACT)); } - public ShapeAnew (UUID ownerId) { + public ShapeAnew(UUID ownerId) { super(ownerId, 43, "Shape Anew", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}"); this.expansionSetCode = "SOM"; - this.getSpellAbility().addEffect(new SacrificeTargetEffect()); + // The controller of target artifact sacrifices it, then reveals cards from the top + // of his or her library until he or she reveals an artifact card. That player puts + // that card onto the battlefield, then shuffles all other cards revealed this way into his or her library. + this.getSpellAbility().addEffect(new SacrificeTargetEffect("The controller of target artifact sacrifices it")); this.getSpellAbility().addTarget(new TargetPermanent(filter)); this.getSpellAbility().addEffect(new ShapeAnewEffect()); } - public ShapeAnew (final ShapeAnew card) { + public ShapeAnew(final ShapeAnew card) { super(card); } @@ -82,7 +83,7 @@ public class ShapeAnew extends CardImpl { public ShapeAnewEffect() { super(Outcome.PutCardInPlay); - staticText = "Then reveals cards from the top of his or her library until he or she reveals an artifact card. That player puts that card onto the battlefield, then shuffles all other cards revealed this way into his or her library"; + staticText = ", then reveals cards from the top of his or her library until he or she reveals an artifact card. That player puts that card onto the battlefield, then shuffles all other cards revealed this way into his or her library"; } public ShapeAnewEffect(ShapeAnewEffect effect) { @@ -102,9 +103,9 @@ public class ShapeAnew extends CardImpl { Cards revealed = new CardsImpl(); Card artifactCard = null; Cards nonArtifactCards = new CardsImpl(); - Player player = game.getPlayer(sourcePermanent.getControllerId()); - while (artifactCard == null && player.getLibrary().size() > 0) { - Card card = player.getLibrary().removeFromTop(game); + Player targetController = game.getPlayer(sourcePermanent.getControllerId()); + while (artifactCard == null && targetController.getLibrary().size() > 0) { + Card card = targetController.getLibrary().removeFromTop(game); revealed.add(card); if (card.getCardType().contains(CardType.ARTIFACT)) { artifactCard = card; @@ -112,14 +113,12 @@ public class ShapeAnew extends CardImpl { nonArtifactCards.add(card); } } - player.revealCards("Shape Anew", revealed, game); + targetController.revealCards(sourcePermanent.getIdName(), revealed, game); if (artifactCard != null) { - artifactCard.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId()); + artifactCard.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), targetController.getId()); } - for (Card cardToMove: nonArtifactCards.getCards(game)) { - cardToMove.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - player.shuffleLibrary(game); + targetController.moveCards(nonArtifactCards, null, Zone.LIBRARY, source, game); + targetController.shuffleLibrary(game); return true; } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/ImpromptuRaid.java b/Mage.Sets/src/mage/sets/shadowmoor/ImpromptuRaid.java index 95e71547286..690b42690dd 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/ImpromptuRaid.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/ImpromptuRaid.java @@ -52,6 +52,7 @@ import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.targetpointer.FixedTarget; @@ -117,16 +118,19 @@ class ImpromptuRaidEffect extends OneShotEffect { return true; } if (controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId())) { - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect(); - sacrificeEffect.setTargetPointer(new FixedTarget(card.getId())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); + Permanent permanent = game.getPermanent(card.getId()); + if (permanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("", source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + } return true; } } diff --git a/Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.java b/Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.java index ac860ea4ce9..7010697b90d 100644 --- a/Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.java +++ b/Mage.Sets/src/mage/sets/tempest/ServantOfVolrath.java @@ -29,13 +29,12 @@ package mage.sets.tempest; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; /** * @@ -51,11 +50,9 @@ public class ServantOfVolrath extends CardImpl { this.toughness = new MageInt(3); // When Servant of Volrath leaves the battlefield, sacrifice a creature. - Ability ability = new LeavesBattlefieldTriggeredAbility(new SacrificeTargetEffect(), false); - ability.addTarget(new TargetControlledCreaturePermanent()); - this.addAbility(ability); + this.addAbility(new LeavesBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterCreaturePermanent(), 1, ""), false)); } - + public ServantOfVolrath(final ServantOfVolrath card) { super(card); } diff --git a/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java b/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java index 1b447cb9f41..3720511de42 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java +++ b/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java @@ -62,7 +62,6 @@ public class SneakAttack extends CardImpl { super(ownerId, 218, "Sneak Attack", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); this.expansionSetCode = "USG"; - // {R}: You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice the creature at the beginning of the next end step. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new SneakAttackEffect(), new ManaCostsImpl("{R}"))); } @@ -78,23 +77,23 @@ public class SneakAttack extends CardImpl { } class SneakAttackEffect extends OneShotEffect { - + private static final String choiceText = "Put a creature card from your hand onto the battlefield?"; - + public SneakAttackEffect() { super(Outcome.Benefit); this.staticText = "You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice the creature at the beginning of the next end step"; } - + public SneakAttackEffect(final SneakAttackEffect effect) { super(effect); } - + @Override public SneakAttackEffect copy() { return new SneakAttackEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); @@ -106,20 +105,21 @@ class SneakAttackEffect extends OneShotEffect { if (card != null) { if (player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId())) { Permanent permanent = game.getPermanent(card.getId()); - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); - effect.setTargetPointer(new FixedTarget(permanent.getId())); - game.addEffect(effect, source); - - SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName()); - sacrificeEffect.setTargetPointer(new FixedTarget(card.getId())); - DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); - delayedAbility.setSourceId(source.getSourceId()); - delayedAbility.setControllerId(source.getControllerId()); - delayedAbility.setSourceObject(source.getSourceObject(game), game); - game.addDelayedTriggeredAbility(delayedAbility); - + if (permanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName(), source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game), game); + game.addDelayedTriggeredAbility(delayedAbility); + } return true; - } + } } return false; } diff --git a/Mage.Sets/src/mage/sets/zendikar/RuinousMinotaur.java b/Mage.Sets/src/mage/sets/zendikar/RuinousMinotaur.java index 84d78b7cc11..9942935f688 100644 --- a/Mage.Sets/src/mage/sets/zendikar/RuinousMinotaur.java +++ b/Mage.Sets/src/mage/sets/zendikar/RuinousMinotaur.java @@ -30,16 +30,11 @@ package mage.sets.zendikar; import java.util.UUID; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; +import mage.abilities.effects.common.SacrificeControllerEffect; import mage.cards.CardImpl; -import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.target.common.TargetControlledPermanent; +import mage.filter.common.FilterLandPermanent; /** * @@ -57,7 +52,8 @@ public class RuinousMinotaur extends CardImpl { this.toughness = new MageInt(2); // Whenever Ruinous Minotaur deals damage to an opponent, sacrifice a land. - this.addAbility(new RuinousMinotaurTriggeredAbility()); + this.addAbility(new DealsDamageToOpponentTriggeredAbility(new SacrificeControllerEffect(new FilterLandPermanent(), 1, ""), false, false)); + } public RuinousMinotaur(final RuinousMinotaur card) { @@ -69,38 +65,3 @@ public class RuinousMinotaur extends CardImpl { return new RuinousMinotaur(this); } } - -class RuinousMinotaurTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterControlledPermanent filter = new FilterControlledLandPermanent(); - - public RuinousMinotaurTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeTargetEffect(), false); - this.addTarget(new TargetControlledPermanent(filter)); - } - - public RuinousMinotaurTriggeredAbility(final RuinousMinotaurTriggeredAbility ability) { - super(ability); - } - - @Override - public RuinousMinotaurTriggeredAbility copy() { - return new RuinousMinotaurTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getSourceId().equals(this.sourceId) - && game.getOpponents(this.getControllerId()).contains(event.getTargetId()); - } - - @Override - public String getRule() { - return "Whenever {this} deals damage to an opponent, sacrifice a land."; - } -} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/KikiJikiMirrorBreakerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/KikiJikiMirrorBreakerTest.java index ac9048c91a4..d252e8a6a79 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/KikiJikiMirrorBreakerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/KikiJikiMirrorBreakerTest.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package org.mage.test.cards.copy; import mage.constants.PhaseStep; @@ -79,6 +78,7 @@ public class KikiJikiMirrorBreakerTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Voice of Resurgence", 1); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 3); + // Flamebreak deals 3 damage to each creature without flying and each player. Creatures dealt damage this way can't be regenerated this turn. addCard(Zone.HAND, playerB, "Flamebreak"); activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Put a token that's a copy of target nonlegendary creature you control onto the battlefield. That token has haste. Sacrifice it at the beginning of the next end step."); @@ -97,7 +97,41 @@ public class KikiJikiMirrorBreakerTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Elemental", 2); - } -} \ No newline at end of file + /** + * Kiki-Jiki, Mirror Breaker creates a copy of Humble Defector, activate + * Humble defector, token gets sacrificed while under opponents control. + */ + @Test + public void testTokenNotSacrificedIfNotControlled() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 1); + // Tap target creature you don't control. + // Overload {3}{U} + addCard(Zone.HAND, playerA, "Blustersquall", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Kiki-Jiki, Mirror Breaker", 1); + // {T}: Draw two cards. Target opponent gains control of Humble Defector. Activate this ability only during your turn. + addCard(Zone.BATTLEFIELD, playerB, "Humble Defector", 1); + + castSpell(2, PhaseStep.UPKEEP, playerA, "Blustersquall", "Humble Defector"); // Tap nontoken Defector so only the Token can be used later + + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}: Put a token that's a copy of target nonlegendary creature you control onto the battlefield. That token has haste. Sacrifice it at the beginning of the next end step."); + + activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "{T}: Draw two cards. Target opponent gains control"); + + setStopAt(3, PhaseStep.UPKEEP); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + assertHandCount(playerB, 3); // normal 1 draw of turn two + 2 from Defector + + assertGraveyardCount(playerA, "Blustersquall", 1); + assertPermanentCount(playerB, "Humble Defector", 1); + assertPermanentCount(playerA, "Humble Defector", 1); + + } + +} diff --git a/Mage/src/mage/abilities/common/DealsDamageToOpponentTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToOpponentTriggeredAbility.java index 2641d757ed9..811b091401d 100644 --- a/Mage/src/mage/abilities/common/DealsDamageToOpponentTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToOpponentTriggeredAbility.java @@ -31,7 +31,6 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.DamagePlayerEvent; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; import mage.target.targetpointer.FixedTarget; @@ -45,7 +44,7 @@ public class DealsDamageToOpponentTriggeredAbility extends TriggeredAbilityImpl public DealsDamageToOpponentTriggeredAbility(Effect effect) { this(effect, false, false); - } + } public DealsDamageToOpponentTriggeredAbility(Effect effect, boolean optional) { this(effect, optional, false); diff --git a/Mage/src/mage/abilities/effects/common/SacrificeTargetEffect.java b/Mage/src/mage/abilities/effects/common/SacrificeTargetEffect.java index 0421dd32f11..024b3a856c7 100644 --- a/Mage/src/mage/abilities/effects/common/SacrificeTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/SacrificeTargetEffect.java @@ -1,38 +1,37 @@ /* -* 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. -*/ - + * 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.abilities.effects.common; import java.util.UUID; -import mage.constants.Outcome; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; @@ -42,17 +41,31 @@ import mage.game.permanent.Permanent; */ public class SacrificeTargetEffect extends OneShotEffect { + protected UUID playerIdThatHasToSacrifice; + public SacrificeTargetEffect() { - super(Outcome.Sacrifice); + this(""); } public SacrificeTargetEffect(String text) { - this(); + this(text, null); + } + + /** + * + * @param text use this text as rule text for the effect + * @param playerIdThatHasToSacrifice only this playerId has to sacrifice + * (others can't) + */ + public SacrificeTargetEffect(String text, UUID playerIdThatHasToSacrifice) { + super(Outcome.Sacrifice); + this.playerIdThatHasToSacrifice = playerIdThatHasToSacrifice; staticText = text; } public SacrificeTargetEffect(final SacrificeTargetEffect effect) { super(effect); + this.playerIdThatHasToSacrifice = effect.playerIdThatHasToSacrifice; } @Override @@ -65,7 +78,7 @@ public class SacrificeTargetEffect extends OneShotEffect { int affectedTargets = 0; for (UUID permanentId : targetPointer.getTargets(game, source)) { Permanent permanent = game.getPermanent(permanentId); - if (permanent != null) { + if (permanent != null && (playerIdThatHasToSacrifice == null || playerIdThatHasToSacrifice.equals(permanent.getControllerId()))) { permanent.sacrifice(source.getSourceId(), game); affectedTargets++; } From 5a7633691a3dee8348ba1c3940dfd04ea4a30886 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 12:37:32 +0200 Subject: [PATCH 372/375] * FixedTarget added new constructor using permanent object. --- Mage/src/mage/target/targetpointer/FixedTarget.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Mage/src/mage/target/targetpointer/FixedTarget.java b/Mage/src/mage/target/targetpointer/FixedTarget.java index 5a8f3c68d4d..f513ca21ba9 100644 --- a/Mage/src/mage/target/targetpointer/FixedTarget.java +++ b/Mage/src/mage/target/targetpointer/FixedTarget.java @@ -6,6 +6,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.cards.Card; import mage.game.Game; +import mage.game.permanent.Permanent; public class FixedTarget implements TargetPointer { @@ -18,6 +19,12 @@ public class FixedTarget implements TargetPointer { this.initialized = false; } + public FixedTarget(Permanent permanent, Game game) { + this.targetId = permanent.getId(); + this.zoneChangeCounter = permanent.getZoneChangeCounter(game); + this.initialized = true; + } + /** * Use this if you already want to fix the target object to the known zone * now (otherwise the zone will be set if the ability triggers or not at From 9b3fc9307d7ef622eaa2630ed4d3e223745f8858 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 13:31:02 +0200 Subject: [PATCH 373/375] * Fixed a card movement bug relevant for moving cards from different zones (e.g. Rise of Rise // Fall) . --- Mage/src/mage/constants/Zone.java | 10 ++++++++ Mage/src/mage/players/PlayerImpl.java | 36 +++++++-------------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/Mage/src/mage/constants/Zone.java b/Mage/src/mage/constants/Zone.java index 52e6164223d..b5318c939ac 100644 --- a/Mage/src/mage/constants/Zone.java +++ b/Mage/src/mage/constants/Zone.java @@ -5,9 +5,19 @@ package mage.constants; * @author North */ public enum Zone { + HAND, GRAVEYARD, LIBRARY, BATTLEFIELD, STACK, EXILED, ALL, OUTSIDE, PICK, COMMAND; public boolean match(Zone zone) { return (this == zone || this == ALL || zone == ALL); } + + @Override + public String toString() { + if (this.equals(EXILED)) { + return "exile zone"; + } + return super.toString(); //To change body of generated methods, choose Tools | Templates. + } + } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 6924f3e92b7..5998477bbec 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2873,19 +2873,12 @@ public abstract class PlayerImpl implements Player, Serializable { public UUID getCommanderId() { return this.commanderId; } -// -// @Override -// public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game) { -// return moveCards(cards, fromZone, toZone, source, game, true); -// } @Override public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game) { Set cardList = new HashSet<>(); for (UUID cardId : cards) { - if (fromZone == null) { - fromZone = game.getState().getZone(cardId); - } + fromZone = game.getState().getZone(cardId); if (fromZone.equals(Zone.BATTLEFIELD)) { Permanent permanent = game.getPermanent(cardId); if (permanent != null) { @@ -2901,10 +2894,6 @@ public abstract class PlayerImpl implements Player, Serializable { return moveCards(cardList, fromZone, toZone, source, game); } -// @Override -// public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game) { -// return moveCards(card, fromZone, toZone, source, game, true); -// } @Override public boolean moveCards(Card card, Zone fromZone, Zone toZone, Ability source, Game game) { Set cardList = new HashSet<>(); @@ -2914,10 +2903,6 @@ public abstract class PlayerImpl implements Player, Serializable { return moveCards(cardList, fromZone, toZone, source, game); } -// @Override -// public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game) { -// return moveCards(cards, fromZone, toZone, source, game, true); -// } @Override public boolean moveCards(Set cards, Zone fromZone, Zone toZone, Ability source, Game game) { if (cards.isEmpty()) { @@ -2987,22 +2972,19 @@ public abstract class PlayerImpl implements Player, Serializable { public boolean moveCardToHandWithInfo(Card card, UUID sourceId, Game game, boolean withName) { boolean result = false; Zone fromZone = game.getState().getZone(card.getId()); + if (fromZone.equals(Zone.BATTLEFIELD) && !(card instanceof Permanent)) { + card = game.getPermanent(card.getId()); + } if (card.moveToZone(Zone.HAND, sourceId, game, false)) { if (card instanceof PermanentCard) { card = game.getCard(card.getId()); } if (!game.isSimulation()) { - StringBuilder sb = new StringBuilder(this.getLogName()).append(" puts ").append(withName ? card.getLogName() : (card.isFaceDown(game) ? "a face down card" : "a card")); - switch (fromZone) { - case EXILED: - sb.append(" from exile zone "); - break; - default: - sb.append(fromZone != null ? new StringBuilder(" from ").append(fromZone.toString().toLowerCase(Locale.ENGLISH)).append(" ") : ""); - break; - } - sb.append(card.getOwnerId().equals(this.getId()) ? "into his or her hand" : "into its owner's hand"); - game.informPlayers(sb.toString()); + game.informPlayers(this.getLogName() + " puts " + + (withName ? card.getLogName() : (card.isFaceDown(game) ? "a face down card" : "a card")) + + " from " + fromZone.toString().toLowerCase(Locale.ENGLISH) + " " + + (card.getOwnerId().equals(this.getId()) ? "into his or her hand" : "into its owner's hand") + ); } result = true; } From 7f45e5bc7eef525d3ada3046acd59badea4ca195 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 14:04:56 +0200 Subject: [PATCH 374/375] * Spellskite - Fixed that targets of modal spells could only be changed from the last selected mode of the modal spell. --- .../src/mage/sets/newphyrexia/Spellskite.java | 29 +++--- .../test/cards/triggers/SpellskiteTest.java | 99 +++++++++++++------ 2 files changed, 87 insertions(+), 41 deletions(-) diff --git a/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java b/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java index 6c6db8f49c8..ba7b8ebc634 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java @@ -93,20 +93,23 @@ class SpellskiteEffect extends OneShotEffect { StackObject stackObject = game.getStack().getStackObject(source.getFirstTarget()); MageObject sourceObject = game.getObject(source.getSourceId()); if (stackObject != null && sourceObject != null) { - Targets targets; + Targets targets = new Targets(); Ability sourceAbility; MageObject oldTarget = null; if (stackObject instanceof Spell) { - Spell spell = (Spell)stackObject; + Spell spell = (Spell) stackObject; sourceAbility = spell.getSpellAbility(); - targets = spell.getSpellAbility().getTargets(); } else if (stackObject instanceof StackAbility) { - StackAbility stackAbility = (StackAbility)stackObject; + StackAbility stackAbility = (StackAbility) stackObject; sourceAbility = stackAbility; - targets = stackAbility.getTargets(); } else { return false; } + for (UUID modeId : sourceAbility.getModes().getSelectedModes()) { + sourceAbility.getModes().setActiveMode(modeId); + targets.addAll(sourceAbility.getTargets()); + } + boolean twoTimesTarget = false; if (targets.size() == 1 && targets.get(0).getTargets().size() == 1) { Target target = targets.get(0); @@ -115,25 +118,25 @@ class SpellskiteEffect extends OneShotEffect { target.clearChosen(); // The source is still the spell on the stack target.addTarget(source.getSourceId(), stackObject.getStackAbility(), game); - } + } } else { Player player = game.getPlayer(source.getControllerId()); - for (Target target: targets) { - for (UUID targetId: target.getTargets()) { + for (Target target : targets) { + for (UUID targetId : target.getTargets()) { MageObject object = game.getObject(targetId); String name; if (object == null) { Player targetPlayer = game.getPlayer(targetId); name = targetPlayer.getLogName(); } else { - name = object.getName(); + name = object.getLogName(); } if (!targetId.equals(source.getSourceId()) && target.getTargets().contains(source.getSourceId())) { // you can't change this target to Spellskite because Spellskite is already another targetId of that target. twoTimesTarget = true; continue; } - if (name != null && player.chooseUse(Outcome.Neutral, new StringBuilder("Change target from ").append(name).append(" to ").append(sourceObject.getName()).append("?").toString(), source, game)) { + if (name != null && player.chooseUse(Outcome.Neutral, "Change target from " + name + " to " + sourceObject.getLogName() + "?", source, game)) { if (target.canTarget(stackObject.getControllerId(), source.getSourceId(), sourceAbility, game)) { oldTarget = game.getObject(targets.getFirstTarget()); target.remove(targetId); @@ -146,12 +149,12 @@ class SpellskiteEffect extends OneShotEffect { } } if (oldTarget != null) { - game.informPlayers(sourceObject.getLogName() + ": Changed target of " +stackObject.getLogName() + " from " + oldTarget.getLogName() + " to " + sourceObject.getLogName()); + game.informPlayers(sourceObject.getLogName() + ": Changed target of " + stackObject.getLogName() + " from " + oldTarget.getLogName() + " to " + sourceObject.getLogName()); } else { if (twoTimesTarget) { - game.informPlayers(sourceObject.getLogName() + ": Target not changed to " + sourceObject.getLogName() + " because its not valid to target it twice for " + stackObject.getName()); + game.informPlayers(sourceObject.getLogName() + ": Target not changed to " + sourceObject.getLogName() + " because its not valid to target it twice for " + stackObject.getLogName()); } else { - game.informPlayers(sourceObject.getLogName() + ": Target not changed to " + sourceObject.getLogName() + " because its no valid target for " + stackObject.getName()); + game.informPlayers(sourceObject.getLogName() + ": Target not changed to " + sourceObject.getLogName() + " because its no valid target for " + stackObject.getLogName()); } } return true; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellskiteTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellskiteTest.java index 083a1936058..0eed350bc6f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellskiteTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellskiteTest.java @@ -36,11 +36,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class SpellskiteTest extends CardTestPlayerBase { /** - * Tests that Wild Defiance triggers for Spellskite if spell target is changed to Spellskite + * Tests that Wild Defiance triggers for Spellskite if spell target is + * changed to Spellskite */ @Test public void testDisabledEffectOnChangeZone() { @@ -64,19 +64,22 @@ public class SpellskiteTest extends CardTestPlayerBase { assertLife(playerB, 20); assertPowerToughness(playerA, "Spellskite", 3, 7); - + } /** - * If Spellskite changes controller, its activated ability can activate but doesn't resolve properly. - * - * The specific instance was a Spellskite controlled by Vedalken Shackles. Land was targeted by Frost Titan, - * controller (not owner) of Spellskite paid the redirection cost, ability went on the stack, seemed to resolve, + * If Spellskite changes controller, its activated ability can activate but + * doesn't resolve properly. + * + * The specific instance was a Spellskite controlled by Vedalken Shackles. + * Land was targeted by Frost Titan, controller (not owner) of Spellskite + * paid the redirection cost, ability went on the stack, seemed to resolve, * target never changed. - * + * */ /** - * TODO: This test fails sometimes when building the complete Test Project -> Find the reason + * TODO: This test fails sometimes when building the complete Test Project + * -> Find the reason */ @Test public void testAfterChangeOfController() { @@ -88,17 +91,17 @@ public class SpellskiteTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Island", 6); // {UP}: Change a target of target spell or ability to Spellskite. - addCard(Zone.BATTLEFIELD, playerB, "Spellskite", 1); + addCard(Zone.BATTLEFIELD, playerB, "Spellskite", 1); // {4}{U}{U} - // Whenever Frost Titan becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays 2. + // Whenever Frost Titan becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays 2. // Whenever Frost Titan enters the battlefield or attacks, tap target permanent. It doesn't untap during its controller's next untap step. addCard(Zone.HAND, playerB, "Frost Titan", 1); - + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2},{T}: Gain control", "Spellskite"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Frost Titan"); addTarget(playerB, "Silvercoat Lion"); - + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerA, "{UP}: Change a target", "stack ability (Whenever {this} enters "); setStopAt(2, PhaseStep.BEGIN_COMBAT); @@ -106,13 +109,13 @@ public class SpellskiteTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Spellskite", 1); assertPermanentCount(playerB, "Frost Titan", 1); - + assertTapped("Spellskite", true); // (Battlefield) Tapped state is not equal (Silvercoat Lion) expected: but was: assertTapped("Silvercoat Lion", false); - - } - + + } + /** * Spellskite fails to redirect Cryptic Command on itself */ @@ -123,21 +126,21 @@ public class SpellskiteTest extends CardTestPlayerBase { // Counter target spell; // or return target permanent to its owner's hand; // or tap all creatures your opponents control; - // or draw a card. + // or draw a card. addCard(Zone.HAND, playerA, "Cryptic Command"); - + addCard(Zone.BATTLEFIELD, playerB, "Spellskite", 1); addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); addCard(Zone.BATTLEFIELD, playerB, "Island", 1); addCard(Zone.HAND, playerB, "Lightning Bolt", 1); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", playerA); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Command", "mode=1Lightning Bolt^mode=2Silvercoat Lion", "Lightning Bolt"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Command", "mode=1Lightning Bolt^mode=2Silvercoat Lion", "Lightning Bolt"); setModeChoice(playerA, "1"); // Counter target spell - setModeChoice(playerA, "2"); // return target permanent to its owner's hand - + setModeChoice(playerA, "2"); // return target permanent to its owner's hand + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{UP}: Change a target of target spell or ability to {this}.", "Cryptic Command"); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -146,12 +149,52 @@ public class SpellskiteTest extends CardTestPlayerBase { assertGraveyardCount(playerB, "Lightning Bolt", 1); assertGraveyardCount(playerA, "Cryptic Command", 1); - + assertHandCount(playerB, "Spellskite", 1); assertPermanentCount(playerB, "Silvercoat Lion", 1); assertLife(playerA, 20); assertLife(playerB, 20); - - } -} \ No newline at end of file + + } + + /** + * My opponent cast Cryptic Command tapping all of my creatures and bouncing + * a Blade Splicer token I had. I activated a Spellskite but got an error + * stating that Spellskite is not a legal target. + */ + @Test + public void testSpellskite2() { + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + // Choose two - + // Counter target spell; + // or return target permanent to its owner's hand; + // or tap all creatures your opponents control; + // or draw a card. + addCard(Zone.HAND, playerA, "Cryptic Command"); + + addCard(Zone.BATTLEFIELD, playerB, "Spellskite", 1); + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Island", 1); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Command", "mode=2Silvercoat Lion"); + setModeChoice(playerA, "2"); // return target permanent to its owner's hand + setModeChoice(playerA, "3"); // tap all creatures your opponents control + + activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{UP}: Change a target of target spell or ability to {this}.", "Cryptic Command"); + + setStopAt(2, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Cryptic Command", 1); + + assertHandCount(playerB, "Spellskite", 1); + assertPermanentCount(playerB, "Silvercoat Lion", 1); + assertTapped("Silvercoat Lion", true); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + } +} From e6b76a0704dd10b0a83a681043d1627c3d6b5629 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 17 Aug 2015 14:29:14 +0200 Subject: [PATCH 375/375] * Ubul Sar Gatekeepers - Fixed that wrongly were added two -1/-1 counters to the target instead of giving -2/-2 until the end of turn. --- .../sets/dragonsmaze/UbulSarGatekeepers.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/UbulSarGatekeepers.java b/Mage.Sets/src/mage/sets/dragonsmaze/UbulSarGatekeepers.java index 16ff85ae354..3bc76090b02 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/UbulSarGatekeepers.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/UbulSarGatekeepers.java @@ -25,21 +25,20 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.dragonsmaze; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.TargetController; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; -import mage.counters.CounterType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; @@ -51,18 +50,17 @@ import mage.target.common.TargetCreaturePermanent; * * @author LevelX2 */ - - public class UbulSarGatekeepers extends CardImpl { private static final FilterControlledPermanent filter = new FilterControlledPermanent(); private static final FilterCreaturePermanent targetFilter = new FilterCreaturePermanent("creature an opponent controls"); + static { filter.add(new SubtypePredicate("Gate")); targetFilter.add(new ControllerPredicate(TargetController.OPPONENT)); } - public UbulSarGatekeepers (UUID ownerId) { + public UbulSarGatekeepers(UUID ownerId) { super(ownerId, 30, "Ubul Sar Gatekeepers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); this.expansionSetCode = "DGM"; this.subtype.add("Zombie"); @@ -73,7 +71,7 @@ public class UbulSarGatekeepers extends CardImpl { // Whenever Ubul Sar Gatekeepers enters the battlefield, if you control two or more Gates, target creature an opponent controls gets -2/-2 until end of turn. Ability ability = new ConditionalTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance(2))), + new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-2, -2, Duration.EndOfTurn)), new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1), "Whenever {this} enters the battlefield, if you control two or more Gates, target creature an opponent controls gets -2/-2 until end of turn."); Target target = new TargetCreaturePermanent(targetFilter); @@ -81,7 +79,7 @@ public class UbulSarGatekeepers extends CardImpl { this.addAbility(ability); } - public UbulSarGatekeepers (final UbulSarGatekeepers card) { + public UbulSarGatekeepers(final UbulSarGatekeepers card) { super(card); }

    xLJoBEaB6O zlWOXj?3D*?yRi71l4p&Ajq|cZ2KGe$|zJxdm%&Un3$S}+26Jv=QL?5JK9Gp z7tW?yRdzmQHc#3Sx8l^!x3x^`U^U2SWcL=hYAv8R(LrN!CC$pBU2FUGr?5jgYm~6Y zNFrTIx&3DQaZ0DtNJm*)o2Cq^H6{FS9Y#;k$Cth2Q=!d#*2;j_09VW)g)FkJHs2al z2X0s_(5B@{!FW;=p&SgLGGFsjXRz{K57qnh#V}vWai5H#MaemN=k`+j!^C(uv?3i1z zkUw_ktU;=M*8BRAbR%u$SUxKcM_B177A@6gr<5a@R3ZJvtZiI0$P;Fx*6FO)>s6hc zEk@?md*?9ZfYXUmrUr>z3rvILI!$k`-joG3V4yF@?|s~c+yDu5ceu$&i^_Ab2gAvQEjkS;rw$O zpIATED-{y6n|nAvy8!x`^H{BRmOzLLfzp`^x$H!-{V`?1YO*y@yTw+iTENgMw$@rW ztbLZT<3YT+G^ob2>rd4WX(l#KUL1uJPIY_)Wg8OSH1g9Lxw5B!u%F{pcP%(~fT=o| z1J=`^xDwvS^ZLDy!7M^aXMgH>vK9!e23z+p1Nw3(s$UpJ680dcx!|J>*v~yetc;8y z|DGW7S>rV$BdevYd^`JMb>BEaKd=8hiF>432fH{?rdIW{zH@#PxkKA;h0)wFV&kT8 zy%0?c*v{ACEvLD{on#*`#Tz+$FiJc-jHjJX9IcH<_=Y9B{5BXhLs)2GRz&t{$r{Rs1SxaB0 z0jj-;hPDz_E=%m5@o*7q58>&Z(6`oA#eH)UE1(3XXHJZDr@;*)CFew(a#jAd+MnZo zd!V^+*HawU!kqMRX0HaBng^WK+w zBw9Oc)UpSPHzoWNi?qLN|K~;g=#xM_3`VEJr_=`Lg1;wotl3s48E$>D+pqCa53;M( z-F()u#^8kfBK~US`m?Nb1P&@GL-fa;qt{y7-*GZz2|iY9G6*Kl7FathXOglWsjr2* zhv4lYWV#8dT#t`*x-G5g{+1l|E+V|uaQQ;)&1%-QUv@tbdEVi4ID97l-sunLF#@%Z zURJva*w*2Ro8Z%ptngLf_gv-oI9qokF~AI_>0cvf`2*JTT%cHt{{NncU<=vJ9;j`6 zs~@(?=uD{7q3V+73Qi{PYrx(*6_n1F74W%pu$~&6i-qvC#(L!6naE~%dXSs!X4?g|8FTd$qE94)yM@!b`}U=U-dF_8oAsU#>>?5p}$QExsG- zmtmdGg+jN2o3jJIfWw}s$w1#K;9m)+R?;adfr3ZLMBauPMxE{O&3&5SOD=T3j{B@E z8Nm%fA$z`dRJ1mMywSCCiO8Cv{Rp|Hx@y+tlzctUTN!hvGXoSwWDB03k?x*(s6}?) z#!|ckcBSamwMnj%B{%J09%d7<_#I(?7!7|9CNo&$1^BU@m~aae+=71Vp(nDc^ELHo zrPKD#@mM)5BJ(lZ*@p(%|0<^s>YU_SW+7KX#i`^d2cdr(9j({VxUFF5B%@WifS)l+ zvRBoOgnPzB85tpJe2lg4=gDKxQZE+Kv0Iq-Ee=;_JZro%tjpP-`5CA3=8d10EzRB+ zkA_cWzK7SCP5#!xDaKWB@cQsK(Eeib{WdtY73z&+tI9YNY~=7L=N?ys`AcwkI9A64 z*;_cb*$M}@Q`6XrCG#Xr2v;#d{Ty1dp0j_~Q8!ot*ZvOZe!{f_)TB>GKaL{V}86HoK~Uzf6lch;mRCrjVpWh!&$z!fNKnztj2<@1YXa^^g(ws zCiAIkcHD%2t_=?np`R1hWLJ;9I`-|bC+C^WaJV@$G3UQBcZPA!b8gJOlMUf`I0mmG z&-^0(B{S~j#OY77rjyy6o(#=M&Io+|P5cM!`y%9OLwFJq`d4tP2cBEw!R)n2!8Bt1 zyQx0Sh5J84pC3x>SAa`DM4w+mV@L59&TTl&a27I{Rtvw+%#`P&uL8#qKF^6)@_x>b zZh#)nEUZAnE6}dRWEp2+1xl$xK1j#qZu%FVe)3$#51@oIHvh=3kCJZ$=<)+r{4AeM z#P68lpTM`&Au-l;JJ{oSzKVdxvuJ}{N;;vDZ8GuBIHx$BTAF=|HLUBDt7i`1gNNo# z<@hT56^E%z+QXj;?M{KatB_%PRnD?lPtra#ByiP12P?)s$dl)Z_mImEA?xN#*WzDW zxZBB7>l@C-EW!5mLPhiJom{Pl2CMnq3Q|OSJQFq-$eqpE%3bHP`#k)edFi8Y#5ujo zq2(;RND15u&}$kMQRm3}uvfo=+Rk`e$G8mtwHj`{3*1fuE#YMK>3FPas`dd3a5+z1 zgUx&#k997x)`%Uvnf>0tlX^ng^H3Ggxdv$N2nBrK67NDTn&PjibN(1Ad4lnD&M@B| zKf~3JfaETyatG(sjh{Nu#TVK8Of0FH&vandOKjrYfPJ6OacVq=7;7=O{1AFNg=a3Z z0=O>Z-tU3Q9sKQCEi2TA(EA(U=n}Y+MLsqm4eikFN~H1O1cztgsuOpWM1A$Zy_F{) zqyOM^N)^&MjI=wcr4?#NUYqIAd;y8EpKx75-^ZZL6KKvfsAu2KKKV*CCxSp!#E;P*M$-D%+T8hjoHPG@5Nz#Vo^tpc@Rc^|{( z+{s>ZfyG>G1)sgfo+H%J7O~QDyl`Ym60l zP(l6`k-AmDE4W^OMek*oyU~gbSWPQ0>dOJ_%ORxCzQ`t?tO85V$IZhZn~|F*9>Dgs zbI&rgcYp{@&i7JpcKYC4G|rRGPE)-By#}da--5i@b<+zdi?w)7J55`7>w{--YuR@? z++GG0`{Amw%K{`odpH~EccRza{#~@l(;Xke??tTXgyBr=Sz$t>s-zaKANP7Tv3>SO z?d&wd^E_6RN-MZFmvxPT_TnF2gLB3w<{qnn%X*qqWuBvPO8b-GV|MBJnf-j?X7O-6d z#q;rvGdVqDyq^ce_6I$ad5GvXkBFxY4xGnMdB~Ub0BMX@=gK_3jV0xp(>DE3!1FT3 zQe!}5R_U~-^=T`e&d=}QS?ymX6t;dePDC^eEo&01+{wCT$?43;F@9PL@l?2zBHBB% zr3;ZI-*)gDZ19tKFy{wqi65>=B4p2>ZbHT$=5yz@PJ#{y%Ca>WZIZH7gEv|N zw`$Tq#R32v2kFBu+9bv-);MxEk0dA_Gn+I61A%zYaEL-LCGWy}6c|`8@7Y z-ptI@RV#|WXZ?4OraJaBep42{9a@3?MLH=h@dBixoCshediEKlbCf9KA2=W9RA2_X z)sT2C=OByG_#J$WCvtrw7_1=^SOUfOa}MoZX8EP@2S|Aa{x4$sLEqw}TpRT6=BfRB zk_+|i=_p-V*Lq;Lt7op3!(X{%JDZd2^E%-AO<0(@H*^5SO))?IB%4paCWBu8KI|f@ zyB^7NT6!aXL{DdLRz04B9Y2PyIW#fwZHNG~%6r#TKnU8&~$;6-3ikA>O6v;U3c zkF#qH-ozS``L{m)3G}oWefM;f*zP3W-@`toP*gi%wr)qnGm4k-zo%WE!*ckBh*Af+&2f6}oSa5Z75d(QyR-La^T^d&iQlb`okK0+Jhb^=iFO~tA~o{- zQew6@@SRh_wNy6Dv$Qi`N6S2Ucn)^vULqvBHc!E`KLa~)ScE>mmE5}(d$Szc+UM`& zNl!n#mc&63uVQD;PJJEE@8vnGMU~LK7F}2YO`QJrg!~rbYhx;<=T4wfrhGTWTi68O zMr1W&2KIObn0k6?1<)Pjeyf_EK50ebyYU&j@NyqO%^ucV30=&^jrYdrQ0G(O_yA~? zo7}laGMn_KKcc5=ht9XLY zQw2lFigkDAD2m_JwxIduRLJ2pJYeGO5gRe+(4HuF9~r zm^x^i2Y)=Br-nG?JH}O|%~>rgM3dR25K1})V8_Mj6)STSpq_Py6YSW}-)gdT&T+is zGVphrL7WE@xq#WQqHF4{Rz7p*wHOl86NEj`gS8HyBu`^QMJFqUBlt!1CaI?fp?dndyk^>-9( zwc&bOCmqsimGyhQygg>^h*HAs{Ipk4N#tW^xC_p7!HE`dRtn3IA*=fz!eQ@rM$(>} z9Y4>PYpvShg_ZUmo*3uLdbT}=v?}h|SnIS-^r;I*2ggru0#`pUIV-MJxAT|6Wu?R^wR9%To}93zlB+kF#C}JRN`8gT*6`(2 z8$7TZpqvP^)>pWOz-WM7YZE`&PVQj+Q#({`4O zDs#D}L~3{J)Yx}Pb-_17*dbT0^UwiT&Ty@p=d2icvPg>Ace8eF$3a_ahOZ=B@p2kM ztD;S+#`2~YswmwV_7P`m`{|Uo|7&;6mpz$kg#A$hvo%mBx9pom zAaau0&W}5zOzo?`uA=V3;{ZYZYLD`!_>kmJQ*s4sCcaFErriKb<-u10^-KrM9_^|coZ zC_bLGt>jyYmEvlTdgHv;I5OcmO8aek5@k%kX>4q7!alq`NKdKlhtukyGpMNrEW_$( zDaYZd9UcEUtJ(_|N{QXX9zILs5~(x_Bx;M^L2sfD=;sM%+>Rp``lxgr?U{4+N{9Tn z1|x^G&1PZt>eDz*>bSEf+2o#G6X$!!psZ42e_Q+JDxO{SoQJc0!jtN+O@BfPQxPoFx<|{l9vz#T|kAl}MI6 zPdl5=!FrmxmOG5_JtJ%1)a=UKDAfUbuuc*yP3qmBPT{(~QwyGiDr86d7oH?g0<_D{ zo{zGc?^ujTk2YQJWEQK2%E@$6!tSMcjuyoj#!T5*(rUSsm3B@b4)U`HD_=+UR0k*Q z(rZJdiCj#hU~N?{usiYL31O!}-8=P;&h4t@+Dz%-zY*-2eL8)yrvaSaQZtoSb<{3) zZt|_g@}E#e@UqkD{DKoDuGNnWX+OQk=d?UpAn(zV9|s5Da^R;*oAXuU(9iXynrE*v ze46$Rq-z?#dB2v#v*fO>M^nzU3F#Z6(rI4(wvY`aGOso|t>6yMeR-DH$rycyc1}y> z{d)f?39Nc`BZ3ijNl&8{BZvB1-!qYV6uTXstDKn7LTHr={euyP@BB(B=}8B(r}Pf{ z2}Wz4)^`%)PkQUR{cu~qr&p2IX6D8#N~!ZnMsZHgNKvCOXQzjO(>&H#a{`i^&e6-u z^rV*D)q;8diA0*x6Tioicdfg0l~XC*lo4%;I-g2~c2ZtTF=fR`Ddo{T&Hlf(#h6vu zm5NeSNR7t5>I_V}ww&^0joxoCp@MRuCG{N|o^jVQDm~8sDEH|Ml2f|Mjk^n%Zzt8V z7-RV!hIFbzOP~gdt#9@4EFga*6x3Tw9raDV`mTWVpYgQX>G|~;=$zC}Wxkhd&fOdJ zYG2eFznn!AMsZ5_mTTIT!9*ThH_Z^mR&7+`)evz_J-cy6%0q34`x`eXtJ2a;G__!M zQS~Q&mcBh15r^djLEqwurd>Hr~E;h^(QUYX0L?2tE&;k5I21h7S6VdzheGPpy73C)k%z z_0vjKB;DygxM;P1EzzITjKwwcHya~Pt$>Tj4qxt7Dc@0po2>6 zgH#lqT9`{Uss?HEBvlh|Sz|Vr+`*@w`LfXPqj!#GV@#4~&8yf%@Y(#eD)d6{deSo!{gYv~k}#8X*eJ8M2b%_M}C zV6>15OD#2)=QvH(La(GYE{cWJQfjDiJQYU5g_+%S#@?i6_%hwcM&4OlOjUFVl~Sh> z?bWnW510krJ`1MpWT+irYbD#cv`C&>Ms(%LsXQd{1n(1Oet=Wq_i%c>mG|V@p?#Vv z=>d9I)6urK=^NX1*oWl25;kNm2sN=3+2CDn$mLJtTzUof0B<$;Jjls}MRa+-LI3vq zXs;DfBN;2x+NdMI`XIk~8pSuiEdt+bpl}&=8)tSsjaLE{)j!{kXk22wr=Q)8ijCfk z49)7MQ3+lI@2#&J<7l7LD#t#4uVIHR+-d*b%A#*R)Dv#u)NMYtH9cdcM>8ArO#3$W z_MHy7$iNz&F_B6M!U!w2y?4TKvryA|D z84a5m`|i#I@G`BbIGts6O-S9NlO5%+l@EIcJ}c`4?|STX%GTIVZZ`aX&iWQ#`L5>J zp;NxCTA3jRaIy~hVL~yfW<+KDnAT6-#d?6()Mo3RS|{aKXw^Y8;zPhRi5;v+$vtBW zPf?`NkFuMG92he>k?K_|n;9@LTGHaB7RO0VcXuw)TBMV)wczG7{V}A$3@ME~tbHgc z;@~V~niF@hy7O?-&UKCd%z@12T-A9~HBzj6T8z_-NhvUocK1~4oj7x)v>#9a-Ia;- z9k*$2I)w`OVXpX&AfdGT*)fhy?Pr=V zxp$g5d+J))QXTYt0>ZDo%m?F?#zxS>CH0*!7kcf4w%E8{%c;GZ0KJTeKSURNlXecA z^;B(oVnFRUnpg=l_B4KVWu+#4zn602v`r7No0+KhN~QYhDfTI>rH!}35P_lyiYi&g zgjV2vYn8RCT4d7}9o= g+;HtTZo2iR>u;-FebYB?zUdp++;+oFe;LC60|OO}jWpZZQHhOJDC_0PB`6N_}^VQ|GhWgQ{C0oRn>)! zwbtG>sZ+T^g=bq7rD5p?*-3s`z+h4e74y#ijqi4&WOv9?fh=g zRaqKMNvWh$aw@5nNXl>bhx^KX=lOT3Rj3 zsH!$r>#E(=(dq(qk-A^qqs~_+s56-#&gi7pQ5&gU)rPEJNNu2YQ%9+*)HSSAkG)1y z!<8%i#sX!a(ne{a)Z-|VaYnD)NA4MSk=xxZ;;QaD=b3ZN+2O2rRyj+Z!_G(Nvvbv% z>$GsvI+h)3pS9Q9W9?z~V7sl|#_q-36nmOI$6jiWw9DI3?4Xs#E^gEaODnI9*3N2i^=kTfeU*M$57i&(*Yv&mVf}!9Q9r4#(dX%t^a=VN z{iPn=&2%O+1Q+BJ~9KQ zV?H(Sm|*H@3gNw^G$udeQkZMeEoc*ePew?d}DmGean3dc<iy#|Y#LR1ee-v9Yo75R z@$YBJ9{&daV*enwad3TbUGPHiLok_D z-RfdZu(n$JtsT~8Ym2oF|BGVhx9j7zW$dhYbQst1Ej|~;j&A$#qu+R3Q9OE*J>TAG zUn45Ku+Q7ancr#e=KZq$0B`wdf5KxzoI1`_XScK2S?8>Ab~;C#Yt9wtwsXmO>6mT- zx1sxwyWBnKK64{0A;iws$_7Gw31Z)Hb({KDjjtuqGHb=Pq1r)g!>f`kJ`fmM+9?(r}D7KNu=x8j(TP!1|+1Z?JZZ{8_$IQ!E|9*3ZIl$~^jyD&Z`^>xM zFEgnxtFJmX+Su2^H^4X5x7fGFw+D;A?YrSS;#a)%7X1HmYFyPhGHDkr|KQ` zDtZw;2e0k;v`)XNKhwYJ7noZ|1bIm0*q}Gk?!IOcqfhd85f#!j;ffB)9!QR0J!D_+6!AwDa;837r zAadY5o^%9H@%uC4XU771FlVq(Fl{gx*dJ&W_~!5D5AlDCup=`0)A(cg6@Mc9=e$1_ zJ}@*eCNPz~{0Kx1CJg2Y4h)_R=Cp=bXRSY099tn5U9#3$6Y+yM)`Q>`#^vDMV0`Oe zGD#hBK?AZ#YH~cn%(a35YdmE5`Re7C1t(oO7!;f=?fea;H! zUt(x2C%co&N$(UR-;Z|YfdTe8Uz}uaRyU8E+l>o82s#>hFN<5jZQ}NF=ebuvM4FO| zyWUOdsx$@r!~|z0QYtGQl;%n?zA4Dk>Ey#3$}c4$Sf-LXjCdX!pRPtmtgf}u8fgu* zdRkj;jJ8_aigoVSj$?&OwW-=%ZGpCmPmi?ZdT0Htt{7R2!bWprFd1$V8Dyw2-dJyZ zGK!lc$TDNi_GGkbW^;1eU~`nY&^(UspEr*Z2{xO{%@t(3(JVc0elz3xviOSO$DPPr zJ$*Is>6~P%yuPBo+`c5fpXM|3lDW-XWiBxfv;J%H<4yCP`Ns5{u~@H+udc6&uaqyu z_shJ(9*3Ac%vOwE<{W-yJo&DgS=`KGrZ>}?8F)=?W@KbC^O{Xr`-@qeNKl(!OUk|q z@Z0Hp8GQ+Suh_aIzJJ#^ZfqdOPc+&YrHs5rYGPX~BOdPsjQU0+mL(zQU($~JP5|IpwDEMfs+@R<0|@$)O9B@ybx8 zk5Ue-yarnc1NHsuG{;AaIyIfT*gz&mLg$mc(yj#3`exm-_TVQqth81#DdE zE3Z|W{dKYWT4SuS?0YVrxRmz}R#_{n72i^=E5VJydBN4ei@}IsA}fU7j&3~-ZX<(j z4(<-_!un_N>pO#cf-8BS8C((E#Igaws=<(;i3i3F>cJ0zH~5VjkZQG*Vt-eRpJN}S?R0{9D5FaGXv3K24{c3ItD_0z<6g} zvzA$n_|D)eSiv+_Rja2p$vSAMc!6RYTXDc%JcmzKA z#{LGXd`PBz%kV0(8}t4^nv;)eT9Bn|D{JW z;usOSU;n8`F(Q$de(DdvuFdt_dWarJPox*s8|WSMntCq%tG1a;F$$Y}N$!rW$J0~j z@j-bH@b5`vrBT{AZ87;LhMrST#o9N>Qr)!#+J3dST3L;vUQN5DvVf6+PWu-a-?o*pH%B$vQ>&j|THK`g4xY}SmbRpDB0(JpZ3=4<^~ub}2vcc??*gZ0#o>U47SQT3F%SzV$| zRkx^*)F4;TQU8#?*Q?D{SJ|ozR_Z8am8vk9vC3pdMWCxqaPM*js5g7hEW{8{2*39CDTsN4h%=u-d#>?`-D`TfK6Az?c%a z`NtERqquLe>dDRkta~DH>9ljsxx+s0 zIA@(xOxHMyRBknQsJq9#={^BH-r_a7QeMf!H9zj|f{jOp%|CFDx;r_84V*&un z9D>zea1J^Po%&96=c66XDd==?20DW{mYvRh=bICmbG-zo80XA#_Oj*{XEDdvz)9e| zu&>~M$L!7E-21j|$90l8rt{ic|1N$e;@+z2}kpQds&N!?2B9CxF8gL8c2 z9&snac=F-nv0Tk{9fx~S-<|F5ch9+DZf5S;BrJ3?7Pn@5KAv|?0+QU(zLuBw+ggWQ(zfGWJU;{I=9e;-&gz7j`CsKiG{NrhehgHOd#bE?JE`08tN*#+e> znd}3e{RO{un8KBh%6G+3BXI_4@cnXX5#H0Pd58o})ggF#XY`Rmd{c; z)KoCa^Z)5DH}K`XT(gOILmQMOcA-1Kg8_ows3IgWKM zbA~$goKh$xUx>|%xzEe(9mMA|_Gu#Za(f)AM+dtjibDxdWHhF{@Tc5%S~QC&c6`)| z0-($Z_6ls}tbLVn02Vvb9&Ha~=?wPu081F}}M*zY9l zWeJFFhSL+=I11;{fUDon?ZVa11F9?P z)^i7PwkzCOcuXTKEwLM&5d##T3jZ1DUUx&tDPy@_7nP^ngNwww{k(=LQMr<(-~nBU z)1B0Q@V9~LI3mw7bp2J25i>P9BEE5hk*{;gAeDJo6ObbGIN62#cTrZ%3#Jd zqk2;$(=zMtBZpDUsB6?Q${Xc)@5@mgHy)tEL^V@@?iBN` zv6p4TjS7a(ILMhz);Ge;PU`#g+2qbi`dob$bA$C(u(wirc0Hl4>8|!i`=}iv7gp0k zi2R}Ief0uaVJiyXaJ44Zeguq`50&u}UQ^x;asN2?h)C0j7tO(GC7s+(a>s8!v-hB3 zbwSt4Z6`wQ3J0l7w`y9Mtf*En7|!qqqgf{GAdZ#NN^JcJ-UOvh56%Wh?E_)84(0+Y zg$G{3R5k_X1f~U+1vUg$q8_vj6bYmWBnhMrBn!j}g!y0ipZUZ5Km4{|4+Q)VQ7ihR zR=gP`cwMj`xE$M_@n#(M1)3M ziMY-92y5%-69^hw#fonXAqE8T^s`zau^~zDE23tiE zeGWW+oIVT%?6w}+ND9VpWQ;?@8w{%Ngrd>Q_{SJ+EHic)r?9VW#u{T4n&4qnG~G-L zrzmDNGiPGuU*RS{Q1K3;b{t}yHt(A+@eB=iQ5r3-6wD?Ad?Pb+RbVfze63L<8ldg9 z_H{+w8|51c7iz?}710W}`Yxb_9P*v@UGY8jh5BCmp8GEQcAy^)_Ekd-(R|NfMhDSENPY^sC8x<^^4 z%<)D)@>>ZMq>t`NcQ~=?09-a4lswR`WoNg4q61E~+Hr>q!a9n;J|cqGU=@RdwSpPo z>#2gNgK6LgKhO!L1sVlP!^v|o<$#$N2^2$3>kwEGcpZqzTG4}#0*xAF+4Y8|}G7{}HIugYDkv=aucuC>77}>GiOVC2*wG)@~TZMfUax z)muja&&eJ#qkJ0nSL+mKTaU9$iC*DH&DemS&qVj^8LS_y3qxy*%{O8U<~TP5w=>Nm z7R(DShiz>@8(c_iSi{(lU%Z0Jy$L>sf$a<)f$v2_v1!Dabmp~!l?MhC!tWHa>RNr^ za7#Ewzm=Ovvt`JpW;Tv0}CSb7Wc zOglz5=4!&*vzd8#&B-=tu;8?2ZnLym0i~fknPeoHr4{xa&3uMEZ!tEbzV9TTaH9%ACz;FG)V~s&&4U{Tiw8+W}uHXuHyxW{gL!;3qy{z3UINm(f^|A}Y)1!ie?zT)Yu^CXFJb?y!B^9%XHDdFA(gGQ=Ffq!zB`G%t2!8_Gzh*l9F*0BYg3;) zQ^768REF2$yfy&$c3});y^f%+vfRU@aG*cjvtN$kMs`j2yK~do1DEQGFXclG$O(@~ z=OjfV$OHZx2t(P8j(5nJkItF_R+1NN(8U?dF<0eCvpXqK{~SAvYj_cT{yuXCYh^%R zXz28Z>zt+T_u9F|9lz|nBg;i~Bcb)Z@EG4`j>2@)a-6fd(?49Pe#TO=qU=>rYQj1C zD6>J$Z&p0T7dUQvVsrzwrP>1a*$MpJ11z{g-Kic@&#Jf8*Xl1=ykGqen~w?Z z$%}ut*QRSnwfCB;Cr4ve^jBcS4d~S~Q3}RtJy5hdpcX7eo!$%oJ+ED2TtquKiE20q zjXN)TS1PmvL;Iy_%oWm#k}tA?Hk-2V4ov;n*8%Mc%Elw@rnZmY>y7HzUz>vBF`rLE zwXSH9RoGWGttIpSQh}PL%^~ibe!jMX zqnw66_u?1j^Lo^dMI3uij-sVjnj?G-Lb%Fw5u|rW-45344-2nFmA8aYg5?#M_e(tT71iAc*lrBicv{xZg2r2jEsMCtu+i3V`?2m|Y_kTQ zKZ00&j5_fpnCKmpkz?*YcO6yF)%@m6z8y*QSVnBPOf~rh(+$?x$=FYHy6xU4D{q9y z&L(~=beF)SR>Ry6Fjm6<#_~&z;2s${-V{Wz6mCM-$8l@u%_i|9GP*$~j;Vp$mgv&e z?FN_c%G8Z`G#E72#jTE~$uZa9+}pui*719L+4lgBzB)QV1-|b}jr*;eo)|id%KJgI zuv2i#JB-WJ;15!TUk6{FsQim^-I(flJ7owOsj%o3+=-bi@2hl&`H1>6m-U8V`IWdU zE*1VaaN{TBub*@in2Pib_}vIt><4(U#{K!h9lGjngH^TUOupe&JMg)AcXbFoz0~KM5`KYy5w;NM8?__sHHJl3P zoD3rziF&vIbz&b8>l_jDgZ;zS+1_INKeo&JS0d>l;@oEYC=u{2we95O=b}y#B1%H| z>opL_N_!dm+X@nSLFA1@gpAdq$8EdR-AoJy9T2Xdz#2m-{A<;aOK*gx6C;8(bB3^Jb&rROGU&@;~u61wS#$E~rb$=K*Il#R$rMzn{vbZqQH zL4T*%N)mcAnuARCpqIW9zDap#LuV zOns|SipMff03yNW&k_K zF=JChPi7{Eqy7Xr?_>Q%#$vWx$=n*|r&AAUVdO%c{YqURRCn~W)CQUw-M}BM;jM*? zY>XoG3RE{L8bx8W30c?S7;eE!R&jh|^&#-nq55d}>IkNZ`V4(K-3lZ0o_Y&Z-I|<9 zZO*5vUS2P#Cj*B)Au=8&0`4bvU)S#N`JQ%-D&i4d!!%dZ;kX(YKB^uW^*0W9C%0aX zt#j!<{WaUHNB8VQy`sI=i3s14N>DlQPa$;A8d_sMHPIRplbdR-v@Y5(FZy55PV;*U ziLdRonpBa}XpZ_&-3?Y8io(+ly|XIpAc?A~FHw&d;HS;WQbm;%_~Bh5&NR0Z(WVjc zVx z+EYOYqYlxRx_aE8M!oW9;BnwI9C~?R30$H-9Ralibzu-ysK^(EQ>1}OCk;dju&Q6< zJxU;6ARWt-1me(9kUWqe5I!0SI46k18Kj^>ikD%KiLm)3B5A391 zpm?BapeBrEAiwxNkRn(%*d*8^I5l`U7z*o10@oQ}Edu?Vr1#|s)ra_Y8v1QofR--U z3bpxpXtNqxYzQ&eb{>NRjyNZYPiH`im%sz(z!W>F-tR+$eTLVh16|fc|E&kcEDF9$ zLDtB~)`^JGDaaqy!7%GU^tZ?qXJE;H++1XJU6@wFdlcRc#iHRX?zoV)oi%F!Y97}@eU{uZHzsc+P;_?@DeS~M-KRsn1v z`FJGRwmbQG9BgqZxp*uVG8*hKi!p(9+L3)nvwRa48>+q49#i{1gO4ud+Yw~@rdVEX zEr*tqP8~tu1wa%j$<+~58h)T#Jy)MGLOG6IbfUC{p`=pdsj1ZrYCh@>d13!)sW&7* ze^k{^Xp>LS5@kG~O7KK^ro2=hDYwZrw@@vks43L+D6VnUIBXNbNP!}m6>YLO{a%Sw z6Gc9NuJDen!jvHM@;QR|W3lWk@u(kHFC{u`EF}|aYjZvig*i<}{~fOMK;!LAzMA2U zDO}xNtdoUI^^H7q(>;M6J{hE09h6?fZAMP&;SS-x4W$=j9C>^mV=_wfOfuFf7}`D* z!GWwL=(Q58A|V;#1xxP-Fo2UEu9TnzH&S31(3aGVd}8Lk@_wK=Y0D&O44*wZOA<74b~ z0x`M;c%V6GXFf-HfpMJ-`w&hN8P&QtT&WILR~?*`8&x2Ly`)2dPC{)u!rN~owB_jZ z=Y1k;zb1dbcfWItL5}1nO8Q%_(rJ!u7h?-3XC2sP8Te&6>hw;o-)W9w8&_!>XDpSF zp+r8+sI56b_F4GW!Nb;4*%*taGzCVy8WgaH zYk7m~dW*HMgV;jJQc>AgZSGWO&`W#Hw>G~pfa|uL{3Kj$3dgjKV~udr5#gGGP{x2w zcA&|gRt}J}_EHB}hqcVZyQZR(EQC!SgkOiF_h&@=E{{f@3&fd4O~>cFSYIVjXd6$t zok*AA2vqYf*m`v;XSJv$wW6o6AGNbFOyku#>T2pqlUch1+cc$;RvUdjEqeL`<)m_q z=zC5%LS<<&b~ypmwVvZSN$q(b$99DGb5x@5;vILDOVl9Nb9|Gr)qk+%33QSi1D~B{ zAJ@>Cf6`0$p7rjq_H&rVM?5Hmqi+n;7^zO72U7I?p6XzF3+B@|bb}c2ON|7JPRod= z#nu!p5+fc>x5rLzY$G ziiO~x-#D5RT+bmO^1Rrt9}D^j5>&C_Xr8rYpneiX39|e?K6IRM4g37g_{0)H$6N7& zt>EHCc-lOC@-*Hd)vT9T;UBtBfAMazk9h1UBlou`jK3%qx;k8=*~&(=$35WFRb07U zT+xHP&%gpYU$hmqd=XlKwg5t>d?8_2~5@*&OH(Syc%{s z0%V$v+Qu`KsI_$9O`&sU79>h|E5-NYX8&8tVgY9beX-f9>dm8 zSR1UF)Z>SsDYZmds$dniilN<=XVjry-`rDbyIcLN+15_Bu<7Xxp{|k~mFziNueRo} zR7j4XW;eeEGS*(2*FIq;Ts!P-a;pG{ueW8JpCTd~+Oqn(Sod=+{Jo7>&&o+xhv zz|~{P{G%9?&;ZVXhJP@AQ?0*E_Pok`Dp+7^HEL$o81J z-7D_+SA5iVV-khRafigdkCGL_6_bpSnXbkrSlUSXb;rV#TVrQs!7%B)ERl)qQUnjI z%sM@&r);A>@D%PG70b@7l_39B){0@(*~nXEwB~ToJ@jpT*CJDCPp@aC&X5lMIfq`E z4w`}J%!Bl9sAkQ;bIo~eNj0J^%jeKZcT4}STlA8~HImV1lb3GO1ZY+t=qbBRr^y-p zlzv=4q94=G(Ytz?Zk&VqE`6K638i)e$aWtXayRqSK#P4)ZtH;bl7Ri9z~!URm+}SH zeHE-I=Us4zHS#@F$Ty%H%=g9u&VDxC z&P%BEZ&EiBeHO8N2_3d;nHKZ9ovn89KAWgCiZO-=HUi)6i$^y@kEqXeEJMbQqP`%y ztRpflVay?Fc0oUGhL^O(zjBZlo|A1h5MzfC*IRQ}^S~dTk@L0^x7WbiX5bU!oe`*2 z2bH>n{H4*h}1zOq;a`1jI+C@~p z?@kn|lIh7W(Oo}!+dJ}z)Vaqw!_auTI_;=Z)}n^koIOjmdpW4?5SeEt^V49V+sRf( z$?B(_6YNi_?3eNX*UlTP`wZv458d{G6LjL!w^LG+GBq+C76BzX-jW-{l^L9r8O)Ui45q4Y$t1gogp0^Bqri`Ch(zW5mRLdJElsbG;?C>3Yj^W^k1oW)6W%za>(=|sS8pd!&0+JcZeGX_wb z9!#d63a;70S#KiuP5>p%MZuWi{tFTq$`$DgHm*(VYy?_r4N7jwTzj<8MrbJA_Oxz)j_KDEzlM^Qmt=>4pE1*XoG$BVsvHdP4u6LA|a~8 zJn-Hymh|BI4g&d&_x}51_F_MEr#e zQI6zw16k<;Ea|pVzBdmfhE4R2|~)DjCHgs!{@G_?a3a}NG; z5q2-r6;Ra$Y#Zj|cdS<-~x!q(X6xiZW)=@A!hXpYpD`(NGLhQUgzb zeqdwy0oK;tm@u6TC}#0l8qN`(<+u*vH;3_@Gi)1*&%6M^-DSLD{vp483@<(E9n)1j zb{$^1g4bg!6%|!<{%>m6l|bMO?M@XzT~Mf_J&HSGXfP zxeJ@Phl@RBZ57|$0bfL=XCf=Pz8w8uHL;)i+>^3sg+;-|jX(%fK@JyTByY$+Hhon& z$TtH)b9>Y);HFP>SG^~{So9y6T4ef*qSJen8(pIz3~C7ZWj7rW>m+^y z_rHKndKPx|Nc%?Da0=poQM&qD>pk@D_Vekp_7iPE(QWeF2l~Q4u;e4}SF|1Q zzLw|$CFw2AkNz7;`$mt`GkV)@sz>OC+(_=20;X#N!Yd5wO`=9;7(5&En5eXj-ngdp zZN*T+-~^AUZG`hPKKwKZ>>&}jE*`J3!At?ZdqT|E3}RZueL2Kkxxrl#ZS(|pX)(6l z1;kzrT~ewk2Ab=4qUmjH_b}5jtl==WxDmxcV)|&J`oHv%bY*m+sxXx-vk^O9fi=$~ z=N!VGzR>Rz89Plyj88NlCHNkxy z(Cpe%NvVwz8A7L{&kk50td~?Z!>nKQH%7G+cu(iV0|EM3{tT4$%=&4WJj;`VUea3Z zqnq8w(*u{;+v$P2L|x(``0Bm=8CCHk{mPmXmyXATWX7y0p>4hXmgQWtw@z$NqZxMUj|X5F$LQ@j2XA<+e5F^&g-L{wdv4KB_+E(u z#%e_F84cKC^3vs}fSbQp*D*DEmGBPt5cZn^Y!uEqXF)Z`sTJH*AM;GaZ#2hbR5tRkULKAhE&gevP~6~1 z_ke-csO!K?ThYW0(Q~tv4xCw>;Xg2>kuaID|DEjw&U+{swjNnHJH4Pu@q-{&=_wtP zS5Z5!!o1`s*RTK8P&VgoslS z=AA>yKsR`hn19#vibL*hGUq08%_5YyVIYWR@a5WQ5Y{dq7GPdWl)ypT%pV}g%(jM7Tdz(p zM=mR~m7ZF77P^g#SmhWctlTV1MTc)J`eEYH>zjdZv%)b-(*02bj#7mV;4-XNkWmu8 z(TC37)z)^H#TBeP+zMJQoI|lKo`ngsUQ=0==VN}dBq7}fb@7iu)bB^5Y|o-Lxe>+v zI#|!8UpF;6dkHXDL-5@{_~HgK)p_FneX_=Lp0yJUm&nbIn$j9fv5MS#4b<`xUKtnb zPD&g~Kz1$26>jLMJR?8@1BmJU(R(H+(_q@;sTWTJ*=~Y)A7q?jT!3L;P|k3dPVjmG ze*Omh6&KE*52jHa1l9wqn2p^W!^+NLi>I(j=?9L4mFJ^Nzd0Qk^LXy#EZwIM(9Uj9 z@j5`q={EGV?J$nBsAUvt3()HpQ-Pa_L1?n8#R9Yb&)P`dxOi zX)3h5`1nc+&}n>Xd7)hO~J&tj|q?eB-%OHbfK5dKH1gWu@Tje|m!o8QR^#)%1w_zI8s3<`M* z&bbJVx(l-Th^2<&p;xh7sdXQM70vbhv=f=8J?x?dd8d|B1vXTi+E7O7_|bU&MEK4< zDpPCmiyrXo3OwIg0xzzQg3uD?U7GBWk&Kd-_w3Yqit%kRy6N-qIjfxx-_m#n=Qh1F z=g}38&|iOu`8Raj$M@K~?5_}8re@8^w#ySb9~fVF&L?2`(C^dHcUcM5qAzu_nbe_X z@j4aFLMmr7s7Y;u)jy;6UUQ;y#A!M53iKijppGQ@_b_LFk7|k*Igj~D$T(el*o1|3v%7AHW!;`8oiEj6|zCQpSF#^u836vnX_ycO>JCO2Y(8GOR zKZ4X_VHMe_@0JC(HG&270+kE{*N?@s7s8>o5Nr3M@tq|~-y>RI!>7-otX)P^yU6Pc zl;XJb%2r0PY6j=6gL+q+T6{mR5Bvb!`Z5{q78xka%S(~TOD>A~cQVySYALtr72gT( z-sW}IKVq5i@*hNlS5&$r;JWhDn*yf#eE+ z=o+E$Pr#425?wCgv$vTp@_f)i#sS72JpBNXU?+Y*pN{xmV8Pl%uOjR_H?^VyT3I~1 zF*vpt6}rAue9en(Vz&v=IQpYr(ADc&!@bS`=00&(CzzjKesbA;bsOl+BsPBF>TDrRu5 z3mL0HvnxQl3pvhB9Nl@M&ULchRWDjSC%Swhe!YT^J!U^o`Q{pDaEf2K$Qlp5^LWjX z{Bdmj&T>@O@oKt0jypQ%mY51uT5xtUJW!`=K=r&b9^WJ-N@f9r7bT+>;GFYvc7D_oZ#u?Y%jeB$r-7MfrZh0qyu6Iad-k)b1^l5{iqvvJq_VL>VaVWP#A4w z?tCH8PBkLB=nd_#jIpruqhQWY)NXXt;^?5Icyx$nqC>P2UfB-&8bW1j0=RQJ{;>*= zIOO@|b@IwdFy}73=>YSO!Gyo@y&ve=5%@|BYF^Pmkx{T&QL|%fQNey+!IIa>N9SR1 z_wddS_@`{~he3D*Rl0b31Rnbhl=_(c?n6DBi&u_hjK^D7^K8g2d~+T1vzfM#+fL!5 zTR@L9@#T5=?lO?EbaPL`pT{uzgBseR)ifl=RAE$Ps*FNjlC#W)&m`c?RZ!v&dh|bo zEMJ2br5bhtWWFA(IGQWf3AEmU{+6C-8{No^%~7svp&-;DJ67hp=H+h`L{dJWGaN#F zn91E}k9U>EO0&U(BIM<+Ylm9vFCr_B7IQiMxx2hV2RlF z8o2yAFQcAkZ=vMV7wqE(zj_1|yM_F*nXwz5e~hEKfFf}ftA2!~Kj*ifvc-FlpM$=j zx?jBf`p8=@h){ZTzB>xuXu={T<47-q!FeVGFXzXOYti-68ojA88cHSdO=GW5rXL!X z;D=UdPgSw>VysyVyD!RXdFIP{*HC(G;*!4-axD|%1DWuR>hRW9RLOgQ(Z_*A=2LN6 zz_p)?_BDf=(?rnwNWPhjin9bXzk;z8RcIMLvXd&t74q0inDcL*efs$xDs6BC16;uejmyw^f`1?f<`#j(|$Koi;^cv z-op%IqAOOxqKA0)y^aiZ6JPmGUUc!hm^_1(jCycNkNt&^kLZT?O{7Z7YO zUOO{in^A?VQwhzaq{rm)qSR+*{cPl#oMgL{^o;1*ANKx%9C*v?0^5O49wze&t~>_< zKf)1gA~Gx|K1{_^2fBDpRWDV>Qic~#s9GKDOOi5DjOFOsICDx96I3S(*IKtpBV?WJIO zl|B1v1Mi|*QoxgOL&yYSkX`4*_Dwb@g7 ztTiifAQ~CWMl~~u1yMOFi=+9&^b4H!0UwjUHz3;F2|V&FUVj}Ayo4VfK?mIJ`S~V% zcp*yo7;3WPy#Ardc>Y4Vw3d1Py&0`WG{q}k+&D*cILhZkY`dQIX2MfNo1a2_m_-lf zQapY;i19CCzJV{_As&U1y+l)t16qv3HT*-gk)>fMJ3mqVB&W$)MB_T=<7(973bf~( z+qrGhy^2>DOo=pLu3Z+>^mFw90e`nH)_pqo*I{T9_d#i(OVHqjp<=A12p!FtnwJ` z;TU@6CS@hqc!tM+C&Gz`!?yZ^oI8<^o4~g!^K4)VB0^zCKHiJr4~2;q8R(x#LG(yW zo=HZZKw9EQCe+gm=-H|85UG-;B$iY~lkW`KF^j^(g&l)h$1r(tl5F8Uv1(~3HW$< zu2*9)LJ#UzeR=J`b*WBgXfAXY8Cmf8bky0?@S2)y9!dR8j(tmC$z!ybOWY}`ou7jp zJR;+M=U8kn2ZwTeH(>~8IQGrl-C0D3VQ2?EIk(y%n0#19CaytJ&f0~Oe#D|a6C3>h zMdrxV4OA-Kel+HwCQKIeWd&dMD|> zSm9}-|AMG{Q!DF1Ep7x}E%892!Wc6C5VWXnR2y3GG-zWGcuo2=%ffOi!*&~k*>ywBpoB72D_`T&s;|e4Ibtb{<(-1o)569zE zDspiFu3b%XaW`=2c&{^OHhwSJcPLNo_2VkHBOWv$QZyktH1p=F5ML{!sMX|CQ{qQQ zDwqS{BqOP}^!J|i>&RBpQ__>E6LGdBYqs>NTy6NJjzpYp#M-`8W`^@?(wVT4`??ja zdn>VJ7gdJSfR5DO80q{=Q`fNa=*|8O_<~e6mZS8}@i2XF51R{K zs6bawUamqsqJ(JQcbJ|KljLtfe549=8>VuAZjuf3N>1jgb^AO_20?GT~A3>|T)Y zCUEi^a_THRO89SUSZrpP3%&UPW#{j@ob&AG-q^y+NM8 zfXaT;TXGK%e8s)`?)9U`0Q1GCawRz~HMy+--c}#h)t~skkj%Lc?dUpI5zf!YC7&cC zr>6u}W&~vxBUjfzKWYm0>_)fMP^t#PS*N0rOznDa)N7fwg?@D~)nB+)4dh36IFTdyLZlZ4;gpsd@Coe`JnupG{3~as;gua=v zlur|2#J%Ceb%`>?!RQ%1RIaEI_}K^Y@O_ZV5#rQRYEx6t>W7ner7t!kc>E{q<_fWN z2R^k3mNkYr-5MrWfE*AHrsu~Vo`5~~<2&==oug1Cd!e(oB-_*__tZi`lIMbQ;2m-J z+X8>6p}j&edO)}TBc2g|;eEP8kNkNm5odYQNuD#m$P)q&`0gEQ(JenRWCgqGP&^g;`oNtDcg`6yATh$b6$fzc0JU~x-&gIy?}_Z z5=_00*LCFSP2^9}xwgZnPmsM|kkK8Gv#8=JxMreZ=YSg&g-0}^i(@F=21~fQ$MBTr zWTIctQkA-H0(ek%qFf%jW78AsvJ&%(a!)FuyjCR>l>sGI0~5E0I}S&IodauJ2m0IR z)fI11`}zPjwUnqJ-b8p!Y`iBf*f%Y8fZXUHCBeCM!FtU+m834wSU!sMHI@_@><_{nGN@q=gWV)eiHyB(HlQccw8n~FrGF@cv85>bat zL$xL=IU)-q6LrKKD4u^inX|DxEBPZESxvZWT)eHx;ABy5}aHXKf zSD--Qt4Xn#I7Hu{pwAch*j;p)+aAt*$=rSL=oPlPLJqslc9-FN+p)vNc;PI1u*QM# z{vodS0PVE{{WSy$mc^>`VcR)*%|q-jN?t3?(h}HuL6qB~{1vV$-rr_ug8w$j~iO$rvH<@hn`WB5>>~T)TQ?ly)%d!90I89es1X*Y7L{ek0s* zE$@3hoF}^%jAWQhcv5yeO7L45{HPI( zvMZw(ok@K`Y@@tNrS$u+!k4zfMz-Tod$EkOjBDVyYp|Hh#LL?-nlSjE5ATw{Pm&Q9 zR0s@Ljb6xxu%bHnQ*A~=@>3gPZ(n%i5MBrIIt=@qh*CKRFPnpgG7Ddu&AX_VqPvbG zUri!rkE26y2wU`IbS7(cWBcCBOYd2IeyIZXT+&03MahN*@azm^$0VqmG3iOOV8Wl_ zUg7Yp-`@D?sh#gRZt32C1SY)z7dy>32lF~hu9d%-v5T?IlZlWQ4U_`IFhRrH1~ zB+e|PS8fSjvWWL7RCNb~cBRhS6C~V$D=JR_3$LvSbCbX4BFa}PudCh1U#blf<9@)= zgrVIB6G(U40q*E7d}~uAjx(TImy{9*>28T*F zo;+)~2lZ+{S#%#N;eMurbg1oTZ0GxRSoJEbdKF_iV=;MFo^y~V5@njp=Orv(#hUBb zVhj7*>iy1YmM`V|*~B54{`V=y<>;O(J>~Q7wktiRB*$@pUp~z5ALNSf;EJzi&1Fnm zx&Fsc*)Dll?K1D@iFLcpc46m5sr_%VGH?-F`-Pa*zP%7-ez28oWVPeGl^<(hR>JS(+$RDZ~0MAX*tO2 zL72)8d}JLJxD_1XTo}t#d}AV+WDtJQ4!@Am3h!tRx@y8%RpZ>sk<)9yYMQe~M zGI}G{sgDmefOXd73Y3C}<^v04g`G;5d_3xT@)w*VypH`BTv^dMr0-5T??h!=hTV)O zEB%8f4dXeGF+6!X5tcrQJT=ODn!A_B&_%bC=R&HY>4|1p*3&~o1<6I`$`8tu`LrJQ zPetxZO|(wnRkmW_VX27Q*-%n5;gd3CJ|AjIY4%hee64fJM+(kfFMcwI}dQ(w+;Cg&tg{%LJFNNL{A|o!0HS zL#??Rt(fb=ofB*|kvlmRO=>pyc)9mX!y%aIai(Lup7i>-u6Pyi7ueD_^fjHTn(&o) zjA+cO)SGOSHb39dio^E+8}Nsp*!&Hf{lX;CTH^H^?C>2H8OGczY*B1k#uJdrZE(tY ze)llewwoBe1#Y~SD7^;NO#ERV-yOtGMg7~y8rzB7>#@ltL~S{G>Ax98Kh991^+2-T zKj;+`&{O5FelG(5&t=TyTxW33GpR&O=KQ5=xgXb}J=WU{yR7Y@&ypx4#kg)IvCdMw zmSzYh70sjos$^EKYC5uQT1G0eZwhQT9YdZKPsOX~nUbGVGnWb5&P5c+!CXeZP46vD z3IdiYfara{y(gf2+%I`LB$^Txgv_5cV(1_ZQ&cg4QLSEFm6pmuhW#Y&{c7 zLI~L=kyoFRs$L9oMl|m|5&j{5kemHUr%Fz&T|6ki=ND4rDu=JtLe&y&s|8bCRI*we zRa1^n^ssJTMWH93+W)tP{Oz%}*t~q-h4bi%<@dr1`rr`*I5YW6cYX1ZK78thZ};H6 z3;C%d`)|*FTk%_Mnd{ECy;181gILFUHL_8>{zGgSO{Jk=fMLq;q^0SxqWx z(n&s!S9zvuGT+QZN1eyCoa?)etGv<6daKD#i`aHLJ~@d=s&VtYbr;dUy_ozc-%Vsp zg7L`SXYyIb4E8yneXV3)vX>?7dp<*Q*gAZB6YAbZ=2o(oh3s<)9xuLri2Hnz`z^h# zSI`^IF(f-(Wx7m$k{l-A-ti*9Gcu5=ywnTA@$^r4_ItK^kGFsDK7D41F!3*Vy!ihMULOzzZh9VnpNw;l`Ag)v!(OI2 zM9lfyId`4hc9(I-%Sod1U+0*fu>EWHBN*>7i1h~Bo@bn4l773ZtaYD#zG97Uo(3Nk zyqJ(GNkWigOt@kUswFXrTQR71#A7}I(JVUEji@Y@x=La+n1pnbNiUi3%Xpy9WGH#5 zn3A$IHu26tU-->=e&k3#c*pb9JD=;I=PMk`MXuyg#vUTp9xs}$=SnXi`ponq?l>av z2(V=@Fs1xuiN@r`dc>c)MCv-^%xc6NsSM;IW@I30Bu7I^z-vMxOLAgJLR6(_44ulY zM#RvF7AlkG{SOKe*g?3LKLv+AW!%F~u6vc-qu?Z||E|Q=mSA-&u*KzAkynds~_62PE z)kC0Pyo&lq*q?N@eFKkvHOE&qvPS%AH3S=_R;y3 zcpziZXJRs=S?Qx%Ks7&733@$zl_Mt3zm+;(x_}HQxxxA`WWKD)nu(C zM80%n@qCOT)J=;M(aLk)(kWZl!^a)S&i#or{fRhTh+Crl*GBWN&NY(1FH_mW1f_T_ z=UunPY}MM!>Ai?$5}n2nd8DqtjA*bD|6c{>UC*?EX%ly5n}=NYlj~11i~pbuA2P9kFB``Fa~`OLpGGrwvpHH?Z~^z88KqnO~8oP5Cpb!&r9^-ZF$wW7vM0m&fPwE>GRa9{Q5+`>>y0tSA2uL~lOzXZ>Mp zEq%F@SXa9EBCQ=%D4Y=CQ|zx!V>8i9L?Tjn}O(8(rY766?MkbJAuOF*&_KrNy@_^i&7iS z1J=k6rpO3>5NsgN>*rv~%p?dSCHFQid?K>v?U6tP0X#dL`!5zCf7{dM^KTgE-@k_P z7Oe1&{wT4QFp$G1*yvk^AjNy|nZLTVJc)IcjB=6eatnn00`~HTZC)`K3ctC>_m{D~ z^WL~b_K`_A(ivV)qZ7$=j&Cm#Rj!bSZnMo}#xs8BF?*0F$sc*l=sB-4$y1q+S@xJY z$yl-^)cf7f{I=9J-*LR}z_9PVaK4vn$V>Jk?BEsqk@rwO zKj-xg=PJ`nmdY>PWyqPzUpza>(f?(7fAgpGvYY@R3_Z1(T#-*30_-A1Mje7l{k4zsm9u`f(g_@vBV03d!GNkl+4$&E&7HNj|^J zB-dD;^t!>Pd*1bU#o0*2e(#-=Tt(@4yTkiU<|N-=OYg73WkR!kQ9}oU}m*uX?eF)?A2X;rBKF@{tP!?m8sge?#(qZ2@V8aEl^@3zI z=?5qPvd%}8D#*Lw?ZO~#LD<5QE5MH>3)bbeF7NfIMm8if*5|zrQ*EMIZI=Ii7e3jF zA^MCcG)+AY+K?@3vAw9uW$?B#_*{8jWt3nl#iw$7SH;^`U4El3S-27Ws3lWt&sUrA zxiNch!X(dkH~ep|{(t#ej;JQTQkf$z??u}x{9+Zjt^7tl{92f8R?b>{ya2JeI9@Mj zD8FCEJKI7mE5s<`oquUQm1eFO+ZQ2ni!T0GKai^=lXpSgqCjmV*RE%YAnlc`KbJ9$^{0c}XL_ta_96O|{Edf&pnW+yd17W2 z`w-Nzru@64d1>0`z`AbV|TySSiEVeQhBQ{(W+pW&4 z=r`rDl9Jeka9{D9l8i!FNM39y7v7xBW4(#7lLVYcVt8;O&t~GG;>7hnr@)fZGG%7U zhBlppImv2?u&9`<6^pA7hdJqqi_7P~`w`1a$s|27A?!IdwkRxH{!cJjBPk<=_nwgL zV-jh6AYUKYHwui}hkB%<#9G*?V5GqR8GpQt`G?&3jV$tkcqPpGA(nd$t36L_{>!?q zaUZYnSt6`ty-R!&J@5t*`x4*Dni5wfsvq;B=pG{fJ}<8B<#iWUvWu83Pib%aFDlDl zZCi_dEn`}QZHb~e4JIkdl`zq9|6}80u<&89*Ma!JKp5`;5NAISXAg8OVamdnTcgvq zWUi$*gkwvun)LOxU`Z?Qn>KuE2}71o@;plq__ZMXu6&m6wzka6C+R%t&TsUALH~n? z$?=Ffy8z2y>79k>x{@m-M@laHn+GH_J;2hRa}{569VH%o;5D3KaplF*qj7&?aF6BQ zrsA$;0i{Y0oJ1(GIMG-n8p*pvP_eu^MB=(c+&qnFq^*e4 zO|W3$wcWfvl}?^U-yNl~r>EEVVR?VH8pIG3IUZa#-Se4=yb3B5y;UaBjsykDk}14T z#;+#hPvT!wn483wQVozbX2Ij;gLs#MY}bQ(rFyWFu^p9aGaVh9y*c^IcEV_-OYJOt z@D}=(s9d2;Phqw4yx(&;>`PeeGv0->-hl}V-+joM($5wOvwY6G{2e3dauZ&D4SsnQ zrh5U6R`lCb@Lth~ud;?bKX}g5az)WS&#%hb*I0g?Z|->exXXTobwA+qeebA*vC6u_ zT4if_rbXE60W>#J;WmTb*MgZBaD^o5NE{kSH0jPYZo}1YK>QHCT86ut7yl0Nyi}Ad zgNP?sAV384gXzMtlXv6_!D`a4B-+N`n&W=r>n0-YQfzJxd0-mRejL_61ofu}_9^z> z3TE069#+$1qoU>(hNtC#g{EVqMzNL7wp3m%TB;lgVTW<)?uf#32`=36HzVBRq|(9m z0rvUEt35vQxTicxAw6!_=}_fo&y%h=_0ly9c$Cr@~7p>J)Q*TpK& z#!Elz0fzit2YJH%_?D-Ov&YM(fr2AZY&F}O17Sj!H?g4Ys6(`d} zzJ0=Y3MYO=$J{%wmJ?2Y?H~HpZ6<>nkPl`X2_74bieqffJP`~w6;oQctSEfa*Or;9 zlgHESig;ReNjPl{uWwEMzJh4a{ou0$xzuosH}uNJaGj%HS`-Y>i+(Enz@iup9AU(Ot!g275ed zB=f?U#Lwn4q#Cy#f7(R7PW(w2rSQ*#Xwve(5QshB#)2Q<5l^t@=lIhb#$UBbs)C|T zS#+ZL(5PcG;-T#%M#%}`S=tO<2e&*?o1Kx9ew+OKp9IpaR+4VDvP{yoR)eZ~Z7Q9O z=pAT9XJ{unLZxT66V=YPblXUGK_l-ejC!nBkM-p*F*RgP{TAk0; zSyG9<+|v9`DQcRfy}vsqedWdITFB3FWM#_45y_Lj(rucNDFerwj-yUZB{msaRRYdM zw5lj*?7C{9vj0SR3-eT{7sLyRFt>>%Qpb^}Pmd9W_Ih5tlB>E1FP=*jn*m3a+D#Ac zMqAK;;9Eff6}V%iz=DEDMYj%NBp}E7sBQZ3;!m(IVTz(EJ;xUAk_|CI`WhIo8lGIBIQ#q06 zg-YP(Wjt-U4Bu2_D$S?-j4XJ5S`=xii^_XC-a~j##gx*E2x*84srg>2J5pDb7!l%4 z^2||UmWaP3^S%jT>-5xoWG|`NpKK|fBwMFvkD00OWal??dUH8=&CO@2`($KU2*)Cw zqbXP(;>D!A_*!99_o5tWF;w^xo&sN-b1TI;$Wu_2QH*MM{i1cr(GAGkjlHWOIlPH? zWjYY|x)A{-FH0;O2`U%~_8kRUnCxNKc^;Bj;^FDPN}g!Vi?|Dm!5Z?{LIiyXyE}>p zp9ZrErn!VCUxP`?vj@U3AAndNdRYFw$H7Hk5Y!}9B*9gY@NlV3#P--ga`Je3hM+om zm7eV^%;&~l3WH$(a*wKbesw&*I+?r{Xtn_npb>Ufmy9l-Md_4pgv|-_k|(QWt@?bD zcUi9A1Oz^^AT+tC^(T1qh0gsTs2-DL;6!LVG{PmX}UexON|GK*S;LobM4&eI${dSjC zKtKe;U< z@YA^SP4Rkn{li@O#?o%l5M4ELn$Cv+_u~KB=zL$7ejAZ-m>az{LoBGT8#3r?#>mXg zD}tNn4@tO^FOOY1q;rx^w|`!)=Oy+lImpg5fBg~}e=5g0Ief|d++2S(CCzFc&X4@TyvaUusgXn4L6xfI)m&re6f z`s}FX*2HcdQWp*B7sEl&>Cj7o?f)43I{uvI6m??t2k$t1-yr&WdPgfHM)UGN<6hdg zf(2W0zH6M>^uIGSOQc(4B+)&X@KDD5U^rd6wFh$dP^jY8%m%4=TeNXIGdqvvOj7or z$GqOwgo5ISmNJ(c!V}|)ebK}fcCE{KeRApa1vbF7L!-Yoa?P65u{Jf3Amu5!UvhoB zaeY$OCVx*_)7GM_=U4@N8*g1&T1xONTY)!_{AV-!!BXz_%2ilO32WUpto=UO-8Uv| zNL)HAL+uP&)2erwb}wt`c4pj$Utih2e^!>xrAvyd5Hfi^e zAuk_1@RBWvefg+R+@lkY4aVZRk4m5e`uRbZS)GpyPM;W@J~6T52Yx%Bm_UC2#i4Pc zO?t_4pnIbSI&)C)Uy5{we>*Gp?B6engjP)*y;R>GpqqM0N;%F7DXLxhrf{Xak)Dtfz{%9D`I@uXw6)Y$!MNCM#Z{8Ph#((3t$U-R(KQN2J)X( zbSVdoxjHm_sILa0Vagnw<5|n|NNez%bydDIv^swGyR*_e z1D(Dq?pvyGnt#RCtUNvRPXdF*dEP;VE8n98zds19&@RxYgFkd-OCXXhj(#2Wxib`r zRi6g^j)eal@jHg@foD10aIarU8M^i_4Q=vmp?=jmeSYv>w}&p$WAkYG_k_=lD;@8x zgJSaOq=)#-vR?aRiGMV~`z1Gry3%-ma@e0x<&OZelDQ_7(EH0QU3W`8DuHvM07{kQa$290j~%c0L-8RMs8VeR^_ z%nxe(jm(?byEn6VU*_}v%qzVO9rL#3m9aKLSBT#b&c)kO#Xz{XHrTZ$>%5fJ-Z!Co zw`UC<)8RQE5y*m3u!olh$a}%SljDOqCnfklwbKK;bgrl7?$lsUJw!k~JKNdWSzrF- zF8#{H&L6zWZ-f)!6ZJdcJ1&R^)CDAhw<8Q8o2#e zh2K9v;n&h{`s=ALK5cMv-p4yCv%-&s4eHR~5L`MiIOV;D^}!l^;kto0_NCQN?n3NR zbZl?~o}lRuB;22M`%wbkVMlW81u)63={=?GgLa~+z6XrH!Zb9v*wvcQ;)e$v_a>Yj z;oe;ROP&}j7HFZBqS^c3VA)-PC>9sE_Vr-W*K-fb;2k|4&kB~IF9eIeFkq9G_vS$V zCxR91DW4cRU@`bXi_AaqZ%4p!-xyAYZttT>xgq>F`DgRc@V#$%gYY}q9F5xMNF*mVW9a91G+Cx%y$!OrM)b0e0g-+ zS49@(i*${T`_7X&k3n}d8%xq%$=ip0-N@LdVAN$pLfnU`gptVpM4 zZ=|ziiLtjipOP6lIcL^))*kyBP50qB_=xe~fI)T~I`55xC!@K>pDhJ<)@AQuUD+$T z>&LS$xa@6#^m0VqO|}H8?IY}Nd^&L2Y_E3?c(zy2VB00|#;kqd_+J7wyvuJ0l=|l6 z4S_sflwk0^@lpDVNR#i5jpbcK>vnB4z;92W526*?6#WnlG%u`6Bfno3jqzoX;V+5y zh)(*=Lvu`vq|BQmuh!4&;>0h>-NmWlEve^{=$0>w1iLAICRZg~nfhJHv{$F)Yljxx zTL)}2{Hr!6@YecJaKo1}S$FvU-Vi+d`(VUP12cF=+Qa@SJIu{vuc4=A>*Xg&dtZAg z8G$75mCV&0nK8aqz9(|m*p=@Zy#DvHKYu@Sj90|tMclEk5tg-Me!5D*bz+tKJ-Y&bP!b zhp$cFcuHI`MsZ2TLuY?cuD&<&<{?kNaY(_xmvLVhiI@I~1plf~5wfb?ls=hN;FQeY z37J9M;&Guv$Bez2MTkxEfZ)>8gGsnIUQld6d$LM=B(`U-v2S>n8gIrcVzD!PJMr>m z-kPn)0(-l+`u;lyT(Uo~2l@XUoC;lacZu5v|MmH?SKJb4Bb~CA9q3j88 z?r*Xyd?d8}!-3@wMl1IIVA^{Eq81@^|DJ=_@Z{PRH?R+20u5;5EULs z^8;B4oU*m?t#vC^nV8qBT?app(_sBWGf_{TwMS>&`8MIkUJ!bV;(A~C^xzbVe0Hwq z=IlGT{O9ON_?Odr(0s5d`N{(CI>)ak|24U%UwU<*&mA2#EezX}I$oKl=&$Ha&PjOr zz}&MEVGNyosn>6;xEmaKLJ}TJALJ^(-Px5U>`ao^T8)TAlaRq^NGXu?~5!ajHA8?-nctD z6pF7A?;_TkN<_~da?&${RnH79!zu3{j$mUB_G;g*r$?y%zO@+}(j6QUJVc@P4}# zkX7mp&Tw_SYUq1tfoO!_s$GzUmZ#F~q5bv$kwRxJfZghkrgtrVkmr-SK=Rj8FKNxU zJhr6eyT@+v&Ggb6AooPV<8MUXtFM(WH1OE=?Rl^c+G)#3k~=d;EYdUut5<>l%9K0C zmCgv)OU9&6*_krCQ)W-@R*iptCezR-(ZA5)pmwAiTm(;0nj_!x!I#rAZOoa^#zCQx zq~n7^Gs(YX9-PS$gTLp+4##M6>2w|VmrCHr2lMC+XbzsA;{~C@Ac|h0el2tj!t)ZQ zPn9E=TR$>=@dleW+4SgV6An$>cR|?stNSQb(0|^JMuPSq z7&v`Kb^zW3`{i(^K{+7fX0za7Pir}KTl8f49OgLh6^LCM=q2xi+gw%oe zvWJjjtR?w{*7M=4vVFz6-#?^|YLDvWR+ue+wk5RCKd|sb!)bt{LiE%^+HJm?qgnty z{$C6HeKnL64D!+A1zOD}Zsvv@w2Wcy}>+IWrgBlEsG z8chn~uY(V&CX@ygbo1n+HS_%%mVN&dN-Ormfx%OfBZ-sbsu!UtspL)nwI_4BIx|fB zxhil8LQ#?G6lp%`K{sZVtl9oK>H$LT;636kVWHX^UM7cS{b{FBt!D><4hyUt5m@OP z7o-$2D=y)$qE1MhUlu>_lY>tu<$B`4 zvr~de-Yh&JxN~g6b8|MnBQtV)A`BKtXXc~+GI%0-LvjYq7g?PzjC^tpxjN&{#RuRsiNNWboN6pCkj@_YJPb5?WLu*C@P#pj% z9`5jlLLVI<>Hfe};fmaTZ=enDO=osbV2=DQd?$CbKq&6i$h-3H1gF)k;o<1-%gLeC z@}{S$8q{_7sPDU@KDvEgYiiyy&UYuhRGsz!f7mBnJ@dWPcyCJ66_XLZoBs27@y&;N zZt{TXUPcprPe!Ml(eRM5&vnG`iQVLf31ZUeGR(*WsSRaW1h$51PwXk^&(>Ujk~Bel zd(w6$PB&@RAIY&jE5H(AW$4+T$ldB_HvM==2~Q;MTpI%&4t~tx$|^uQ^+w*hKnA;3O0+wt`@3tmX z+mCy7xT0aWvfatwJ+5%czeE|!V;NGF)+}4?8;0%I`llN zLtDE)*6v`YikX?d!ReL1W<_JogQ;w4rNd}*!(4^EQyZ(EYq6RA50|(nY2_TPBQ8je z)$|0s7nIVXuq!p7`Xp+tH}uTLsI;e-MraMQN1kFMbY}O|PY_g_CTN>frH~3{!DruQ z0;NmiC@;%4TKHa{5;zFdhxM%ZgzuY{w28^ZVzwQ41*_p2Tq>182~dY;CZIJqjv3Gp zyoWPxgzsXlOt2bes;6AFuVyx|B(){`tNwIf-8cO$jjW{?<{AeqPs?pipNHDL@%^~Ya-MdwVn^-cG!Dg)ava^))H3-hA+e+L)@A#!Xo>gEgabMn}`_0^es-^EfxyZq* ztlW=^ec+*CDYFZ7QEEp_BjzPTvEMX8D#S)$!Yrt~G7hO|@Gb zTK{DKsypi5YcDPqbv*W{1s7@bod>)_Ie^I@!mIKjc!aq+i6lKs8T>*At@qmDX926o zCH5~XO*i&b{3D(YF#f&0gobETCh zE2jn*CO&}l%64LS2z9EJ&h}?UihOIN4(Gk|1nS7+7o{wRXkS7*%jNL^_=Dc^k5INeHTAI=RG_9#^&(rPG ze8RQm8f(5XLR+8to}Q9U>63Ywt?+y-WKVgfFrjxX1#WuhzQ?T7p0P+(r;_@BE`q-K z?CfDjV0K%=?6vlmSoB>R3%pa)Jh~3BvXT}|?LKE+Kn;k{MrFFfNpAB*;kXct8kEjV z>C)5S2qd@6g1!{a)YY6>R*fyMwmw~WU0JKvJqJ%_yY9tTrb#JAsdYZl{a(u*pC`;h zOY4(4XzAA3dfS5fI&OJ>t-Jl`bMtv=X3yNVv=;TL)SziCJ$vI$3#F`D>a%^)S*~{z z>*LY(!Ms(qS`EFE4uZPk>S|2;g>e0GH!%%NP7Eo`6c0fAQ}M)e@(S_bPRfKl*k5>- zKXI(^49ZJ4>jONoW?uEN@kI^og;crv*w#DRj!~_PSa%=eG{(i)^|N=guGXP$IaBk| zS!)^R+2W*1-QU#SoLQ$j^rI`{4je3H#nz3L*GkLGwQ}vcG<}XxJ#)nETc51HWU;P` z78hx=H?6ldsjZY+ZG{04TDWNoMuYy(nvC3NI@(#**vyokYrW8^Zne5^JH`cmJ3?h! z-{RTAd&~66mROYZl)DCX=?j|FR^>?5n^^;_v;OT_Tbp^tqsI1X_Gi|w6{9c%o@lwb z)@`G+(H6{8`#0x!v9_I=&W18Qv^Ym+UVeJEwb&L=6HhnHS?v9yEeSA>h1vcwvJ$q!dyvVKU;p*+1d*?eNKGks&@=eEvJt5bFR~zw?d4&m2*B*pV~9y zoVBQbG44fwetP^X%gi~ObKJSX^n)5yTHv3gr^Ry8e zgB+!1U*>$x+3Wmx4xhX$l+dod=+&Hu1vIXl(bi(kwAo{(6_)3^w@>P=M6wdTrCQlu aCoP*Jm=Mw0^}i4{YwUU!y7cy`<^LaOP2+U{ literal 63990 zcmW(-1#}x{vt1A~86?Z>FeeQ*&@eMIGcz+&!)d62hMAd}napg<7UMF!dH>lX$+Fg~ zmG+yNJNMpkua527d1(ac-?CrZaZ~3c84v_PVN2 zb|e<5jHDs8kg7-(cou^w5g9^@|NnP>F<(3*&K2v4*}`U_uke@9U$`uUg=q1L_^&8K z?u(Cvxq?<)EJht}CBn?iXleZ+6$KOb}k?_ji#=g|{Gxl3-s%>wqDmpRxK}<{QZQEq~ReQ&{ z?C95~v&KvM=31}%s&cWss_dn-gS3g{BzjG30%t#nyF|Ajt>Ik%BA?Sc#IwrXz%6%w zah>u^^k49odSl&mS;bPM_)6j00(ai>+-kW=xeanU<+RR?$rJKAqSCE+BKWAH} zB~zDuHm7aQ(d@a|Epjq)X698W@a2EaC-Y|&RxAn@t}N_Q@Gkd2_KfUzIb-vDc_Z`K zyqX2h!t|n1MW+iM=Qhi!mUBIa%$rqMv#3VVkfJYzJqw!^4l0xsH7HtFs4V=u&{|lO zKe^yyp`vI;QP-j$g>MRb6h(@3#e0jeqNauI3Qrcfibs^hmV7UcEs>WNmFAT;EA3X2 zU;ME+skl*5ucH3NzLG_bDrL^HY2`D@lbxumn`^jhxofbih3l8|s`HccjPs*&oU71v z#r@dxpLdV%tFOE7nOEhz>HF$m5KIiWh;$(Kk~OIF)EJtgCCoDB0y~mdi0zPvXf?bQ z-Vbjh=_|F$H1cDL=BhGvQ{5xI*6>3=$6z!GW^dH_m}qOB)nn@w*D~%uTa-<(qPDg+ zwJpthJ+@bDo7j5ReYSCNf5ge-a^gJk;}ahx#wN~9I39n%zBTTY&0}-My^epExFG3E z;-rK)d&FA7`pa4&ZnOPP{HTNm32E_j>^&^g8ipBAR?EWkhPb)V(QjDK}GeY58fHX%o|)rTtS8tNgp-k2E2* zb=uLiu4%Tk1!<4dPNt1Xo0Ikm_IaEZn|2^IBei;3!?bQ`71BPYI#Nw(3sR?~>_|SA zTsh@MN~P4?lxisrl2u881SCNgFSj?33)t$!4T;0z`r1xeyIASi>9KEObTLDsw?v_q zxuyxmzYR)5rasD0#c*FQ)thuF+NGLwb*}1~l2Lq9+)+d+!m^>#yLc|z0nv$aLFDRk zO;|5Ijv|PYkt^XPVQctHuu0&TFXTPp-Rd3fE%jJDQ{58xZI{ovqP#`fMn|&4Um7UA zRNAu?FD)%eDE+(ibZPU_MI~2?6N(=ewJzccl||;FYDKk+I>HL8TQszAP{HwhTmHAa zda%yR^CS7{f=&5Y{_Z?7w_R>=jxo0|_hVkG{8jlM@`e0g`SJOK@@~T`xjFlDy5;z? zr8!jg-R!N|jkA|$g)%*v)+|fbvaA-_AG53HEXui+^Dd`2XJ1bLoYWjcPC^cnb0>RB zwj--k7M3+Rt9f=&wj=v}c8zRbW|ho(nG-UvWa_gTW*y6FmHjfiVou|ntn6voE3@S} z&YXhWmwC(cH{_?~x5@7g_qFo--rIt2|3Ri#-cH&AfAb3;dM>9RnZy75yE2cf8BJN4$b}x^J&< zsxQeG0R#jwEG+GI8FF=v`LStdp)qI*OSh~639IA(F|Mr$wI z;kY+;G$D|%Ht|VfQKCIbnRGJImC!PwOTwuHd*YSE-bsncZ<4#Dl%~{3ZIn77^+)Q6 zwBu=cX|*bBt?;|T&k6%7xYLT#sI;4DrnGIT6;t1(tWT+*@*w$e@|5KD$+DDHDM_g} zQs1W{sgjh5$$uvINv@r&Os<;TGr2xImM67K-ju9OIhV3NwMJTWnksEz+Pbt>Y3|gc zsq0fmrG7~%Oum+ME-@ytETKGMS3>24_3<_1|BP=H-!eWSzQ|r;pKd=FheD*Evt`;u zThO-3R&4DUTPOO7<%&7W)WVc)JZG$7DlqLe_qFJvHbgy-5-klZ%`KlSeWNx-wYF?A ziH0q@5t>Ho6{=0Dt?Eabd)f)QJ36)gj&6ulYYy8JZg?{dxUD*dFUk_0fh_ z21ego|4rxD#p`$L5ran`(pP|Q`=g;)zfPa7Pc)<(rW>mm8yE_7bG0orf2;4Q#;Ry# z9pym9czH$H1<5je2lfF9bTwof)Y$j@A?_vXWSn$_@{{+8yojCnMcgMQMDUO$aNK{$ zKi_}aTju;y`nAxU|24N#-aq+l;oOpor3XtbrEg1Clu*Tq#Rm(E^FQZ~%n3uhe976E zJ3cQz|5jn!;`${cOPFFq@xO&P^4sMe%KDP=C>_lx&&bLckdd6RF+-mBp4;!K?K=dS{jpc;o#{E?Uh9%OLuG%L{a3cP>`Pg7 z=T>)ppDpkvP$4kT@A0+pM|_{W_uOV@ZrRE56RxWs!E5lX_crxRbk!C* z)S>urain-u$-I*E;yT4!p(gDsyjA$2&`~(EsAlnl;?^Z?N=_Dgi|#{)*K8<~GUze>UJg6P7u!b=4e3la)C6nOGS7PKv#TDYn(r*Lc$Ulb}XE$IlE3w4|+ z-CY_i{Z;BJJ>l5l_!FXedRg6atMifbfm7w&SiYrvQMtE#h?8&~_BIX73|$Y4VR!hC zNN>VJzM&cR5PzS4&3$8Y8Jhl!me5bA;nW^dPOc}4BVQs9B4&aij*=DNw{Iz&k+9v_ z&FoC}Ju`*r$xLJJG9B44+k-3P_VA^`8^Bf)G#%}Zb;dksWwbpYu~o=wv;h`DTcapi z6%C?#+=DNZw3NzZhh-*tBgI?gFo@~%nthr_nwnZn>(B%>HME3wuP#T2>FxRodY5jN zE=ku*H$ZnxS400>U)xBUGA)gw^)Yi|YQ}zzm0KHHn_G!kF}Bd!GR_>oE`dxqp5Tu^ z96vAqYJ81^p$VH3ViGeGu_SfU@5F71;}e@ER!_`G*qNY6j7f4OT}^JBvLhuXbwlch z)U&D5)Qu_KQsPsFr|gB>=VWd2#-!w=O^JWNb|tY&(tk;tk~$>~O1hO)J$Y|(0#r(S zYW>tFDP(eTa&%HO)L~OXas0FRIth`4I*C^kg7H)0(fGUe#r941E%vqcx%OT5J@&)) z@Amugn#A&?!zpu8^{Jy$N|QAyYf_e_B*1&WOg@toOo)lU5%=0Q$o9!Pz*^BdDt3KL zkC?pZ_0g-N4@IX(kBY%#V`KNl+=zY{g+x8Fu$G-si=ywuOpjH>o{IiuSz#J&_^CUs z9j~pcU8u=c2UQD{qZL18O{GgDtt6`@R%tzHfn=d1UUC=jh-YGFvB}shRDpQ-53G+q zLERv~5H*N6Vi$3Ws6^b3+>7*%Obx#b7WxnPg5F-<6P{b{NvEDtC@| zc5>cyx}EvX9A|=Ssf%^BcmLx)>b~XX+`T=uJXhR=tG??$XEW#R@{?s>9ZMXS9Xrdm zmA7)vc5ZP7%9Z6lSoQgi_%g`;0$)T7rGVhBd({e zcCJy*M(|!+oClnDog1B-oYP#H?sJ}do-9uV?;!6+?>TQPZ<^q`T zEZiX6D_kcm4bKmq3)+L>K$qaT(CKheq;X_OYUUFYLLzX2YWn<;v{V>4j;U zX}58p;hJu@_LJ73E7NZ@{4&HE8yc;~HHIhpT%B6?R9m2BwX=0|^lrl`V@G3m!&dz( z-DK@X^-?7-x5)2Fr%Mtg41NKZNG?bUr4IQ%){%lz;t*A zd@Q~Je~$kp*)EwV=_FYuNtUjZ4w2fVZzMA%JnqAXOLFif7>?c)XNwBtDw2eHP$S+$ zvQ_#}=8~r>&nkB*Co9J&S1K5w7D-i5HCROTP#DLja_NjfucSNCbLlXxU?*_(`O3VLBe`O34wu8;g8I;z zO=BN3-|1qi1$B$8K|Ub55&p;-!c6JtCGa9$vi$N2vI}V=SlRXcL`Ccc(>K%f@ga@G$AAn z)eU( zj*S#XB*gZJGu$c6g?w87md ziTs0HME-#49fgU=EwR1WT3jVkVpn83(g1ladc<+ae8egC60Kqf@sjviye-}m?}=sN z6J$LaLG{>8bR*gm^&)o>5|N_okV5g1xJLW|xUdf2h0o_#3TuQK!XBRH)^m-xXl^{W zm2+@Of(@c3SL}vNL;532kjcnpWF&e4n=Hwc?w382iP9oT8%YnzO-Yf&ByB3KE$uE{ zARQ#FBh^WpOLt4pNY6`~$Uew0`D0mI*`KmAGOc`*JV9Yse3Jhq|0261dm&pOgN9T# zUiMt}P1Z!#P1-|p5kHEH_+rU&i3jh6GuRHyij|;y(LCguI96EA_u>!nemWz?1sDYG7wk2l~ zR-!6#jCe&%CQL*#!cSz7e^VxUJjCI9`YAnxmP0fTWhSt_I6o(FXE_D8nC;J=X4`W< zZa4pqzsUFC$8yV94|AP4%sgZQjFP>~rtvP}CZfi2vGaIO$!p1VNq>oeyYM~|qx6Qf zk*r8IS^i7zhK!?C{HaJ)3|8D!{}FdLZgpHzT$!y#Tv}X` zEj_k0rb~=1re@6I7&aynb2a94j2Lr1_KdYJbZFh;O5-L2&U+d6-WG2=V|B#dk7*Nq z&2r9s*4)cdZYi;>vivkJFdsH&n17icn|qs2n7W!+<58o?~SdGEh~~)0q%cgPR}GVu4f#}XrFN+U7IdVZzP6!a;KFM3s^ zES^~WM@d|1N5}iJdd^taD_5>-qAS@|!}Y`!>&f$``=eKVA|4(!SbW z-CoT;!d}NdCGMB)o2}IL-ZsaUXj^Vw7P}I7z)#Urqk~avqozb{jcOhBr=_R)jY(>{ zY-p=*r~9ehq%F|ot3Rp2fME{G7swV#cSN@B=RDP`Nq2otsQHid^Ra{hDQk+-3rTBBv z>%xNtr}N3YlX<7|j^rK9dz0tNE6%Hw|2;pYaBI;j*mG|2h@!Uz4f03kjmhKl?&Pm2 zXj9mCZtrR7J@4J) zt?s?)N%PEchoSdr;u+^%>s#o*8Mqa!1-ZXghz>3f)(lD@{}%Fdo)~Wj?jqV%sXxy*!&l;EJ#XDxT$h}qoJr0jM8U@ z`DXf82kr-*p?|{uaAW9VCKEDpHd#dKs0gW|CQ&K0nOVvzd983*xFkFmOkz*5v$#^6 zg`5ViV5;P>^t0@Pe754ZVyF@WtnX6a(d^XT)Me=J8EP4I#>0kXhV_O_!&~E5(?|1e zOaG`Y(Vb&#u>)cavAbh5F*l>1N9$s?#`KD1V!K(VSg%>_wk5VlHlIx!*D!8++>E%j zahY+e?TzB!#N!DK6B;M+41@DLOd6r6F(+C$9}{9#hz_{ zWZ!O|W*=!^VgGDTjPC;bB_@nWn3FId;eLFsy);f2H`|8TURxhoHSm6KZU5O!woBHg z)^)LKVopY%xsudbsRrrE2` zR^E`8O1DZ5;w-irBLSITL(SL#Y&syhGL%9y&|N5oRzkXn2LvzQfnUPiV%xA*b^!a7 zm2u4hPpx2AFe`y+-9Z1KW0^LLk~vJbp_R0QDyROU|Dkba7W059V+xr#Hj91F%>s{ev$7;A1EkOsLoKy z{s!zlkZes3ASaW(NRD_&Y$fc(p~$dE_ei6NH1a#VD;yjC7|IVl4RsB@2_6a_2`&m& z3mSv9gX4lbf**qSgKL9n!JNRg!1O?sfF{r*@Gc+=76zsSvi(ZG%{S2d+f(Mb<4y68 z4^#l$bU)ZJ^ffd&>5~(NK5|1OtA|;V&L@c?1d`{M--cdDxMLSFFr@jNqszfK#Lum^WVM^Es zTr6+oHGBg;nZL~q<63e}IRjU~X0SzUF8h|f1NY6jjofMO33O8u{xsK(%VP(!VP-GW zmZ=O^Z8Ec;*~mmOJ*PQOMXJ0EBDBs0_L74UnSowe<{Bw-zv|M&r}GCfy(X5kIE?30@Zhws49m( z-lrO?eyy&rIjiZQt*mRHR~a4ygHXeG$`H^u(jV3J)>Q)@uw1)LTSePP>jiG2L?_W( z^#k=w^mFyofxB+2->}f`$MbLRo1oD zU4ipjuipZ^ zJncy>svD-et@{kW32B#VJHn@!s%fGgsbZB5Wl))|yrSHs?5F&wuqf8c8_P-A4cS6j zUD*!lG08Jv8MfhNIFAp;n_>0P8^}3ChTcPCumHLp?Sj@v>!3FDGtv)vCB{R~D-(+N zSNu5sJ2!|cgMNGv+kvgarZZic2lPz(0G&<8Fq4=w%mrpPQ;B&+pP*mU5xN;%>AQ@I zt<5%v%(0N&%kE91Dv52x8e)mCQD`MJ6~=&Gj)+?Eu%H)C@H_a+{B8a-U(9oSJ7JbE z05aDGz9U}-?{Jmv#8zOV*%;Qu<}+)U5x_RjhU~GB*$Ek{1$&Qe&28uIa!yPHOI2h&uAic0Q(Di=$rUryg#0Zzrvj_~3xaTZjs#^N~f26Vp&B8a@`6z__Q#5v+qkr1=Rz2YC@ zJMbH<ADmWN2qAl1i_-{}Qwg8Us zKqxcRC44-b8O{$s2p153dL_p{b#$kPUc=`=QR^NO)G{ZNx-WA#x&}BkO?2 zNDloBo(P@~dV)(rw(ylO8}^3JhyR1))Qzl(Jc;1I5c`3hTo)b~ejXkdAtQ~5aAau2 z1@9t>?1^+Id_*PkI53uZ;Xue7S{jTA<_A6mya9W#Rd70F>ixkp!G6Ji0$%?czaj8X zU|^66_6w~K-3mPcHSuF8J@g?oI}`~n3kreuftCKBzHPo6KGfgdzuS)nh6UyZM#FuR zfIJZP%LBFG2rWT}bca5LcLUNekh91~q>J>EG1PQQM&G6zF^iaW%zw;F<{2}Ssm@54 zXl4j=pZN@o6ibf==JX`Q!67D{`2$w|49>$1;D7ULgf5^-enG~f6|gEeh0l{jBnzcd z*+JQQ`D(>%Wuj_@>YfTyH&YK*4^b~w?@-TI?^nlZmTF#VVj`$CVx~h6TRmoS%#oO{G0$RV#b{&hMK6eM9Q`P& zY1A1@Maz5WLpqt8nEROLnCF^@n`fI3m|vT(nRi2XA~#<#Eier;jfHKn=`T~7>9eu9 zalOH%pQx{+*Xk9Jt=H)9KxVzK->h%1udZLMuVL5^YVCQ$S;IZUS3{w}V~8^jG~P2> zO%+VXjUNpW{h#^^klpua2f)@*+en+HE!S+*G|;ryY|uQ@FdAATXgCe4QA6GwqW!3y zqhoc0^n>*}{UqHr$laecqck7XN_8F8Eaf9bZN*RdVfl2qNxohtmu;11O41~q@V_w$ zb_$fJgUBOMBaRc6@t3&{To3LN7tPP+pYfUeB|ZQg<_+d4t)=@=lgW)lS!6$~cwe>$UG_1(2SPd%i^7bZIbD~oP4@*9Qwh-GY3c~|jIu$L zOl9h^57<<0FxQ%+*yrprwldq8?F!6qAydSt*%@psU>J$;3|QG$!ZiUEzl(0<4EhP3 zfffUscoq2wTwqhQH}Hae&_&>)S`PZeFYGHu0T($C@@h7=2+(dJxB%u!I!J5F+Q>&J zYAClUPeHvLp!%W8Qyo?z zwD-07S{v}{t#p`fiMAfBv0QB*-D}-ceHd^?4)ExM^%T^8qwcMCnpUOVpsAwKX`(bq znueNgnvR+j%^h_E^-t9`)os-tV9NWdhO4@&yvlLPvx+HiOc(U2;TnRB~JLN%Bi_SF%nrOtM}gm0p!rm-Uv#$^z1C zX^gDBthua$th#Kj>>VgFYh163FDK4!pX@$?m zwxDN_KakEy4zdN+U{kQm7>`BaVeAq%2J4N@#h!ptk%a4T1^yWu3=!}JQ6cM~GM9sg zO(#s|Pe5G{K*b!$t>)fxN?ygQ`4s3Q=JIDCA|~+z`2&1q;a}mF&`~%DT>pBm7xxz@ zup3whV`hfaB2`FbQmOQP`WVw3Fhe1`kgLI$^4*1ILO#D37}H&RfL|q~is!^a@v*p2 zY$9S}7@jAKzkrkf2CwJvyq_1zVZiCJQ8WGvDONf)ERG{ zouEsbN*|>|^g(7KTbbL%od?9T4PwsDP2@t{M*bK7f#1q^gKKn(PZ69#hIj?(g8I>= zpxt!9pW;c98WOD}gqPy?@r}S|H^FP*HoPW26hD9~0P{4Hew0oD?Jr)Q11oonY>{k= zYz8pnURgEyaKP>j6k8R$6{{7a6}1$U{Dyp}yqSE2e1rV9oRHU2Oi?UU%u{SoI26^C z2IUz=Jw+*C{KN7!^4@Ym)=xHDdQH+=VwW_Rbd)3mj-80d;v`ld-v?N>v80Lw1+*0> zsVnIt*(5nDxgt3&nJuwNF5``G30{Joz;@c1vX)kFkX(3q*JbyP>{aQHcL5Qky z2`;TKeJGtHi;|y|M=6$pFYKUVC}jT>MGM7zMX6$=vbO4$O0S-+{;iJD$TXkTThwD= zTc*CEE>-`fIitzeoYqv;d{rM*H&w4u?N#0ZwwjZ_g-`lZu2U!#@8q-Pz2tM{U*#3x z$ZHjg;K*+IMtM(p1Gz&sLH0u0O8P>QBAEv2$~)AEP6iCVK%6gL09C|-)J0|@&yn}Y zW~3Udu-T$iJO_AmtMEan3Rv+5^v!Z{olq6F=0bH?Ti5wD5DPM4A6!XNu!Bs$40yb`_%YltZT zzy6DEL2sfKY%FBc-k@b5*l%i2bCE{ii>;4zLz*KtBoV2DSdg<2Z)*etAm(F$ z#+AGm*0P(`vvrtRbUxLGx=9j53eh|=DSRbF1X~AB25JXf{`>x2{^kBtez!j%UNR@10~0mEUBfMN|8}i(rMT`nhd8S{TRB%a&pXdK??ZiB z>+-r_a zj&`W)q^pJ-^ZfQ4^;Yst@Xhpf0|h!8%%~D$6HAplBv?)pjBOyHIjdpcUK%yJW-rc^i|}^SIBG2 ze*&MpNVZ9KT~;WoA|DCSbywaBdgv>l-o8-{RHv(316In@)YI0{7HN)YHbM_A*Iv*b z&|TE;HAESg8FP(QO+x{*)ix!X#+!8Jn`Wz}zQtn6Hy<&tG%tf~fq9d8tNDc4VtHtp z9#t>;dvpyziN|7o#8i$Q9@{+jPE3uMhtbPGr&}tgMzb;j++^~O#{&Tz!g$Pm_h!BzHK zzg$m)x95$viS{T|+}rB4>b~mc>OSgG>Q10&pHK||KZ0BpQWh$&D#t5ZD4QzVf`SyM zv??npdn(rf9yq654Jt`nu;cPW=BN5Er&GEP;l+@P$bWEC$I?-Xwp&lIN=hZJKK zaf*D<{vXKq$vevL$|z|i>0rrod>y_TZbR@8_+U~n85W17VJ}e+;uGtOI|PBB$0MK{ zcY}Vq72AR7L2sa{QF`Do-;!I&1>{K5O0FUvMk+@b&~=*w7jrW5Fmg09Hc~&56tPEQ zBDM$;@r3V$=Y`Y2=}|pAB|I~{FuWnWJ-j+RBus|(g|>upLw&*-;mMJ3WIpj7dZ(Yn zdEmd6gSK;*@IWWkk?c?QB)gJb$iC!o;K_QB4aqv>F!CZN&Ji=f(-Vpikv7C>qKs%wej$favne&T1ooIf zej-z;zSJUW8+DXAM%@AD*Jt1f8_;v;akK*Z)$!D1>Lk^e&Y^cQO`uQe&oSH<-p$*D z_QEKr=h46hv=W{Q1H=cSPej3g-wm|eRiNJL&^PEcY&QM?KLyq30G^9?k|5F?=@nTw zxFWcsiQ;bss~D_Y1lN*L>{tAyutF|xspzd}1=sDFyq!Etwhpk>9qAp=7(au9Of4^w zmCDK?GA_#o$V#Mrq<5g++<~L_!%_SQ)&;I(JZ1siTR=0>&8Qq537L2%TvemU3gv=Z z$opTem5Bl2qi`H>#TH>bxIN|yLxuXn7rsCL4)D%q?kKkiP)1X5ENtX%0z>x()X_S? zcenu=d0=%^_=8$t8-O29cSkL;2Ll$Kw5TiN_e@Q z{4}98;0yyGkxIxoBo8@+cEXNf7qIQH1_xq&utr!iRugjeX!sO~mz&vD(6RR(eT+j32)%j?BdS>^ScXhUlCtP*dgFhfo6c(Zxfxs&2JJ0 z0p=MC?9U89LNEBkP$Qo4?|Gi@BU}|^;#ioS$PpVO_W^a?M1P?V(fOzhU5Mm~UBr*V zY+DI1Iee!xIXQQoT@0*qMR0{o15e^UdJ^4- zZcH0Mr>;QPp*e64kDz+NYVS^srDjnJs3lYnsu)&nE-@XLlBPssqBb!SBBmm_ihM{a z;ME<_wOpp|Qnz6(e}Mkw9IW7mR5DeGYDE1-b)vd~uY;#H&}DR0W-)UDn5KG6DR7`0 z=rlT)QiDDopsO?8n9a;qW&jhzXedzCol-U{Gd1jnhl1cHnvG0^0jX zY6JBia9nfXQN2_;<)*6Bt!RS!2YBv=u-97ZIBeCaJLDpA5BVM;71^tS;z`^kbor|_Xn*(-GV&}2JfDhkD8cJtNPf1bP99fLK zT>f2gT-g=;Ky$%UbWeR*U8t_C8K@beX$8FM7|j<=7ws)=1Mp(1f$MyyA7sFdXN@*f zb5nIwiYdY5H~wq<)95#R22Dm~906+QGLzgq(fq>P$a2b3YH?XETP9jYS+-lQTV7k9 zTRvJy3l`!@xJ6rQj zy-Gby-BB$9CY+#Zta3t~paI)rig|LG{1|-x!Lr)2_tKiuxqww=cq*2P)<)KgwZT<1 z6()n6Vs*ewhhSR=xNa8o5EGG_$WL)K_+B;%1^fzrA^)B4Ae;bvS1c3=*M&&}F02Pv z%V1#g4}nwUCDV|}r4Q00U_GCpI>7a>4=cGE6$6alHF5;0B!3Vui4UNAY#`c!`?4P7 zel@uf*6}lPH#rp?Qd@z`dQ0`8?}BDCnE3~|`4LPS6983Z6fIB}!Cik2R{3>mIc25B zlh+6%aUIx;W04n;Z;>oeDpHAmiB7x$k)k>f|ra22YIVBH+KS?m2GSz0MQs{oCvJb_W)s)E5gb z$!q@jz^(utXc8O^I?nxIAgBl_LdsB^(7&MesKa=;T6isZA@d>=i40;8nM~>FRHiN) z1sre{{w3c9@>3MJkEV&wMH4aFp01t=eMx6^oLUYnR(JI;^$JY|?M`q^y0qom z586dqx2C#g1t6k_;0M$IK02y)LkIIj^M`gHtnhc*=h|!9g<89IrKSW{IikL-S^`W( zYgIdN5MBbD_*}I}RY~;|Fj0GDBV}LZ1aLiWRPI-vQ65(=Q?^oOD7q*<$fwHd$=$LI zvZ}IgkQHi6O;UwaE>%hsq&=jo!P}saHI|K&oq&p4Up`7cPF@50#@RAndQQ3p{E}Uz z66r-rS4jar7Z<=e)dU!~$LJEY3i=xvjJy$BiUm+(CklT6?@-3S=6CZWco~0+Ys_V` zXV~5BPIetT9e5-+vx{lO6w<@!x6~j?OC2Mtl23sPPa)m`wqnEW!?i-{pfb?K|JgU) zXZ7WJKYH`M4(~1R46n_5&+~`pvb(uE%eBPi0*A}ta(Vg6vb3_-j%|(=a6998?ZC?F zm$fZ3lznilcl35x9p$AzOPSJkj(Lvlpx5U)DwhoboqK-Sn6ma|)yp(xMUG5IT-lkj zKIP%^70xneQ`cTlzUR50xj(r-yMMV~!K&}=t^`{%_h9%r-95k~_2zmP`!an>e>HzQ z{~G^Wzb-HcEFUxDCfo&%UI$hQ9|2f)89o{x z1G>>yyoO{DIKGcdo=bj9LK2BIBFUD#ki3LvqNKa@skECcTh>EyTfXrLR_`ql|wKdf+G(tAbQsMeai+^AmARt1uK5phRWoC{ZJJ=J zX5xSg9%w8y%rJ;BZ!%E7NME8~V~|0w&IRV`E+&lNA&d#cfb`e7y67{#;L{zMw1aUx(vDh|>hRtvaG=ugX*oQ~p+TR20dNgYMZyo+8KPMtL3Z8w$Xz z9F@M8;F3we&7Hy~V%@P85Fs@%9J_+HMDHUlkRtK4xK11|Ruw-33LOAS-WEQJ|H|#- zrhtYX2YPxu=Y>krfPKZZ0Of8zy#PFXW~M$<6LjG$`Yc3DMZgpJwL!p^3`+Pv(Yo(GtyJjlL4`I%~iow2s4^joJ)WcnC>if z?sheEXSm0E(mhIV#B<#<2H5#G?!~}4{BoUg9d&(hQLcD!;a_tncy_@)8@)D|V=M8= z{EW}%`|f)U+R{CU*BbuY{%!#>Fgy4wXaq0sg-{ICo|MSv$R@%HO8RAzAbV1~ssE^h z)FV*&$3cg6nBGNi177?!sH>&)FZwHB#9Q=3mRhNIDoqc~RSl+Xubm28JFOO`aNcWgz&1cN zUbRE@6g2*$svfF}swB8Ss44=*EJ0mI-Albu9aJxcO1VNC(Dv7@)9u$i(Rp84LBB!Y2DpazaP%*_T+shJ=}+k~Ll?sY!*F=ruOF{JsC%ZB zXh&$isQarq)eWeawNzh~vy}~i-ON+0RIu`ya-BR+c1tz}@WUwSGnh(Pg}bpeSUc#| zg6Ms878;LUgPHRc;wj+DS8(&$qtG$D0#8Lhnx_syw9EyBZ=)^(`udmXM|33G6I$Y2 zq+Ns$e*|rHcvu;J9y%P_3{#Y@;N+kd@L0p(-e3W!u-Ahlf;c#c4+ZuGUI%Ifp9Cj_ z@bKvHzVH)pS5=RUiToQe65EIfp&=tgIUy2_$Z_OZvV_z_S27lmAw>-Uq^Jfbz$#`B zxZ9^O!KahPv_C?p$9qv=yDbOmWMtlhJFUoeiS;E)l_>bi(Cl2 zLkDs(d6Ya1w>#tu@*a7UEF@#8dQ>7+0&aajv6kpWB*AB6BWfZBROQC-Y1hIG%Pryr zv4U6t=UGnl1Js)d3T+YOjxs>D9iW>#0=}T(RAtHxs5l-x%%8};zIwor z&!MhS0lX!T=Y?lpC)Jldb=FDh$iWl%oRYH4?!K7!R_VV zaV*z@-^Sy>5M&4vh}9zDv+!DYFG!)Ywu7cM41I={qp?^W=-PLK|9(E+6foy2X(!oP zS+0zi>E#LXwlH~;A@2Z@7!L?6M`?w+F&5U^5mmaXvU&+bQJkhLY}LU5_E5bI^yIth z8k&O|t+u;%q_(eiuy#E-Qq(%7&ZGUT^=M;s9bl^q&yE8UeF%S<0?JiS%|Dv28lASG zwx4z~I8c^?zvYbf4%~KX=WB;)8*4@2z8h$+LWTbdSn)4a8`Wx6uBxGWF}&kabt|<` z^-L8|O;+cq^_o)kI<-mtOm$uL8~F58V9RT(HSl*wRclneR65lM*-_B7#>j@thRABkP+6w*3Pg}!G6j70lL0N>#m->Y zuy0r?Rs!CN-B@36x0QpEfnzlK1$-{8&?kr)nJm5#8VJYu7=9T{EjDLAf-9sN%$44z zw?i$Q3DHyV}`U;-ImcW?Jg_Sgg90V)(5}6Gv&JXME2YH;_ z1XCY7$@AnJvXm4_BlyzBP@AZY5UB#Wg0zv@#2I1=xE-R1WZ)QP6SIJ4_y$O{L8KZu z(^f^UM%Tn+G z$$bz3A4v+lkP3=`x?%#p;sEsvs_-w!7Cphm6(I9T9#;Mkh>erf)&FsE7##(?LStYB z;%O^PeC>g?J&yUnRANW7+d*||4sQL=j0W6eC)r{)f%}uIz!ig|rw^-QzcJ^auAc#y z!$xpIykc_T*)+z=JfpYLV}Na01>fE^U_UI(dZ=9e*e&d1n8)b~-kLlP2egj!3``2- zaz8*Tyv6P2mVh4h0^B!s_!i(9?98_YCagU_hyThq5%vg~LVe)8??WvMiUCmDHi&h^ z3{dH=3f~1n@CuKCZ~IH|gBxfIf13C3qlJ(#7rcZfm@MgmOhVQmSCBB$3q1oa$N$hu z=v3r}Xb|@SzZeU;+fZPYMhk6(;ovQzgweo04MTn))zCpOzcc`CkN$;r0%X+}T?g!k z9kkCi*lFxJR*W$i0m^bFCIx5JYdl^uSaL#wg3?OCB%B9a9bFW4q5oU2%2ZW=YL=>b z3%;?ZT1Hz5=1|w^Ug^rgeL(4CdV@YepQ^8-uL_=rC3>fRJUF~#j5UpQ01q3DpA9Pv zJq?`=?cu)|2>N{eSN%<3E{1?7q9eG(mgyJhyXgJ8eSj=E?Mv-;@I913Z&*pA)z~yG zfooZ%*#X-s&0tLoRHQ?IGrL1~_zc`8wN?K=!SzwGSuqtI$3DOYYgDMbT-|-K?xo(2FwP#o-EE`<_O4V6l{|3R_&JJWhvJ~lnSdjwp zDxeO#_(oVRG!ZiR)qGt(#2w@+bDLR`nZYD8GA4N8+6)Zz2`Zba2>JL3eGW46HTnr%Ld%#2;5j=4+4Ly*8P`G0`G z?Enqu5?6>V5Z9xCcS-x7+p1mU&qy1XwHypyr>DT2kP#tbfLWSe#7g2Fc#B$sL$&Vz z7@Lp87vd_hm`EjlfmdW2VBWECzbvu~Gyq2=k(dOWPBgIg6Ub?hfp(L*WKGB|A1L8} zoM1INhgwNB12sWOnW$RSVBr7G0#|vFdIkQAf5EeKgNb3su>Y{<*&XZzi0zudj#h!s z-3CbHTZKKw4EQ`;z$XKHk_$7#y`?*0 zy5|?S7yl;}R$S z2Aq6L@KJbIyaLW)@36htFf0KpMqi?rz!$IqU5g$=pMyW(JYeh!;19@0UL)5a<2*wO zU{0+fS`AGBo?JjaAnPF;4M!d$LtvWiGAP)maE)ZT8R{NecnnWa_pOXQbirdH1{l&?2^ zH~lpE<~Qd#iQp|i^FPy7`UG_Kl$*!vn(vKXv5M&!k^QS-qoIqTfFU=}+tAB!7-sH^ z;SsvYCx&~52@zJD9~v$Cu(HO_yR--)VSPc>PZxIUQGb-1OT#fP&} z4Bh??OSYvaI>nl{ooHKo**Dtn+i#<99d56L4(B7Qz*<%V58F>P{AM(~3Y*jV*m~Hy zmbG@L^@8=MwHRwFwFnw>UwadKNqZj8SwZ(=e^!>otSzf-gKVIwHo@j^t7GfNZziJY z5|7R3y#Ar#Uku~b&@qk`WeVTzbmH|s$45B7q0S{}dn-HN!Wtdmo{G-JMD_QqG#8zB zoGBdFo#)At9nRv!{!mml+tI?Ny5vGAkta`Rjv{QHWT|9}cs}uL?RCKG2P*B# z-o3pydw=vU>oe2ml}~;8OD^m5x)9&xAYNI%)%-SqU#;>__pb*laWEh=AS`eKeMO{^ zsTZqql^elvXQMc9q4cT88g)t8LYbr(si>~d%lDv{+#@R{J1ZS3^^)F$Hyy}&kSIiw zC1`}Nbnh-f=PbBx5M};2CXy9iMDdhPJo-sp*_|pXj*bxnSY~1Kf8@C(^8ZlzEj9HZ zeril<#;3+Z#^uH-_!^WmzM_K7&)b*R4z&M%?%v$lbY(Qo6><~xz4Si%pE;Q*gWKt6 z>No0FqxNmd5usnCpQZ1vFRd@AFQoUQvm-jE8y!#8a@0Ao*+sMWWL3<%fpR1#V^v1O zjEwY`>GA2u(|4xtOW%X@#Be+vYNv;!H%M=u-Z_0z`rP!%={@*=Rl5BY=}Bp0(tOiC z|NHbW=bu-aI?eSjiFo{><&4_b9KdVW44);i)0S zcn;O{1yfO0tF8H0=-e$xE>PQChHBt>{)zlO`G@&g6tt-*cv1!HOfvU>);6}AwsPq5 zkK5na{T;J#mK*Hcj27)MT~rI4y`9aRonf#yIgdCKz>>5uxQpq^E+%w?w^|~s2R*(o z*n}oTzrtY01?c^*L@cYV*r7;MbR~X-tNs$TW7M%AMrYJ-)LwWLh*7#G(P=vsU@4E$ zD5$bMg2+=_dDbOARg<;W@@$D-x1MKFPb>WwD?M6!RPZS75#rI&V>WEX6^|DlE{`6b zw>;Z<-SMhL9{t+e;_c}Zh=+lnPeHCVK3U$W-kIJSpK>UPYk}5u2MONka~^%>2y*Nk z5a0bMI%j)NgMWO*3=KzNyoyY^KbdrQpQ%14d~80wbx&}YsK<=?t2@o?9jL3VQ{uUH z$Y+|*5T8Cik?@wInA>N4%sw4-F}fdM*`s~OfD2o|m`CW!qD;B#v(cvmf3c8HLtb}` z&m_7_#?oJsgJ)7j?__wEMqVCX-#s6ACU{;06Z1oX+#UX>nU~t@I=qg;GseT$V;31s zo@OU%l@y}1Tzy_OSJhUfRb54?@Qyz9Z}M0WyqfY~tYvqkQfW=eIANbFhklA=M^CD( z6ZRo=W3RXUwKlfyCcoYcQ+OTK$5T^1({{R{mZ3m;owp^gAHC(N==A62_Q?&)EtLC5 zAEPe^Ul*41Dtm5rsq7zFr?NINJ`ZO-$au#1St5|mNY$5v1r`5cyYVGL@S zlf>X(hR<{%JU4tY`qC38>4xt z@d5GNM)zW{M{TeZJ3bu=D2d-{OM2|}2=H9yc?W%au-9bJoZ{XMs0S-~2ZDNo#z|u`$m_bJE1#*Dr>9m zknXzfm(H#;@Op!Eg>`nH44*e}GM#+4nGLAOxrWej^tO_C{1^@8} za~uu^6P+KBe}ntN!7FQ<8k+i=W|$V32AhKLEIVsFXgqCvWpr>nq%Qo2eyhEqgdr<0 zK5tQ8ue`c=@!ZPYmOCZ4Q?5Q(Bd zsnS$(x9PHI^h)ty5^A);bKoW4%L^%nz{cNKyg&<ljY@M%JsKU!L)9HsE~`LwbqJT@Y6~71 z54i7wYAp<)9tG!mUmx{YoYs;x2SAvVaQKWD^8$Xlk zisFhuMFB;yqAIss^bd@e7m{bo-pk(5yS4+4w~5Rj2I3}&=_so9(o(bJ2Kr#BUg(1wLJaEcm`71z5cT#VuVf}`{WsIR-Yh@0mk9R2?eTM0VX`g8$s*+`< zNM=wlh-qn4sHu}_glRnJ=rXX;ZJ?kxOz%v8Ocqd)F7*6<&M(L7+%vn(wP3ybqj-<9 zoCbgQvDSot7-n5c&hy+VP@fF4t;1m`6ThEs=ru$B;dUe=x+rn=o&AOVo;}Ha&VB@S^D_Gsdmno%`f;0cX@$aX zqe%brJD|f~0ycWseh_{j3SMuS zeS`gq{WDl;4OIEF>2!?YT}%gu2}4i)*uKLaZNF%D*}I~&d+%^L0_dJBgl5u3XF;N4 zk7JkPu;ViQn;#sx^v}5HoJgTh@~cBY-_}-`bo`|M9)nU>_ky!=n0q86-wTBQLqY?BoifjC8;P0{iQ|Vp6f{)b7?6Jr>Aio zm`@Ah-4>~u$|^_JQNEb*_8E4uonp5lL(zZ{yI8qTc?C>kuqsiNhho5>`iNTozUqqV zh-w$u<1|&Istrd!)ofLQN`i88lll~SWQ=;6dZKzLSVd)ZzA9ODf=BP+`WnwoP_0+> zRfVVmRaRodIr{tmL5mZ);an+KZf!7H?4 z<}C*${AUh^wHro%Tc(%f$n}`Kie9cCp_2#`)_+XbHhg8 zTpdSm$9%_e$5Tfh9u9S=Jyy^g{GHC=0(24-aFup-LD6u<_15)|e%RW=LLpO_$mpAa zPNlwVJm1qeSua@^zJ-;thq7|=S&X>%@*KI86|at>mtw2puc8BZ)>V!~#>G9Hh0Myr zs#>aHs#yGmYN_X{U#P2TmTBTOugJ8np#UGEX#uiWLZi{7lZpLPtMDalsHv;*K;v|n z$44>>hcF)Js>i4sqcHZwpQygNwYrYlUoEg^Yt<^X1eN#&)k0Nsm7sden2%CU0M9Fq z(&-bc^-qNsx2RFd)x@S7$~Ve)ytj2QTkX(IDU`2R$!F5FRbNp^VL){jh5jal9+5Kg zFnU<7qIm8ASHDHE2Gp<>`tv}A4vm#W@lT#CKPI0~w~M#@6)sd`WNql$ddax$g@# zQb!U@boP_fW?b(^pPMMzC7H}~s^ZI8RZ;?%uXq@NAmN2;7rj$EUCBiCmM9!22t#29 z%JZ8bA(+mwpQwC?qfl{BTShv)oUhOUM>xFkD`;u|hl(qlSn?F5Y%iDsh4l^i|58gU ziy7VRR`7rrw6;sonanV+g^#`kn{^u%MR&8O`9c0s#`+FWzBu^gcQA40d|STE?8r}p zm)k%F*CW44emNBEM$}T-CcUX3^I|uTt7Ps$?lufXa6=+hQ?%D0y+auPb^YqR?;%|DRxEpJqYoE`nG$f~X+Wfg^ynQV-=N0=^{=x?PFnd+I7ajAZ z=nITRb=;CT`oW8s`}Mz7Layut1hn?9gLeo7zOXCjq`e7&7>8vRR$K>t2E%h36r z==x3ksfAwli_n>F`uftvbSA!#+N5n{n`GbdoEt)CTAsyh&uRBETnp;GfxP`^{{ z!$GnD$bB~Npt7nDJz%@Q?bCRKT%Du(#O-sc>#8hORrM&|)dBT3){_o+%Y9efQ0=5c zZY-$d6xB-lOfIS3@|-H_vGnxV)S(~(8JY@k9lgl~mPD*qIpBEY%>G6EBs4bNW^J6gRwqO1bhhj#d3wj~c>aDB(`l$Q#Ok z%ILYJ7p9f0CVgZjWrbzFDAw+y=WNXybV0I2(wQ|wDM_bh{wieQX<1QHh4tey=u&g` zS|~@iTWO&rdoXyjD}zQb;o*0dezytKbhYqjOrn=`v2z06jAdbd_Yy(mj@x8W9m%Ua z@kFUfUR8na$ygNAuZcZI9BNuyEV$1cHSZ!Fd_gNxmKXV=QXI}K;m{6cR zVnygj4fli`v>#4J-B8R_7rj6)Q%}<<)B(p$PvHX(!fbRmbwvNu&eV-t zL#Z+Q?pp?M> zaUywgnAHW>Iv>T0j?GsoRmXlvc;lj9+72%@&x;>eWm0~c7Yw2gZ3CiyY%X1n8r7mn^ zU*f@d*Fx7?IvRiCwmC&epqoX)sOTCjN==wU-)B+y zEDOETSC!G=*{$HUN-K*gODaQ@eTdl8;Q%7JY+$^n^Y|3v^cHxy1!R&7$t3$It18nJ z`{^1AQb_5s{>$I~B!A8EPM$$`X-VR9Z;p1T#9K2@Mia5yFjLg%R({J<L{{C;y+dIzO z2X3qA6R)9YgcD{Z-nl~I;4>KH7S3ivK0`MgpYuU^XW*GxQC>n`80}gyxfbWNt@H&4 zqrgd(CP?Qq$AeLA|Dj@ECmD%$A_7coon!+n%xrj=G2Byw{Nl2(ROm;ab}gYO89}UT zl&c@wfoO8%L{|bT)+kpm5Q5jv6JXMb&NpSz}EdT(B{7a7Yu`foQmx6$3S3fIx`&XIIA zjdjjNhZ4m*TFURP(HG_d>Bx3wqefBTS>wau=_==HP&kc+O9xL!q& z4e6=Mw(@#0JpTYF{8nCVA%AN%diNw$FkhT6oL9l<7x0c+IsKd;QM=6JJrChsPvQN? zQv2O?oF&E%r%tSc@}ed>8qq7tX@5%3_Xhha`ywjG-OR?P_8;WmIk=Pjw*R6EJ_{eX z(msp$9myreehvSqijFSSyJH>Q9Ifa~Z|oRMkJ@g|+BrJBHuIOKJ4Vte)Za0XTib}^ z=?<+^E3&q%v46MMM~$%F5e>rB8|UCaoOyhyuZubS zxaGusz=JB;1?rSye@rfNjumJj75WtW0@kDrRN#9!2fMlV6m^Jz%h*!K9mijI$f~^K zCXA$3&eqPJoaG6OniH^)`S=h;y7uF}Q$T1%ggPX=6V&9!BVj-8&Ug!xr@^dQ8<05L9NMhvx*z?Z# zLAQ{#WHt@r{v)yUmb-ezmCj9mW^Wn2Ywfyqz}<0T!hy= zLg(K_X)^aZq$P>HBV<$1E-ax&y(s%cHEx$#Wk%Uo*)!RB*-4Jmva>k*p2C;tG-%p6 z{@z~MI@vPWeA#UJ>_h4POP79@W=iE~A8N>I@&7mU3|7Y-@ulPm$1}-KiAfU3=Z=s@ zu_9mPNTerhpLC6M9$3;K*6VOEyJ+cQj%{RZbEM1Z$lpzm;x6jsDD)u9_*&ZU(V|2(YWOwRHW`T%{TgQffFOMJ-d&yhBwD>0ojZ-eQr%`=8cr%7k9 z@~q}HS4n5msUE?(pU+?3%b8z5ol{7f0TVn=(m;|2b9F;V5pswxX5l+MrBkU*(wK*{ zahvjVJ!j^Pr$=!rGi@pJy0^2U)5Dp|&LWR-ZCHj=LRrR{9Bslc^4yJNxt&qgi>mrN z#K74&UzM_DTT{@|y|?}*Hl~1z?LoURlMH_#*jNX=QO2N)-RjoIZnn-xM>@>f+uDU{ zVhuHcfPYqZ+hCZ`p6HpvaME2t7N2hO0U@Yj4Lo(j!u zCE?#S_+I(hirI?Ts_^Ux+`IO|`L9MrF^d02Onw`(^SQ+6Z+4ZV zJZnZxP(3d&EprGKM%^L$r`{vTbOe`xIy%!qoo`3MkPyikI@U#6nx3^r2ohzjxr7-q@mIZ zQmr&kk_>M%0xgeS$N=r~r>^yv7#J_t=}LVpScD3aLBz9d=n2oE)O{)WA^9qKjk0hQ zk4)oH$MFW)Cma*@vQF$k33ONZCAb6~wR1Tt>xQUMTjL58ZP!iLL!7bWi64g>`G!+P4zPCt=d4Vw{flbw6h3bY!LEkV z*&c-V&uuE*U5w?G=yf9C@;iYKHKIE9vl?IvlE^U6qw0$W!5RbKQrV)g{2~*7LUw+Y zeEcwayPZ_|3#rJv;FjLrU7Js*+TU$HM)n?MUW9&oHvdngpQN~@898iai?`)3&p%7W zp2TZqnPp_KL2!5NEi)`}^iz~!?rj2*(z5@^CitHqveYd^!dpbYr^FP&QHe;mg82E> zp>m^8bDirsk9#=w6T`kZ3*zl^m`b!VBYg_0(oJp-+%8m=OqHBwEvn19bWbW!>*zq! zpRyKS;rbuWIU%5kOIcm-z*u|%ch8ndaV&|HZw9T=0vs7QHQa#Xz4yJ=)oBBWXT`;i2KsiuOaDvG~;npv97?vBGa_B(jyer1(brw!B==Gsr|1*c-t zywk*?iyuj4-xqdefTkySUImRr^I3gfy$D1(2&LO&s`1{aR&I0V+9*AhspQ~`=|9ve zuJPSyZ~&M|)XOANg^|lf<8q%Z96(Q8Ua;e(a)CLwhN`8J%SpBuToMPM~}yH{ZjoL{aE}*%E1;s$k~%KH>Y1t-JF6s`Pl~gZvSRK&OQaB9+BN4 zyI=O0?C9*{*$=Z*@&EP8DU(wnr#OD6)@*yWBBxYNlbqf;L+G+?ms2yRL{1To@;UW$ z!twvQo#V`DpdSqnd7Qr*hjL&7x|{Z>Y&!9Cw0;sDizD>m9K-bUU?=zJFX$iYGxXlM zWpmr+j?3MWo0R)6*Bh_Ent5&VCeXKX8t=Z8y!1S&p_HM8VS-@?-Cv(jy8SSu8d40e z;qCJcWl+c-fv;DX{9#sGn5LWVo2sLKQKNo6Onq;}t*@A+DqK)BZm~Yrjxdx*iN$GF zA9|=pfvSJDRfKO*k~`n06TT4NUK=vLBTkF67mQbBs*_|^`%)mHvxo?9B|37sQ|yQk zOnx>(wi&EhkT+(Yo?&LzR1AX2k5cSWBv8YBg@H6G>}WW3_;R&XE(a~C14Ho;KcL3y z5$gHqE?0BJfF<8m8*n}v#Yq3HDT!`%tad8>5UW9FE@|Iu)o5Qv(!UYs@z~>=hZ0t? zm*+aqN1kf0#$Lm`=FyLF5GOmqyS4Ws?|8WN@7~|Me{-EnZ+$hNE-$-ELAQ&Z$6e@R?&w}}+<@<&O$SslokW+5em&EzQortV+-EE5 z^uDNY{Cxy^rhr6IA$&pke%t$w_jPUrLC z4!o(_GX+njSsp_?+R)`?2CX{GnHj3Br_Eu#=%Z0w!-tGn2=`^0<^|;B*Y+ z1>HfS9-#?nCeIimKgSw?3?Gqm9WW-Fai z$*4z`p;)V)@0FizdW|Z4Ck~u#nAK{N-k5IuiK06lEx5wu1G8Dr)PWh_)>Hz|%*|j# zI^$Xp`EoQwL$zR@rYE=&2HQcxq9BdsOD+|D{qFJZnjgOg! zSw=6Ec^zPB=h2^%2)gcrhPFk1d%C<@^0Ng$d*lzJU*&v$Zhj5iG!GK-Gnu7@@yHN+ ztcF`QTOQy^P!r5N%6igzlW6@OPU$^5)TiXdH?0rpG!e7ok<8u~WWNP*Q<;F;;1N}< zo|zm-?ixltI*YvK7Cs7@4y&UidC)vEqHpX35=I}%0oLw3>bR;x7aV2Q3Ma|w{?H-W z9rfsAdWEdGycp=e`iV1^6s}|ltoTEzURnW1!A|zrbfyieie=phj&J zBgm(>GydZg@#F?4;ape462&S`^S>L4+u-7N6c5Op?{m4vy~kOxcJYXPI2fFAKj$G@ z0+*t!vN23l3o`CX=+HyqrJ_(#+)`dAx0tEy&u{9Xu&4soR9fjrA7irO0P6K-a8Tbt zuCB`y<)`HbCKUly zDhkt8gG{~_JgiLqL3T-YfG+gi%;cxCEUH+EJYQyGhZU{70M95166M1@e?s*-mFhW= zs`Vv(2l3RI3sGKGqdNa6i9?az6Uw<3#niV%j^U3=hNYDF78*pK2!_#s6V$Z4#pC z37X3N!#K-*@%ZjQjaUsmNm)3+g0SIMsz;;C3a6{UHLes6as%)~S%fRW3?ZEFr4-IW z-8k-vHa@5TdERhw~j zT*Bv`4i7aSpZa6CA7$VrX?LZghfQ$pm?ZsHas0%csK5vuO!)Y*foWz?v0wH9)49`D3S6dc8RC79H>(V z@T3{wJ6pk*c5`e7QQ8i^bCBD|$jsi+kyl36n7!2^WFzSZ9S+_w30aUg=tpzA2ztA_h2AIubl`fpSGk z+oA_83nmqWvsg)-;*{)md0%pnbJHJWpgKrEfW#B0u>khKY$X{=g*lT>qvywiykst2NSh=v>@T$zTw;`@3+Q?PT-qyExy9(UE5f+{1G{_xu6_bP(rMu8 z|L;;dk8wSlkv#^FuJ&LD9m0(_bpz|oJdon^u;(w(!jge3PHRYTqHYf3bZMcacB=bB`{)B=D+4TRij6F&4&D(C zI@gZA!`AM8m$kgh3|j#ENVmf`e>zz8PO`|;e9kAV+g^@}bhVD-T*c$K`jy-y2%LF5 zYrz3@5SPKo^YOFo>~?V&Pc$0o8VBDwi*;uaYs^AegBh$X+nIsCTwbhKErni0u(d)W zXtaQ0vW}z!+{!Y^K3t3L;8drVXwYZXz#*hFDC|UV*F>=5Olb}t5Pz5}e&7-V8259C zn$y60M{t=b+XyC{LW~U}e+egdSxbhJ0t2KXetY5Kqa)X-3%53d+~T3apeRNbP+wUW zwyX(y+`e#SqrnrFf-{^}K2W|@{!)IX`gw=D-d}idr_x(h2UdK9Y7U)dTTy$>L50(s zeFZzJdU8Eb)eGHMSM*x#xE>1oy^u%DP>o@q#m*>pN}#3rseD16zn#Ams`OFjDN@lo z-XnWifYvb>#wrcGW!|eC)xN)yhswb?+CqP3vq?1kJ9W1ox1U$aNFEEoXzC$7rEyPTyi?sspgkxrr)u1 zNGd;{f#zM}x4-B=8)}IKgA1}Y2jdI^MdE{OAuk zzK&d~BC|ULM6oyXY#iwJ5q}$_Z?(r?_iw#;cW&pm(KG|6kvUe z#cQoPn&KV8J>errZYKMI%h2UF=KJ1&hn-W>8r1h17;tfN#z>;XcG(5lN11}GbTAqE z5%~)|`b)s;F2P~@6MfxUQ0HL0t9ruw?nOoR4Gm*uRVT*pB-I48`x903sqz1#ht;U^ zr9-N%dL%uT$52w-z&-RMonvae4g58N#>75$U)?H_+v<4yDkq{GtD^QpHR7Qzf`+V> zx{ta)mk#Qd9AV&Y6+z)L=!V^`nu%_*EjV3$lo&O*ZldY}W*5%=hq{3pB@&0_N^%8#oKJ~) z4~dmGiGxRoc=KSV!rc7sd+7;gP#096K2ild&^s{xt<0fb@G1dxdp-d9o=mRSg#4>1 z-FeNJMP>0^aMD+wNG3G~hNTD?brP8BG<-gbJN1m`_4I%BqwBwhqcBQHD>{MiaCdj? zm)+{xIq(y;7|SognHS+lPz7g#<9OEjS(CwbhPWLJl&BT{;3aesg~D_^KuXa2l!Bv3 zEPbBi>9VerFUe0wHE|tn@e(?;+u&a6X);lV|KRw9*8LU=kL@Tprr?1x$~fH^WsEak zN2T$GSl|#-YcU%w-B#)DqKXw@Tx? z$sfhp6!5)dRAy4M)~rKkqUP|W6Q?W4!7;F^ui(`#b0B+1^v8qZJhLGa6&Yeplw<+c zs$f^MnYaI}C728IQHEY2Dn2DrUdEdtmWX(V>Y=E;89M^afW_U1%J`Mti0-&93hmLT zOQRgy!L_eZ#pJM?NgMM06J&hi-YZJnqpPy2Md4ST?$ux=y3@B#dC0Ey@rd>C)_=fnHT5y-z{$cQQOslnlkhjHpW}7k7foAddc)H7uHtR zhJYhi!4#->1V!(mtB(fA_zM6QOLvJ!-5;i zS?wmU=IQil4$-#NHq;i-%5mNQrAgN~H37V8FsQXgtAx6?YI5ia_^$cE<+tW1Ki`8R zKhZn}fsRET+8+(56Xn-Y^-3JeN8*aPq^epMWzI&PyVikreUs^UIyR9R%Bi%_jrfRRdvgNh|@Y=c7cg=8bzsG{s}a8=k2 z3p51fa9MUie~S94GZ|VkQD-4tE#YXN+EW=+qC)*fMzP+_$Bzd62nW5Y2^J!A7|69g zf{t8fOsv8Gt0Q=p&Tc_3_!v}c8?$K?^Qjej!qRYt4zisGaFx5rqGHf9j%L58U~495 z*A~kZOAEJGgB`>s#eBoO9oN(zI8PQZXW%&>lRuiy>1z39@i_@%m#F%vDqGWAT^OhD zho-}*_J`w%Pzfbfw($eADZzNrc;5KH_{f-y`sqLR$5_V98_NFRmGC*189j_8jA6{f zCAbltFfFznGt{8`UhzFP`gyTZ%H;qLR%no0I& zv3j%GbYmxqXxk-QDw@X-wEFwlDaZ>3Z4&yCho~MroV7p>H_@pqC5Im5o=XC|DU8GA z^9{S%HzX_D#~jL%c;O;kT3UztW(K>ZKf}3O+^1rp>=?X|MOFb6WE{xQWmG{0(BKS2 zx3iJF=DotA2qeo2WmRvYtUwfUf-dK=drTSb8HSR54*I02bmT9A*}1^H`-U6eJJe0L z(JEaAv$+g*vlo_QJRQv~an7j%YEz2WQIkD=A$xiZCX_^+xPn^hB7gBHh|zAYkMh53 z=!g=)iMD|xEoA428EA^8ay^sYk{QI1iS+vp@gxiC;7tz0jAON@Goj^U}hikpE}A&^~^o{`_hQ4=mleG!hzxiZS;JowrBlIv*5 zcEbJ-p>irA5hUMWW#gG&8>m~?P$jJvrU|3K2wDma@FplK$k|``G1{CsR3A~~eLcwB z3b~X-t}H6$ztl+Cpd){Apt(woKAL>Z-)Y40IF(%Fo8vir`8l*jE2xPEkn=Z%4=UnN z02-t*ACswz_L8Gbw~qn6oCx>68kJl$b_w!iG_b{WT=;b2QTTNY#T z0jl9MaI5=J6UQ=6&+-53D2Nl#51+99M|Wa8)z4-W$uUI8TVzra>Y1V_0m?ALYtfb8 zgnhBXQ2-pYy|L-o17ZxCpuJ>_2hqeFu*Xxg<=6}3!V>`-e2^;T4?3#Sbg)*#mRlst>gx1uqJwSpc;F!CLZ)lqkONZEX z;hFG{F0mT)SI(xhKaoxpPgc&!paO{?wXcX!U!{LRY?ZiKR-(q~0unG^wqAA!6-*K% z<~4m!AL;bZ0z>qo6RNa4n4e={m?qgFnE7G)_am%;SM zG{TvnG*y29J)zi3qGfTyAE%-sxQ}M;D19TdC1d$~ozV(3ku+k=w&bYmR@lD*Wm$}; zMia1?qV&=Sl3f+z2y$x$TwrqVTu&IeN7(yhj;lAm8UI2@>P2r^5$-8rElw5F zfNEwUTAEupRH&(N3R27K81GQ5m7f2XP!&uhCd2o+o$=b)k z3+!jT%$EnlUXP*!a4UM$lXU-`W=&6|0{DcRg*PjHL)0|k)XkIesh*Dp;3Rtl{h>oD z6JNP!RO|QXM7cz#%6hb|tN3|_4Ca~g6&+Pc%A5E+9OXB2*rTW?PC1QTPWJ1D{Y{tK$WgWDftuN&=G|+$ zIoHZ2g4y*3y$j{@SB9_imwDp2V+E`DEWIT?gLZrwInprPWvWX3r6&9=U!&DYqF3<> zO0i?`H%lcGP>YRb?u^E5q8&9!MS4gr!Ur(vec-(Fh{=7aNlFPan7?Gu&CBR%?lNCq zxL&(4-=nN#BU!(yvThXu0}JHZn~GhDQ$?Qh7fMobx1N#o*EgUh_jIN)X5!G3&PG+! z4XtGvYH~fb_%)O>>rh*YdYN!4);d(ID6?`jSos|A^V9gF|HTic5PPCDWxro>W-eo9ZsynpQgeiU zv8N#Pg5cxcm!>kzLp>OQx{mXKrqtlRGslMgpo6e%Lr}_=jS}h z8Wf%hjIbm!h$Pfr&(V9mWnY5#xXgTkB{WKu(gMusV0QfQmg>-t1+ca^g>@Q+k}(qG zcPLuKsbnPEsh#2(#k-^{P$u>uI|)S@*9ug-FIe$(@ZlKn;eBY)#A6>jG^_fVi@l|BoQ&X@^#&3aFo)yyuTwnf8aZ#|{!0 zfcrohFy|V~p330qrNN%d@UE-CkJaUTNUqbL&iFe_qdEb zBj)pIhM=cx%ej$AEoX0}^}<&4cKd}R@Hxj|9WKE>B=XpUD0cR`|DQ}Q{sC>`1s*#Iwx}lT zg+Kdd6d~iN!!Aa3;Q@;iL%kR=67UL<+xm-F)l1fg6CfAkz?53Ln&4v96n3U9w_EeS zYM>cb(7*(crv;49es1h8h?T)ki+{S~7rjl-SR)?5!QFA(U`!u|kz0e}cpAB3IEZ;` zMf9EXx`3F_sXeTP|0RCSWf4)$#{5H-$Fn}w; zAm_H8y-<$-&9}jF9cp& z4A!qYbG;7VXk{|V5^#%hAs@_K%!{t`o=%~fJj%O>huOLTzjYliDe-cTcaqBY?m=D^ zLjKtag+OCoD}cY6L+|MqxWQD|ufMQ_IlMEwOU2)-NWW5lMpTrrhw*kF&CqxB1TN}6 z9f-1uK8JktpI^Y}Uvc>jQXdS%BQjsZiB%&Q^V8sOwy_uQD~Z5-?7*B}fi`+O>%n5? z%5YYa(bS78x#ui6fvCsMMYoy;j-MgTm%8xYsfLz(oLlF80-oxI>=CYY$y7)0IexKk zTRMAs<)BvbfL#wF-z|tND1b>3%x{=d_Gf0cy=$;a!+8OmXND9 z;9GLCn^_Jlu8HqfWPU%RVm;6Iu$T3E6E)UixTwkOeLK$0Mume(wS$Wcc4=KkcGvj~ z6P3(ZyF}fwl^%;}@FpYN7)VR9wL0!GUY49Tkp2TZy$3(wS5jc8-cpO*1syr)?iLtC zB_{Ua=Yos;L+||4jhTOgmlAzQ55d+%5yxh;PtRO-(e)#mfE4>nKFK})##K}U*ZBK4xOJO%e}(&Appp?_<^p)O56{-&fLoQ7 zrXRV>SWv==WHAeg!AIP2Hye$Bl0AC7s0sws0+85X?4@ykh{UZe*4>d}!DGA-theaN z)|XknhgtLwSGICszrAq!noQ+3A4Wf#>??uM@DU7N?Z)8yfEn*4uBM@?tHF30MrOAj z4D1p0k{8)u82u5VKidXI=qvWiEhuj;9|KB#3A8#(Zj~$Hp^DRuBr0AOf-n3>?)d^N z;w5;q?mwaysM(6A{2zB30+y8Q1112_h;1x z4fliL(xa()0rqeK?afwpbe;lU*O(demt1@cdm;>`d!q-;*+^!`94gCY%#_7+p-&)Z zZ%!4cmF4m&K1pAr{(VgCcM(h?7S?(d99#s>m~CL>>Qe;-Qx60XskKB;6==GW+gAAQ zbn=RCWEXGAHEt6b_rmTjqHk&hd~XZTB+*f_G<;tm3iW@S)$_tma@(1l?@p{%1>mbb zvdW#LzK&*A&0*z@ZhkV34vLJYb_?D+()tR&hLM`a+67#r;HXLoP! zCFb64;?*jS)i9sy!J=1ihXQNX;0$kC}zi4uBUMn1$c6eMywsC-!@glX!b6k)Az+~kzul^D%U&8*zyH4}l1ZtOu z{Qk2$E~UF{L?dx0#@6oKb{8w}9jemzM58Z6oiD;q`YC_VnUN!ysa3Ouzg*Gkuh)Q^tb|+IO6_-;uBPLt zD{g?cIlWJ!0^RaG-}hIN!lyb*??yB;Y&1SY zO~^NO%&Sb!$_vh595uoU94BUi4^BjH)RnBG6d6Gpxxz8mO7?o~$m&-bge41Q%~=#a zbE#1V(kIxJ?5ZJgsVLc&#A#v1{A8Ypd#yflXK5G7;C3^X7LwJ8W3nQ(V<5_jAbN1h zu`XA@ho%;zy)E@oZ+bPlGBTSpvc*eVj&?+gMlfd8+&N9|kCo|T?aX*J# zF^Xd~^KB*d)h_bS$M}|s7)L0xdMGh;D5{{IjMGNoLX|vJSP;Cf11UXo-&C!hI8z{cXpw${p5)=tZFR~} z9En~YI;v^a{|+r3k%4#$RidN2HrQYds_xR{n*JbGf#{!V<2cltjB+#?!6dSSD6-0n zWNCL@*I?rhxsN!I!^>oEH((df^NqxkPwWAmIe=#Am^;sWOXeqLhvlgLnvgLzVvVc` z##^6nvKRdDBw+!y#4dD7iL9j`m;<8kMHt-IF!VMHsY^DZPTCEA97nu*0!o)FaS^qO zQsq?Ss7j?%i(IGyl~*Tfo$2Ild#UqoF$z<`F48%^;1=_QL(~b0qjDP+-FiGZHlSu& z#~57!6Ftj~ZScPzF0Lsx3CDaIz>^bzdjU;X~pkniu<`Wwp(hqlpQM(FP^6|ul zF8Gu;Cg&YJqYdEL+jFWm~T_GTd73kvBI;Bpr z))6zVS5!Qypon@7DcqD7Hpc#DCVD$BKs5N%F*S?E%)f}Oc*bXvzj41SkF(j^p zPNyfeM-cUd=os7ybzLM?#agiVTdZ|r2ARiN_#XV`4rAdtpD3MNTt;=Erb_T9d#_6V z-i!=h#E_el#dkwl*qd*=6Z~d3^nauH)@L)Lr=t7|=QrJijyzJ#^+jc(j!ME8WVJjf zbW8S~>-@EgGTSBzw08S<|+~R7?tL3;_v}#(37CliJbk5jH#3E zdh{4S&u}DCmtG+gI!~Q?oZp=0_HB;)C{mNCZSR6@KV=NQq*6%6Tl;}qp?HyJ-Er3y zVn3RLuEl)vsDG^AIf7K8RliPP83kl^> zjd@HpUejOV0rIKABc?D2bz%Hrbo8pxn%2YtsXp(lJk@+rep{G#;?M7GM5PqY z-7(JPEY5CUp%1HTOGavS>N_R)+&yZv|(l zKZ&7#SZ`jCl^$n2&0@56!$l<2jdoX{F7Rd~=7aA3qb4^|0heIpHiyX=#K<1U3O5S> zVR3ZVXJzzb$31}@Mne9pCExMk|1P|V432zqfB#|Np0G=>AJ}`D^vKRolHzS0lry#d~PQ`W;DjvC`dtzJeJ$g=danzDDwyBKVBr z8a|$TXVG0AP3E!No#*Xv=ONosVjMwxdWIbEG}i~2jT>3#WBBcHvcgCBE`MNVerGjL zV?ED@&>S_8p`=Heo-2N&m4 zDBLcB`Ch{p;wB8xMXKj(FejI|l>kzAhg$kG_}6bT>F=!AA2{A}&u5T3F{^$F;`B!H z5%tPTH{+7P>m~5qE4<1LUgt77&k=flHnC^Ode;A~Tvka|<8?G0E#@F*P#fkz6Y`|a z%!Yo%ik@y&W+O&>NoJdhb=b&U&1N2otUw9oWnD0>CVZ~y%!2}`(B;hHEb_AF%z|X* z{0C5j?_A$w<=881p=R2^x!S;bvlfJF5jn^L5U)+FIdNcHw^=71aR#ruSDH)AqnoS} z7wAY7drqTy&T2fzHlWGf%u2P5bt#VZ=m{&!d;Z=tR+ejSrS4f)ro$Yu?se)o_uXaf z`ObHe#tQS9_wxeWEQMPi$sWJ(8!?Og3!;(3VdV4KK{V8S#)5o*WmpZW(B)c|x$nn1 zREV=tk8{<{eU3V@n$)LyDeYb{Ts%9MzmZM``j=Nu<(<9duRY^zydZOZ#e03?{(SqW z9;5kGo49P_^Q;EPAB~Q?8Td|7)aUucgjYm^1abfo(Rn~zNCN*o$NI68Drf;2L?2d= zisTz&_Mw1}bdZ(U*zdyuFKHv@WU`99LqGkJ{N)j=NTRzgx|ZH24R}gp$C} zl9_4GU@zXgQ7IWpdOspp5V5NwM>TSuP&m}#a8&DwN@D-=Yrf0xti8WDescUF@3(+f zdAVamRYtHlMyv2$mgA^{3P@b*YjL|E>%2g05f2xae7-+%Jf!elJ>z)CEB|8L{2_OK z%m@`bpw}{T#XU~@5n&s$7L?}Q6$g1OPmHcY7FL;`WkFzz@xB#;5%ljhQC_TG50b?l zB;!lqn@l3k-{$^n95?8Hz6ZAdhFsteNTD8_FoPWLEsscqtzVC#c`_W%Sgz+#|1Lo} zJCk!ZiF-u0xfhjiQ*z5vusa^GIyS!1Z(vK;_?C8)nXKhlNtQB;xG&&COz$7*2F_noQC5aamx!sW05s}&2V6>IEt_P+p=1!wo!-s)+wIvFaa-%W^ zD$U>IUEirKzJhsuCii;tKcx9IUIqKh9F0jl;}U}wLGl``u6f<&=k-d{x`Rs|xLSm#&Zb9A73m`tpQCX0)8 zN0B)4xI{+uBWBWPqH-qlOdwJhB(twc%xDG*(VZ%HAm7C}BE}lBbrCDR%2<9woht#q zs85y_Nk%Y@zK(_D=9|Fw4^q!wW>kG5tI@H(gi5-S!^{A0-0NQbud{MrliY(5{7HrC z0S8eJR7tE(Cr|+{BH!MQ;^q=~%zHc<|AL*`aJ49aCb$j`c>_V37Q;a9pgKLmaTHen zAbNoVT*uONbPOHjaca~v^a0%Bc!WOSom&rJqX)^4ex)+-vsI{8tAMT+fzhP9+UO(%4*1Ub6F$zrG>01O1oy< zZi4qldH7Hd^aPo_|L@Xo(vS2wJ;ZJ2EEUB*KAl)c%%h5!3qP}fnqeWV&@xctMO@FJ zzL?H=7|HqQ%n?R4+?E=n8%I}ewS$dr3MN$!WwcuAp#LqM<2Uv3FXHDrv`g2Ch`Y!Y zrxN`-upZPTR*M;3N%A~D;+;eyuID*?KhIfZ;`qi^f&9%OXP(EgP?*d0EGm)l^xQ>| zPxmCRZsJzjcndZ%g+E{$Pnp?Q|A)yZ^S{^R_V=mn&aw`OtN3`_O1t4h-*K-_bo`cN32MzuJ zdYcSldl@&L(J=;E$V>&$RBv{tT@XF)eP7H(4#`fXp$ z+~rw6f{2Di;iF1Z2{d9I31^j`!MK}-Vdewc+?|NXi|5` zx8OInl}^(bdOpP7(|u_1;^@{qi^eyBZi=%w_~VI2N73yJ&-3 zA+>@PY$j~;AU=6RSZWWcp1l1Y+5Rc|qYk-i)m>;k)_~Z}<8036dOm$q)8Oj|aK2lT zXO|~ekxKM93%(&ozC)FrKwf;5$|II4UCgQHvNDYW73fa1sRnQ82{!VFEb=zk>V8(6 z6^yEB)Si)yvThvhSyei)(uiwM6?YXXz)O826TAu!y5GHWL@}Bdv0_Z4ejCdu?+sQG zMm(=ar6|^dRrx7aZek7~A}7_z9D>}jRm4vWMBBG8#kZL|i5v;w%kdnCK?&F5o<0+7 zZ!{?N0M?YIpo0ZqaO`$7%n)|F%u6e`(ovo~X9f9>-q8)L9ik>^&iaE1y-4}ZikmcFjL!6MMb;UgylSM3C~{6${-#qSu@tcVQt1OVH=n2Fj*UT zNE>ISIRVf#V_T;x|51zFp4RS)0#20){FYHsJtWXGcKbkDwGe&UzD1 z56A^FmZxCv2I_Vn@)a?Y>O{`8l$HG$$m|(6%aH^w`3vQ{3+1~9SxIpsMJpo53^4a2 z)UD50DU9y^#?mmzjld(iz+Z|xo@{p4Q1R4FH_1a@km+WC#P|~j!>9p=GrK1d9jC)< z&Bk3|73ldkD#&BhlaHx1GwCb$px>_?C|)x+ay|++Xohq)dWuCv=XIz(b}+a1gB>2F zqw%ct9J;WFu)SZv4-HbYREvvIu&g5Lu;$G5p0fUQIZlLiiXx8?bCg8pSqeM)nq?|7 zkcxDmH-$56fu^{C*Bg`UO8P9qb zNyZYv+SkX8h_*p769QXUo{mX>ShHN#g}ZPQv8<=dIQyfh!rN14m#3C7QJExDAz!0{ zjHeRWK_xPm+@lv+M;XwiKU5S4Q6@|zr|3*3QIkmHO)ZcM*72MwZVx#AP-bs17?2p> z?=rp)lOfM#47Mfmm1O>@n17;!UIvj-4?CO2?0W(0D{{VDnK8@JPt7G#Ph`vwCJuL@ zL!&+(cI8o61>xltjQ>^z{$C51-0C>)mcu8vIQN$12xh150%)%M@cSx=`l>L`D9)uk zM;)B-8sOYj$Nj8I?)xh8{HpdE93k8v%F&H^*q@o$i#(t;Zm4ze4y(%Fs^PvJ!hW8O z@v3ivQY*~;h#olX4MH0!dipNH0Z{Be7iaq>W_lE#Wd$q2GVWb(KT4*MM5gi<{ydG@ zX|tS&K@Whzz04(8=$`1cQ>ZdQkeY^f?M;s931Rd5IA|F5Sz0lTT} z-T>}>35fq{WvCI8t!5dhV*OP#D0}5Qw)f{#a;i%S(~!Tc3NjD zi%@k95+g?7J4a~4@%m3-_Gf0y6@yo*0c~KTyEFbWt9TxYra}}{CH1nhS~be3>mcS^ z)R4OAl>^}FCslJ_RMVYHll6Y)r7go~Sa*xlpr?6@*ZnpKbsjBz{?tyV*E)n9+m8MEEMt|t z>0RvCQkJwRW40JOk?(qtF6DOi)RaXvz`-?2Jn)q`=8IsPBJTZ}3#GZAm2Hvve~GpF zRGeLrMt;BM%1oBEjny7Ci_ZPn_6}-iw_^crfwby~xfK%Ao)3GIA@UxC%yy_`eucY< zEdEXP%}J_j52^fg5PcgYynm_uv9jn}UhaMYOrJN6v)qfZ+2H%db;)*`U7X5^SI0W+^Vh@KP-wd&-kl0jJbZP{5w09PI;Wft5%DknmU>_^7T%SR> z+b}$n$=f z+WW=B-pT3)8SOvBJA;x14%D*-rO(9Y`umPh{PnclZ#%xRmv8QhWxW-n8uQ~tg`p%S zv9MkjYQT!vsVb?SP@1hrmEmmf=EY5AWJJ{?c*`F#iot6Iiy3^>PTb-;IQ<=MKHQ#F ztqCS^7?z=@dQfNmv$IIwR=jU6>esbgldUn2Qx}7Fd8$d2pta9S3-+&byoYz%BD+{G zPhBTZ{hYtrgoWGSc__+a?7(IMZA(^KWxEAZV8AEy>>wHL^VvPSdomDTQFMJQzy3F=67;Y82`3keT zpRJtj%++Qgtysw2EM%awItn{F$$5SwF~PwSM%H&&h43V0(rNUAdE|Zt=>jjrKU^WI zG*O*sDHphtb@akoj7ZhJSKx*Z`L-YRp97-HpV-bn-ADQ`YdD?uCRF|xhO}yldi9a-abn0;6+vA8ActwXgo)3O%-issUpwTUh?`&#sZ0EwM(?r8bj`AhPI?2(GQCl9&MtiFh z-p?+3+wRMD?`5rb_@B*KXDw)}f_P9$MWYZbT$nu;PV9a@d{Ab_zv?kGy}p90RRVXM&lUW` z3@z(%z;BBa3zEuoNm9hjpgWyxnTa``&E95c&m`vPL0scqIHJhqZpIumVs$n7)~YlI zmEe!^iD9qE606~cYhsmZ;oGBPPzCc)S?#f+?Thuc*f%~^-M$rUm+^jl?rK%^rYCRo z?QJbLQiU{xE1T0@-D>=Qdl^P&v8=m{vKJn!uQotm4SsqketHytFd>bgn(aR=<=sEg zVpPJ{s@p%D+=<_g^;S`GhsR%epICO;-lA=w3;M?6&nn@ERL2kK@xN(%z48+a2;a2M zIa_O4V{284vmaZ3;9V4JX?`+1WdWY@1V8zkS+;kmodg0{g~@y0vIc(tQq|^j z9P|o|(o)Mu>NQ`h#l)Rt*W;L0^C=%DPx1*LyD`n1vkUe=A}h?3RL`aSUIkaan%}?V z)b$R|v3}wo>(Hh)cAeX~u02v@egp?KHZf3-T95F5p1^HCNwX5%R6n@3r=_oJ{V0Sx z(m8n4yN{_>Ob{PlO#O8ZW%2^OdYOvHJ02J7)eA+D*PPMN$d2`0(T4ffhm&G$dWwS#t^N+#dBehY`#FN@&*dgkSOVuNn z!sbg^`CFDZ(t0u0Y%zqmLR)DD=B2W;SXS_}YgPMxkW(MzFEZ5=&*5Ru6W@#Tvc>tA z3sP;din>(j5}HE?-5`bj(8ORqskhbz;vN^4CMOstGA|KyvgUTg$@*S-$wUWsvE;>^Ad+q|X%JU20wGhn*$ zuFs<|&H&tdAM0KT?c4?LgrcR3)?K^H(#du^2)(6Pc%yN!p@(S*1J!|ouA$$qp;fe$ z#g<*571v{8l-$(bz^O3G$^Qq(=HM)#Y(7hdQ~9w(}M^Ld2l zSjbTMcMtxt0}pwJ)>fVN2HyD^KDLs|XMT9-5I*=@R=rB}U#vxCb}}vaSSCK&3S(Ne9tQ;WlE?=YWXkM!&$e< ze|pPL0%uK3GuX^`WZPFK3F{`Q;(eS4wDA;jZiSuE1P9#Qk9@Q=F>bzDL!t zl_KE3s>`8V3T0CbRuvkg)+{z`u_p^1Dvuw70UiaTL{2}7K4Y?RvkTP%KakO`rPJGN zgqGVb8=>`=@lV+xpfhClMP&9DVBsnlg#VJKjIArZUjy4z!@F16 zvjObY9P+veAAgJSPq)Bd&DGB8V+U$!SE!&}lbC`!36nMT{;jg{7`@S3O>U4jOfElC z8-?R~0^j{SF8@{YhP{dJTY~X>4{NXjXRr!O5RWUovWkK{+Iy;(i|`GvYjZ5~tmohh zU-li-Ein(;Ox(hJyu;$O?;AMvsW^tw_{F}C;r7H2w8Rm#a{SHxqbvQpi;Un1ZXiY> z=gd6feC>u0H^7I>a00I;toi~@U@XSu5x%yUT&*L|R$m@=5ucSWRsT*v#=rAUYx(v6 zhyoL!=wbX#PZ1-stL}2Ej@b4VyvY@^(X3qRg#K|LA(?FnqpVl&`#|h^16G)*hYf@S zI?{l)5Or(mg_U5fr~{ox8*%!{V`|I4;^1QzyG680Q}yJDR23tV4``zfe^tuVBa^9= za{F@flVU96Ox5$#Szu1Ot`k&U2UyrH-0@D!ZtWM(_p+_MT8!!6K;QiVPX28pqZg;g zcWp1mJ(T=jbIqmK>7_u6;>`?YzW$Z;g zvja3pOP!=id>H|>7v z;i2>aY+-1QqvyXC8+PUxg}HLz%l_*W(!YLX?=L z#FX;-%M~Kh&H7P4@$4xq#cZ)I6l5Rs7oW>4w#qN|@fz7g%p$U~D`aEM#P&{dmwtNf z;~3&e@|xK)odq(k_vAjSabKHpUGb z{wl_AMSl2S_5L4mpx?Ns$2#X`1y$WldFxP^s2vXQ>ZAZFnR2^q*!5ukc2fL&3xRwH z>CK__d73hI7+iRtEH02lL-muG@3Rn0kg3Z5H&$xDD%-DOL)iOzSYR2hH?oNF@a)s@ z@Mt-~gL1VltiHKSt+p(!yitgSsIPLFMdGO1%>mrVPJQbuIDai<@DVisE-i6X@t;=3 zADrwz^pCByW?BO{AQ+MQ*1<|NRljdwsg>A=DtL~FmxXwRGezjA#<`6f-Af*oq`cUX zGd(}utC>`x|4?uq5tok`-+7$($nc2_u{^hy&yv?C^I}ADi|W~FPP0)6{CoW9@niN3 zmL$}pS^P%@Ua1;PQd0}fXtb*wQ|LQG1yl#>hR zc5{gFaHD8&VqE47e(-hpDEN})c#~CfqR*V8O=9{F&f72S@sGqaW>9<=NJ`F<^4hY_ za&>vmH8SHyvey=rW}&JG<^6+@+9-M4cyay(S1a0Uvc37%S^3I`a>%b`7QdvJzaQS) zXFEpF=A_6z4_>?&gCAqCtIH)C$R%!rKf8g-$IWKHnl!aHoxdh(6RvfCMe>Q=$+rseOaf?Hsf^l@4FTw<`(CshAaIev; zzo+`#oyKe*KgIH&4-1sjs*Csa#qyRS_MO^oxb#?V$EAlJzlGS}5WCVSF)$5MUA|e0 zpx39!U)i|L^F`2{nDxWvUEGIb+2!}PB%Wn;VpE4uT2WPa{lFo@J|V9g5XvDKh7SZfZFS9{6xc-Wq+T^px$xT<~V;Zsf&!) zo`I=CtNti^9LOTOVpVR&Y&H^quXPP#Cf-Y2m2!}LDOad)veLq^TFjSwnyZE`lOKk* z?l&AlumX`oZl<#fCg3Bs8%)4kcz}6w{>bfv2Z&LeUG$r#_>icoRZGlCIhk~2z3Xy( zO0X_f^|lM>bIuhFvZtzBXmPe-JikfH4%WRZsg5JFUz>XITYB|;8ok%Bg3n>qheQ4Y z*}{F)IbGPsZTS6LXzH3Lq#kzzD-V+wW5MUJxlnQE)gtC+u;Z}Y!)*C5YYx=C51QUZ zt@1VX+zRbYTAmq{aL*Z=_MEY4FS*y&Ybwoeh>G*PH&5)3?WoYdWB=vGfPG+O&nN0# z8;ye44mAX(2#g+xe!up&-^__6EtDA4DhZQcDc@+|m;;fw_dhzQOx%qD?Wc+{k}rFK zCUK6c!9wVK8Q$VkUhjM7>Hr<~i4(bntZ1mv8UcN zOx_&vWvmiqe)2=-N$HxKXnh6-1VW?QJe1KTd66JH7EM)mJ=mKyDAZL=u2 zSqsJZW>|PDln}n-EBk#)iSllWj;rJupNW3K43~-#vw4UqTFj;WB=#%3!~i^KRQK9KfsHBouEOHU;0r#omciqlNmmv`o2(oIU)+X{n-dCIk?7RWGI$NtKhx;&X}YnY>8$ zl*8w?&zageJ{8eFk5|Lb6!JZVd|N@EjBf}YAZmr>umt5(eWkqLk6L4?^lriQ{ZVHr zW+}`|oafWQBSa;#guO2C>5J`O&N>iF)Ko5$-vmz)NFp9D_xu`TPwGNBP56|+4tMg6 z9eI{cbj+Rk%6sJf1Dv5z*prD6(;Qwk^tz#Q->vQxmB@oh9e?~pE_nSc*sCyaT|Rl4 z`dH6fq4qAAo0yL{`0Eik$T1MYxKw$W49U;KLxxiOQ(W^VF=Gd&`VaW;I6RO~KRF+p zUoLr=28mVdqDI_DqWIF{1pMH%Eg7=NK&`Fm`V6a?&GKV($j2=AYw`FeIQJkeP7Z89eyIOEal5$a9Wxo! z!UEJ&WeM$F*VoHSw&0vcW7>F$uugPf2FL<<3cE;befZ;l;bHW8!4<6fX&aK3(S@o z~Wvnh%J2=&M-j$?Sie{_=z+i_3mE`GS7D!9Dub zojCP&w01YcpiN}`wRwfI6ukK_xdz`Jx2SsmXEjhon2E#KF}!Mhy3O!T*G)X zSX#`UdImuB>VvNEs#K%;TMFgiAc&Lq+^q;P%dCHzin9d5m3f zcA;{=5!=;?HTFpw_>souj;ApTu57kB`Cd;<+57Z4YpGDT$fAFutlurG-kEah-Lz@@ zQucn#oPIH*UoIN_JmwWV%h-VeMxEz(Pt5ad7s-CE#{wP;QR$U5tLuf9GPVkPC7*ZB zN?V1j^SeJ>Zu$RF8U7zK|6k4JvMc@OPFejo+B#aHk785Nf8ws9 z9eJcSIJ~C*;WfP0B}uuTkDoX~*R#VJ`iPe275?uD*-#&7D()K42-d3RTo*8k=YTrG zdU)+kvHp2iYM2P$2gB0EXxQf1*-P2>d9r|*wdF_kqmR^3rY|D{CK*B;N!bd-NXzMSF^d`-_92)^FiS;rg9&A{G&d+4Q~Dh zdR`4lFMz3M9iL_-%Gfkh(nGYby{TWjv$M{u;#RXlG}dadn=06}vSvarV}{LA=20nS z&Xf{3u0m##&X*Xl>=>}4ShBxq^!}o{kNHw|nt5f18B?~?-G6s%lNnjQpmqPu@&#Sn z*V@*kdEZHY`iogp4y5~F9;biLiAy^Jn|7vk%)nA0F={b?OBJkMEprLRyb=vra|?c; zog=;%3pg~*e(@~(eF>*F*MD4==8cGZ-fzJ=2G@U(1)r23@*b>d%%@l}ucH6WmGU0zDJ{e~QPQt%mq6`~4Cs z+btF!GG|hb6pM?dabnlX4BNT-{b_@qg#Ko*+a-9NP<4Gp?Hcn(95A9W6m~_-s#iq> zxsJWwpqkc3|LP=%?N90RxXAN-QZ@wcUXYOXa#%Jrb|16bjWBiO;0Gz~j^W*M8PQ&V z<%T}3Fx_2f)FSGgRJ z&NCcO@Z`C|8EB_vp2Q`b$jF;{G$U8$Av*s3{Lvm+!;dLn_>9L|>HjZ*<`<>hW4=6O zj&m~=qL1;Vp+@Wjvvh-AZWEtdU;yIopmAr=%4r>pmMxghW{>3cA>aE%P6g>N9 zQ|O*1;Pjs6Nyfpeqs8^dME1u-v60q~c^-l8=Aiu=N#(4&_i|QdpbhBfqw)0 z-o=LQgMhoIO#3#G@s?9#@S5{a4O7Itn$3kODO5|5EmYvO%4-!w)w1%2k}R{Rb=3MI zj|jC?R12@ru1>7om6*G%F?^wdx=|gnwUI-&!Qox}_I;x85OFv%ma*CdesYRDe->@m zT%I$=&#k~{u9oe5o)in;!#TS!>HFaFqt0b+oJm1vxTM_wBI9GS?$1;Xt5TVEr54oG zNc@g!-A%Am-07vOOzU2;d=RF66fgd)Tx_O@z5p^?MG3tYO5Y%^e~;!-Pr9C>v$e`jPaM+_s(_Ig`qBE~M9A@Fb^paG{43>` zYgC5Tr_tWqae4co_!HT37$JNXHt)QILrdcW%JMALw3vOM9{!R|>#7%bX-ID>n6qkgdOP+URieaB!3Ch|+6#hL~kzhG-3 z`+L?h*(=j=1ux6A=O&imKfG431#=Rjp5k-QCw^fp#_lN=JKnQrJU*q3_U$9F5<_tm zef)aNUU;WtZObdR!eoT*;1>U&S*rclgmJ24(!;JR_`esk?Bdvw0$7sVEcXfP2;?m%Z3)K@XwbQy_UGXna=S`+GNVjN!km}`g8K9ajwBAUSM#l_}{I* zpH=CPSugI9X?6BW8}lu+z|hxG+rL~Uc4?~aS4?x}T}ty&!Sm8EK+(ht=AoL)siL1v zcK^5N@w;9UDxpvaeX4y1AFNjWeP4uGj1vr{<8%!1WVmsn`tUf+;1hDh(86Th$L4;# zaxb2wuTi@FlRjpk$HA$OhAt?yQ8A;yAZ>tGV+3!1IcI#XJO9%S3h9jH>S*0b*3el$ zzY{JApVUgfzbRQj3%;olW}!AMS17hZ%Ttw?D#uTiO!gBq%@j;Lc>d(G^6*&MQ=Q=; zYm2)f#q1K>v@JNvXrUttR`QFaFj{T)n~zSl4?V6{i(H4XT+hpGl$~tyiEm+}t*LFZ z-mYzvYk%vV_?``_7+-nzHC}I<_jbZkJN@QPzx;#8Sbnzr>iJ&l->oA{kFnxEYda~R zV%cGz$lv$L-$P3rnbP0Zf7x~eS=$Ga7yeBRAU?I%-hV<4$1sT}af!!HWIuWA#ObO6 z`DOei_?7ZnD4?SHe+9gEoxGsA7AlR~o$PA?*6PGrnM8m7WDs2Xh-@ONeiQZc zsTl4U$2E@?yv4J;$1>JXDSxGHkzK_61bbM|AxI^|3=4Uvg58$%6yJCOo2$h7s^Zr# z6<;F@t|QVmlo2<=lr@27V!U2Q{^dUQ9AkMxU-XdW;nYTA+d_8`wm*>%n8+8zG9meg zU?894Q^H$>hCX=yF-93YnLI^&?s2hxIA1Zu_r|y1?^nW;b+o=+jvgwbu6T?)c#Rv9 z&ZrLFE@q7g<$dU$OREVKO<7a;&RqT>2c2<9?ejN`-fk>O=z=!l^}^$Rn3%mRmDOVG z-dphg0!U%5^ElJ_oCNEQ;k6%9S?!~07uEW%ym@;}U(A+sGqljqm8pg83$GA}p(OUE zAmn&@nkDrxBzYj!2!56)>`3*2FZqR-gCWN9zD3hEH~E6NM|tpn&tQq35QiR3`oCT* z`ks{ecTAaoOS%7zsh3?(L3y2iS52M~_a8hTFIbTJFF$LIF}%4?VT(`!{G$&av5pxX zf;G%IdD6@d87E_Ahoh&g;Gn*~Py6M6%N{lmb1uZ|VF?El^L3D&>|;m2p0ceU*<>s` z*voEvhffI4uwUDo_Wg@}#T-}v`0eAYC_}9>bcAPU=RiT{I^J^~bpdu2Tv~XZa{kpN zqV?4(ZozXjfuox7S}oaD*68@I$u|z>2OrXgW7N!zY&n23lnc{g7S2D)dl(3XZHGqqF{qkabMc28q zrJ@K>UTq-w-AZ1$OslP3hXD?4SUtU?K1R4P+ik{nTd3>ZsQ1GqejBfL@_x+p)DkMW$(rk2+CN%PEj|^<`)+$>J>KOgyYg%u z99=uM)y@&!mSS+5bgVHiRa57)u5){ph+H$B=}VIOvVyaJ5uUAhV%UrFo98DRES)NM z#a+E3qI8V%h_N0yadEj^-LotOE$13P73^Fgb-hq{7V=8rboI}%b(ST6dKO!!d!E~; zPZ#HNx))}KS#`5x^m3)=q3JtK9X~Ym+3Xd%(YSMGrpHX5iTi-&_Dk{0q4g@7jw`%; zLBANsSI|Ew=rN8Uv|xoTMLdt{V;oySEnX{@TJ+8MZ|B=T_9~omm8eyg^t`CYX!$Mi z58Yxq{dQiDdFWYlIhG8^ejHPE3}*QUl0B$0v5&9XtLY8hU$UIg$%a}s zbkb{7E@D>T$eG`^j=5zPp7Lfdv%Sfw9zGtMIa&+d!U#Ss#-IG z>S^yhlW^8J-eD|X`>Z3J!cRM?(_pgD#mB5FvApE}wxk>)6zQAg5;2?ecYIOQjlZ*w z?X8v__S|K?+jgGgSG22j#jCxi@ViKesm`SMw zyC|J%u$Ne0Dl@MkqpJzCMT=-sOOLrKSxbzjsn22>i`y;4oX~?b_1MVLz|zn=jl3H1 zys5{COVRh5d#Aa_CLUwo>uoi%R|Bnn8mCh)p@G>2x3(P9)se72g;#dpQ*@K<_P)2E_}ed#HSy3}i-PL44TmuR7a zxZEDG#Cg5M>+zd4(jI|`!UoIx&GI62c~|5jQ7dXgl2{r4mcsTBZJ_v^s`ENvrF<7;y(|mprk7Dl8sF6=op`9((%+uaT zZGp^qQBu$?^7yu8nRU$d_d(*}KBAfZ7^@$7^E&NIx#C7V(pu=4+507~TKlj~h{YGS;pQO<#AIj91JBrYj zEO3G z+7M^!L6NhsbC-qMLvwzIGkUu-+fEE^c`AyA=gJzp#n)Qw#;XxZ?Mhz>@-Gxy=MJtV%w+dk1=*`l8kwx9y<}fn_!92b5C2IOvo~_ z=;+xG!GSTFE_k!7`_u<3)87)z*#O*GKihrMdxJb1;8~1F>uaC5<3d<-@M`zri0@C< zll2%(Tg;jle1F`P;lBSZJ?$BHYUrIl)z7Db$Lr%+JjVL}U+L#JLMPHcad@#6M-&?0 zn7L`NV}8_jjA?tse+fK0G9lb2VAv=8=djfYEH%zWoRiQQ#vISH5@Ma@oV|iynCHyR UcP8Hy+ZVFju-+`Jy6)uv0cwV;eE-z+O+ShRwb2Ep@@(YB_Wa} zrR}s;OlvbFIkl=jTG7 zX-e^tZ4z9`_gUQ8>lgVi`OG%G&6DN{)7LaMhx|AGEpq z+4tpMJu}!`Wf~y8qq*E%#tzf`?f!M-UtsPwSDPAUH>*bZPQILP>;LqBnZ>qY^nrcK zob0>0IKI@?^u>Ozxxn6U&$LU-b>?SZ#gB7Wx_ey{f33O0W=HSZN#-jb`F-weztrDr z7MnctyGf$eX}-MQ=6-S?yL0_cGb`$!7#A%t%UyX_!JX^QaOb%{-2}5CIyIvxF(CTY zUlG4uGPNWluIMM((-M25x9oZ5He~eiPx%G@Dzn1;Vn&*ISo@qm=zsKi?o8L(d6#Dj zquq(+iIbzV{h;LZ;vL27k}Lf;(e#X_nH@4NjaK+k@h>GaOAaUBaD&XJc9C6SciCI* zJ*J&+>mG5#{MF_MGs5&T1?FDc)Xwr#<1Wc-l9#z5wr9q>ncrsQM$O&);x~)p;(y|O z=9lP&#H_@&#M_Cs(H7q`Zd-Co@$8b0F0v0LF3XsZIB0+J`EgFXCV5x+cEKU#XVlFsoi(<5VO=G_?|MAL}X zGMDX6jPFkljoX>diH|epB~G+W+ylwqlk4INe!ICN>J)7;5BuBPjjp=+!;ZDH{SbGR zd)wEDu1eHSJZ9_r#mNCBdx~F5KIx}NPh>op@o_ZUtoJYAx7*@4xg%cX|FQQZRcG3&*DP2#ylFmm^g))y^P*dORB^Z{73ec=j zuSWI@g_+seM^OT~*zh9)0!2Th}Bge~&1>t#0EjOa9bmv0`A zO_s#5pJkgS-b=h4y=F@Lp00&^+Px1C4fk_>8S^cia)AgO{HjF^a)J#t$!rGBl&vryZC2+O|&JkA~7+#-aP5)V4}TU<$jLq zxS4Jd`n=&r_$l_O#Mg=2qv_^6c=H{9(7AYKd^8^9o7($ekh@KP?_F!WHNlLs%k6Hi zRW?7lB)NY+e6z|tV{fpB&3CYHL-UIN#C;jJi$}-x{JFME;?#^U6O--pzMU(B=6hUo z-xQYq#awR7*j4^+R~WbTd(Ch513TGFfW2=q`-sF8|Bl-o-|xozD{b%S!KiXHz%+1~ z@s8xUIM-ikBD>y}Ph6BZYA-Rv-L&``_l&Oq|9AFR`#xr@x!w#g`}{+AqPxF{`tXKb z81;+#nQ89F_}AF@CT6KAWoz0tb_lt#&sFyO-7eRgdh)dY$rKRRDb|~&W`V!We+$1~ z?z;JR@aa^$9WBpw+u|!-XCK*F(YMj1VES3OyTAX#w82|9`5)XD?oof6X-A!zZo0wy z{oLXBRrjs$WV=UwqF3xk=3;+^Ywvcuqy7|pdX3%T?}I_wx~u#oGr*o;`n`;h{CnmM>=_8EJNhSm9@u=`b}%2g zU*nhDQoqm~F%RLN$9yZ8r-rXd<@hpk_C|Bam4nAex>nPyts8*LT)h#6vTG)Mfy ze!IKOHF0mcA-=IGGT+-vqRvrmd$FGv-y6?xADj7hjs3~g@l9P@m*bx|f7%Aoowlqg zbYom~>Uf?X>zh-*SNJ>4AEu?9Y}-YnqQ`A}pO;))(j{5deP?<`W21Ue9edPQBC9U- zU;D@u`{(`H#A39mZZEfu?8l~_nVzccE&YRjmp{=Iz~nEv0WRD3G861m(bA|zRLS1& zH^n{TAL1;3jj3SQfr4&kzUgK=+QFtbT3#8yf(MuT;dWotGjUDym|5U*(e+(F4otmf zCixz|6m|Yozs3(Tv&>d{kbWl1{7uc?$xfHhk2LWgQ>U}c`^eZ9J!Y%>s&TpGjO5K! zv2pg|C^zZ@znn$2x!K?0$N7JKE0bfMA}+V#_Z4U}(cI%-b7#9X@Y;v=_GqE)Y94Z< z;`Q-Re~*RBqYG>)bAtaG-ul43=QgU)U}t{_w4OR-{6097r|Vo`6GTZnh&xU z*eA@JexA#5*SS0WTc(^n-zH7Iujl`CclgUqTicLaIiL79r9$0jUpKqlu()g7&b{Mf zW20N54$-+b*Szcgj0<4goxXs|StYu{);5b>8+U@g$E>CAo8W$rd$~U5g6MFx*`8u% zxlJJOYX6ye&+f5v?J{iZ;y#Wy#NWFdvOJ2m*(+^3v%>Xu-+-fb;NS~7!D{9~v(TJx zFSU1?T>o)gDt`=)=vy$nuYM(>sW z5p&R-Xx}sq{JxmZ(SK!@*!i&MNYe)%ztYq-ufZRG$Ft%-ZiSy~dn8Uw%(p*yPt~0h z|KfJQPd!1wwRRpp{LH`a*ZSYc>mGbO;Wzn<@W>t9d7k>P%l+k>*yhnw(H47}x!ye# zUl$j~BYm-X*M0+wziB$tkxvDs%R$r2Zjf(ePPgB3?;(50G=mxEyBpjEZVsH2W8b!q zkVUKA;<%cd=-;&KqAAfOcCfEQZ#~oP^<(huT7S9!kG}*BkJxec8B+i{UWk8*e{e0# zvvzFsWz;JA*);NXU46I0&G7@x%Vg+IKi&3AaJG}0D=`Ln5xXZfY> zD_6C z!wm8lxE=9jZm3^PWV%FOfxGU0jCUnvu*1x5w>Iui#9naA@b%fz z)M!XF+_oY!-h=}(=vf!K^UX~AYIJS1$#n9a;hVo)O;chlHLaJ~?$`M`rV-qCieKq! zc@NW`8|B%*&F%gMSJ_o@)!eIeIpypZ(Y=Yh=mopU4{|-?^6|KMyPIwr(||Wx8@R3lB z!*VCOEO(20j|dF6<85bq8CZPAU*-RDV_hk~*;laxqv>?h1%9NvG4}NTL+J}T+9#u@ z>CVoN)|u_DeB38FJ$Z_|*7S-FL^nho>^8rVvt3X3B%R8|;L%1`+3U^KoF@nS_xvrs z9rf~IGs2z{RgJRjIA6|9Np?(DkGuG#_Ws1o#Oi1?n)L9OxSQf#$<^`8euy0(eN2~g zH%wH;&5iFRGbCYz-E0QY34h_=_7`(LZbIMph#72KM5jh4!$bAm^5pw?niGYo5H0Rr130@hi-t$5>}Td~KiK6Vxffi$%A8=c?QiB3^A;Uo6@L?Fg1gQ0 z<_*pvd-zyuO8g`4(%8gP<0t)x_F!}{D$fb~Y46~lC)^e8eK*^8!@_f-UUrGU2gZ8e zRrH_wAI-V;UnT;J(f3V1!hCKDeS4pQ*JscLHR5zu?B91Y<8E}dwdjOeM9A>!4+yoXomncSIV^kB1te7VcCFm=qo{sXxFF8>ne^=alRPGr~7 z-3{;s@$h(Uyqaof>}__q?PpK5^UW4t)j#O2bqQbHRJ5;vyCr50y@ex}Z}5wK4s3s$ znPToUV|{6=(PQ-VUzjgJ;}@odecE=hh18AvEE0?jjVgp_4V(XrM6R4Y)jjj zAfYjS{hKMznN;`hd{6qVtxQEehGSz;(cR2u&kpDxoAc-`rjuX&-3xxVS#M7#Lu;E~ z+{18C6S~ZLbgYkZ;c)XSUE(2T zNAt06nOp5TFunT6bg>c7cSDbtbkZdAX4Bn|GKrDfZ;-< zJnz@KBW|IeXtq&Fdci1}OdXn=Khdi`6Qs}mP*aP@o@ie-cltZ&Uey=m`KQfX@U+Oj zXg@I@`tLc9p3Fq3nmOwCA$tUTT7b5nk&(0f9AChhpoYDedi0%d^IyIplfEhDZCGF$7(V1mqvO4%w!P36m^S8Czuv9m z1oSJmk260bw?36%7^j=3%)jO{6JuEekWs^&k6#b^b*kM3X5E3NQT=mURZQhByNidSb) zVX9ecUo;z2{(Od7^dncPuD%o9!kcCWajrwH?_|pO_U=IZp!=Ne>|%Qp88wi;r4t`w ziz>*RL*zn^1c`_V>UElf0!% zzTZ4TpK}g-FXGC2rmqd*%E_$wicYL0EY-v|Hb>}zv)xDTBmabH%G9SAj&6^)zW~3p zVSu_w$TDwm4x8w!GP`|~j%_mazLWpRUttoQ)?P6){4Vzir<2pEy3g6VOqmw@Ygy5b z*-Z~7o(FtCP%+7TYrdxQtxb-f$9eBzFxbTOK=aw=Q6{|;>C-*zmoP)k1oJ7n&jh{K z`mNw$z4?$+#M{`>i+Sf5I*!Bc6=twQIUBAtr(nqz5b%z##Tm8}$Ztrrs@c8xU^=VN}?RKwla_wW=GAaI=Ub7lGT^6f0kss5r^c=s*&3Boc76zH^WL^RK%_Ku= zQVTZt-bg%)sZ=ApG6I`!rK9fSr*Srmz-Iwx)4Q3Q6~O$TxGH4BE2avQg*)Mv`$6ve z%tC(kOW=UItXgY2RMcL{iv^OUW0ckaLOFOZ14@&hxvMm=?gFCvFCWW zZg@y~ z(HJIb1WWxuCaz*qe*(G~uIFRp$xOEoySx02rnj9#)f{53@r&FV-8TkJZ!vaZx_NY|G10YAUelisg6B3SJdTXu>!8`%5GE0vDRdEcW_sQ ziQEdF-Ax4d`T5lQdfjEUbaU{|vqaf~%E*?OVQ@u7KijQzqx}8o{iJPRTbMS?%*KGziT-+KXs6pAM3A#B z43kSu|A}5{3jSzAhv#9$$z)O+G{29lb?{yn=5hDI7j>C{R^+s>ovM`04575`2l6($ zfo_D`>!vbU=wn|->#lYstXj#R#f0e$cZ>hi%(aK@9rjw&l~dJ+t_zci7wI+z6O(%6 z$Pl>eG0?Qby^qeVIQLhjds+{lzs?-&YFE{tz`6KWTR!^L9w9EPIW6pqKXTvk#^!YT zvY1otM)c~yOnE93qU!j%C)XZCauJi2*2G{82%c(hg>r|AmQJbr5nfnBGK&cg7dLF}-`0Jh%(_=X3R1JH#&LjJ*Pc zt&bmflR4w}v#&Ds=!Smf%o&_SdNRX(jS6@XQ;&LfC==-j?#$)wN=<6h47&73;ll6m z!_Az)BA9zH=k*8ZF`whk5g4c+lhfzj*GwSR*pKUW~(RIWV-yPjiiK>Meu6WE8xP#P@LB!!J-k7YW9y?<9Hyk(yJ*rYy>oUQ-$Q-6S zs|brP!J3wIjBnAgoJOTuLf(xfe+PlSHE`A#^1PNEY)@j+vWz*)1F(Kxsw;g8&Tq)v z;sEpP-+W)X^9QMkE0_Q_BMKkE?w`}EF5oTMH~ux#*bcBoFy(o4AN`Q>G)yJ8fe1|wrQkKRJB@d3H_GkwUtAh5mphDv!oRqz&Mj^z1W z)T@)RAP>)tpi}!1lzomrX492TBD%4wi&qPn{oMs}YVxk`R`U~joQfVBIWHcf4%Vbc zs%ackxnFsHC4M=I-d_>5JIK-dIfL9ySK0!MUd?%CpechEZ&UYPrGHyMHLu5+Wd*xl z1>WH>c;Z!_ngoUi6Zf0x6h6n6>&el*^jUl9F3;f||7|cz5nXjRaPb5Dwc3}W%j!*R za;WIz@aQvi9j76C4wm;P<6g&-5olQ3JVuu}fcGXNe19tCZdP4S$5fh=?ru&*9l-ZB zscF|+;QmJHe0MshrFgs!Z;3AQ7lQ0mGXf7}Bc&y^ zW-EyQn$BcBGG;TOyA7TkO$;uA%gV!#m%}a3;h84zQxPcp3D4Zk#CJaV*9dv9ajtq2 z#6CjLcO|HyOfJIAK_vLT@RPcSd^>>>vz;nTY~skElb zbxQS9bLfV?#Z&drxDT;yK_v3^n;yis23_JN&M5Qfl17lFTfp%gy8q>_$o&WWjRXy! zagOMSk9OhfU;Pdr^HgP6;yb*!hkXX3(INV$hloQl6QM7Oe>w94CzEUFuq>%Hy`g_PTU*tzWj9hoQFYiZ_Zw`$m{Ef%iAFPRuEL+yAjFvv84j% zn>)zII_O;q?B7gRS)Lwo6?#|3e|MteN`Er3eV$Wedzj%qPK|@We1s0~!DPctMW)&# zVT9knK`$7*0<7GE*?&LuY)Tvl5w)K9y&XNrUNF|#e9Q^%0;)${5cv)qT*v$ZSm(aPFHnU*uVd$L)dd7gKfy~$LATBq<3Vq<#ud(oIH2(&#-A`1uBH<{R zzR!1rwLbt6N$}VaCLfE3-h=%X!%qib(%b0uKPQUC%ut3AiOyy@D@StW1SIwa-_?m@ zdor(K>OIBvoF5*ic06Ww@$oPd@2luxyD*2?&!qZk*lZGV8j)v{LBUJ(cGKXBHk^}g zfps(^n}!`QeaRGVs@m z-HM4tC1U;??D?Mm9X|XNM!Xj;8wa}&CgykJL*d-g)h-45-(Yz;dY>DK`+d};iDX?_ zD#T2%_cJV1jwm*yFDOG+oB*nhQ0pI}Pb%W~u%?2YH`(`7&SYC$28>z{eKR->Ey9{S z&~yU!3`bVwRCYcDUav#KSf*gllF!Y+=oxebXH#FA(Nn&T7Wcs7m*LN?Sa}`{Z0R)1 zbEiFdJA-S>IJ@5nat3o}n>z!~_9ce9$n@US^ZS_Z-a^Kd2Qg1j!7m~&HsGOIWa&7# zt^xS?hl%0YOd&3Y;i~a<67T0Jy*z*Z?FXfbU6ZLq#>1?apZ&;sC#QQKWtV>RJ zq!RB<>AZ_5_6Chp;og2=W&nIvhPAtqJRg2q#`SZldb8278SgAx_`h9QY^jZXKcu|z zOseO-5w1A}D@#$iejqM4fPzWPxo@LC)I0x+=rt~a`wtS;Y3RKTrfCBjJK+2C$e6~= zbNc%l;P)BcIQ+y^U!kAQ^5bb1$1V>+>1#!+hPCsfzL)a{BOVG+J~0y(?rdhfydK}>xAp<}$0 zt3UDEIp<@?rRbK#AKSqGDsq22EZLIlkHHl!=#y@TnTF%Po#_1_vY)0Ss&9Uvler7F znartl7@hQoobEP(uXA9i---BjREu*sg%`kc;=8?GTK@oYuBJYGPOowpea~e6aw*ft zQ(>!Vcy%<^Y^Em|47<$po#BK>vAzPV@-t|dNJqYi{Vt-u3`U1-VDC4WRG<6s-gW5w zJlgRaBy`siv$Ri`hQ3el#0-s-zJV>~B4Z-9RzU7ZP~059PJq83q^GI`qYnWk4Petb zWYrS7kOpvU8LG`-V)GH%^cn92vY1+a&-AA^Tz@^hJQPd!6ZI#F!#wmD39sKyPS3^r zKjAk9g?yBtc_U+#4w#oPp*M#I3x#Azlvt|xLkxD%5j`$5NV;3FFhJ&)bZS#^Nl zF(?C9%mGoKaQ6tdpMyt+z?Qi%z(`R1JRMnU&O@KV3>V<**_`kGMebU1dNG`+DMkso zxQDY;FFK$~tl7zF=Nw`oq`wQ_jON7CogDpys#J#Vbqwc^A3?%*FwP0!aZ+kRx0Bdz z!Y9kvV;1?5z`~YbJBw&;!SW(@=!DenbOm|nJdqly_-d6%2QT;p)PuQ;GUv`j2y{A{D3@R&ysXzY(-9Kw2GQa21@> zir+qXiJTk5z9s0<5v)E9Mot04AMx=c^~=JIg}i&KPY(iQuw*Nr+t9lqSiOn0hhVIU z#70y5h9IXEwc`jjFC*^DuyHpmS&wf13hb;4o(@ujH{hkOu_l9BJ`g(_F~#|s^VC!# zP#@&=g`;fh-FOjapxX3BWq5KcQCkTU=vr0w*nlR5=y49V^n@q#Q)qvdtSk?5@5Pc+ z;p;hM(ri2(;qyZvrw|ssf{#;~Y!&fyKKiVuhx!ZLG$TLuV#{oQ*ZXiEy$NsF^@9a{@9`*4? zW8#v@?sn3!EYylr=uW# z5zlWU>gB;>D?X~Rqxfk7TviFjIR)zs+AYOHrHE2{p4&$zSo+bEVfQucIG)u<@Wusb zaS8H089E*R{efn6Qg!DvH2DL~Hl^OElz{tKX3?FOx|J>0~;Cho)dL zn=IW&B>pAu#7j9`X@CbC5To6kJ%2>+eDpXQ#@DoFcB-SzqYKo#hd%h(!&G9ozd%_Q zh}n-eHDQH5^o@FhI35)L0DGJTQ}!p;`DDTh{CALjkHA-rcpFfY9)CLZY%@Qfjo(_L zSt-sz9*y!q*E}$}gsOKY7`+3}7SL&ElC%aiHG-2nIf!F zM!`A6rMjBL{#Cqz1Wh+SNYQr*Eaa+1h`}^5uA@)WKhwN;Q zEv4~G1tL(1J3kY}UaMpw-ZAOvm;e?AM6=sYGVR#yhf}Xak7lgi!>X;Y=03Ep0&|qXC#A5x5}sXy7Jp(-D`fY>(i&L) zA>HUJSe}cQB>4&=Q%F?Ca%V2tTZ+tWNk4TOU&RY^ut@CN03OT*OLf_050a;oU%Tjv z`%*D3!>U#A(%qa^meY}S;mT#`d@0;=7;B#Ay!|mzZ-S48QjHrk#aRgB%q0`D$ci)B ztq~E-CttSV(bZ&37N{Ns9vi3fb1Zo=jr^)ge<)uMfbl(;8;32Ev0oFAYl(R-z0ztl zTMByf$^DbDqGl?0juOA!aMr(Memz!pMYk&8`g>%2f}bqeeIZEbh^3XOM(dD15AWqO zb!v+)IyD~V+H5?so$j(F2-bAu{btj@#6!|=$NAm=Qu z=YZ?Q@XI1(mqGI7TyIKmFpFyOBc3i#{b-90>N$>}tKnWgGIlW0JrP{@;eIjtP9$Dm zVNVS-?hA`_g>MVM=`7H@){rx0LD8w$or~7{(0Mny>z!u~*TkPE zapzC``7HUd2Jh)NsJruwu%zFBSdAX}WN8ETY>kD7k*hQNHgMVuyPK!jcMB`GrFw)M z*s}^(&*P&GeaSmS>#LL=jqsh`zN+6oN~{(lWg}iah4`L~k2b*)+wf=jn~MGnrh{)=WJENd>I@osWI|T%H|UV!NvLdb}~0+}la*KZ}_6 z;A$aJ-HII!Yjh$#M22Lis^SsqMMJW)G;5BKzYVD|Idqb%Q?bdXr|k;IwMXy2@YCNs zyOk{1Lr$MTd{5`e17IW%9Bd~x8&Y1VfsGaMU;$Z^4+>>*BP5q4T3d+v-$;n?PYblJ z0pD0o`MdGOuYB&Hk7-N9&rNau9%8l)xw?NCoK#0UO&k8g_97UyKF{YMH3Pe|QaDp5 zQ$V~LgQ;eCYd>1+obeBOROR`$=-dvpA4)OBHf+v-VLkrP*~_M)Sp>54QY_L4Y&Ya? z9y{(L^0^?X66;Fyd>&VJvFb2cmWv;nVoiChE`ghi(fBVSybbKt$5YL)R!CJ(ww1Wn zLuwuT;fZsM*K_fg`nG&LxG}{tWx!wwIv+uLIS|_ni!?7=3)?DZN|7^O+m4k95FYs#T(8T@L<@*?!g#4krc zay~gy8>F@)ZU>2qy1H#>T?>61aV;BMm*COESng9#>0GW(PX5RR`}C!<|Ze)yaEv%Dz%qRu!ua zQg*R#20v9tD{17xe06rzZ?3FDzWO_%x*6*uYJvQ50Nn^Kt0#`ZdVWaFQIQ-0pT6PjH%WbaZ`r0rNz$Tju%2|h}*wmkPT(P|T# ztVh#av^W_AW`p-XxpDw}NNPP0Ei@Mpg<^bq6zu7}jy}|1JG{FKpB{$EYNaq%hpSuZ zWR{~Z|4Ij4Yv7}@T(vMn0V{PXH&|2}&jp>1fRSzNQcR7|`+%zKxdo(eU~NUDw!}|W z*h{D9EqqN970qvs;K5qdnOf+iUiD9G)ti(Pc}7^zOL?d$g`iSgQRd}i^Cq+?%{u+d z!n%Czc^vt9(37?j7+Z92OZKU1I-VCk9~Y7_BFYe zMb7O;&O!7L7HhJqh^O;;*0UdI0aOz#j)eQ$2E{9(Q7-ifIp_bvFA{ zU|ktBE>3w;dLKrb0qb>AUCTan+r|!=tgDXH`rOGx@<#lz5y=*98?m-LaovwDAtM~$ z9|b*CxKo9^-UTW*65A4bg{G`8M+7$WAzshKlUe9dmpcuRy$_B5NLg8m9jjxfFed%f zKOH9CW!bY9J0{?jLtNX>M-krFn}(WvjquYJGI}$1%G+&;qb9V)Sn>;XejQS35*O7$ zpYp$?W+6{lPM||A?vz9NPNZyMbvCQpfw5d>GLrBo`<5oV+E52N;1k2Sf`2oI)>>N^ z3snn~=vGLqH1kn*l;w$L*yxeFj6E`8XIxFjOzcA%Hem4)< z#pFgSI?|Jnp9VCg z`vtH5ft8iB;n)pPTWAGQ2VRHR5_Hyr=m7fmK=9*p@q0ksvnJoY=wZq5foGxfoNkngXPhMQgEB z0_`^NygK|CBxshR=!(ZQ&ECxQOt2vDsk>1WHBmSUMsmoBTy#)HQKuovh2%zMVpWN_ zs4Lro^nbXn&P(}R5xdJ$sl-I8_8!Dn$IdEvcRwCoi@)_oPgS%W5{|M{F+TFh*J-3I zR@YAD|E`qmJ*g}cCp6$rMPeW{Z9&5VDu;TinkilpBkbe(Ty_&i3>xb*Vh6>z1U)39 zE~^Vu8M=lDlz_>)WNrhV$w;AZ6TTHv;U_TeX~;j%lR+D)VUTD#R{NC_|v2=AHAYf?nKyAEyc?o zFRvtfcc)mm3Z77}QI5#ygt&|AG5%2f%0cTqcGG;D#Yl1>tu$AUrsArI<#qnhge26&0_@P4K{;9;>A8IBeY2*x z`@vWxo-d0QnW?sf*s5 z!elXAP#Wo#*`o~C_mUkuQ`S@h)rvtW{HiS14w5F{1pWvo1D!=IPbxa)(b5qE^{+Y) z)ns3t>k9FzCT)7Ufaf(Qugk8AnclZ0c}90j@Pg{UItKn{0Pg7jJE@32G>_5TQ58dR zsf^Sd?pZ9-ch&R-64=FYz9Bec5yi3@R+R8J_ork&J<>& z)ZHX(rr!X`;Y!S1_3npL{;N(#=BDHx;JS9!6Y@eCR;xQsV4Xad#KS^!2G`UJ%BM%k zgmUCpE^?2u?;ft{9HEn*d{K(OGk9K;qkQfw>&swejTD;|B2Bee?_Pu+bRfGa{Z;DP)O2-^LqHHh07dj~y@Py=+<60I^iMNXJplY1HD&IQ zad~7)icWM{*c+HnCpxW?7mx6q;x4OHdvxXwCq8*bJ-+67Nu=m3E^Bm68K6~xhXR&$ z4p#2!oOY1dipw(5S#OMlRP}4Zh}b5FtEITB`L8leH8pg27H{jcpq~$?{FTX1VkGIK z43eMKiz_xd|Ek8z^XlD{E8-jV7m}~;d>>C0u}3-V7os!|3IFqua-}?$XjURW3F)#> zGBjt=cZyd5d#Kwlhi(<{lk#gna#c~4$v-1cS;+}_Qe?%H5i7+X!c)P2 z79|3f;0@ovEU){#d$5t6X+S^RC`72)Wr{AdCHV=FCq?P|qdg>5tBz znV>8mwm66_Vo#x0*`PO2S|R?{|27rsgldHHPDqoVg*P^0H^ocO2)QA;4s`5E^(NvK zP2yGSBu%@DKja-nSi1-@;uBrdDorg)W7R>l)?1fMY{^B2I9^Cobvb~?<&z4m%|V86 zCmbuM_#q`hzYk!DjjD+(ECu>hkrX?jRq>Dp;ViHJElYf=8P`!VUGLx&1BZ|G8&c9t zc+gixLQkvXRwYfpvkTpfGEAP5KSG9yfyHh@rZf->$-?WimmFp&RUXD4!Oz>^<3IhpT+n#i|g5ZmEE#aCF4`QAJk# zrG=sxs)2G&(xkUysoIuI*{AoFp*zb&YgJ3dM(C9c<&B~wzpCGm>;zKe5y@5zWQl5x zxCE6_{!taxAKj7N>N^anrmf` zB2$4+bzz5)v7a5(CrNS+S3?au#MLC{cIC7FC^BK{E?$=2nOqgOt5?uhStu@(uQk8c zq`wgF3D>IqTCbQ3r=eTW8Bi8Vt}KyvC0G6s=jmVdNmf8&=+@MQDDTAM!j^Uu=gS%) zA=GHi`Q)R(9clhmM=t&oK9lUG+*JQ0De5)C8!BNnR03sa1{y0LWug9PotPq26V(y1 ztLmzvE&J4?Y9<+aAW2uZtO_WM$-nA>!xNIDC-lxy3?%QVo6~MWweX~>tL)SM>el4t zV4ZSR94LP(|7EAnp5crj-co+3nkX(|W+5(>p5ZqERZ%2CvV-@fnPM3*A6QE@Pd$t< zqP2>kZ1It`zDn!iex~Dke;2g zN*)wHDQhHGu@^V#XYC{(2hC+qoU%zV3fC18`Bcx#m$EL6VS~P5$FNrYgR~ABDGs5N z5Ly+ru%qnNzLKX8v5qv;nlKTUUh=B6mi&Mz<$+|V7Rc+eTzHqx(o$Iz&=q(_K2yb( z9DS!gSV)l;>d+-u@fK@^PAkMWcwP2~4oE-CzsfAF6Sqq{MKknC;dG~Sp}Z7)n(pWI zx9k&B$Q$yI{1-aY5G~mds*&VtA4N2DjM_<8rK5Z(9fUXaTk@Lv4`sBfpm6Eo2ZagA6fSi~)~mY7dU-lv zO4Lf@++40w{3%1`Bw z*dk7OBp^>VixtG-(l79WkSdP`4+e&kXXR;OO7_X`%7zdH$qBKMor*)SQ<4=IVMCpS z@Q0D^_K^-k zs3gmy(oyW9=mgvdcjD`C($QCWQQR83EwM*<521D9M8#OTNxKl;wB7ny8c4Fx5M%^j zXir%we<)J&rmBiKKiI1Z60%BP6$!;x9u=B|261TERT6|=;UmO=M^m;5Cz7Ll4n0T6 z8)>7+h3AD6?GccYX7O-e)lPFDai9<{->CAaR*S2I)NpnQRZrRl8>P4Ol~;r;At?Am zG1EOEK_`7_CtIYmHl0&KhRJ#%MCU2JUzR1pwS1Kvm zAxC!t+5;XGKgC%7&>d+JK0~$yW>nl2fn$>eMJr6fwN4QZ6+yfea3C9$9ePe^mvl)J z_Vg(W1Db?Xc|%>aq9_Ua)U)DX#Z1@}mIB{}E3!~Nk+1m%>5?S>$hHt+?Gn7L=!VLp zU8Hruu4Z5%=F&0vPaaXkg2q}AqN#XE_VElCIs@gPw9{Q7RF+GYd=Xef&q}^BC)7#l zu1}Wnhi_B1h%0r@mN!)WB~f^k<&r7+Y3`Kf%Er)}$y;HaVkx;|fWR>NURo>rkFqM% zR$Z0Wx}%jsldzzj6dUa)B*~}Bf*?ivNe@{h%_UW{uhO7YSP#gN)_OvfUfCq=(za*^ zX{bE|o5~XPp85=uxxgyB))xopDC&%j$qA6XaU0Q2dE{{n{kfe2zl#Wq|anOxh$6c3y zLR7^}$3BBk6|I2HkO5);AUAk1cuChoq=M!lcG6r|yL#5Tk?JTLz! z?m-tlam=sBtWN70P%r6e#Du@4k^V?yeIL9Wc9)L>-{`rZd)Q4<^+%dW&!9=rR~n~x zQ!dCZ#Ubo)d?o}7)2p>tz_FwUThiW?|H5u*8+9lAN&l^%jzvK~rDe!#@?yY8uu^Mf zvGx=?6~%zv|CJ#*x)YvP6t&;~`bt-W#frDGUu(izNeh~!B?NgvC#}b6 z-H?yU<+Q}0`!VancgN!?;58jHNswO0e4o}X?W3Sg@I&CAH1CD%P46hp!XMeIlaSaU zSfK0ji=GG>E$Qji$E*+9h8=^&>F1AK3o#8}kM~fpF)j7~%1(PE9p|*}x_(Sbcq)A* z?bS4f^=w*>R?3I+on)o&ggEGK`bt_;{j9s`I{_!!JMDY<;TT(|*XyZJMbj}3z6e^T z;}<*|GBntfj&s;C+|e^ZukbZsDlPZe{^=Z5tisBmXRtMWRrX6_+6!SP*?#<=be;yS z1MYPHc)5Yuf~V5?q!sB1Xl?q*cd@OH>HWk%qG41`?*)HJ`*i&X6-Uno_72@+K#n31A{lm-ztXV}-yd&Nh+et|=*e(JyQecEjq3EB zU|ZT7!Jp|h$F7Fe0a^d|YVd^arSn8mLOn}IS!>e%2z!J`1c}G23f@WkJ7oC()jW7z zRW7h!h;)z_JfDut|JJae-SOy4Iq1I_md(;JJR4$});e?r!baM{U~R~Q@KlhMmXN+5 zv0JWCkLjL9P#PD3`~SbT zAIsLjEyvqosL9pZV+M``Or zKBRqmJc%?w86!$7++q}WuyHcQd}C&nk^Hv7ow@bJ z?4_J76Xkc+jYaW0tTI2$j;O0@IV;LO$_!?D|6=nad+C@H92NY~aZD7Wf#xeu=M>wM zU^dZsP`;1~!F?S{PWL%d#(2Hf9v*G%)z|Y#{+}qQCurYU3%g&Su{DHRX>avAS_BtV zRqiyK_}6+<`zI-n^L)ho)Xwm&`Yr#OU%h|qPK@#YM~it@Fx9}EE!nucUbdO8ZD2ZJ6amQNLgvEbY`AFfB%2JCDtG#D&lzR zlHsHDEP+ocX*}h<`Mra^I|Bo>+2K>7%BAfY@=Fy-$`}7W{?M-mRxejj#I~>m=O7*; zn_6S-4f3A4z|-nqwU*+f$}G>wZFFC)HVgVbdOhZP{dU-r)D%fU742UM!#~dcROMF` zZ3rEi?pg+S+GW9Ms9SR4*M(ot{Yvt`;muvoTy>Y!f*ZX#`%lLWBjp}SB&Ln z^cd$EV}XiG$(!&ZVT~`+IV5dJ<~8Y>1|9ca`uOAZmro-+t8_c`P^xv2v8kPr--FuF z_@sxQ(|lO+HLWko=$&d`+QN}1+&9#Jo-&DrepO2TrT%fBiO3f@Be)%94FvgarR+?~ z?x}6xHWE_R%s4Vl5l44lP(t0$#^*NQdwKrlJ;It~?3R5*=G&1Q^!bT%-%fh5^j*J{ zlkV*q7G~~{dY6&e|MBPkgtI@%Qy&n3czNBZLZht(cO`iQ+z15?L3W_ag*WG_m;3r~5a z4U33NH!NF)-|e3#e>r_;>|EMR*VCYR zK|LL1lEJoj#wY4od(GS2$W&CU|ee;m`raeujlT%Q_!E|>JD-Xm>}OjV)^g$~ec z%NMBTy_DGHM}}mR6^W>sZg=DxV~2O-kIcVnd74|J^)ey3gS+c-GLzrq8_o*2ovxKC zmH({IP`!d)Mhp*M?Ob3b{5!bQb)e4=VwWGswLm)Ca@z-QeX6o&( zlPY7_NUelCVczuB^~af?Eh$Uz0(xfsk@nq?#zQ{Zy5(K(^#;6Re6R{#A1s|kcuDVq zgd1Oz5~}zQ8|OoZhQA7_?y`*3`e=F^NbC8OR6FH?nN439awe54qP_9Z-}}eFuiX+$ zsba1NAtH2+s}yTy-Z!6ErELclV#QQ|t~;8B{tEr!N>s&?FMRKk&^NhJpgvW11;Qdy z9gfH!(u6P%@ahODCVNoNvwb%ZyAW8Oxj-}ncm5}=6ZiRIZ|9U%DILGNw>?D)%nc0 zA~Pqx`sm<&8x7&&A5ZGpnH&0RKfO87OSw%lqyR~7X1dS}(f+cW8H%7DOQX=$y3 zj)m3<)m{InNy!C%B>h;M@QbRee4)RyzoCra&8erE*;m;2k2Q^r;umQz zRo7yi4;;IBS2@zY$2z-q1-EuhQmMR=KUaO*m(oR~3#*m-O9XdhF`uW*@GcEJ4pj8N z@mH5ET{}|EiYyp1Uh8BhqdE?oUeDB&PoAgtO{0PHqESVhv=hu9R#R18>+96r3*D!U zcI;{3v!}GDgRg)L*H1X#I$r4OwAx}XyD2LLMx=a6{5yHF)yI)9B2C(Mkv&~UrSj(W zw(_qrk6E{^1gXHhx#Y`dM;Nn14}>mqXtc?n;N58# z)8mcGLYJokeF8INIw6fbj;UHboWnBf7)k!+_%hpM7H5} z-*n8N=Ki9dFWzf*TkW9Zu(5()wLjYZDNg)t#5u!_B5a72 zvVku;Wsq-*-JO&u<>+H1@*I@W-Xxdk1KjhR5xhV^^IY+J)l2P?K3z15e%k!Q`z$5Kzf@%rW3)Gh>F8>V6&Vo07c@jpG1vNzdlUVs>^gI8ER*x1pc?yS6`s*q}^8Sz)!Ov%i`J)78mxHbGX$t zvElc)pP~L7Jj%5+xI)l0#}utJ&qiLmtW2-^(RWsW?U#{uCOMu(=nWk;wVLv)zpSsk zxsjE2TLWRTh;`aY|qE$q3U5h^p*{d~eOOM#{tL4ZUE? z#1g%+F-||phuaVQ^SzEhZM8z!kpHknmYxm7vR=x^E9?qIKyZDoX7Nw ztToq;I1548V{AT|M=O?1IXu=F@t1S|wYX%?;K)`lUNvIh;Q6#vbdN?AheYC^PGy-Iarfx~hpf zc8dRnKiHZqb#{jr5$UurJ*VDMU#d-Fjjc*P>ACHjXa{SlUC)9hxCUwIl@+MrzZuvl z8;PZk_pUq6SkchV>ObzS6}VxCQG1p}%jRh1YVB%clwfDf48DBcqP}6~AbP3qb6*L0 z8zB zo8|jvEfFPMS%U`wT?4F_InFaWDQ|K^e|#7SyXc zdpPeIg|)$Krz$EN+co82HIv%%XChjEsJ-XqRA=+P|4iVuou9unez^Jv?RDi7bIo#| zL%_(({-0{IQ6qS8Xqu4R&Sz|t{lov&8{)0%y&LGq=Yi$D32v$vwF~;HdZWz=EM6Bz z5p6ghO$})-+srbP7kX*3<)s47cEM}hb@c3#`Ke+c9qtseY{Lhj34aZK$UQwQL+Al#P8Md~_vZA5`ctV?dL^gR zRm-u0KT^l#0XxR@`U_ZXsHgEhcx-4{*C}f6PfTKoX_KR%MS>msLRP1G7cn5Xnm)s< zkhmaW=ue059v>KdEG#}alcNXqFo*kx_}2K_SSxv$O9b6_+~sfV@|NEYQjs#=x+(jK zs!lT~HmH!1M%D6m{uz}pF0qhJu4bwJj?5G`%ek7z+B1DDdBLyro`=%yEErlObf~L{ zIBYfZo=Bi%)|OO{(-XOuI- zbsr;n&>CPR*(p>`Tohl$HEo?fPp_drr+NOlNk(Gdlua^^>sZ+Cuogj=wcYZk`A=Y$ z|C-MT>`+x5&fwa?V;!$lD}S7?c%X{aK^@h)I!5aoc#4{2+p@T5rQIOS&R}ho)3pBX zWkC}iHz;4=uaw$JOH)Q#pS4Fpl|z_&khX^kgPmltqWzEkkL-#f$$7?I(2<6Rs0P+O z|NB5qn^TzRs&~+HiH~dqn@f>O*%jq=d5}hEmmE&lOGlh`!9MHBm0ZS?-Hc`-@I5Lx z*EvER$F#oG)f(=9;?t~2tby^+8RLAX?NebEvrJ3bPgOlOoJWfOT740w@>&zD;;XlYA=4_TI8*iXi8D;O{-{0xPQivp3r-?FV){wU)OuQjF&M zLf(l!s21u!x!HEvLbXG$yk!mOvR%}wVJ~ERw9a~*QPU`+uhy#RA9$!e)svW9*mp<{ z*B?3x8x45__EfwQmH1cnDA3BcH}FoC)V?};x_h`X>9G`SGpms`Oa4tmR55jpqFJKa zEDzgX?2fFutFi0ii0C60v6CuAewDFQQs{a$L3+Xd?TG%8AChIvJLWr8R-2+* z+BiO+GP2S9A}dXCa*Y*gw^mVNs!`eTpYcW%k(K@Dd>8yxtW~s49M=vzJgx)IMp|yQ zC(tYK*?O#cu;;Xqa`95)Fgs3@sgBas9JNiIp^+laSnTM9dfH~)35>Abs3N?ycqz_k z5n3O%TW+vd+ik%%E$LOMc~|4LqnYtRyrr6|vRWdi*srZxGB-=F9n~vnFIiKW$_lsg z+Qn&@KGB)RQA@0QC`?5X=cxc38Dw?|2*0mFHp}^}?=djj^vQmk2jr8DsSA z!pYX#nXO*dZFz~6)@vC#wb8V}8f*5mylNeHX@85>?4YVfTi9maN(a{#%pR(G4L(a!a znuvD#93!pKi!Zl_2L3XGskc_sc&(*jb?tkYT@zI?ZIB_1tD*^QwVT+x<$So8lhu2f zjj|&vpTul!kUq<3W8~t6EZuj=Gtl2m-P0C2Y)3ic0q?2u*jeo-atjS&QEa2ysJ>G^ z@kQIAH4#tPC2CAnC`zT1@8weZkJV>G)iB#@eU>wMW23!uo?{q##&lPT*q@LDt^NoFo3W%lRG`p*6sq*O4 z1}cpG#rugt;v+8)W&B)qP_?Kc+sYnMebrX>SD*O{$jMJm3R`lu#qq1r%;SS?%4@Iq95vN`WA~;FqNScu%Z^oaQA7DDEkQWwy7|nX*DQbv z%&aFHmyH(sRPK`#tSM%8yS7@-=4ri*je1)#POY`#t!C6%WD>7bduywCTHY3e9JaAY zELA1#kyZ{_fqfF)^v(K6tpKZUw>3`&vRb>9kB`*H8E5nrVv35v4685e(>UG*s2Rr& zu-fQBOSr@fnhVT0>E{;Kq!)A5c5?j^Wwpu&`k<>HiynqouP%B~51B(|SF4pzS!yAz zVIBBz{uj^B=dlphQ*E@z+gs%;Dgo73&QTRr=vM6mlYBe<8DxK+TJNuq*Y5B)Y!E9? znbk+xQ0<|PtQUL0R&nADMJK+Ew#j77@42!q`zXd5EsV1KyuBb``iI*ld#!J9TySjE zNAb+6k=4rl&-z2PW*t}t=z%_Lh!$fsHtK5gRdsW+zplAYwh$W}eVqU4o7qsA0nBWH z03{0U7| zWXIau?b7NkYovYCc8b1K2VL~9^^Vf&IUQq-+9H=aYTdV1$iZ}u9c6!0IjX{@2wNxP zv(|><%;~-#zH26mc%;pE_@8zNl}!K7SdbVKxfn! zwUo6MjkU?*0KK;BSjViMG9#-EXJW83m7}%jBwGd!_~!Z-TUV)|_RQ$zFtrz~v-({j zAIVGS)LEG#)3OgD(s-}u76UM^mIhLpgJd&N#Iek|-MGLKET8|IKdn_uz2zJAERN2O z#>QGPlXA*h)`!6JK#bK@brTBS^APnI(0nJzU*+%{G@h8Tmj*0jR<0 z;~QvgVs{MTZV*JSNBTf2YS#6h@MI6{Q-`!jM{&n5y^Lr`b)>Xv+OaB}#j@|L8!sz{ zh+y%KqU2Mnj{QJ(XN|Rb#wf=LV?Q5lKk{ex-Sx$rPr?3|IcvF>x{~zF%x`}&o14|l z{^nr&IV)zQIA=JIh_SMzc`;DM&dXkiWFbT@F6ln?V{KU-swnf@xnvMqp_g~M9ScMT zWttIY88e@`#+sp=S{m2>pbGA6#&;@Xt@7>kHue{`fAHmwX3iYO2L4@5kxk`AnIJn* z0X~WEV++}Mrt!J_EBh*2TdUx?p5x_>w9eL!cx@1!4gB!b^^Et|RWbToSEC@0>#gyg z-?QiY`+)H#S{bR7IIGpwOBw_9CHw^3%YLTE&Ilwv1TB4lZxy8lgLYqQI?M_-=Yx&9 zuKKR(#x;86cY9iU$_FATQHyqvW1zFM^RY33&$I)+NY7xeW=&>ijZd!JE>mv}&DX&^ z8+dB2RTIQsI3&?}Iv$B>v0c`)7h93?Bu&<4I{Uk#j8jzDdg?poP4qD#pi07A znkc8JPP~);(Xr9dS2I;|V3voHPk4LEF~-B7%fYGL9z8eTC+C_+eKoz60$0>ry{;=K zre9i~MJ5LF1cq4s)e=4oN`8mP$z99=_wKa>yO1BiFPrPn9bwK7T6J=p`#cpr8~jaG zMs17Zr8CYMps3uhmbxzU8y_%cFFPyS1kxhNoja z=&PEc)~g28pZt`}gY-5=h*42=lso)YeN_V2?O`mP7NwWfi|XNee=(O_vaEH{43~G9 zt#vhq>T9{7s@SFFOjVk$Q9Lzb)7W8Nh3``5Y@BGSoP3!WB@XetVwkp1f2`f1dX~qx z)Yr*OtsVlMx*PrV45AD>t0LiGWl~jCI`V_##A!2yhaI3%6hu4K8#!JcQ2(*Cd^+1g zSyU!@MAl`+#8%N$YpCrLb;NoR#mC5Tfpz|)<~em;gz9g_K;~o*c(};SXHhMCk?FJY zQarDuKQy9^I{$43vKv`b1xlz3oyNzp(n|dSG$ewB~0}omv8_Jfd z7oTXPcXlzdiF>M>T!0w8kfBo9Z)73%gkR<3d2JR!d({PXf`;-bqP+G&r01ompsZ^T z2Yb-iez8LHi?{qf{PNp~XRtlkdT-sARd@@1h@+LGn*IcS<4-$GZjz-`ef3H$1XiCH zk$k?Ifb)mpP{6lEM{%32q;Td3lCP)HV3Y&pQ&p0;(>`jew5PnOs$(UZe_5&J30lUh ziH!PqN&d0F;-6c0&Ru0OH+L^}(Xj$}3A`exUg-}tg z=`t$GE#+YG{4=!548-)a z{n`FkuBK-=M>?SW!Jn(ta*TY7&uPSoPOG{qGi7Fl`DCtGS=Nstlv5s-S*ak;tR2uE zh<%)~FVeCr$s_77wpKP^(X#5}0I`6=qtCs2@o#E$%hhsX*O1K-*gemr!eW6&= zX}GGWYEnDCS^J`85ld;JY-7*1JF6J>lC9%2#lNB(Kg1fc``{KAlqpNg>GGU9hlqXU ziK3tOuV}@l$`{stJC3r5a#~MOiRDmL>lJ)I^${pQ7yKH(ol1{%?^kt?F~Q8 zJTwwKrv>W#lU%JDv7-D>c0)Ck^?_#zoU|2sXRR$itLoU>t$4c(HRZL$N&YWez&i80 zz>FoNpP7D`XXLe?X=TMkGjqd^6dO9YG%I5re>+psDnt%(T@BQ zE5){hp%uYihOvsQ33XAs6j4LbN1vhh6?0V=>sDa9*<4m(@ZI6AloI)nhn3Jj!4yZ| zXbO6KGObbj)pGj4l6XIUgi1s2W>pDPRV>jqi3V&JoQcDB9%?1J>!tKcA`_dfuFK1E zzFY-H%Bd3@#J}*YB33Z*9=xxvIw+M)Q6K0eE64BgulxsFfmb8tV3~*Rux&iO*w24b zKlM}|RsESR>Wg?drl-NCAMmu|ILoU%&`F)43+M9m+Fosl_Kmwym1pb^b|d7wJ^v=E zXyrwHW=q@duNJfZyfdq=?%3^Q8CF~?qn{S-SuJSGzhw|{K1O^LYk>?IsjzHl@3+I1 zMd?Hdt%z1fG(m22$kQ@eHDx1tb6%HKV^`QK#QX|B#_p?sG3%pkLkVudn_j3@Bj&ukZX%VurA zD9?(?yjDZ&8I;@(zC^?!9xqrYXoWm>9v#OI_kh9 zw7wegmJ}>?`>|b$mgB_Zg!T)aSQ443FDuG|stbLg^Wfies51X9T5GLE0+p7}t(^8_ z*@KnRR_X=ytl|_Ml!!F>*kxB3%(ml#Cz?6$zvA#xQhl>X6ryj$zszcx+O|6IW1+XtlJ1Um&mZ;6{ zs<^tRu25=LlMP``9>Y8HmC%YGz-ybR;iU7yqN_GWD_vt;1O8(>He zz6NtHsISlD{Z&r;iYd))I0s)KYU<0hXS_6KcVD$Y z9mCWt#@?_!>`zu6HFbnN$1JpEv;waAaQ+gv8nF9hh&2uu0=hPl+x!@>2({hS9T5eA_p9TK2&Z`@|vThiO+9sZi8({`Vjq#mLdxB zFq|DmTa&G2GJ2p+m*u1R zJidV6Vw=?;_BS)L)d4qT>gZ#Pe)USL&QL`mE&{9s?Q_FARoeX#Vc+8nK<_{F-h z%fRiGvKG|cXetiY`$6OuU*WtTMzvRvr`1F_p2fsHFtArNm3o1-=+p-e$31$-DvNm0 zSG;3K)e-xHb=)qiCXj>Q5#zNetuHWSz3K?m%PotjGHigbwZF9huR`;&4%3dHi!2A2 z*;qc29f4=^njQe{(gHL7!Ky>V0_}`eMjQv?ud_N?8SF7CGk+dbKuOv zGcrvxQMSZQiR^kA+>|&4CX*L0~r`&F*ktUfSFWTRcQCTqQ`IslTqY0Q^7r2-Ag%5X+4$%nI@D261szC$TN^q~6l%Tq* zgQ_5_0REl8pYj>J7XEDwTcn!fb_%eG7V|&EdR`US>*o3R26hr%^TR$0{+NpQ6!o5Uq8^8#>)`)J4c5bCYwp*L=Ur)^R@Fblh~8SEM5rit{D?cuF? zPc{Vm?8jE1>L;^c_=MB!)UpDt=4G@8+5u4<_jAX}G-`?3tVXGDx{k8~rn|J_ybb+E zi*a-vOg2VcSD7#iH2#p~V`C7fCiH~vvA+Bc--PL~08`_OB)LloHWi(_lSjZO{RpOb zQ(cgQFdHwagWzQwwZ&QwF^1hyH4u*-a6^Ns9kpOFa6?zIVq~c5Y9E}FrMv|n0pHxs z=76%?-W5ioLb2I(2Q-=3wqD$@(&EP9Pi`4*@6}U1_)Zi1Tsd^&o zt2z{hj@d(l=`bB;HV`Hk>g^bfrggxAY;;(qf#&+k7PBdEJ)5i6WbnG+fY13R+*r9P z7s%G?06k;PaY?*0Ys#*(5WWX>dIxhp5flACbkt4OT@=xFh?guB4s%D6Tb!?0M4LNR0`EVv`6zoY_Gb7)3#~U zgvSB-s_|5~Cvj1oQk&Ek6@bzz#qO{OOykx(Cv@gLa={aMjdg#Ai@XE97zrQYB3^9^ zUNDtLz(Fj^lbG+f4po2PG$bdl$ESiXH6jZ*T!i;xK6Om)kkiyfdd|-BP?3yh==rA-3}}d{=#3k^lbDIAqEjceRSm<*NjJWMj{;VV zr@rc|%&p>;O-1-M^kFUdq#smI@Rfd45HUT$3bLGRFr2~^T;=c0+E6YvUA_V@UCg4z zabfeL><1LYS7?e3tQWt@TY{-|p-`%cirh;(=m34hdScmJHk7qwxqtu#Fy+5t#!O}t zpjX^tD$l`ss9Lfa81PO?V&lN-JZutX_j{U)Othne&`7C~na-%%E2#VGEEb(G9FuV; z&0{O!copEQsFIp3orq{CPbDUcuRIg~M$d2)r#vwADrIFBDq}lsMyx#0ZPnRo1(qbI zD@ohf?rp0s}Nc)-PL6o9Vcj;9L`V(hYdw39^$@1g-2BGXbZKj+w z2nh6#xSy=_2g`qPoNe-h^FI-{m>5%Sq7GefYn83{SzC$X-;)bv0kDgm>Vfovan_$$#SH zB^7&0cW5g*`JFQ0YTRHwFgM1q0ywL!tu!jnM)2&=y7O5jsJ-4Q8s{1HSbBB~-Fpm} z_!inGm@QGep(Lw;MeoI(fQNi0e~ySRfX07^ncImnAo98Scj%ByG#*-e3eJLOg4-w1 zM3#|PLZ^Hu6AoHoby;1fpYQ@|ic(Pe71=j+QfjiVe6EJGhkO!zpubsf`l2NEr!Xns z&{6P)Ug(+W+(xxUf*0SD2Z7h)@$NbB3J20DxMh>&UiAxSo{?g&xC4H(k3CY8Ww4wo zHzU>&{4>AIy{P-Km;k#mcRJBk>^_pU=8Z9PAG3nU<1Mh5{6N1KINcj9n({8RT3)r2 z?N4$(73H->QLVc6hmc?jb>Wv+m&@G%fSF#3 zIjI>q%RS7v7---MK!ri@?cqwwP4*zT5mkY{m&9v$kvG83|G+)DY4$q%wQRwvfyF!& z)A&00iifebroj80+>greqCcLo`B3tUfQH9$8?`6TjH({VCtw<7Rej(jACYb01^p?C zX{EJp;skr9dV$}B$(3pb_@2#g@Ql1UX5tU9>U@YuCiGMjpz#rQ0XlagT>@$`Ye!yHMhT*lW~uBozK>HX5ragF6@HaSLJs3Ak(f#bxM^IZ%;*sBScd z1=vSuo09AkYO@&20C)EpCi4{Bk<~>J(S;X>8&gPS#a>#eFudaun0PU*k9f#((LaG3bAR3qyxj#Z)DQEl6x9P;NDuVs%IX5!OS9f=40`E}8U}s-nKJVTQ4(DIFJMq_ zXjd-(#J7C1i7Z+ntuyjp+csQWaS=K5Gtt!r(-J=TyVDYhJ3M@VOTARiZ5BSq^+U%HAA)n9@#uLDUe*Y;dH`AfgKq^s;oA#@Dwp|H zT^h*>@m{%I^?9jYzQ2tZzj01PCPTQy)YUC%T z%L$-L0{ah$eh?T{nY{%Asmn&;$&sqFS_CD2860jhT=-{DMn6<}stA=h3in)&Lz(R7 z+t>y$#My{ZGpr|^T4H7|g5NumrNyWIjk)_3{eP8l9*=mOMm0T9A5<-5<`FRXD|A*> zmV$S+rn71>5VScIOb1jup(1Lswunatstjc|6s)2UI}Ufe1^bIWDi`vwk-f(&)iB#M z)`%5H9%fK}DvjN>Wddv^4KQmAEe4Kl#WYW%sq7T8u#@+J)>wy5{};UWKOmpZ{J_el ztT50oC%D2s^kiF_j~JQ2fRDJN(GF9$5_D$^boXE|q*UxMlte4ArZ~J?18+Eo?>&BC z1CW$=oqu{71P+42>Eg>g+%yi81hBzPjm)@ZMJF?NNA1j0! z732XzTtrumVFo*gT>GgHe5`yp!}yb(1u93w56Ov}3RU=VJoyQ`4kh^?xbsvBU=H8J zdLH2~^1^Lj&+@P*nEUtX5+YL#>?jkP0DgE3w;@yGzS%-n16bqW?bu9Ascld&Pk|t3 zp&+BNmceWZF#8GiC~;O44kS2<-!|bFcpP}oXsk0mYP1?o1KUG29R`c+hdOuyq-n+C zu$!tZ6m#l7Adru8u}G-6@#q+vPO$d8KOEM-;PFS|9%E53BsfK2+q*F@(<6(U&|#18 zSA{U)p3x$7+dHa_N*TgF11pQ7+icp$vO#-gU^SuGed;8h+71=7he0u7rN8f6RYlG0 z2J;z+zuX3wdIRSDXK<=|)EQ{*fd=S|I$h5GfIb_E7?uQLRE9gT8UI-5x>mFTf4zzA zM{OMj&sMa6ZH2Em5OeJ)D(4;MNr2_Tx|gA=+rc?;qc6Twf4CdO4r6Zg#yQ4J;N~!v z34Sui%ER!RhWr_BP7X&$R>eMJu=kI^qgL$b|COhydJtju*m&oD{9Sj-LJepas&qJz zG%bEAqI0K1S5^RGE44~JRqd%2P9LW5bWky|bQkJ$CY1n_w9(gvfYzg-6R(4_-p4;4 ztfwMytQsrA(jaehpn&>f_S8i`=7W}ch)iXnacY`!g740R#yO9AsLk?%d7g&?-ioLA zpvyA>F*>0}y1~8OP3;)f@~YpC*au() zWB<`@+@k*k6ut))84XsjTa|&c^Od#XdEr&uL7qC&O3dDy=)AJX{$I$|eDYx?u7DbS z%HFZr(DqqSXQ`p=Zeh}8#g}RSpdV29lfdWifW_#v16;WlIhaGNPR>xvVgyvihRyGyY zw-2$}g&9uh$P;|cTvjJcq?rnaIQzp;{Vma7A+*8n4a0?lSp z7jTA-n2KF_B5oTL1K!+FxlkwnvU*^ig}}M`?+#i?_>%p-Wq64ykHP!=*J`FE%fy$2QwHn!4i#)zTg^#C9 zzy-qW?t+|sW?gw>xO|I|@t;_=n~j4v)(YxI!IOyq4!r^sYC)6mnKxK99>RyR9qjNIa@HBj1Ice^=G;ZL|IAU)1_+oQckYMrs12K7w%!c7wC?6&_Gmtj-V4lTVdIZmxo}r011+LuBz2 zRuN0bz~(1{6J$Z>f_gh9myN5RnTw4VZ~3bqeRi*TD!zLLWZFq%Q^*ISvkBAIz9v z_@@Ayhs@pwKlIUfbm2)bB^}6e5MIc5$77pG7-;On+gX#|EVt_^gCDtR-P9Q=8X6-M`sNX1Z1O4@x<>wMv zof;RorjM1y&b}ih76l_D5V-VLdH?aQ9Hj zX;EQ0fSm2X6WRgYcEXv{(EDS6T9+s{Iw&JF#xS^l>7Wgv)X;TP;2M3zyZ-^t*bN-p z2wd9%Hj@erI36C{FQ9lFx}r6ndH{S@A$B%amIdVtDZX zFGm-?L~Zl}b}z@@cSPm1XNkb93((s=(9L_mubSYM9C*DM`0+thNESGJ>EYnV17CIn zi}u0K8jmUU6}h`k&oHYv`06h7=Odf~zl0Mr5)j*?+3b;upROL1(;ugrm4ZLeEBHAAjbh8(j&Xa(j_3+y-@S=Z$S^UQQ zxA?R%SnnES;p}e*9V(zRx@IBu#2#{CZudr=;J;LWS)GT4fvsHx|GJ2H)CKy+VrNdU z=!U?tZkQ!mphXvfue|~{EXY<-Eg27ki=#5XU`M^c*CozWkAMSb zgUXzVYIkF`P0`(?A55JQ<#Ezu-1*>6`c{&c&sK7nL7w1sf6_l;6*aH(io_? zeqe!xvHN)Hg1wK#+JCP(9fZtv{NP%{@%&lX)idN( z2Yyb&$?P8J(r4(JPsmEM|Eq9<9{zwleg=16gAQqhYKcd^zDL)bK)oJ8oa$olxRnpC zbQ{>dA8cbG5acYfQWvx88}iZ{pPU(t3wMaXVZWevhk*Y~KwZAXN{--G_bsgaI1K=j z-$54YqP{%%RQ%URkfpDb7E!DQg_IkpoP=|M7wEaj|98$wSu7mk)kr8 zWqTsftLKR&>?vk+IR?rrHpd`ybHdNu4-U8$&;NZoS_;ag`S05mcy$_{`xJdz z4Oy&#zB`Uixr**+iNDN+h+RQW8=`kJ;YQ|f{WK4G|E=xT0P~w+c5ekU8IAd$j2MkU zwYNuZw^VeT^)iF{tFc}6Kr=R)_n{aScP>Igc2N${1yPV|A{ycLKGGB`7EGF zSNz=$XzexFM<|{Wjrs~^Suq#u0OPa5+Zl4JUcNBpj!u1n&kK^Od-N3{>aDtaT2 zm$AFk&=d)%q$KPj73w)V{yGAx>^oMx1@U}Og@NCz5Yx`6y6I3}bONxB z9#MTl*${y?$WBB2L}O21fi?%hXJ(t`eFlCJ^}yhggRP|X*UG#z5xXJ%_<&( z7k5XtYaq%gU}7!Nkq4ojGJpj<#N1tkS=9rP{+$ED*?1(fmlhdFL|;G0GdF>+e8iJW zLCqEg5@y8@A?jt5~I;e#<*mWyZSwFFE}n84Q}hi!aU^!$ z3B5lDD;tX0lOCVd0bF`5xJw?K^bSI`4+oZeQSXz%%W8u?{e!*4!$qoxeVsuTQX!M0 zkQobH{!h%urNGJ#sD@35+GXmFXBk9 z0p8gbPyc`p`|a9UB&VxaPG6#oGqc{aXPwhB>!CxZITiZwn0mplTe@FMoogE{b- zS-@GcBToIWm!Igdf;dxXiJWf-^3?=>6b7~h0Y{4=+UHTjV4D zA2?cTalSMfwf6rL=_Hgv}!tZy}*;|C`8fD_#l-0OGec7g7&F&Dez)#}LLBXswR|LZ+3R%D|ahodu^ z0k7A9rFKK@UB_%{ggDPbcQrr`wu5_)$Lnu_sS8on<1o|LgM)NN%_y*qe&D19knaS< z!o%pHEOF?k=o=#(pFKL#!;nw zXr)R`YBybyNU2&WRvl7YDNcw@Ffm|b3=Cklff*QJhS|3}`_kWeiC$ei^SsY{o^$@^ zf0pODcdoH;AJ%TB@1Lm~TXl$k>NNWWa&r0a?^tpWd&d*MoMUAtIgiK}2k2C!M;eBG zbbuclZ|2u&mG1($mJy8Cs`VB0X^+d7X5 zjQ)nRg+I`>Tox@yus1w+o4gbr^uVr-{~pGSufV#T20nx1&Lv#^&m_O+llX#)@@mq3 zeb>9Buj!Ps_QtP^f-hspDROVAjIonEN#2~Utwa^*B54PGSIJcOjc#E3!w@`1x3BO` z6^#DHp66jW|3Iu9O)|zg*uG@^-`G@a_j4KoH{3hoxqJ4sQFrV3>@F+r=|nbT%|Uki zE*VkuV{tKHr*I(2W_3I>2+t4j_rFz>tQ`C$Ip<55QwWitv*c~HyGytHs64V0Q_oxL zioDXQPl>baK1fwyRFU(fLAu2bBh53lMlOlkA1Ch{Rk8Fr_WX%XuYo=P&O2|?uvBkT zZ+5;O_#u3V9_1Kr{uk6Amz};K3-rp8mvB97TMDadGS!C|a27jelMdqd#Lxy2-H-c| zW?tr-H`tSd*{|{36VB;=sxJPceb=ZH-vdTk*fOGumeF9fr^`jqA=;kgi)OmyyE`UI zTloD&Jb6e||HQuf+jvqd2mP(+*kjIna_|4aa1p!5X+0sgKJWe}-kE^TIL>zB)r|zR z8alpD!W}!+m*wF7^5G46Uvg87}t6B3^-BW|^F2*|P zzEXZno7XFk-SqDaj@Q$*9>ZdENL4S>zGS9QNBK_H=tD#fDWzpQHIkdF!Wi z{#TwWvD(ulx5xsNCks_g&ZFaX_`&=k((wxyQxB z0&fd^1doFe^U-!g(2TjXTBpIQ#AX0QbY2|zRilr=;!$;h2^he z)I;$2S(1g@<*ogm|08yHll(26+*|w@y~Wo^ep%G?uCPM>}}$p4ck8; zwO=RKO3JgO7dnf1SM@#5p0wzA$$GoQ#VLq>6Q&=@EeD({{<-QH?|t4Q_3N_EAzpkz zNAyJ&j>;f!(ys?bTUb^KlO?J^y-$360*{L#cQ>(i;c_r z*JpHce4DcTI49eLr!S5+dI3+UP#f}XAtsu7mOH(RPAuA)xh3wDkk#-nq zOLE8&D_j?kpH+{(0qfQF%u$nGXH%Rs{60O_kkBhHbzpX{n5hwA84?O;osk!>Sobo& ztTp#Vv0f|leIKTAPM;z3YdX>wc_s^q@AJSRRUt!%r;;pE?=0kag6WuUX`={_ccTkj z{WSa7+(|L;vmRX%$X*8MX68)ToL$0J66m;78O2=B1tidt8h zWYkSGpBF71tjWr|H6+&YZxatxV&q{Q`5tR(N%%|s*A7|XHrvkN^a=khr}N9aUL`7i zLF@DID3A%GvgN|)K3=rAJ5KWsxooSspHVe?VEqFO{*@@&P44gTZM^dkmH9LVU!e6G zK99UNiOm-mO-RkcIksgj7Q$z39A-4>jtjAMSdriZIgo@kpY^`&a(R? z&D-hJh*3{?qS&7K9sd2udaLNLjporG^@+F0_p>xw#F0I&&Gb8md51~4YjhnSJe};? z;+=q_Y&iv2pQ_^9eKh<;ZvP*57VWuqle?7UNqKwLH73Jf^Y1biK1W6kmL2A;AIYKf zB0Xx%0W0Q;-J|sTSaj^7@pgDjC6(n0Os*#Dty7(w%p9b1H~jnD&o#0G4|enAD9^mE z0={kC9lZ4{+Z(Vodh+Y=xMRf{mOl!;LK)|{C^{=Y#o7KAau!*8mA-@WM5P&d=0(om z1&_lb;|(60!H{iYY^&V94%T7a`G{ zaIck(JN$G@@AN(0LYsRV;JMfRO1q>{7T%}%2<9{<9A3iqDJzY${H{BT>T$9BH0-w< z5U)r&$F<^UIrNs%`h@y*2pdZ1yFql$B^^g}xBc)x<*77{pX8UVB=xC&q2r8e%sTOX z_(Ra>;*(mu*e$aZvu|GhTBKX#m0PsQ;nj5{Y{vfy40})Yx(e6u?m?_9m4mL)a)O*e z6@7^23!dtwbBdnLX3QsYmheIYExRH5>qJKQ{7GX|Ja~b=;hijdT9SNGitCf~S;C^M zdpE6-M+=`Eqvxcx2H8@jnr(#0EX*#F+GEucan;103Nus5>H{pgY2~o5ga?{szZUcE ziFM!5CN^5>kt_ZKr74K4#q~-^+)k`ofY}&EPIyP5(ha@jIvVr8Z z+!;tLLaB%cCpvsMm&|K zONo^mtv?U1U*qer9)1TOM0UALyBsrX#B2@*bVKYe+2M~2TSK?%WaX&Zi}-huhwngi zL&A{Nbm}1W91KIwI=-uf{5XsktXvM$VkoymsEb8mOQE}2(n`hWT5DuP?-h7NA6!Z9 zUb?Lip>c}PLBCn{&iglf(3I>s3P>1q4e{r=n98uQP@mLge%4-kO(LOKB%Y^PhqVI# z3Rk5}REJxUS7UY;i?b}e=w?Q6}MVCh+_MugPy%tmqwpmc|IJ=hRkS!psdZAPh|)7YIQG4`k{=vN4j=t<*! zhD!Lv34J*U;hi2iU|xilyW-h=Udv(42&VQW(pQMyW%Taj?OSH&LZ_Dh*I-|<-uN01 zc9@+@LbIzJ(mnVxZLP>j!w@ZGX(L+}%0eb)zWVfPBUbWkve6(hK12BOd5&PhUnG8?ufiHs0_3EqL}W5Qm}NVdb*VD zx3KzMcOu5N7^|V%kXa)bP$VmdF7aMRz1ism?Kn9bhtxW`dOg`)So%v6hD6LmH2#b% zvIg?k)UNks?5w#>*w-MwALP0Pnh#rJoZQtcY{kMJIr%DWX2kvm`mJU6ZH)PqxVlGj zoa^rMS}7|GSS`*z+DS=cSk&S|S^SQX0ax%kcJYnu&+_dpj2~uCb;6}qqa)TjE=yd7 zQWbvf^xDA2JQ?RhRsKWsm)Z&Kf=Qw1y&z)ZozN2bO!8LP{V*wu<_4EyXVQl^&F*X_d(4Vgp%FDVq(<(`u}0K`LFmUGF0hWh z;iTuI^SsUv6Rg}u>m4M`)9s8Z)5iKTI&bkrMkJ0|Gcs^!T>_1iSH38S{Ly9Z2){Iv z-HJ7{q@KdD%ly3*(vOk6%G{A8hkQztX?dc?%tq3S61{I5&4Y2J-%Ap#qw;pR?qlVO zBr6A|my_MzH6Ex>?A}Df2mQv!m~#>yan`WKwS@IOY`o=~pkVo_6^>Fzbmp&5UYN2m8o2k;UV0I-;*C5GC>6 zM%wJqe3C8${>`UZRE&&O2U&Q9NIl)t<}Yh5IxgA-mFg@$N_wYdXyCPNK0E z+GQj}XEJHk86KGS%0RjqS|Q;&-*l6a$I4b3#?E0rk$Z!VljgRvrV)30*>{~^a%i>O ztTLRLwa&cPOoI88*-bLbN_q^*HfKa+Cx0z57FTqQLy5<_jMmX1YQti}u>t((Bd?Sd zOA{R)RHrNir+%~M3QuI-<}jWY0d9^jNWybq(;J=EM7B%<=ew z*CL-4(;-WCuq599F0@(&?Uv!;sB9CT7zzBUp&SUt&Uo7Fh_dKEV~16pFfB6Plxx(T z_`FO$$+NsPY&@ULa#~fgy37?lYMfvW(4yY+!LS1BN4^=Mb5!Fz&#d5^T4S+Vzcu5N zw$Uxc{}F1!`on%Igm5*@=ByTeP2v2o*%P!#SubOSN~=fQwv#+)JkIS_7|k;p9ZU3U z^PULy=OsLi-G9VSF4U$;&4u{`q@uTvKB^Yd@oA0NzxIfiurp33^5~oI*)+`}d-mxG zhCN@K_$4}`&>)w!MV_6p>Zr>%q|ssl8!PxK?MYv>Mq z_KYjf{2VA2d9uVSg|)-ho+hKrIw|*JKjph&NQl@S!@Ev=m~lVQh*OU&-FmGzPs1FR zFZgd*T9NQ%-rVr1FUlh+>O}NY1ALRBL9oML8Nf68t8tp8X&R?u1)dHpr%8@ZB-j%S zUT)PYPmG!$tc(sm$NcE#vtD_A3r%A$88JJXXcfGjqDkb+I32G^B;15YcOoP5N+w~_ zyx(IV9XtqsMmCx8a|wz0G|yT&-v6n9VKM$hJjeNX6~D#~HljIf4Ub1WhtHyRmFE0E DC#sxi diff --git a/Mage.Client/sounds/OnStackNew.wav b/Mage.Client/sounds/OnStackNew.wav index 4fd917b8e8425d07e4a5ab3eb679213aa1b30f3e..4610b5fe33c32face12a7dc301d99cf6207a8281 100644 GIT binary patch literal 68928 zcmY(Lb-Y!@_xIP#zH~{abVx`mNH>C%G)Sj(H_~51x&#RU3F(yXZV-^}Zjg|=d)EBk z*XOV2m9Nd!w!# z^;65=qV6H;Zlj*ZN=)u1g8zQxztR7@qUE*9dzDv5{W&Jrje4!)?~z<9>Pe#REb6Y} z$~&J_-td2sg!0PA7Pl|cqISto)h!;7ymuWYu*+01c@ac*Gnxg7_~?I?4SR}@e|kk$e%v= z*E~xkcN_4!=RSixVXU6{1oD{Q#^GIw_&4!jp~ga7`CC9nDIKipX+x$6t?&h(6Ie!0Q3zVMMeeds^u zUHQ3gB8e;a`N>DdIGUvA(_Zj-w|V7D=Ju-3CFi-L`#!!rwdv?)5+J2W(uC;b2;j>@f#ya zcvUvJ!X3TluA`pf0iPDh%zg5ASu5|Dscej3eD1NV9Pw>=o}@fQRyob5re{QRNK!e@ z-@U)@Klt4IKI)F6%Ozi2e)FXy8K3+)>)?aG!1EvUU-J}^%us4M;omYtYke|4>pq{R z|2=hQ?ma%^^3K0vo|7?Bd3a@co~{NXSA+Y^Bxn5|#`78L=pU}}CwKIK^^%s6k6K@U z`+NSNFDL8$6q)2p$}ZNxCI8&t@K^nN*5^&0>zV(Z^|F?qKH;bDctuV=vjB7S%0J@W z7kpkh;J@VA&-}M?kFhqBFxDw}=9i3444zRW9V;)IWM-AM=iOCVV`b$}UxG1y=UYfs z?zgn$=5D{1CbGjWzpVVhgQ&I<_M&$Azi-^1m4m zxSM!VK}K*l%DC;|o_}HNL-y=p-;}*@#CMe`{y6*ds=vtRC6F0@6r=Z+yNxY>F|Ku_ zs9z#|eJxqW`24{vCXo%yNkTs15-WK)*PPG&#AS9buy<-nWj}%uSmk@kul)R?pD1%! z6WRH!a#Dh4DakWV^xt#8B^a~1ylXM<$mbWbAIdWC$r#I8{(^k#2e6JB%1nNG%AaKR zpZb}6!VCW^v+=#`V|`ubr+xfANy(Gvlr@aUVBRs@x021&inwyvpJgvTVP`yK9y7Dc z`pY=~Eu*=Vl`_(AlSRHF)$bmwZIqwOULM11zGk(zlGXfuk{`(Ug}#Zb^nJP8W>S-R zm?RDTR6gM}>oK>SqdFwz(@XQG%CdwinS?6-i7_1P2Qy+{u@ZmbYOQ&i=yJ=?;8~|~ zy+rKDX4KE)jOGGHKP#`>>+j3={;<^W!+5R)Qc4sW zl(S2OS?E`=`Z7vapTe~E|HwT(FHJO!$?4~_cZYN5)ucL=^*rOShsyYj^*V=nN$+1U zmc97<8fsW))_Y$+j+x3MUvae;RKP!dJbzNg=wtc98#7ve;m(g!mqz)9tn-sprD;Ah zPn%YnN^L6ZD4xBVFJeY&T{A)>rJlAkFM0PkpUza$XL8wPGNafBA+J3uO?kS#eyx8( zE&5tcOBU`g1@mfr4YNXrN;coj82_2Qtc!WYVPBKy?IH>MFcZU%WcJrfY+u&&rN(9F z_aFRPW^{`*@mWkGy_ZR*&HRA?#@j1J@ zJ$ta5?DjiltA3E!I>xNl7^W~QRLP(4H+@`Fz(+Uz{3+_qGCt*{ zHZq$umx=EW$_5=STe)UqdPgmGczR|txp~aozLGS4t;w!mnSp+*Z29lgi?BNO`0b2r zO;+S`nMil- z#M+-p7rQOzsVTpi3L4X-<4%w3E3@1kHV3q%{X!>N)qbXmRAkTAVW~r}IvPu8PJYV;z*=67Pl~nV|@`_J8q?u$3m9!q?6OGS5%6Jc8MON{j zWVTK<>c2B{d8SfS_k6Nl_Q|UMFvWFhV*+#3pVd!deWcl`o6RXV!<=LtZIf9(hH2_?E^|q@GE+&Vt~snV%~Kbb z@wsa9`P=edQv2lQwx(cSa+++?SKgSvb+{R?{iLRE;xDPNr?zvgPt0_FKh#`yk4@+j znKi79PVDp~tfnNU5&wVZXH%Q6_>|_3&NO|sL{#@<4?S~}%|(}zQO#`rppyTpG41af z-`wR{s+rinyxHI~n<4Uxt}@=eGnuLB1*DArZ3=4!^G5$?u4!&NUH3Ax52PwJ;hp^G z^P9bz5J0|Ay0H2l`qrkp@9rB*M(-um15${3y+T&&mnOSk%o^HY(#RL`NtWp%YSQ9)EkufIbxfj^efBW84s508qEY*Z|vKEuxT9Nv7#NUCd=od2z(KdCN}ym}G6;tQ(yG%807(^B>r0VBlsKbRw$#IB%zETn4pv`!b> zj3B~7W}s_iqiX>(-yZ=_m855#^ylR_<}W?9db7K2lISXFrDy5c%RxauQD5_c$3}r~ zqEp-RnB2O|y0C$?@dfBVF{#v-v^HHUFa2en3~&!6p8hDErMy`TdRorD9L1RIrT0Ab zDf|xY!A@T5EBPYyhhN+&^TyAUwUWskqCZrZemcSbCGT~lOk;cpm|fb(Y}E92t}AF( z>LqYyI@8ooWdB#ErX^;-C9%<^h*<|Zn=T*qzIo)P@`TwL{qI=`J#1VZ9=vb`Bg%(E z?G0_iT)x&L^!x?BpNZ>J+T|L^|0J5fB;#FSV|A5X;d+}N-89ooUzkd+s8v_OWTGk# z^~3$wzNdewU=F?PNBfIB|5A4Ny8jSQ4eI$4?)WEroptz&6w|S?PtW*Wx`(QE(tifl z&f}X?o2sxwdzcHlQ=WnaH_BdJ>Sy?)y!L^9PJe9%lIiZ3u!_&veOxoGb}>Eu1nD9b z%qpE?+v^(BLElm@Qk$WsI`g?w8!}h5O=+;o53;~~=dYO*uB^GMr(`Y&G>4pI&5!b3 zqV_HSZ(^2cYI{E{77Pzx*wK;Sny29q^M}S`jN+Rc?upSbDP8iKN$mHsejb8{60$S9 z`_5*4n9oiOSITzgrjqV4+guE@kUJ{nADGE}`ZDv@PtmrrQ4OnR6MOWk^e_ipEnC6G zu&Lc1J68X+C8V^yuHEctjUfeK6Q9_}zXx^oj;Z0-`TzL?ptxONzLGYFD-^LPvT#I` za6xc0{9yO0f=(7lcUde4WsOXvSIp50emn@FwrK+1NJCAXt>b-T*2z8}&oqz^)cs4^ zR95MGo-~7v?-rYX!~AwkIM3_~%h{>n&p}4&ZDXA$^Ra*F>B4$Jitu)D-*q<`b%tcoP3AXNVr>0Lg<5S=f`N`peX7F8aJ3}$HQ6Z- zGz82Qq{n z)1RJw-u=SgOW5NY-R1y-?y^PQ_=q84jo?dH&m3|>FFImZh3D)lH{UMRE0VyT zaJB7dchG)IcREa+y=l(+Lwx3z@b{qg$8*uze_9if$JI2T71_c5HT0?1)c+hdFBLzb z&uiLi3)5SdGp~!Jx&C1Ha5u}?8<|}(vz-dE)R#16CD7%@Gn$b)(0p{2%~@$L-TX7t zG;AL+D6AHwikxICMDY?^$9H1H+DJ^Z-z5ubx;17ANd2iP9a%r3OJtp(hI?+F`DA8~ z3;>%KFvT@v@K`IE9?V;H`PY4AFGtRh{w@P6{;K>bX<@=M?e6fRjpqtS?2G&+_}tC$ z9bp;&g71d-ALx;-O=I@K6M5k-m^;1`dtn%zHidq$8~rkUXx4;@g8q?R?fdYhog)pU zvq`G&%wadj#s*==g+=|&itAu@_;dQJIT`LZhr-(Q*+z8Ko%EYdT2*eDiCV-~rdoM< z=~4#S!j2IUk@q5cL{>Jj^^>pf)7g=F-aK)I?2yP`*$q$q5fjUnm$%&K?;y3s;P15h zi|ygM1@&E$z=t=3OW_szMJ4dtQ}d_PF~7S@ppBnQcM#QR@KSv{Yu&Zsu=qB}5^|jd?KDCp={&unM^u(}jlZn2&!o4zU+!a}`_037$A+Ov%+sS=v5^E)p+YP$X zCm%t*%8a5w#gy?rH=Q?!ejWTCwvL#te}e-)YBdvA3);mnp`m83TAP7NaX`vQY}?j- z7F>vo5$p_O*_oO`zR=iaxc|{m5zKup%UG?}@-kHufys}WR4#{kp&LLli6tpJ?zBH^ zXNKR|v!4!{qwc!799FfV>uJvT;#Buau$p>0-Cofxc9z>=r&2Fp$rf!U_hg$-Z*PT- zBc6x#A`*n5eH@Op+d$Pws*yX^I^LnzB>>!3TNAKk)x>f6X>+7r9TXR z0-v)IZaht+!P>J+2D)$ue@6S19x%y3m@8n^KZ2%nQ=gOiU+pfJFj(fRz-xQM3X4-?&uVJZL(iEE zZf3AKawDUOUZ6*0qBgK&T$-SOZj>=_of$CpnzGSZ_RUW4Q+s~~-uI2HGFRztvs@MF z0l#g89yCx_Q$g-(Eq@NynaHFAW$gE@{I}GPH*n|5{toqOiup{>ns&O4UbMz0*2Lhn z5rNl1K^;BFTz?xB(_O6Pqi&#tjCLxz=v7eDO3-Bi^oi$wrLRh5{>-Omhn{3L&Gdih zAF@`5P$SyFSv#A_rUv|Di2vxygCu_d2YdiWS7qEP%OKYU?Pjt(Hq%WSv)D97znICj z>&XRqEx++u_4P5Ino2f-Ia--7*aNH4Up|+v=A|29p6XQjpa0yZ@JpEcsbJyWaF^V$ zf{nfaJ9`BfZ=U?At5F@ZF#<`@a>lzZrV^^?LtP+obu_3bffRtz(q?Q1%@&MyaUxP^ zS5u#ApVe2k3z^e+)a4)bu8j}6JL$q)U2k9LUv%*y^0hx~hH4*)3DWz@H?|dhQDaOl{iG>j zr46XH9n5lH&y1JQb(Dj;N$;9={-wF;_kkiS!SYH0^wi%}^K3dzVA)TKtvWYw)KPuNjOS|=NFEEE(Iv7;iR(?iX$ZPLvZWN}PRNd`sB|mgcSB8U)HAbq3?o$TEjNhMWB#1=$o&79iQAM@J4s|K+F4abeF8CTxoFyE~AoM zkW^-$+;f+Gb-k`JHG@24)_;}(_Nm`x>uF1#Vv(ui(g%6m;$X9@6p`394vL3MOm6p0 zV0|6ywE~)9WzfqT|COzy5z@-9h7nXZQ{5YsiPOHe8(@>_a}=R%Cc1xbuee3Np1Ugt z>9+;lBdTsalfb-^*7B=6CfD_InD`ypEyv||aM3`RbWM}S)ivoqT{8*j(+Au``#WmJ z-#X0X@N>*p?h*5loi5l{9=i>`Fq|X5zlDYs3k30l&tRI%uwaJY9K7V2N4q!nT4Zc` z!Dr}B10}T?MfX^N4)+#a=#~MM(v3%$t|+^2sNV(MMDx(SKr<~5D_d>bnDywO%l!>E z1lBqYbU4yZ@Sg`6SVzm;AUf7T``qUaI%wQrwwq>~YDf6sX^`Q2Qx9gb)YS?;(+qa9 z`(2j1_9hLScoZ|dTC1ZBeF?rfCrL~(dO{b*vX>@D<9O*`=nNeu@z|~N^`6f5a0+w9 zSD=sAGIR7N^D>lRLwH(RhnZ{vm(A=zE9&m+iIjA~gOdoc8 zdF@6uUx9A-Iht?`X^w86MU^?v5zLSvI0s(3L`NG3qbVn|K$&^qxg)fcU7~q|UtI#$ zZP}oo6s2<|x7oE$kTQ%P90|u57f!If!(VNIum`BDhdtyDGZ%lNh~EY`e@S=z&8MZN z2EMUcSz{`pK9{4<#zb*m;CG?u)c4=eEntk1`OIrK(5~?v>|vc|?`csR&Apb-(TfZW zEiVe%&%Uc^;?kQoTF54h;w|Vr{p@kMDnGDZI)fKbcVsZ?OLBE+l!Z}2tbAvh;dIT@ zr(mov%?42QdlcO@5?!;Qz&0~sIE8N95*&NlY;h-00LJ5r{0fiEZCd%O;DddP+dKHUj@vcKEyJGc}m1#i%2SE69051P2A!DCp^(lD1@6uv-1 zovs&Mdw5(CJIAjv7v)={S{z@h78vN1>Ft)<#%?m2@<_V^-9LjZBKhgjnf!G(R|0nm z{Cf+&yI$7mKD7IsApMf&E8T1l`g*o1JE6F*NHzV-w4=jZ(G%>by0YDEVhrkP9COy> zv!jE5G!eu(>eyYF&9T)`ufc)hu$XI>m;mdM8 zY-EP%et*k9@LhdrO(O}yOek_*pP(}(GF|0+Gf-2a1|MNwf0Zk)tbe6HyOC&iGf-5T zvO4FO({>s7x&;Wde)uz*!A5&p>x0j&U4$aH9()#IllY@SN7(;+9jXWD9e?19{N_99 zY%|%Hh?waL1fAV3#?+zl*YIoYPM;O7^uXoeXek?l80j^OJKXAoo1#k9@WvZOH-lSE|m*ZlOlc|eEE{?ujyC` zlkpIHm;tCzE7(t4?K0O0EW8fSWwY!v@9Cg@!L$~}l{#GEuZM$e2iMYW1x2?5p$?Qy zew4{&@5)$E$p?Q)cDhk=8Mv6lEXM~;C_Q8zUPac3f5Ms(b*RX#Q7hA+nKY40<~=^q zul@}cIKLgvC$+=_iv^>uty@51)6o-t@l$mz8q;+uVjd~YI^2qPkstj&k1gz9m_3@B z=f8lXv)J4Z=jx4cm)z8R=A%#M=Tdw6fEN>^;m@K{30E6n4!V2Ps3G9ywJJ6n$g-g6 zCtsT^aH3Uy0DCtDY&o7kA-Qcl$xElo$KI=IlcAJN_VaullNh!2s*k1FP*q>(?>u8N zYfX~i5e`R7S4G=tcUZw(GYj-TU2}i}e!*YM0NTnTHKwm!7e3Z;(Az5b*;lg4eP^O{iq0N2LYw#oFv@>rGCS(J->dcb_f1#}ZEyj*tSRnV zdYq9Z{)0OO!|a4c(usZdS9nXR=u3P#GQU4m(73pMq;&w{s|&opH%{?14yH-V37y8BZm05_I_PtWmJ z&34?xZ>6V6z{n+JKTH7;ZqidIJkd=$`fqYghf`mL@`U zUR6`*Gt&iKJiTng@hHQ;!`v8n#$$iMPO~}8=!iHllXT&FoR}f5yZubZfrT=djCLIB z8GTuo;03Rtx8#<#ZYAiuAbP~-DE|fQ6~8hl3U9H#v8!NX<1e*^r>$X*R!R=;A%`uh zok506srL);Kk5Zfbaqh2#Y2fKWcK^{rWoCHuxtjcEJZha=_jKnWe+xMYmnb1_UaF| zx~ayP{|^p-+s=qwDe>K4yWBPRwY6io(ifE>I^VB{VYifL_K8^_TTGy(s5sw-8BGh< zPjce>zVziZnVfewbcNaJ+S*QF`zEbiv?W=E$+S3p$jVqd8~&8cE({aeC6OhA zbSR~nOat4&yyognqy6NrgE^*~w)ot!LHgIjDfY9lmfar?Fq3p#a0Ul78rsiE_{LPf z6BqcEUh-Y^wtlATWHV0vNS}j#Qqv!H#{A=!`@>qtWc-hxI315uwg)_hHsf#D&9JOW z{xf5#ZxwX0uZHXUvtN!v{*yU@FYA34+uU?EgXDjVd>Z&<6L}<=;9j8{iGo$cme7^- zhs>rFy3|kF!Z!2UOhY`qY~e_0>YkZ+u9lgJP9Be1^rQA+P2V$_OjeUlXUYl?zoEYT z@$kz4~P1o?E ze;!Vy!VdI*qTftMk-AE6pF^FvjIuS{egYB4^QZMYe7?f?Et~yO=3oeGW{_DcmE?)$ zW>-|A)7*kBZAXWAg0uKNE+|-;`Z&%n=E=QpWj~kLFs=rE9oXO}YJU>yW*f3%70s9W zQs%f&%A;F<2^;9=i=oI>^?ATrZ#2|m?DDbjiBb6Sb2XkB;qGgE<|k^!?(^CXjqZdMhn z^O{=vm%paJ;YsA+C)s>W^HJmCyjYSGf07|N1_Bra0_umebH^11M~^YfaIR{z?xX1g zQzblNpMzVr=s+}S5UpzhHe1MQxgn`gF`~TXDX0up{2;li+5HOLPftrhS}rXp@-KK) zU6au~_v_d($ILp{-wcbaOJ7({H!5hWfz;ERvdJEoiYNX4Ipp0&xpaI^d`VGcXn zMcR74G0*$hHpZKa2Zn7=4VgqHFFAVdE0pxM@|g9o13Z40@oI}}pUNMgJFLeyn2&zl zNrvH`ZPB=iGQFiB0$0xx_%ZQUKW+Ogj zKW08UYU}|Q$7T|5A4z$e9S-p$Nb8Vk<(9x~lbRD~7}rS>kpjbU+^pq;SeiBH3|`)^ zMT0q-RpPpiYBVvw-9(P;XV7kJ`2)r1sqc@Do6+CXJY@MA+S z%74%Vpc?8F-R~ECowih-Tv`ove2>0xM}0%E=@wLlY7*(L;dGSO>d{A)y*~&yaTnRBPW}!Rsu|i} z7p=vbYpJiOyhAmvY|~rlq6hII9!o2@O+JmzY+QGP{Y3YVFRDGIy;h+ruJ=#%wm+@~ zO(_)jD1E-08Dd5=lXrCut7#5-uXZF3%h=xTHL6Mr-wXB@jp})c-t+|3?H`-g)HSo2 z!71jND<}2B4J-Z+Y9JPKRu%jZ53?*7c0y;wpdc!i`8no-yUkBeR2i$VxqmZ+O_pHZ{XV z`Up+uuKgrUOmRjnzA0^zn3PuNC3#F1O$Blqj8*`k`YYh{6bx? z5A|nl>w4jet~7@g_f{(5^CbZN41krylUiXHO&t!EJFY(c{H>3UANdwVaVj-(qePIE zh=J-CN7jeWb&gw&=5!bqlb+033*CUr@sk`1`*o+@WRWrH{%F^+Q!TX)?PB zcs~ct8JEwja!Dgj__j6|pL)^tLCsr_8*$pt)wUqFd$NEhZ>#xmJNMg;bi~5Af7?xa zS5d}mW730@O>z^OrLqm3J&sv}t`rT$_-E1`gWORelR_f=rr*dc+>z60Etk+NPDoc) z)paL6rRD{V&t{#B538USMVza-N#hP+^D6yfYR5f7NX z-!wXjrkK7o%GG`Ogbof5qD${#%{(GmxgaVj&+d;!{d)o5_jb3=w5j|s`#mYT+ z=M$WwAAImIySJ#>#D2~KK5Aeq!5)+PMD}0JgdTo^`nDe))zQX6kNm(+ngnaT?M9jE zZn__Y>QxJ$V@8xhP1bt~h}W2|W+c`0lE!sE<3xN<9gJbmxZ!5ECN(ul0$p_p>F&Ew zCVRoA@1R+AxA*{Xgwi&S{3tMcw66U0?U#z)ty}S{$zr3IrN)tLie5{Nu$#l7=4)2R zPIhS1Fa>CI8Ck9tbhZ6d%{aC$F5xj94bw_Q0`xw)v0n_njcp?%&2=2OUSKowHF zc;;rZD{We774|kK8o*TLNO$oX{R1a@5I$c;P}4Iqm!;{E$o=%D^hCZNIb)^yw_AeqANE$Pe9N!7w0T2BP zbC_AFNnRlj%1BJV$)06I&X8mq1Q&1Ow^O(0pt%)drMDq>SJT{rLD!@MEuqdP!1bTQ zybeNZF`)l;IFL`lbVtB5YjChUeD5B8ZN8akO4=uI+rLPJ{UGVIvX2=~1m#~b_gH^% z*b&{~)fGwm-K5(-q#k$kOWj2u(`Cb@sSR2=BPHRTw^(f%H5=*DS6ar0;Ut{B8q!wd z_@7)MpOf91UfYWU{dFS;w3~cYUp?!an&HwwlWE~_5P7kw(vp!H6n2**a27A$_>QC* z--3Jw`-8YIe}Z_j>tgo@vr!Kg*x}g@h|3g6L(4LiFIX95cY$56OuNeZ)`iZ9w=#7cxwLQIo+l6(acuUfBUdM>XBqC;R9l)2*uD9^_O2Ze+$|UJQzP1PXxe6pf zSI~C~;hz*k(Mc{J$Xg^tW$%qbF^?(%o`%&&`aHpJXmD>_Ui|Kq_O5^LhT$2$CKn#p zB-C=a=Ce3)vIwoa7B2E^f7=!JarAdN=PtQ4_&yoz9`HTsZZK{sJk7-@eO;u39JVi< z!4FA=*SXwG^>3w_-($w%s}43lo70lU4yG$-M}I$J5|LQTz{!jWcxjbn7>>|3`aMhm zjO^i3BT%MDD*LQDPY3$u-s1+|g57nHZ{TDJP%XCluY5IsF#Lft4w+@9yCj`mPP>zS z{|}16RDT6cp%U4dA+iHCpd_i}!z52;lcWsnDRb4PqpSXk7Z!tk--o2%Ce9CZC!2B5 z3HnYNvk)GVANA!t9BQa-MMcja26z(%f-G(-szXuyhaHmDT@*)O-Hm(qQA^PM_j2F8 zKwzJI0(;uWH{IpEE$+U=bI%);^ml`D?hiW$x2Jbl%;pK#m_?*n(Zlopc+KFb(P(i(Ua^+{Od zv(J3Lh`Rn;yNx{ZeJw?9?KL%G1B`5~B|Rv!O(D|2>--;nIK6N@Yvc(jr;@yTpB8|j zE~fey!|N+;Mo!epth+JLEdJ&0$Qx#J$3u zyJhyUhNhqw+%n1Ze;}PSxKV>_ZJiFrdhh4!XSM=f)?8`FxNKnut(UbtPc%{mAK9-N z$Qh3&3DwqAfay2U0Vt*h??}1w!$B-Lw&7poV2t#1A0F`#5>>4{Q1=tZCIp@$_w%hC6-4xi-LM?B% zXcAu=UG1U!Q47+aOT)=0!0mq_SzOAFBq6zu>amr5-`Q_9|7rrN)CzMwD(8;&)YXq8 zRoWVqHXXlV1S<6ga(3CIn#qipJ;i>GPLsi}v70#9yG!1=Ys^$@-R&2<;bB6b3sgJ^ z%rTRb1Q)@4cO=RcE$ix=9g)X;KX+UI4%2FNeWyQ@0-6FRsRz0!0_V4=a?||=`nJ-{m9P0ay6*(70DGmWj6PkQ8t?WDF0|-RD|Y!GJGT@*c5G? zq{UWvU3r_(CAR6%&ECom(jwLE87)uBYrd4C9$hmPHJN!A#oYb4B#< z?IL!gH73(~ILA0K!CG+hbNwQsr*vYi%p~H#0d^*Y+EaGy}uGxWCyj=OHwR6 zX?KK`f+AsTT**sj6^t!0{4<>l2+NyS;WH9@3ALD>3vZ*~c9P_gPwXhI66EyPVd;#% zKS*Ue?B)fLE>-ZYJIXzci--U(v_fy`EKOV?$xQn8Dp|wzVAlVc>9WXHl`Ij1HBq$Y z+Q>dY#rR8)x#YMWx1_F*8|2sS!ICfmE_Ww#opl+*3)c5NaON7k|DBInuRE~(9o z>wDS^4A1#WpUz1G*EGl+b|qK(RIkZl66~i)Hq=2e?1h@u809IN+#vfOTd&yZ%*#^u z1P#8YO>GvVKg=N=5(7?IUQe3Y?A?ccke(tDb(d8-)RcgExk9AANR!EomE@HhkJ4bn~*f^)c;sd4SWELCZ$`6?s0Wse9}l(wigPQr1~4 z(#~sm^8IdpaEzVO5T$e?Sm(70n&kyO$jOp(qz_E6RAXpcUnyKAMMzt}__QLp{3(-7 zLAC4nUtWEhn?u#F5*#Jt8MrlaFICf9&=UW; zl-;RE(4Lmq#5l?$P-({m{d5u@#1q`OooKET(cg@}E|bF4Cc^g(o{-1=;O@bJO;8@3 zHPb~$o!o$W*Tq%0?fpAlseRDFE6OfX0UvA;Dg)XQ+4%QiYqO0^$X+@RKPCSk)AaXc zNa*#jry}S3LMT0H!9WY_GV-7awT$UZ_pi&Wt+YpRh8wV2ducnerWe8z5#wBrAUYf; zIm*{SP~0c;Oed4W{8Kj3L!!I6c8P0B!uXJj7L3#mK~dK^VpdqerV7iFMCq+~60V^% zi~PrCk4znHcPJ4FWwBZ1&%i`$qAgU2%qKY-8$)h|~HwVg?Fn5l)x&FkMM>pCr{2N2i-=jD0`77Q{9??0cUz+D>vw zMLBO3oe{4OH!TrFlZq(&v^pptBV10n_!*GVXgirK`BY90EDHLE z|3ir%L?X5i>v&gqJV+2Ok65pPO~6T}TIRj^%lsy}Y++j$R-X&x*4I2hDJ$mZ+NOA~ z|MMe!S@O;)%{8537T`OeGN53l6HCpHfz#3pju)k|e(eW`5k^RyWYziB<2ju|eZPqE zc-m}q?SgE&fGTj;KMn)b=uf&lh^A%8Pc*o9?z>qr*6} zi8D`kO-^q5s!WL7ApIlDf^IjEv`FSJlBbF~pYjnM{tG^>x^ETHT>4Y-a{6NK92)6q zZG+c4*krS*IK9$K%Sm?o()Y1Roo&N?XSCEROh7Sn@$s#Ea+!i@*(Q z(eeMlANvONJp_;Z$Z6RljPo-RO6N(W?U2@>wr6fN+Gbxk%redk_tf>|3Q5mIE`UK# zG>`2L-;GSlY!eM-dKM?LSDOEkej4WC984#N|0c0x&6O zWX@I8^&BenCDAIJBy<}0_7}(W0kVqNIzuPmo^Kjh&OH&YWBx4 z0+in)h~)>G zUU11_J!v`3R9O<+5+;BxBnR2wBZ*Li^kZ?~z+EBVQBww>MmIInL4_;H+s(%7tHAry zl6F{6#;1a>j(>Tb(_XP`N8F@Qej6%SKX_j)PQu+Lqn*)I1aB9WLvZpbuCR8319x?0 zIG0)9baCq?t^4GE)tj)|%y78BI5AR8kGO%FC9EM&aQf1K^Kz0>uIcxZ<6emVUtUL% zwM-rq;mp-*&OD`&KTIpz%Y1E5FwR|3s&0bH*4g&()>?jr?dliVc<7HsOnfxs!a6sY zs)KE8GHvs9sSb7R$O#nXG+$S^b1aVaf%?@+Hh(4Tt3 zHP4b6XrV}`Pxh{_i$7@;zZSQY3)_=kjt5)2QA6iIb+*+zwxu4(>FlFBj@rGardt^RI2loxEXX{EI%3hHf*QlL==) z-Cvqrn%zEvm;GTsYA4$xtcIr?owKWNLD!RgOMAi9G;v&NaK$@L#-zeW*rf;bcbG{H z_nquRKd7UbTqd3%>QvmnIAD`WKsV4_xQXA;bE3XiV-Pu;s$7 z<|W-(#>^vMlbuyL(L6&l%Lki>8wPF3!biZ@JJ8cEab9CM$LbFh~t zXmA0^=w0;Sq&B;BwEf8{)rW=5gpt+cRPZ!Y#}u(|(IhI9-h0PsqX1v;Hk`b#q{Hi; zW(NB4%=rX#+9G;fZsEH37DcP~Ark;6iF3{;OOEIoF4s|O78qX`A2d!{F zeIge8WIc|;QTRh!f730*qtAw4*9G>s#?2>JUzpRanZRH>eI!Ub6IqHIueL0j+VK!%lCgL6y2Q^&LsxF3a=#HT+*VFWj{s@rS++d;kH&`Q) z+Mi6)Fgq2NIMsE~Ea;FknCIyD*nLs1t4IZ#*3L9{Y%_RhU3OkNe*c`a;M+-1ao!2< z;*c%mACjsqK-y;x*?_;@OVqy$(heNlLeqxj$GoGd=6)U~{4knV!mE@GjNwit)%1b;cgAaA>UvY;hff# zc)>sV6A6-(T`>whAxGwEE<@-ji+Cw~TPnqqCQA2Wo4f>%5MmI0XPohHw$0L$N zBo2DnYUnz(Oa)fgQT)rV!@td+q}N-pQih{|oI*qSo)Znnd`0TPa?W*jL)GKE9MI_R zp=p+O57_UONS&7V{lF0w!M-awaaDi>d0|=SJ}2ijl--b=Get!;H?A0|cWO#1)VnpL zC(lv)W=J;or+?(`x}tjDMV%pxX|Hn@sti7POKk+6`|w}ZYLeE}>TWps`r6bV>nix6 zB;qDBcI)LAbJCP11=a(lFfaN0pTm5aC z^ItXaf}Vm7lY>e!fRfgr>gJOpE(tF6E?m2;GJ$V?_y?bC6^ci4ne6s~KX;K6t%tJE zgA`&0bmhM|8Ph08&snYus7e<&Tk1G%^9A3i@xlD<-uY2lh-#b(9(e@hdVrODK-UDD z&=abFT^37q`tozSY=1wN(>D3hh&)|$tmXShaI}h|MdQ1Od0)cc6d+J@j;w8!6W9JO>BEMTqcv;X#Y71@ebHfO#6c=VV`I=-HNAw z#C<~bxanrwznB#FChHEL;-H*j(^dxpbc%%#W*&TAyOp{^m zSN3-s^8z(FpPaWhHDU0?KZFHEgXNbYW!BP_#w+>|tb+X%!%H~t6QT>Za?itoC+E<~r*i%~Z46cws&C;$K;H z&v6%)>M=NflskG|+oOr|{TXDHcLcdPi!sOCuswn-_)>?cGau0j`BnuSp*`rW#W|BV zU%xedIhT@?r@g8bITN1G*VTS*0=iy#S%Rj!hU8mrIgSJDNp#dA?IF?u1egkMv@zI! z8GUR!7%Yc9<<_DqR+sO{2d{u@=d%~#J_GR};>! z7>^}1XJjVl#iq0N&yXQbOkS)6%zV8I0}{$X4X|?;P8UUTVjwrlNJg86Oin5ga~85O z#lvIzGQ7)}Pj)pxsYimUdfZm=v+ZT);e1OuQ!s{eb^F~;81SUE*J-2U4kc( zi%N2u+($X?qZ~-m=Y^E~lv&bO7$rBMrs@o3Xe3uLby}2%=Jj6}qV@1YImJ+)41Cp(5q@vj z05rjgFWVqu9jZb!+ky1cNR-_=nt&0z%ISrNcBf4NI?hId>k%31f-apI5!pP*C*}yN>e0wSJ|g^0n!DfVx^+m( z*3)We_4~pQ2lEQ~vVin(C-7G}zh9I3m7(xGJa|Nsf<$~H)7!K+({Rx$Mt0K~k!|Hi z&ah;*>HRgn(O_Ie$jOqt{AmN|VJ+!Sl~*{zxkHS)Gu=zb$hc7^^J&y>N*&IF@4!&&jmr2MDhLzP1b?Z8Qc ze`NqHJF{#+WiExTz1EEZtzM$)?4%zovRmA4s!?2f7_~96O-^>~bA4nNkZOH~YE_Io zt_L1W0Wx^Xsj4(VI@3F%rj5?2zBBr{ndANp%9wA1-l(uSWwlG~k45qwXQZ}Pf$sM( zJ~<;!+LgAbxeG3hW%G~$-WLuHZ*bO2m4=p!e`AoJd*}yRNoPBS`xt6s0tN+=x;W_R~=b(|l8PNeBv7N3UYqup4J{j|_G>$b&p4%XWi2WC1jf!_>Kswgt(xuUvf29K;}PjN%xy zx1((z`vx}mGaVJzn4VtGbg{|l(BMRcLT3}v~3weTmT!ek}PKUTi_t}4`#3``NOlaHP0Sa+rjZflj5`29V*@S?zd18-HdFqpQID$gDNAHA5K}R#-M~_HC%rSjH zVqbuQ`rrVLfOW?=C1E)4NT6SIb#MVMqF+u4<_Gtf;g0$-vN(A9o*p9a`Bjj~UgVp( z29U>Ug__VnZ*ju-w66h@i75;1@*tH}7}5rEGQ0c&eAbV6!-MTCbKQ=#WrM6}g7bVM zuytc}kI-uxiqnf+gIkQ4ol!cM%i z58p_*!5olNWEe<;v1Xo-ha8HUzJTx0J4;4jjD3ZFyI14sI9C&QI0p#jrTGR7a)*S` zbHB$`b+vR9S^ZchU$nC(TC@jzzsY-l%Y7SuAI{X9IOBc&OxuMsFnc+HUY0#`#xyfq z$mQ=g59|YjJ1!NaynL>6b%d)KpAAD*Wy@(z#)vPrgZ6~_-F3rdD zE($fg6<%~1^gCUyGtm;tm=8F$f1qOT@R=B0a!mF|xj>c84}NUN-bw3ryCkrK89do| zsc8$@VdQ&8poMHiE7_#2xaRV3$;0!?;K#6 zgJdt)(@RECWs`CCwUuvg1~;f>I34pw=ow4nLsXB!3?Ex40S*2 zJ(mSlsj6umQQZy?s-YvMk1S2Xb1UclF7nL+)q)Jc3uf(zrVN|7!)}$v;siwua%Wpe z&{WWZjO{dBzUC7aE z%OP7SXv{ZD81&Pg?q@gHwKV;MOA!Z9ijKRvZk$U@4z&e}(Fs(A)a35E$_MubhO>=t zjzF8@bVw=k4I|*$d&91-yxWK#P~ZNJl8{VhQ4RN^vFC6(@N*JU^>f&n=#aBuS6ekg zesquV6RHJ&nXCcd8wa{g&bogY7Q}Oj#mS08K9WoYsed|iSv2v4)cHJizN90Ywx7h? zW%sS#4^R0O;RDi<7vRIz{K0pRMV+JLHs4)K{NAnS< zpYJ2$gh?E}^P-zsNb+niygrc`0IPfF|8})uRR04}T;*)d0{H;nsIGlvyxj_CUZStV zdh}aPL~2Tz&iSV{E{+@GR)p*HC*5QVQ)BqyvYaQ2>Av(~?6IrDG?=Tmq3nk+aVMuAs-Qy0~7e!i(7@3rJ6+1z9TCpV-F zm{(g)&`Q$H+$jf(Dd1)gbgb^i6h>~ES;_5^TL*L>)hrxZATXO@vfrY>^cM?_bm+@h zGq=|U!M@5wbI7PKkBizaO`4u!^;FufD+|%{xS?x#1+KXUma;c9b)4~06m^tl*QL-g zAc<4RuWN~Jt_?FqDzlFCkq@ZRg`BBbNyEr&IZsZ>V05z$z%^am?lJYxh!jq0=VDN! zrks$$RQWJnUZ=CWiR);+!{uv``f5x#jnqyQd)bXla+q77xzV_))9Tg=VxBCZg6y7w zBGgDm(KwXn)t+5-0CeOljAkMp*1BklgFyk>qJrIrMl=c}@fKdKV0)i6Nj1~o)n`um zM7qYUFqG@<)#@;+gE~~XsdAq2gc)!oDm+8)SJCPZ>ux&=hr(tx6ar^#L;cn3bV~CK z+~WvakyR6dpX&m+MO{{GH@vcn&vF3tayyu%2bjYWx}6bp$NA}P?g?KQuOlED`$;Sn zB;&fH{9P-&=+iIaAUT0jbu%ir>_!i2TsYeAI?NGAQGPw-e8?wT((fdKY6YO0%B2gS z)1Sb1ood%ocVGy{$);$}!&xh1!Rl;u{TpCn*2DU}G!DsU?AOxjp52yOFxJI=$l}Hn zW0r=0(uuI#^~7iK$C$=xu|Ox{X_I0MD%2o2sGj;dwSEE`(I!CBZMm^J4u4DpDZ8rpwi!sVk-|Exp)-oH&HIl>yTt6?-|1{=vw-8-rXBmy3 zXboz^(EzW;J~c^QRbBDKWsz6ROeB$|vy171dMk`rX5AUx z6J59LjWei$e#8VFp^|XfUoif$?zf@G-9m!OGu=g%WE~V2|HQMyB)Gsv z{OPC6Gv*GNom%-w<3(48aObDt^G%X*q-sR#OS-38=u%h7ujv1Ok-d`@Hs-au1opXv zT0T~!b^MlX=n*2VAMCzuI8DY;#fv&7$P3^NsqKvD#j{dF+lt;I&V>NcwT=UwUCe|L zfPd$eQQy2u_nF6jqxM+?bT)KcHEHl>%Ymp2d!yodo9wT8sXp?Ucwyd0FSrbq8;g~48FhOqPLFXs_b+^^ z{?-E0ZFU-#Oa!B7Wz|C2(;cPkdAll|pcl%M5Zwi@KKYK$zSeoGu?oVKzn+~O#NIxt zm#R)^##)QZVjHzSQkTR(B4Db2>mzm<@y^^PSHo~8>R#-?jqsK}Ldh{;H1W2#y-pQT z!}J%{$q7+bzLqAswf_3AHbqA<&|JaqI>^~L2vmQz9jR7X4xA&u@PzLr{c5eK;Z;dw^Z)U1{6^rGYGY&+S>Y9T86Z0Z6G_b1WEEll2^*Z8Gop_seI40KL=N?-ZIY|2~h zX=NatDW&m@F7}&D0z(Z_^Q~xWfO-bzom!rDj1aTX_PKnnec_}6$ezv28ZITf;~c50 z64VynM{~Sh+i}3ZC;hY@Z1M(ljL(d$W-#i@7YauQ3>n$vsv+qyCuAiwX9ejPO5wMi zZtYPgnO^ZT$~)#gFvyi8OSpkoMu^qy*H30U6ztbkMa|soj8T3@5w|5WK}74aR&^@z zbe*go8T;iYx!280q=6ar(-%~fa-aj7jn>eY?39A4iE}PHZK>fQ>Z9JgC+9I$)>UIU zn-8FEKc<>eVOokBeA4Hni^Y&_wVG;`QKUf|m#nYgPu++D?GF?7QllsR#dlES;%Y1U z@cTH@=NWU&1T&-KJ^IpR&W_e|IHkuRkD=ydxk>CY(&_o?uXBfS+E_2QifT-zfBBt0 z)UoC|*!HC^?J!^A?eGVLa86^fGIv zTFvkHAp+<@FT+=lRvnoTBUA>an_*}t=Hb+639GnHWigK7NT0>LMN)tjp%c^qyDR+P zPMmiS!~q=zMi*fXW!I&^fu5}IQ9l}yQ&kIGc?G_P^dcOMVFA1`dBFZ2;wZ|>db@`j zJB0H=(ACrgs|%#p%Lt;I4`q7=*_2#{Kb$XfIX|kwApS-5`6g_bgzoIaUi2yL zaV5SJqxf|#_>WqgG!Ni(f9mVHG}HPlRYm1w&K*z2K{q>5&1KCLr$6ywewt4z!&keX zx~tn-y{((pL?(q-Oo3;Z%_@+26RMA@V$8|k;j~K`U5!vQwR?GjN5Qd6a^hSyTbo5> zQMpXrqKX^`39w9xSP|ljxHjSSS!0^BRcM5RDis? z1dNEANGl4M`OI_Xdrr4^YO}SCPwXu(ncZYh*?>ORgG_*|oEdfLx(v|k9-tO?^m^TZ z+A2xpe932-fF|>e6>fb}L-b-8>CW^(XJOsi((N~*o<@Tfe3yCTXgLy9)C)Di@?)P2 zlx@t>vLNc7U-~5)eTl=gDE_KNj+JgX%vjw}d8<&nEcJB}>Dnook>(lMoI6zl*uZhn zj;n^ZcmqRKPkX5B&g<4-7`09C8-;NK?Y2f)&8?Q&VuJYz4}BJIhSSQR{-S`6hey55 z8C?gBz(hNf^+DA#7KmZyQTdOVFpK@%UV~5iwccy|1?8^h@B!=Jr)!`qcy0TcT_pN5 z=9%=OET_OTv_xgV|G(+2XbAG4b-K&k{|Nkakt$Ag4F&=IL(X6+oXSHuGg~l$b;j$q z9%b7ks$LX&qqeXORY4fscy?1!pk#C9F~Egx1qU5!c*B-FWxeKLg8D7zu&TRruYpN_ zH{8ezO8-~Z1ciwLTWL=pxP&t~%-$zou?HG~pxo5=_`TCbB|Jnsm{8|($H59CJ9ElZ z=B+%e)@N#*`UxU`RNn;MeZe$c9nZ;ARn(3HS^5Pdmd(tD2Vsv&kKV1h=!~B$lD+J@ zjb{(aaZlk5+YrX5dJZ3doO-vI#F!0q=J&{gT%l9Y(T`^CZ;MLki?snaI@769!z#(1 zDF(`t0-Py7DseQ~yq#cO9R%-((Tdr+9p0V`G&iVo=f`>`;dZdo2(dwD1shrjm?b0o@M=LOmuNRA}DnWBy{IP7ebo5uj~D(5g(N2fs^V+BZIbN0GtIWR}8_W10)(4YRoT4I8?iX?ZP^OF?G+ zheo7%3{-b4I=2I)lGbEzr$%Mbf+zU{_BI36=BZHyzfKvu0v?|yINj#5#*51BOnaYn zr1j3~K=(h!7>GB%Jn!F=bG{nhjR<2jvuAO6m&5`;(DRk3x#z<3MWInzEUp_)@(PZV zHFOs|zpF7D%|i}1w!;@*I|I*HSxEb|zeEwO_n z&n;?(Ud?`vM)^wbEKdluC2FU&Th(P&YD7O2j^cC%nH%ktk5c5fou-dm1h2Uh_BJEP zMKRLLgW2Ef=x1K*9juFW%pgtBAP>a1T~~N8g9Vv?%xq-L9k;IHe_TVi?$S}*VO`(S zK~_Q4*?JF8GoDnj26krcrQd^*=1~dOE$gYiN4C#$u$UsMB{?+TK$80#&&UA0$@KSK zUxtPCq@yek!sdg@>)^+Z<$Z9)CN1KIjza`WBTYUIAbr$8Y9x!{BMHkhLw|0V07{z@0UbliB zNT4EGMuff!55EcQe>7j?8&mH?dis<`LsOf>VJ2SUo0(wOH4n<+{M8P3APA05w9@Hr zyrKSPcJnq)qT(twb>a&t0N3D#--C^0w5mGqsy+1Z1N3sd)IqrEMr-mcU{(84_uuOS z>NR}TR9#IUwHl#n-E0KQ9(EV@X<6|1$KX7%;(`oCg`vw?t4tU^) z;x0HeN&wtC7AyE5yx4HipKy@z%HkLAbsT^04E(}R(DJTS>8oTGWkb>KMg6E~ue8#r z^qf>pQ5D>TFNvj}D~t}=pQ?NjMfnCZAIh0$DlZ6Q1AC7hBb;)CTw#;CLO<6^2y?VK zg3CSS@_Hs3=el%PQ|J#XtDJnN zh0GcSMKiIK?z)84&G|R^D~zg}JZ{b;;chWXvL9-Y^SQon?sHr1wibUu9Qajw$t(-< zu)%T5;bMXfbOVJ%tSoEZkdbDToWe=Bjr8>Z){Q%EjE*n~)#y$gs9=A>1;(SUt54O~ z1V;P;$Kz`zup@RI7@_ZAPhCJ&mw~7rvi*2s{qV$PCc*6~SZyw}J~PQP7;OKv<5iHN zhT1u$lXGno8rBK2E6&p*GDI{nQ^_pm22{VHC|v%L&eqJRBM0LKJ;Yx6jTWx5nO)?> zqmva5dHyGS-dDb3oIn@5-NGjh%vPJ)*9vQ5& zT2GRjCT|2UpCMl07OJh&F!SW$`>hAPNnw75ldmd9Q5goosn?T{DDAp|^H)ZdSwSwx zb4fw~mAN|((GYQ1cIWR8(b(kWhK{xPrJ9Ls;uqZVF+BaIa8R*t!#bQ2jYS$Ry^96y z^rrXr2Gwc+c3uhXVi>X|0jz^dN>&A3uc@n zhU@+jch0A){Js;9;l9%CF7YIow!^wxtZu^EepQeVDns`mgOnwTm#)>#5os6!1C@ z(ema$`=|2PsZ{}Vsk1@nDsjFJv(tjM+{c-0lP{GY?#)A=#dX^U4j%{z(=!@N|qq1g2ecX^sw{WQHwP)Cz)B8O+TTw zybqo|3l(k(QQaP|6Rf}7h;RqBW`2CHUzukm>WZIwgM9>4Bwp20!C;+F`879(Fz*%M z+@7QFfX%LgA^X7zS&Fm}t-h+3OiMR$Hf$3!s0lsUp;dJcu@Ss%r04?gXM)h>g7FIh z7xb2MsX`A_I+R|$L7Rq?+mjQAbApPtR;%Lpes+rzBtJIPjd_YMPy#z8!58^i}u*_fl2sr&RZ zrW}k0d4s({m4Z?70x%ko&O5#Y6TwWA)xX#$sP39 zMXkzKAy9%I^i%)Hp4OmCe)=ZqC*|oS=A#HpO%_2~5(j(1OE)$0gR8x!`_85FS;v!y zf<}E8?qIX?tyCa9o#Bz!$_-{$Q{niG*2g$~ak-;OxG$b?GFK;0*%RFBl~^TfiCW@- zEFho4k)-4vg*cIiKJOcNV0*aviD*ol813Z~d4##;k`7@m-DkH1DLBPv_=$6QscK-~ zhVid#=5R~x<{|xA?bG!#(Z(EO))LXIrB>pxcq9(W&1OEgdFUn1isICz6GkNwDW5r3 zJ7Q1=F2q~2gKCkD?t7H^1I>Rls?qXd6JFUedLS5IAyAYn#w@<#N7YsRaRyjVtsGS0 zhO8)ey1B!sKU_CsHpW4kLT$3{!f=hyD^zDOg0s_&9?arw8HVR&8_4+#c1;4zxy6aT zmPz3$XXhg@NShR^^!7u3^*R0k? zX9w#bzcUZXANQ;Tt1;a~Q*ioXJjc>x1oTm}G!q%~#B@#1z+}BlU53+*Q0-ZF{`%c(bwOtW*Kp5@V<@4z)u*`C4VyUH#i`k_G{O}hU(SjOH)OYrn< zd~(t|m@>=qGi;~Ey@0=dN=;d&Ug`sMoOiS@9d&Ur2xaqh(U;2C3nX#{i9g3U5x+3K zWhaR)2>ru5bju$_4^h?STOt>9A~tlVt-Y#b28`8p#p3NeOd+EXtQf~lFL%Wn9bQ<3--1wv-b-W0+Zn|Yk*Hb zQGb<Rl*^P7;$? zP5N&?@Pgy4paf$Q2+#~;2;6Hdvtzu`8#mWVy9vCC17^ODm;lB%TaSg4EzMcrge`KT zj(Y0-hQItIHlm3zNKqTgTda<*T7>WKAY3^W3D#X&x22uMd;Cb*rjt)YDC z-l7>Z(@}WR;viUS&x&Q-B&UK*bOetOKIE!>sd)Z^+dam2qS;tpm7G3&=0-_ znqDJ7WR&BKt~{O6pdYC?%`5RWlR%!vqe0n)204Sfx(1nNjYyW%V8N*L z^a$!%8W8@BD3BHy{;G|>L^4GlecI_%6Y01+8Qg-$r)#FDLu7RX$gE~=M-^F=`s~!r zz)lxB+BlArh0=;&HD;da!?_sCN`7FE$J=xnweBY7)Bx&y6(*_gdH|KCv-QgQqF-_H zzJ;Z}#%_GTu4sq4C{BH_+NfSs&8=#pDh)FmEIM#YR65?tZ%)W@C;}!@Ls!9nKGbjR zWIfxJo+sv@Ce29y_k?%Ri#IWVXLU_>C1axonH`N_4?M(o*us={O7N`RoL5(w`4@oc zx$C}ay~@bbn2R!NJZVZl;9@So!+XLIhJZDf<&@%%2a+#t;4V4NU%n)`Nba31X{QGx z+M_P1Q}|rUlK2~eL;o1l(_8w}Oxz$a0M*AD*0LW7WLu30u~PhlJ)eQ5^sySp9P*o7 z@vWTChtZ2W)f75|J#aE9QTLbRdw#N?*a4(+HimDFrD7bThe;*N%L?#SbM-?UP9^C@ z-AVN1=4jM(yO;&T&>CEz?vBM-IUc4X%zO=Y*BF0NQToBMXq)#_wbGJw5oDCX8SiW~b17_$yF%v(8wHto$l7m?C$%($DYXspf@! zh_$Pb4D6tmeXv(EnJ1zmJOFOl*_ex#r8Bt#(c&rV`8jjIZjwxjG2`u`hpkF#NH#Hu z#E(ocEPnbiXIM6KHCZFAN&RUr{f!173-90&7x2^615?PT&cmFo*6vIPW%={&%pbE9F(S=O1wH=7Fr3uM9k3q%zxLg#VCB0Fg z7L^TMZa%WGg5(ZP%)LesdoGbVxfO|TLs6v%xq3*@E)TRzM&xWP(pUNFaKkY96Htiy@=o$GL#3A`;Bw!pK+dZLdXrrrG;JjJ z30MjT9JM1o9_R#-5>3be>R20A3i%@Rc1fV6X_zsa(W4gNsiV@N&)6(lgA2`3|D31L zsy3mYTts$YF20h9tM58Y)&!Dik8om#kp+@Q?BXJu-`(QVu7?H!zqn^meBW3zcPg)KPcEJDC5; zywB<&6$b$A+AWgnDab@_=&F$JlLqz^5^+Ph=tz-ROqmtj_M1*W2(@eWi!i8r=_ zUUip!3xwk~*li#5Z*z4w*8OUf|4q@34VB|%B8jNG_~dSIW5=j>H|Sz^g7}o>tS=x} zii#+$qB()MH$b+K9jKjBmIkMH`J$I`-^&Jio=JG2YLbnQmI!UA2k&u&F+`Ftr|(%~ zw8i<74Rj|NJ>oX;9?obTS$c`|(DylS_MyOUDONEHrWc(#!&ZZz#eo~2Vb(jU{;AD6 zEnUVUy;6D6si(JJp|CE)san;ZsXNe_jI&l-DOEAOk-gH06DYTyrrfnJ3dq9X^b6_x zxnJAn&O4L|UqS4a^Y24Q68l3Qjw$ksbH*q1vZ+zU4MexOk$F5!9pP-`jt6GWI-ubN znA79PJ6Oxi@1^Wa-0;0^@$!gDHo>;<~o{meqSo?#mlgqP5=go_qtZ__LE?vB&e(+lyVi?{drl>0ri4AET;nC$Hk2 z)^v77?2c+A4C4^g7vE6Q9D)IkB-v{l{Q7=$Ks$8;?(w_avv*#8l@HKl^nfi0m1n8_ zt4K@EPEB0FpUa{TT0yESXl!d$nz^BixI_oL248FoyeD^2V|i&;O|3?6bcU|)52}my zOq$i0l}3{OQA{t^^_jtr8yTs7NhAhLQoC^fEJK$u6^~5>8h|4(UyV`tdeO@z87F2K82D4%jeBelPL5{it5WOcnz@#og4^UA{oq`CfmeJL_XJNd+QO-~gkK53 z0lWysd<9NsZsVc5c+9-NRt(^cZD6-m#%WQISuGzZW;3wS+Tt(gOOoyfaxska;vR2% z6gn_EO?GEx+^L5-lf0P~0>OFqP^EX1^tl&I;4gZv^Yll#nSl18YITAmp~zRqz^Ljn zfuA%gqmOP(VaP;(m5$H&N(CsJgso@rUS>a4>i(v0!sTNT%k>zcPCh|W}-1AH?o^k>I)*G}xJyl-u z9ZU1QqTmA-fZEP)=5_NBzVJtAaqwz*R)1USe5A|7Yc3{ zj~7Y>TTY$+!~W`lOXeAz+Xk@gQDQ4obRM!-647-IBKazTs(YV(@));edXjPn>Iu39 zRre6j%2SY)DSgmVO=WgzB^O8=6tFofEI+7HZjkOM`Orv5e-y)>iZvdS5YpbPAXCV< zFb}!Vw}dj2yURBqymy(F+u@Gz1ermxPP$egr|(;9xvI>YKg%;ApOd8QW9lrN_DWc( z1)P~{?B?pEieqJT2WkGQ_URq0h)PTf!#Fp+nS}bGCpwQNWI6N387450bdiVdIRr&r zSDru|Pr!8ta&@ZmF(WPcny0L5ARC*|gm1(es%+zm?>fF4iMBM^6Kl$)r`8Du6o>D&eV{YTYD1>4@ zCp)`8$cQg^z+DtOy>Tuzl$~TTaf_Zy$e&=QL%D-^C%o)YbTFggZB9_zZt}J=nysi- zIjC{B>Gs0$N^Hf|@&{dTJZot{7^EhEgl!!Cm6%o z{PSpL`c6#KwV3Q`^9C=2t1CK2KitN3@oskk@9fE*+D&J(3m3sR5F=N`2$0+w%Wgkv zT;u&`7q0&011HHM($BQ9jK0YS%;GLpDv(|z5S$?m+-zlB_idN~(zD{bfyqF;;PAwaGAc%a~O5Gk165%pJ=VI~Hw;8*Il>6du=c zsPqTrUd^P|N`tkM^wEW13wl2s61>jCw*1UMC}7@B}pV1T7@GnLch>{3izqe0r% zaVDH3591%Z;=b)->;lDB*_-6@+)~>G0a1OyzpaJ{N zI!$60Hc_(_6Xijrdc(b!kaL-vJ-|GxG0S8mcjT<~#ihPfOOzkAFcoLT8_vD%RQ@dN z_MuE3apau28&A=gcLee3tk>w-nCouXP1CIZ06@Jr!T21io3sXR-S>IC`=#u6hGZ^l>@)PE&Y@FQku_niJqYg z6T=-n3vK&vrjV8}aIJW*Etx0RQCG^LMp#TujOEO$&iS1a)M6n_&{!)}HKmK1&vXBz z%CQa~@~6nJL;2eu^uMUMjq-|!xu_yD%?vn7(9-$jq4H;HA!D`msZ*|X_@`*9MC76r{S)S_V^ zpJDX%6~P^s;r1*fTA>*Y~0B~d>l@E0SshQzTXb~qBY62r~q<#lau8V zdoC{+^=97XJoa>cR3P2an!Seq%Wk)3o&DfVjpBBpkxbXGa9ZU7FQ2UM@+qC5o2ltn z17JyBfvuOtB~_Fs;04yTg}t*FwkIQXMS+LLQ5$}VPIy$yGK17(FP}EPkvGIG&@jBI zs12p@7TCZegTZ7)f z;7vWF5A&tRA47_?2go{}TxP&q^jYEX#;bTsm*fpum6>r29IirzzKI#Sy%;asnQ3Gd zCe503unXl9dgeb&&&AnqN9YNr>HHe^UgZqtcxeD zJj$GGtdbSr9RKlVhI1oWZFbBJl<=M?zv}bu9)mZuLm`rabE7I%xh*`aA9MFV=E2vb zop$APUQ8~S6TYM^Zkt`;m_?baYZ-m%Pb!KNB=kH5(b~oix~iYqUFh!aGMiOnJ`4Xe0NlmX{&%L+`5Lob-SV{?O+ zWIhF^NpyLH6pfTD$Zm{=v8sm6YU&&0%fv4mucNHg5 zQDVR%3d!MU>L2k5c97pS4ByoU-d;M9gNgGd%Etxx;`@P2<>BcRV|7{dZHsV{KGN6e z#tQN&Tz`E6+u5s|>elGizTmZ7&YBuUhg}GTUM6%>4Mc6;XInbw=gc72@JkG4A_&9b zyB~hsrR!Zo9V*ELtvF@IqkNWpA2)j&40U@F^lpNs*9KR#bV{DoMEoGX@r2)`M;*iL zS(C3;%V;j+St;w#$y8!;@+8eMlG-zuNd%SvpLTb-O5SAUo;Up*FJ(1;G6Pn5wH(dL z2`51*LFA&#YQ)Jo6b7TPeUxfbl-ggEKCi3s1isW4MP;lJCQg6{j)iN9r-Q+@PnUaw z{py9%dZKCsOVfqhXy${Y#^Q@vr<3$J2$81zs`zS9pL7hT_Ih>lZ5%l&rY`;I)`5}ECKSG=uOfqd%`!We& zE16h!QMXf&!L!c@HtOJBt4M9@!Q8Zjo}wG8EFO%pD6>;FJQ>$G58P1C{iZ_1pa#m% zBoPQ!HiP$e&1gpA#%Y{6Ge~OAO&=SDa=!~H`>R}z7b8Ej%zAL!l-#M&32wlPQ)d_b zMm~0aQTpf%)TI4P)wfVUj#C${hN_KnsH#*4H{SFrCZId?j_G-N(afX8$vO|`_J^NT znlK%N_xvtQ=63qRAGm}wfSToEHa?7|)D#blFsi)o|8a;X#!OL#)mGB{Pd=tsi3Oud z;%6Di1Yd<(ord*Tku$<|Kh8Ef5ANRMJi0@c(`B)MQ{n{uKKIfv-_)k67Ln_4Z>w+ph0n_2;GCds?c#O)zDSihJVrEj9 z7c;j+((SDPxBAH0b_e969eT=pG*~L%4nHBQh zSj`GP%%03de$OTt&oiKO4tm@?Mi-fkZvGup*Aw`PzaV0sDCq8@==8!-zD_S<{%#6F zb6mS}ky=xs*Xk?anLF$_n2jUw%sWZwS}A^m0&4zz7FIxcDqU{+=x5aXHb!4jO$IWF zlq1Emzx{=sVKQ%|W#2ZT-fgG82jXeG%8A~B386b#FaM!^xb{o^8&=QtUjlnqoVZToGb~8vx&Fk zXE>x)N2L{oc&#)O5q#XFZAIj#^ z=sh}uXr*F39YjSsR*xl5=@ZD>5tW8db{hxYKlKHNiMG;#9BqbEzidrFTj8x+s-xWBFCzk&YjNOsyVzv1?!`;u`a}p$;>P^k^P&9JHL?{hKAA`9L3A- z%n1`mhUEr6@ljSnK5)_vxYo8O6Kl3JacO7w4G`XGSPUFFq6{x;O8AC+Oiq_>Ga=RP$FY zhqWs~qWndxzwIYhfMLADAw7<%{3VX=(#-P9`8u~q^*jPL5JoTHdh5O5LVj`XYSG?I zX_k_uWjA`$DfCD$smvXPLAI-H9F~*i0M^h#5Ta9{znMfYkaTTK6Jz9ld|s7B3F!-e zFo_fW9QYzVKr1%nc7X$r7j#?qubTroR89=J!V@ zK9Rn21BgvIX7VaV5m<_&us0d#RjY%4Hb7mHQGNwssw`&0$Y%mcMfHuQu0H-OS89sW z^pRx#IEY6^fwoYzW787hK03>?1%rP&NEPtMm;`^a|#X zGn`5IGErO=r|uPC_dG|p_EycO7S7~^J;~>r2w&9z*GOejKMzq4%NgW%s8G6(rQiy4 z@r=6beO7LDLT9Gu&p;}vFTU^8%;Jdx9Up&UHGIesU4jWV7k9u1faeUQYaK)-anP~9 zWtDtJb-^8GIL`7j&*oH=|KUvZBn0lkBFJo9`6{%1asX|$W zD;>wBF-Sm9w4Q!&9~i_~dhydtSh?jju|pi8cF*BwIDyLK1Jg{rm?syBb)5a}P*H{% z#i^w`a7f{ph7((XVjv4=#5;7rK1^{{U;_g|fy>ZIm(iniGmw->&8@yN2#;iID$zhH z@*~zv6?&O^sI+G>xwhh5Y{-eQgE#pDR@KHa5+Ori&)2ZdmzvLEUCW6H?3rTdalguj z?1yqBo1NmlNxFj({F{;BV-xrUh2&GSC7#}qxKlE~{^bJCY6^#SR7{e6_zJ5~nwN6? zl`#4ut+~dGhb7pKI`^Luj4BEYmMSq2{pLgbzT7*)?T0nxPENV$AOeSAhBkASYgX84 zR*OqlF_}EeHaOi~H#kOf|HVAnAC16Xa?p!A#>u@#Uj9u^uq<+znG(I|GzWkXu4Ll) z3Ue3@@0Q+P3^vh%KVOQxsG;caztMYWox|uz7T*ZEiemIyXJFr>m=_K*p(OHi)q$1h zrf1p?yE+cC0NvE8Zmptf##%p|H?1bBsA|fjdfRH`yk@Pp`{^sr{3?Ws+LFYJDs-WL zS@~nw1;JP>1^(kQCbd0mMcWWP~=FX)GQ z90eW&+gE_fGez9O=`hkR z0kRkiQyT9h8m%e zIK_Jo0&N`%#+?Oh^&ux!1^fdyNN1DGLr+MG^ru_?N^SRofh!{R|9>jWh0kXos-=?r zjNVk-u5@KFaAJ~VJRkOMI-|e(j5Y?eggg-P-R$GAKb=_9d(?ld@;9?GX*c@~@2U)IG^IhW#QW+C+y4j5 zc_d7JHC&|+K+zNJFS-#}Rc)%WE2rQ(d+Z`N*LkuAL99^Cm!W_C$OPXGeBOtZMA{*} z@<#PrpM;GLM_Di*kKH{^p6yJQpQr?7@Qaq>1dQdRTExE(MFp~!4re4tY*W%jiW~R1 zS#c@J6E3FrpmwTjOd~DOubo#8xt^PvUg)Y~BrEd_6XHa*U%f|LMzad)nID)ooSaP4IahNSH$+QwHpuuzdo=fSWnewJ+y+Cbn&V_T zI+8|o4nA&}-g!ZFHr+AaJueDKZ(on4+erKj>IfGv|)A9yvX&x%_D#wb_bC z)7}jXq&q9Qg?htZTU0q~GiT*dl?b{HYoc?h82Z_#Ru5+ml@G1MC>5__=~m~c)#Omr zW;K$hE~p=?N>RtfEj#2tT5{+4OXvSubnCOH7_ zK$0vX`!Q$bgu^R~mm?<=sUiz3fm1Jn8W+OJUlg5578HCh`CcLR5W4q9y#3kitwZdq zt-3zX8l;F>zqgSR9VPby>0zi!M%tNB)8)mz6RO-$UuM6Z{R(u2<(RkOhB6*KPmC340puU|4qss_)5(@LYnO&QOPZ=p|fPdwL ziJl6l_J9*RI}YPJxIeS%U$C#ROPpboSc})~(`YtbYSRB?J*Kr@bi5lurNjBz%Ax6S zWhTzSyE+~!TB|-&K^=O7{yf#`?Vp$K z`7YnN2uMgu;o@K7Kohp0nmI)!@J2I{L8LO)!CQLLtBgWRm(FN_isdZ%z}sOJq!FWX z(yi6gJ*;ZP47}su`YKpdW zzxCX?3|+|~W}|V+ALV#abzQYar|YG1u*R<`6Ha3%>-nGZ!V5hfmFg6ITRT*KSH2AU zzB8O+6_hRYMNdhVAU*F4{`nz2$$FG=8MqgzjVOZVb_Ks@CJMkp;Hld{Wt)qUW{6qT zoFLuJIQp7W=2!XNkrAZzr#vmEF_C^jCpm?46zqe#wi28R7lI3qw72OEDmO@EE33Rt z3$|1V^=y8xOmQYu$RIG+jeBAG>oXVgkZHBSm!YR7mx!ZClS0{zCoJY9lZJoXj zLQ;{0*yCh%dEo)}h5Phpmd!v_$Rf&sRBXnDu?%MIJFdMzy5Iv$dBJp;KCsQ-MM_k( zZ$u0(u4-Z~(_1$7VH1=466F!IoH-X}r-LJfnZohioaP8~Jdq0=McoRyrF8T*v%3v- z#F@{{WoCe5pd+^<#QcCWVzzk*i&&CbnO}c(L^uM?NVodvWY>v9ax6Y~e@@X9@WdU- z**K4yFAdMMsB8)b9?P#5OCR&AaTSMsMV!`k(WPZ#)gN>@1X<(p%+7CN1ct+pE(hO> zv@WU;E4yB16+wkAKzK`ARdimp432IAwQ!GB!b+zfITMoiJ8!}!o~0WrtEM_@TRGHL zmBSin&DZ;!Q`B4MZMDX!lLxDHRyN!ZXRIUYw{o|STCc6r>a+F88s>bDi`55JV==1= zo`)OwXj;)b53sxIdkQ@{UYb4XGH732RZoR;hUNyT}xmN2k0 z?O?h-AGEzMQImTa;nY1mW?*a*jcg+@ZXc$CuS|_A*%5vqhxlzl_NtK7v>!xeD6GeJ zRgUi;4&oW<%*=QFs)JMWEBEg6cQ`bZ3zKU&|?$Po4+0IuA1VQFlQtu$d0PpA&E(U6~hMeiiyj7c$DtFFU);yIg~lX zm23DBXPv+K3tr)~+-fV5Vz$zEy%2$B5A-Tu#8C5!`OR>1q>!Jf3`O`vB%Pte+bU|B zdF5L3H@bnG{K-tB38xCW1}6U@s0d={bF1<1qrqDy;vQ^b=jT1U=C-Av0gb8b+?9g* zwlQjJ(o5)WD&pE2Pam?LsTaLCI{5&*o!S5c-jnas7R+%MXxJ2Hg;U%-G@jEiKX2DTcf0_! zdMC5!I?k2t(i0c*VKn45s9d|{K{)P1auNA|x5(3;A&<%lGK=F7e#0od$%{T?FVjB7FO+mhy(*&NGgJ5S9YlsxtF89 zX@Y_Jfh>=t^Z(AY-4fNF(IR;wL!(K-wRTZ@I zL&^2uO7*(~gE-30sd{pPf3zOrk-wtqt83PC)CW1$DqXL2uKNc{J%WDeJSTl7^e#_GHrd53Pbuhq#*6jx1ZaRpzk;$FChjJ= zE47&LX0w{c&>?5!%*laY;vT=MP4&J8qVtfi79zWl+OdXSI)YBWJ+<@$Y{_A8%i;PM zr+X%bePUg-q&@grm+fwJmdWZl z9dZNJQ4a)>PEeOs2|F4OTWgq%Eie(CP-vXsj-*lG;Avq1n({_7&>Ox+t3s9)>!TN| zF9DtENHF`)tdi#FEX&DR?4QDN87`m@rt_=92gd)6Sj?@X?{H3~5J&VIo!{s|of~Du zTdVDFI7|Msr@`Xfau(#Lc%(n7soWX=PEEo^m>-Vf6dbBl8Xdqd%W17uH|X9=!L@f& zso+z}+a*BG^T8}{U~Lu0cjBh^)7w>rr#}q;uuo@GebF9jJ)8;U3@pbv5QyE({FBLJ z+y{Q-O5I7%oVb}cnV0!;12gjtm5-#XP<4^J4WmfE%Euc2s+QP~c)yq7riw~#9)=Sx z&;382xp%KV{6_^;ah+fSPNR8RYtIFxieSF4z>GUkWFr@*DY$%YkeZ*=WtTTT4e0|% z!3e68%ir8~^$O*!H)@;8gRgR?o})Z;SupNQoK#iqoMisImJFi~5b*lIxHU z8gFkA?c^JqlV5C-<;)1r2Jl&i zo7K^MFO|!-mXf*TPrmM0 zlC@@v5VH!sSW`5y8ATnr2*r@A_kBc)=zG*41;r*bGd+x4XrgAK6>G|@8_!gFjP8CU zYPMi>OgW6vbdUSM1wWuvBmdXf2^YIx*F{<0n!L^COrRa;#0R0Q@zA|sto`_NZBW%{ zT&aQ#>_OHS%O6cbkgBGBI#a_1pSEgQublg>>hy0rNMI_ehg!Sv8-=P)I-Z1tee@0M z^loyuV%RIcIgeAoiA`1+^mDR@Zt8KWJFd{owvR4^7N$NtR%sF<%fMil$6Mz?cE@x* z4s_I)vv)Aa>UOlUg}`ygF?CO3TA546>J$Fg9X0!Y@PUUsu`xJN!^BF{6NhU-^Ojkh zfBFvR|H*WB`!9nZE54x4+%Hn8naFuU79|3YAu zzKK?_(Wg+^O_Z1M1J&Y0_Ysk%l;L6tj^G=(V``&(+aYmonG@wbk`%(kVthki3?Fkh zmFfRpYZOKKNdXCC+P_cE%2#$nm~qQa%kSGh;1}|6 zuS9LCXDm+T?_iUEVY`!<4}R$q%AF+MKh*RsDp?=0?pVG$9a&&n#i;YvXXj>4!l`ig z^HsR@!C6J+u{x_6aJr3g!Jk)Gol~51t$fxD6>n9rGOPK?ADttt{&aX*@a|7^79^Q3 zFI9iC+QS5WN4->jmYdyC^`tBB$egRmmifcP``GSm<;E#`nncSBR&9{LdGIxFRWIh? zc<|WzMgwy&2*qF~(vS2dF6^p_eNh$!i}SSrG$*QiL9-1y!mG48}Tm%ypo~2S{YR3x4wnraCh`{~yoHM6`7 zc3k2Xq6@er=bOFdV|kK{wHM|uc0YHe7_H!NH_40mNwzSJ50ZVk@x20>%ugja14_iD z-~#o)Im&ZN_ak2`8Z3{qi_DZyqCaS|uge2L&)AdOM=xlnQ5t2~el;Clq_yhDzKz34 z)8hY=QFBu5(~#_YPBjGmt&7*Bv<^h!G!Z>YXFIJFMjliX9^fh8Z3EtLzVSt-HLjuR zoh$yx7GQg$VGTj8@fh9&_gg6j8P82WdpM_m0Z_z_^hu*h2^cSS>lnce+02QST}&=Q z_j`dics#06et@bJd72%jOK)110 z;*-c~d23;HqS|MM!L4tNLOGJd+NvHnV_}QB;G>9f4z`o5GPpwrtM($%I*3-HEBEHT zBR8c5X|er{+MquY{o+<`&l#e_;39_87j48t`(AeiPc19{F=vd#u@u7Y{AnCxE=uIt zd5QwYEzua9XerZ<7qiD+yBApqLqRZ}qwh#yru)gv*bpt|b~F*6!4pS|S@6$;=^$ct z20Ez#vX^?}?0yPowvSG-7BinWN?w;Px(Q5QW{`s;sxu+Xllz%C zyl}OT6F*^e!(ddSINuh+Zk~ggc?O<-i0?mD6r|(30VWnjcO^j*|HD%d3_9M0zUd48 zv+`yWlED6gK3tgpXfHyuq*-2LOxnmWO$ z7Lc5M7Y4gM=hkA`o-U=EcrGWIapDJOUpASUom!R8wt|~kf8dw-&Ro(<+@oLW1}|!g z+Avn!h6iU+gXENRur9wvf2#ij)IChGoaAY#9!E)L^0d34@f{52{|FxHhT_&c{TOWU zroLh{)_+LC9EUpbFKKltsA9L_XF8xr%!yCrIG^|@?>aR+Ru)tbFbOE>U!X@Zf-C>wg~A~1{Y!Cg{joM%C)IM5j>)RFb)OTpF8-GfI3~7OVNQSb()otF2)KLL zYU>=Va#@o&lQ)v=T1kaFpONtxsg~f)YeOFpsZtpyRZ2Rky6mKjB%Zuoc29DEwu6Lp#`hW_+JXMPL3=xuzsA4_pGHmHirIMtli3z<);6rhYWy#lRO^yt z=Dmb-?hn558HdS zbKIV}1$~Nb{{a!*#B<%i37HXArVzgIF{&iIaTT6^Kb_aeuf5nE8VyDhT31^syE3pM{@rJzuhs;ys11_ZAlEg|nua?}QH;_tK zj<2+lDzccJkp`{NN2cyS_=6kME9DYx@OWe*{UZhF!!>Zn<0#rX;-}4sXZ9Zmc}sMM z+@omhfE7=J2I4e-vc1^IEi4ydny1@g^azzjK`P2T{_10tlp}fTPtXm-f?dr7dw*;! zMvs|}PI;s;N^YWBcSf6$T5d;kn;s?i33>+<^~QOz)953;jHlwHI6%%#QF#UQsf_uM z-mSZsD_?NOgK7GrV=zQ9s@Pr5V(z=Oi}1`8J;flLGxyL>Es#E}?Qk%#V$|<>^z*a9 zR*K^|N`^-tA^PKh-YWL+b+)1s4n&b`>4TM zf~M6_uDQ>Ho~=Gp;5;-jX>r}w5t~65+JKjQ0sV*or#nUG@rRtN?4mUYxv}TKU#y@WiUM8(C^@GO(JbP9MtJLzW%1@@t460 zd2@5xLp#B026ML?ukuZ69dprkRYza4=G%d)fC|#btgbqf%Ep-zrP`v5o&xK4!m3Ns z@o-p?^Gf2_KZ{C|UX_Wt6~44VRKh^i1_jvDwNcoW;0+$f$JPOaYA!0|W;k8$vWM?7 zc@{$j^@dN9Q$7OIZ36s^3&jKJHQ$?QhrYtzE(Op8&=>4{dlC@W%r>DowuJ!_6h&w&6IEy^oty9o>(WQ z_ZjFW#|d;1Oa`k^UXwG${oZN#ImYA9xJ?yo3pzUvCFMOh(#71PQ<`kcxu{Gt$QQ6g zY3TOm!{J47r%0ULRn#EmuPwTMQi$|z*%J)vJg3)tRBN3`SaPj_@0^PdTqhH~c?a^_Cr{^`#Pr)tcr?@U|pg5y`IJ`99eK+oW`w|f-_sA zWoq)5<|Wu)9oUlwPxmA`gfe0wzULDtnpS~77eX=h20htSvM2qS8hVi#b(l2$ zrzjJ~lT2Nj9G|5yolf193VM{2)q}2g7TUC|FlbJ_iSN^o6R#@gw$lCR&~l^DszzF4 zS5Z;~+2M3~C4>VN>kWD$e=&_5rKY^s>2$HL;Z*Lx0M39b?LY^W8no>*3c!Od?GkuM zBA=ilJzHI{o)aWM25>icUv4UFtQvP1)*A`F!WA)VlS06#rBJy>mBJ*Ra)MCY07Z zg#tW}TBuQ&RPchw^BxWxBlv&Poas!+p&-R*F8vIO2!7W3pbmXNmXgrSoCZ(mgo61D zKUWN$_z;raTnWlEz$`kTohWFOruN{`Lv55-rZf&RKQ#u&oX*Z^%WW=|&^s2O<_*OK zwu1^EPB*!nGjXGsjVj~8|JSsu|M-u(vzv+(&pxowV9sC~%7?4!HZH8bARro~x(o^P zRmh?9BwwQfeNF^t-D9S>2vw9-{+C^ZKZXQ~`TV;nRG504ZNIs}mHX3pYfE7A9lYz8 zthZ6@$L1UbKWlsi{a7Ye!4nX+b3D7<{IqrHM;`Dtitt}{!upq>M~h`r9Za<-16nv9 z7o4i z>a9^pT;eo;!y74q{&WC(`YZTLNQ)&`;x%*E6;!6@IB%ZuF5dE{{aN!rQ6X_wP`LU0HZVvPGuKdcL#0=y-lYRiQ8>3TvQ;+ocDMyqsSz!i*_jt zx2GTvYXUch#PRnGu@QSBy@&x^PmJP@qOJ=H?M3wJt51@c*I1MoBw~$2~&wT zl#W$>m-BZf)#D5u`%TaUf2u=DPSOzWxSC9LuTB+D$xk!|?Oi^j7yG9;>$D(Assq8! zR#JbDQ31HQp6?WlPdWvidL4GiBz|Xl_T4;^qdI{KKLK~kXq;nyTf+Hx7M)iVzvCTQ zrElq?E1~J-4gyf{w)8|Pn2&C;X4lfkwP9uig=GTH#eX@#+PzNp*iKe$U8d6p)R+mZ zt;1BWIpPzyPzM_$jUvJqWMd>dJ`Lw%W??b?rR7Ad&zlR!WmN?HlzZchkxU*r#2Grv zkMtF*K_3%&@@3gs<*A54+?}y*T&$IZGaL%2l!(;zAotooUOwO-d>{ z);y%5ox<_+k=eo*G|_{f@Gz5QF`n`rc=dm{6@6JT{Wy!d!o^i*-xX(-Oaj|$$~rhn z7FZq>xL0|PAK-b`apwDR>NcZ7bRxy00Ib_C-dqqW+dF8P9ilXQDjoglV%&`*n6|z$ z8CN2)^fzqdedZ%4)A)5}3}tiEH+3`%KiyxZobM=vFXL$UgB{O+GQKNsA{ReLF#jup zD{3^Ij~{EgHP3H5KlyKc7krVl1HR^V6#UY7%K9r~Xu7HYwRI-obyj5_&%UQgnkL;y zX(=Uik+o$jLtB+8AP6&pIu5IYs4$8Pk66axK|ukXVGw;7kii*zWGkx+n}8LtV%ee4 zO7|^Im$Yem-*Jh1>}cISaE1! z7Ig+s)gQ(c%Qyk+yL+7Xt?Y{yWipNx09)RFUFVd;2WW)6`T#W zuH-J6Swx4cSb^q_j=~*W1zAjnUWQ)l3!fxHjt8qZ^K8^J%mW&^<7F#3U@X2kr{Fp8 zaU6H{R2Te`Z2TA&{W5rCMVRLorgH!5BCvWlb}IrwU&CY0qhD_}Qz^jntH^rKfvhi( z3y&mAeir;L$Da$R4(Afl7IMGKH9SGqhgZy_)_(|3znchfEBESgrw!HRO~~>+#(g)t zzWzDpx^q}dcTGRXw`U&1eJ!UK-pQQe749gQUD$}UA1nMnBIC^kGr1m8UN}Nc+0OiL z02#*ct(%Y0^Sk7d8lL)`Q+Ng6PxU5pOk=g|26EHUXlfD>a3;B@jre~I-xtr<0Jek)gMJ_3r5;|jx7pqB5HVSVXZqDw1FVHfaSHtTbj zlTRA0=kcZeteI}${_*4at*>8k5AWxxQ!ijnwt?BLS5)V4Px>wBWq=j5{*mXngX&7^ z(M7piz|5J9vWvOOWOUj{_Pn5AE>%S=^kzQR^ytcvW)|SC`f^zqpN9xf~z;1y{X#xlfeeVPanOHWB7(v@nhB>sdQk z${q0QSa)o59g7O~^Te7m*0Fegi0X^)0AqhRiTnd&OLBl@c z?0>QM9qOa$1rLtgj>JDAqpfGf^!+PlqQA}k0I4T~!G3i07SGMx$G36)mbH*uc?Pk8%J5Ov zb~<>1dnsAu$5f{ap?)K?mv1qbx|F)Jgxu0ZlsJi4^54v?Zsq>=IjkIQAi_P#ca=QO zD(jW{8t^m7>$k-KJ>$sen<0tTU4^e3q zD1QW;fhnFMU(Ee-H!=&nkBWFL_4zei3wf5fbs1Ur4b~fePHlWN@#!Mgv#z6(>cscn zBWL}FHH6FI!tbQHgzFBEQ^U-p7TA#EY6AIj9hK`%_~36@9XXk?MzD4r61Owwp9+E> z0@r+B02uxazt}R3xx*~$d zdlfP2QE+nv7CwO}d#$UhRCOD{&F$E7DzooTu-fZNQVA7CHQTpQEfv8{0ad{B-0l4Y zl-FU)Wz-I$8Asx%T@K=otcGr-1Yd@@y~nD|Df=hsjA_gts%O_CAHw ztNFiz?{4@tb4R~>?LS$Mz5(2O$I#uZCj5-G z>d;v5KC_71**lx(V%y26|H!KA%T(!4@=J6}u=mBF;+w?1&#VEm6G=Kbb`3d?*-sjG57WjPwXIfQ76L zZKv}5JuB{?B#%6V#l8ZiChl&34bMLxq<$8E98bPjN#(T^dZl>!O|X=_$PT9=c9OuzneXs9Lu$G)-(6>gkdRF=u)osyh__S;Lod0>+p!Z%+;q;Mb^-I zBYxKkB3rP$wp&V$@Ea$d#;>kIKj&i04e0-;XsRC%YX*7E%tcb{p|}3HWOV7vtF~m;Uz4q#$1i?IcB>>ZU&N?;iAZJe^ksB3 z4IV#&{yV_lZhUMdGt<+_bW^azd}eW{pow{Cb38JxVeMfp@#qEOdIcHic;e7PbheX7 z+KCUWfzKjny$=!|qOQ6TZQsMW1t9w}GVdlh>Lhoxk-z4%zZWTAM21czEQ8Bg%r30W zp90rk;0#aPvxf3x{OSVm{Y`3wv+&Wc5wpiaqNgG0-wfp{W*Lu(0rsl4}^b%3gCLKI4{bwMGKL0JDL2S z82vK*@k_+nDbQL$G<*S_FDF*C5lwoqb}@Q+i+K4k*1Vd`_#hbkHu`MCo?|$(8QVUO zeeR@oe1e#=iFr>o7I_lgoenPU1>I}NrxRFA{MWpx>&;A3z=586Ia(T`&>!S2Jl~r9&7N=@p$jCNLPv6$Dz$pSkd*luaf!B zBZi!iMUV=pkJ zh9hlY{Sl<%TaoGaLt_6XqE-#xw%tcn@)UC3MJ#>=J*~rwH=>b;K+5gZCC_oTjT(J3 zTe~^?2+zE)q|F29Z42mmoBwaovzs{B0rpp*Wxf*(9sd!EYtiOtYDa&A;dG?fNp<@U z>v;GU)nYTq*i4NvOg!ksdIiL$?ZoUCLFyFH<2T9|f}lU)=}U;)BXDpr*7*clnSdrX zqfvgpiS>qq(bjzWoJ_Qz06w0?&o+bpRxN7G75Qv#>%7_{kA( z-+_;H`1Eni->X5}JU(Z`>saFX-{CI{IdT|2xr?~o1Uko|31_a|;GziJOv1NkBgaQ* zJC(NO%nCO1lds1EAFEy@I0?;kO8`i?LK8{0XDw}nQO4qJSw~ztoTPf?NxNPoJwac z@n(n~HE`L4KTRRpeFnWB39VK*D(1*&UdIv{w^IjIz{PrGF9JcE@Q*UIJPN+&!c!Ao zIsjM8u+QtnP%D)8K;v6vf>-c|SMmH;IODfV+)rkB9(%4LUh~8^Uim28+(m?clN@2@ z+YX8zCe}U#idQk0Zl@~R2fZcizW~BFA^ls>+zLP4^xHrNejkf;L#rFjk0!IX@V^^Q zhQMea+;rgwE0K0D(cJIU+=T5b;Cx$#o;q|rmi-#eErrS^w7U_F?MLzwGIKG0Qcj;^ zz+69TH*YfaEfvb^5|-iByZ2VMuU{2+%cfmymRvYHsj8+bUQ|_wIatZgg(Pk2yS1?8c+%#bE(P+^K zdnjA2jNbwW2c!8(@I98J$3WpEG&v8CI0cG_(7KfPxf5$1N)$bqG0vo|-$_3g+mGRF zBUFaaXd^nU!@e_!ImglNaC#rb|5o&JJfBVQaRfcI=yc9cgqrK9jriUOGH*gh+&2ej z=MY_HAjvNB*&0x?9SyGlGaJ$QF0`T+-a%h$@SWAXy73iP&xXPL>*!<)+IkN^dV}`> z2yX!+edwhFl&+xPcB-yE{P|7jH4zcG^PIg`@SOEfC`Xz~`#AiTo$pJwnh zntopI+y&qL$TEzyg+$s-9OGF%{Qo_CW+i8~aL(_LYG($de5=sI8(AD$L#vJqGxcD9 z8JTGrIr?q-$-7utMVwrU^xjjp8GOA3&l}N5FS_ZXMJ4F!BkOcg5e#P|@x3=-vYXhp z9w|rYy%ip}AbAJA^ByB?A&Tw8I_i53RJ+h@13ur$xRs!$pB7a}S`7yDxC%5mg1?o3 z1-^HR%BUG!)MQ>$Os1(u_kP!G4v#8C*AvjEIklZp`r)+zD$Urgf~`Sh*@HK0u|hnp znKP~E^&mbcVuOjaQwsGaM(*QS9X8_02IBe< zy5B`>XEp=)f%$t2Hd)8E_Ah3{a=2~-<;(E4*T~~5X!8y}^%|e|v;PNtZz+}BGi3Q! zvf05B<^s#udY%0KG8KSZPvdzn(Qg?TSw~gkd~_3dSOM)eki>O&C~eC!d?%9Z2042{ z$VPnl75ctOE3Xc3XL|=4cmw{ofi%~l-^TCSptKu`?ey5g@vUsFVkBp98~JbCC_pP# zQd__qzj=q8o$yhKo=Y>0^y2>oXw?W)mHFVdj3d5liWcpeB}UL#9Xjp7YfG`8nP!ml z1MoA&3mGP~IrqaI|j?Bg*_~zm4 z)p67-!42><0tT#!4k0S=3t$>q`@$IT{+aDdOB1_#1;p%g}f&REEeg`_QVf zvJ4IjI9HqLZXA3}L9#LI9YjxS&{9SjOE2wZ%usIw$ZB*P!73Hlb3a~D3Kcaz2sZZM z8HI3SwP7UhrbQpU`}l91Y6nd_!AKW2?E?SXINA=aeW0%w4DJAD`xs*%$J#QhceCBa zdlTI5#B0_`x zP{LyVyY5zp?h2vV15&%;rGwGA)fZYl@Y2qHe_9HMUrT&#hs$V*$0 zX)hGE@qY*HT%Ye|dn0n};BzlN<29XXY@0)(Hd?G>gpK%<8glJ8I8cv$XsMf4Taj`P z+*?Ht!;M*>lW_;Bdd)KJwCu}tvz1T3QGF<@JC&v!4s*0Fgo1be>}Ahi%&|=lsnosM zWFxPBc(7*gqrJJsdS5;458e9NeLD*6Z>b3 zwLTe@#mP#jRpTv9_(3%`s-$f>GB{r=W6L8kP6g;I!Y2HxI<_9hGC3@)Z?0rDYEHvx1SNSIx*)TLVxu=NCeOi`d9uHZEgZbk%UwSxeLu z-e;y3hS1wMkYtNG zXkM(8L9Z7n3gE99KFs@i`9yTth_225>*hIRZAbU%u-4V-I4j!{Tk&%2bjGl2p4+lgg%WfCdp zUOYx!D`ii%r{^iJ)#wms%p}?KCg@}@@;cjaO??mBRy=CP$Y7+kMso(y$ex~IY&L>b zb6ixK^_qCQl5S;ep9WexTW`$Tjc4DiB8sb_(1cvpyk+b)V&!RA**T{;pUD0MT3AOr zzWKvSax^W)$1uE?(Z8JjeMnQvQQw6e8^)5QNTzS~^IuDffnszRi128Rb75N}p0UeS zR5OOTVJCZH+B#Vbt4&ca?spOihiJotw2WDXXNU_c;b9fVo)OGGVz4Kpq%U>BNjD?g z-e_sQDPhDCuvNgj3jUO)56+CP!))zmTP}=yT^X0okF}l_l_%>Pv)nE|6UTna&tCfL z8RAyabPSl4;hcl+rzXq_NXs2muI~0V@>3{3_Uw%6Imik4XS0^ zsB<&4{hVX!p;h$P2F?k@Q}om#<|FfFEv@x>ZCK9#65d+Td6Ir=?Vx2HqabT53aUBh z{MCr)xLQR&cO?B=KQ7H$IYYBI-!7PqrxzI8^|V;wG@cvh{C?nKw#1g`^oTL30Xk+1 zYjHV}H{)qkM*6jtkrd2A)=0+MW~erE#(3;V&LLd+blw#_DyjLv?4j>h;M?X5`xq5n z4U?i)kSp64f)Xtuwxy(8&OWt;dQ(&C(>hJAM`hz1Q)?Jqdah|`iK;9fS)Ukv_(cKU zwQSi#{g!8*ThFJ_U)|)eeq>6kVkD9z^aUsH>U4bt!oEhzK#S#fbWw zQBeFEfy~KfDD_YX&p}t3`nlOkOp2Glqw{mys^Q8^dbKM~OL%)$tZQj=l~_`5Ls)nO zZp3B{$BkL)RIc?HB{Ey;bz0f^nmikYOKA}q&i2+t5eJlNFw@>JysB$8u^4Nvs!Vw5=-RxSG%djVdCxoHlxs zd0uTAWwfve5Os1Gk<19CE|tqqvzrzvp{;NEwOZ5ijuGCY4fIVhAO@ux6}0X3;Z#dl zU+(|2jrHOj?c^rnh(0bR{EXT&GLo??jinT!IisAI4Za-1KhMdvx)5W=1~q3SR1aQH zsNpm47TG$qV)QVkiE`sl883Z1v~Tp)>;0_A;#BpYxiUU$Gh>h14k_%VSL-Q`AN5#d z38PV9!8$l9-ztvDD~14>%B7vGZL~tfL3Qt*5icy@p6gC#)G8{Sox#cp^8bX~U?gjRV#PYSnxZs1-48g$Icfx8%T)#kC_0XP#h1X20-C#}lBma#wxMsR||oC zbs`1-)VS5Z(N1sj9WuyS8GC^dZQ>YmYDS8@YyZH!ekmVDOl>bNA}{LQBBdBy=tZJU ztVvf?=rO@TAVc2tFk`E=o5&SE;rY?m-nMeI;8AMoCNLDp_P-<9!VD?WMP$si%&+pI zgki7XUCkQDqK?xq2;Gs0Ko*ilk$Qs3H7@AjCZdMw6vM5BVbG?$1lc@q!jQ~UWRI;1HD<#0PP zkTFjEIu{eQYFOFa4h`wq;zgbLj{lwu8SEpL)s`>m2bYc&$L$r`Nw$i4ja8>S+A1=u zR0HcqTO()aN6FA*abd2z-uw?jKI;t+k zzmeEudXrgCu04}txV*(nDtc&mmb?a1!(uT~Ued5Zct+SLtPwibGEI;x%a4Y1Q&r7aU88Z7v7>a ztJMb6&E1&8lIF@>7KD;ID6Fhk?s^H+r zbBSB~hrDtwPhml+%BfYGYlN}dmFGsigf46sSa&Nl7WzriOxY85gM$OP4UH(17|r8I zbtyzS-Khuh3j*IAje8J@39+5Btf1)YP+fQ2U8ejN*u4 zSI6|vy?6&_>M(fn(?}5(jaa2D_H-O8KI4^=#3+s$R+Nev+WvAAoP;K96w4Wo$lPlkqjB2FuXy8GsYO_2J)0UND=uZz!W7{$`q&!k~ z&$Cv5`eMugL}JQT@+qE0nzLi84v~{Gj@z*xp9yIqTggI-h>%Jj{JLetv>Fr3MwMt2 z$WV7u3KY5}$6*hV5!oQ{ARR}tr?yc4aXw)sFRQu_s-c0P8gzqx*gdSN_1urP_LEZd zS92Z@%%n&p4O_@@ddHTnQ%r~!woJUIu{{<%#h5`aB5IyaSUG7jkgsjSzFJ-%53~j4 z6=V^u{LDP6|-)Iwhh`qf1@{|(Kp_RNnLmJPzmEQ}E#d?iA#yPcc zAfJE9S$I`MUAc((mRiLq#usUb4N;P!W5Q$_Dajfb)GlGYK$biun+3IGSutsZOqvcm z-^*AaOx6(U5dK?KZ^yMURa2`|>hQi88#;{i! z#g=L~Z-pdVvU$FxNJ##c=RNV9=iop|^1ToAi^Ri$QiSBuUR@@fB`-^yrhWScX7XF| z;ON0Yj1v9)AKJ=~6C8)m6wG#A&ia;y3up z>n&u?@8`WXJTH)Y;C7NRX*%gPDCg;E+Z270hb5dQuTK%pUU?4xwsc8{%4+M7Fpt|9 z`GZ{K+Xelkzt{^($r4fxKAexm8fv~>-i8NSIN47xh!%Mp#JqX#A{rf8SvFlj9>Wl&2kLq{=Aa2@oGUSUJW zOge~cALB_O@e^@8G@_34kvHEWP%o|EDQPMsk9Ki3>E3Z-?BpxTX@wD5_-h%GG^s_t ze;PACPSQxyQ0klZ^KsQ9`Km@;`Le(N^M07LlqjTDwh8};Sa0MsPb5txF8{iJ;!&<+ zv}hAraoaH>&IS$w!-=P)<7k=M2i4e%ZEYT2AH0WDo(p<$F6}3(X_RP_A0tq5VE#xN zNh7BoAJkvUZTZZSB7x%vk0EiMOSh7CQsf9v%;WqoE%~=bkJbrWAJlK2`xq-w=qQQ5 mJQDQHklay%+mJf({6RVXS|g#8X#KZQ7gR&b`l;N8&-_2oYbe|R literal 80376 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 E0Hb$9rvLx| diff --git a/Mage.Client/sounds/OnSummon-.wav b/Mage.Client/sounds/OnSummon-.wav index 1facee015c8d9395ea1be7010879ba9b865d4607..63e57d3df3e4e44485d20715c32daa24f3319d96 100644 GIT binary patch literal 71446 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 literal 50056 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≷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 %GU_OFQg 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 literal 240812 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⪻XJK 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 diff --git a/Mage.Client/sounds/OnPlayerQuit.wav b/Mage.Client/sounds/OnPlayerQuit.wav index d9b2826d1ec93c6a42b48109584befdeba9d8089..4d97f17e4fe1364195e806046b2a1c9b0bb9198e 100644 GIT binary patch literal 60664 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